NGINX-DPI: разворачиваем в офисе

Работает довольно не плохо. Есть конечно проблемы например с банк-клиентом Сбербанка. Пока только смог решить это дело исключив комп из DPI. С OpenVPN тоже работает на ура.

Сперва настройте nginx-dpi по этой статье поскольку не охота перепечатывать старое.

ПРОКСИ СЕРВЕР

В качестве прокси будем использовать довольно шустрый hysteria.

wget https://go.dev/dl/go1.19.8.linux-amd64.tar.gz
tar xvvf go1.19.8.linux-amd64.tar.gz
mv go /usr/local/
ln -s /usr/local/go/bin/* /usr/bin/
git clone https://github.com/apernet/hysteria
cd hysteria
./build.sh
mkdir /usr/local/hysteria
mv build/hysteria-linux-amd64 /usr/local/hysteria/hysteria

Накидаем конфиг сервера в /usr/local/hysteria/server.json:

{
        "listen": ":<serverport>",
        "protocol": "faketcp",
        "cert": "/etc/letsencrypt/live/<yourdomain>/cert.pem",
        "key": "/etc/letsencrypt/live/<yourdomain>/privkey.pem",
        "up": "80 Mbps",
        "up_mbps": 80,
        "down": "80 Mbps",
        "down_mbps": 80,
        "disable_udp": false,
        "obfs": "<obfsphrase>",
        "auth": {
                "mode": "passwords",
                "config": ["<serverpassword>"]
        },
        "alpn": "<alpnphrase>",
        "recv_window_conn": 15728640,
        "recv_window_client": 67108864,
        "max_conn_client": 4096,
        "disable_mtu_discovery": false,
        "resolve_preference": "4",
        "bind_outbound": {
                "address": "<serverip>",
                "device": "<serverwaninterface>"
        }
}

Типичный скрипт /etc/systemd/system/hysteria-server.service:

[Unit]
Description=Hysteria Server Service for %I
After=network-online.target

[Service]
Type=simple
LimitNOFILE=32768
ExecStart=/usr/local/hysteria/hysteria server -c /usr/local/hysteria/server.json

[Install]
WantedBy=multi-user.target

ПРОКСИ КЛИЕНТ

Установка и запуск такие же как и у сервера. Отличие только в конфиге и в скрипте systemd, где вместо параметра server надо указать client ну и путь до client.json (все это в строке ExecStart).
Теперь накидаем конфиг /usr/local/hysteria/client.json:

{
        "server": "<serverip>:<serverport>",
        "protocol": "faketcp",
        "up": "80 Mbps",
        "up_mbps": 80,
        "down": "80 Mbps",
        "down_mbps": 80,
        "retry": 3,
        "retry_interval": 5,
        "quit_on_disconnect": false,
        "handshake_timeout": 10,
        "idle_timeout": 60,
        "hop_interval": 120,
        "socks5": {
                "listen": "0.0.0.0:1080",
                "timeout": 300,
                "disable_udp": false
        },
        "disable_udp": false,
        "obfs": "<obfsphrase>",
        "auth_str": "<serverpassword>",
        "alpn": "<alpnphrase>",
        "server_name": "<serverdomainaddress>",
        "insecure": true,
        "recv_window_conn": 15728640,
        "recv_window_client": 67108864,
        "disable_mtu_discovery": false,
        "fast_open": false,
        "lazy_start": false,
        "resolver": "udp://127.0.0.1:53",
        "resolve_preference": "4"
}

Дополнительную информацию по конфигурированию можно глянуть в официальной документации.

НАСТРОЙКА ОС

Прописывем следующие строки в /etc/sysctl.conf:

fs.file-max = 1048560
net.core.somaxconn = 65535
net.ipv4.tcp_fastopen = 1
net.ipv4.tcp_slow_start_after_idle = 0
vm.dirty_background_ratio = 3
vm.dirty_ratio = 6
vm.swappiness = 1
vm.vfs_cache_pressure = 100

net.ipv4.tcp_mem = 8388608 12582912 16777216
net.ipv4.udp_mem = 8388608 12582912 16777216
net.ipv4.udp_rmem_min = 16384
net.ipv4.udp_wmem_min = 16384
net.core.wmem_max = 8388608
net.core.rmem_max = 8388608
net.ipv4.tcp_rmem = 8192 87380 8388608
net.ipv4.tcp_wmem = 8192 87380 8388608
net.core.somaxconn = 300000
net.core.netdev_max_backlog = 8192
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_keepalive_time = 180
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 1000000
net.ipv4.ip_local_port_range = 1024 65535

net.netfilter.nf_conntrack_max = 491520

НАСТРОЙКА NGINX-DPI

В /usr/local/nginx-dpi/cfg/nginx.conf добавляем следующую строку:

worker_rlimit_nofile 16384;

Добавить нужно после строки "worker_processes auto".

УСТАНОВКА DNSPROXY

Вместо dotproxy из предыдущей статьи лучше установим dnsproxy поскольку он работает шустрее.

git clone https://github.com/AdguardTeam/dnsproxy
dnf install golang
go build -mod=vendor

Получвшийся бинарник переместите в /usr/local/bin и напишем скрипт systemd:

[Unit]
Description=Simple DNS proxy
After=network.target

[Service]
Type=simple
Restart=always
RestartSec=30
User=root
SyslogIdentifier=dnsproxy
ExecStart=/usr/local/bin/dnsproxy -l 0.0.0.0 -p 53 -u tls://8.8.8.8 -f tls://1.1.1.1 --cache --tls-min-version=1.3 --ipv6-disabled

[Install]
WantedBy=multi-user.target

Ложим скрипт в /etc/systemd/system, назовем dnsproxy.service и запускаем.

ПЕРЕСБОРКА ЯДРА

Поскольку будет очень много сокетов с состоянием TIMEWAIT надо повысить производительность tcp стека. У меня версия дистрибутива Rocky Linux 8.7, а версия ядра 4.18.0-425.13.1.el8_7.x86_64. Заодно обновим ядро до 5.16.9.

dnf -y groupinstall 'Development Tools'
dnf -y install ncurses-devel openssl-devel elfutils-libelf-devel python3
dnf config-manager --set-enabled powertools
dnf -y install dwarves
wget https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.16.9.tar.xz
tar xvvf linux-5.16.9.tar.xz
cd linux-5.16.9

Открываем файл include/net/tcp.h, находим строку "define TCP_TIMEWAIT_LEN (60*HZ)" и меняем значение 60 на 20 - это ускорит утилизацию сокетов в состоянии TIMEWAIT (не так хорошо как tw_recycle, но и без его багов).

cp -v /boot/config-$(uname -r) .config
make localmodconfig
make bzImage
make modules
make modules_install
make install
grub2-mkconfig -o /boot/grub2/grub.cfg
grubby --set-default /boot/vmlinuz-5.16.9

Перезагружаемся и заходим в настройки bios/uefi. Отключаем legacy boot и secure boot после чего можно загрузится в новое ядро.

Перенастраиваем dhcp сервер как в старой статье и готово.

НАСТРОЙКА OPENVPN НА ПРИМЕРЕ PFSENSE

Если есть пользовательский VPN, то для его работы через DPI необходимо создать отдельный gateway.
Идем в general->routes->gateways, создаем новый gateway, указываем ip-адрес dpi и назовем DPI_GW.
Идем в firewall->rules->openvpn и в качестве gateway указываем DPI_GW.
В принципе на этом все.

Показать комментарии