Инструменты пользователя

Инструменты сайта


setup_proxy

Настройка proxy сервера

Настройка proxy сервера необходима только если используется вариант «proxy у оператора».

Подготовка

Необходим сервер с установленной OS Linux. На него нужно дополнительно установить iptables, nginx (необходимы модули: rewrite, proxy) и sniproxy (необходим патч от зацикливания).

На сервере необходимо включить маршрутизацию (в файле /etc/sysctl.conf установить net.ipv4.ip_forward = 1)

Внимание: серверу proxy необходимо обеспечить свободный доступ в интернет по протоколам HTTP/HTTPS. Т.е. HTTP/HTTPS трафик от proxy сервера НЕ должен попадать в перенаправление через маршрутизацию. Сделать это можно через Policy Routing

Настройка ipset

Добавить создание необходимых ipset при загрузке системы

ipset create BLOCK-IP hash:net family inet
ipset create BLOCK-IP-LOADING hash:net family inet
ipset create CUSTOM-IP-PORT hash:ip,port family inet
ipset create CUSTOM-IP-PORT-LOADING hash:ip,port family inet

Скачать скрипты для обновления cf_ipset_update.tgz, вписать в них Api Key (можно посмотреть в ЛК→Администрирование→Настройки). Добавить вызов скриптов по cron (например, раз в час).

Настройка iptables

# Перенаправлять HTTP трафик для сетей из списка полной блокировки на отдельный виртуальный сервер
iptables -t nat -A PREROUTING -i eth0 -m set --match-set BLOCK-IP dst -p tcp --dport 80 -j REDIRECT --to-port 9000

# Перенаправлять HTTP трафик для пар IP:PORT подлежащих блокировке на отдельный виртуальный сервер 
iptables -t nat -A PREROUTING -i eth0 -p tcp -m set --match-set CUSTOM-IP-PORT dst,dst -j REDIRECT --to-port 9000

# Перенаправлять весь HTTP/HTTPS трафик на локальный порт
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 80
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 443


# Все остальное пропускать...
iptables -t nat -A POSTROUTING -o eth0 -p all -j SNAT --to-source <<ip адрес proxy сервера>>

# Блокировать весь трафик, на сети из списка полной блокировки
iptables -t filter -A FORWARD -m set --match-set BLOCK-IP dst -j REJECT

# Пропускать весь транзитный трафик
iptables -P FORWARD ACCEPT

Настройка nginx

Мы рекомендуем использовать nginx с поддержкой lua и headers_more. Ссылки на готовые пакеты находятся в конце текущего раздела.

Настройки DNS резолвера (необходимо использовать DNS сервера без RPZ)

resolver          8.8.8.8 8.8.4.4;
resolver_timeout  5s;

Конфигурация основного виртуального сервера:

server {
        listen 0.0.0.0;
        server_name ~^.*$;

        access_log /var/log/nginx/proxy_access_log main;
        error_log /var/log/nginx/proxy_error_log debug;

        root /var/www/cyberfilter;

        error_page 404 = @check;

	location / {
		internal;
		recursive_error_pages on;
		}
			
	location /redirects/block/ {
		    internal;
		    set $action "block";
                    set $check_type $upstream_http_x_check_type;
                    set $unique_id $upstream_http_x_unique_id;
                    set $target_ip $upstream_http_x_target_ip;
		    recursive_error_pages on;
		    error_page 503 =503 /pages/block.html;
		    return 503;
		}

	location /redirects/unknown/ {
		    internal;
		    set $action "unknown";
                    set $check_type $upstream_http_x_check_type;
                    set $unique_id $upstream_http_x_unique_id;
                    set $target_ip $upstream_http_x_target_ip;
		    recursive_error_pages on;
		    error_page 503 =503 /pages/block.html;
		    return 503;
		}

	location /redirects/denied/ {
		    internal;
		    set $action "denied";
                    set $check_type $upstream_http_x_check_type;
                    set $unique_id $upstream_http_x_unique_id;
                    set $target_ip $upstream_http_x_target_ip;
		    recursive_error_pages on;
		    error_page 403 =403 /pages/denied.html;
		    return 403;
		}

	location /redirects/error/ {
		    internal;
		    set $action "error";
                    set $check_type $upstream_http_x_check_type;
                    set $unique_id $upstream_http_x_unique_id;
                    set $target_ip $upstream_http_x_target_ip;
		    recursive_error_pages on;
		    error_page 500 =500 /pages/error.html;
		    return 500;
		}

	location /redirects/notfound/ {
		    internal;
		    set $action "notfound";
                    set $check_type $upstream_http_x_check_type;
                    set $unique_id $upstream_http_x_unique_id;
                    set $target_ip $upstream_http_x_target_ip;
		    recursive_error_pages on;
		    error_page 404 =404 /pages/notfound.html;
		    return 404;
		}

	location /redirects/config/ {
		    internal;
		    set $action "config";
                    set $check_type $upstream_http_x_check_type;
                    set $unique_id $upstream_http_x_unique_id;
                    set $target_ip $upstream_http_x_target_ip;
		    recursive_error_pages on;
		    error_page 500 =500 /pages/config.html;
		    return 500;
		}

	location /redirects/proxy/ {
		    internal;
		    set $action		"proxy";
                    set $check_type     $upstream_http_x_check_type;
                    set $unique_id      $upstream_http_x_unique_id;
                    set $target_ip      $upstream_http_x_target_ip;
		    proxy_pass		http://$host$request_uri;
		    proxy_buffering	off;
		    proxy_cache		off;
		    proxy_set_header	Host $host;
		    proxy_http_version	1.1;
		}

	location @check {
		    set $action		"error";
                    set $check_type     "api";
                    set $unique_id      "${pid}-${connection}-${msec}";
                    set $target_ip      "";
                    proxy_pass          http://api-proxy.cyberfilter.ru$request_uri;
                    proxy_buffering     off;
                    proxy_cache         off;
                    proxy_set_header    Host $host;
                    proxy_set_header    X-Real-IP $remote_addr;
                    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header    X-Request-Id $unique_id;

                    proxy_set_header    Content-Length "";
                    proxy_pass_request_body off;
                }
        }

