Работает довольно не плохо. Есть конечно проблемы например с банк-клиентом Сбербанка. Пока только смог решить это дело исключив комп из 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.
В принципе на этом все.