Это старая версия документа!
Настройка 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 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 (например, раз в час).
# Перенаправлять HTTP трафик для сетей из списка полной блокировки на отдельный виртуальный сервер iptables -t nat -A PREROUTING -i eth0 -m set --match-set BLOCK-IP dst -p tcp --dport 80 -j REDIRECT --to-port 8000 # Перенаправлять 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 8000 # Перенаправлять весь 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 dst -j REJECT # Пропускать весь транзитный трафик iptables -P FORWARD ACCEPT
Настройки 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:8000; server_name ~^.*$; access_log /var/log/nginx/block_access_log main; error_log /var/log/nginx/block_error_log debug; 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/ разместить страницы с сообщениями для пользователей:
Архив с настройками и со страницами сообщений: proxy_config.tgz
Внимание: для корректной работы 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-connection-loop-fix.patch.gz
Конфиг: sniproxy.conf.gz
Готовый ebuild для Gentoo Linux: sniproxy.ebuild.tgz