Это старая версия документа!
Настройка 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.tar.gz, вписать в них 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 был наложен патч от зацикливания.
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