Конфигурация дополнительного (для запросов на сети с полной блокировкой и порты отличные от HTTP/HTTPS) виртуального сервера:

server {
        listen 0.0.0.0:9000;
        server_name ~^.*$;

        access_log /var/log/nginx/block_access_log main;
        error_log /var/log/nginx/block_error_log warn;

        root /var/www/cyberfilter;

        error_page 404 = @block;

        location / {
                internal;
                recursive_error_pages on;
                }

        location @block {
                set $action         "block";
                set $check_type     "network";
                set $unique_id      "${pid}-${connection}-${msec}";
                set $target_ip      "";
		
                error_page 503 =503 /pages/block.html;
                return 503;
		}
        }

Дополнительное логирование:

log_format main
	'$remote_addr - $remote_user [$time_local] '
	'"$unique_id" "$check_type" "$action" "$target_ip" '
	'"$host" "$request" $status $bytes_sent '
	'"$http_referer" "$http_user_agent" '
	'"$gzip_ratio"';

Далее необходимо в каталоге /var/www/cyberfilter/pages/ разместить страницы с сообщениями для пользователей:

  • block.html - водится при попытке доступа на запрещенный ресурс
  • config.html - выводится если обнаружены ошибки конфигурации
  • denied.html - выводится если доступ запрещен
  • error.html - выводится при возникновении ошибок
  • notfound.html - выводится, если запрашиваемый ресурс не найден в DNS

Архив с настройками и со страницами сообщений: proxy_config.tgz
Готовый RPM nginx 1.10.3 для CentOS7 с поддержкой lua и headers_more: nginx-1.10.3-1.el7.centos.ngx.x86_64.rpm

Настройка sniproxy

Внимание: для корректной работы sniproxy (фильтрация HTTPS) необходимо, чтобы использовался механизм DNS RPZ. Системный DNS резолвер ДОЛЖЕН использовать DNS сервер с включенным механизмом DNS RPZ. Так же необходимо, чтобы на sniproxy был наложен патч. Рекомендуемая версия sniproxy - 0.3.6

user nobody

pidfile /run/sniproxy.pid

error_log {
    filename /var/log/sniproxy/error.log
    priority debug
}

listen SERVER_IP:443 {
    proto tls

    access_log {
        filename /var/log/sniproxy/access.log
        priority debug
    }
}

table {
    .*  *:443
}

SERVER_IP - IP адрес proxy сервера, на который производится перенаправление через DNS RPZ.

Если нужно полностью пропускать youtube.com и youtu.be, то секция table должна быть следующей:

table {
    # Исключение для youtube.com и youtu.be
    ^youtube\.com$        youtube.com.proxy.cyberfilter.ru:443
    ^www\.youtube\.com$   www.youtube.com.proxy.cyberfilter.ru:443
    ^youtu\.be$           youtu.be.proxy.cyberfilter.ru:443

    .*  *:443
}

Репозитарий (GIT) sniproxy: https://github.com/dlundquist/sniproxy
Патч: sniproxy-0.3.6-cyberfilter.patch.gz
Конфиг: sniproxy.conf.gz

Готовый ebuild для Gentoo Linux: sniproxy-0.3.6-r1.ebuild.tgz (USE=«cyberfilter»)
Готовый RPM для CentOS7: sniproxy-0.3.6-1.el7.centos.x86_64.rpm и необходимый для него udns: udns-0.4-3.el7.x86_64.rpm

setup_proxy.txt · Последние изменения: 13.02.2017 18:01 — phantom