bol-van / zapret

DPI bypass multi platform
5.97k stars 519 forks source link

Обход блокировки OpenVPN UDP. #153

Closed ghost closed 1 year ago

ghost commented 1 year ago

Здравствуйте, заранее хочу предупредить, что я не аз по Linux и сетевой матчасти, поэтому могу допускать ошибки, в таком случае зараннее извиняюсь. В общем, проблема заключается в том, что мой провайдер похоже пытается блокировать OpenVPN UDP протокол на мой личный VPS. Поначалу у меня всё было хорошо, пока не понадобилось сделать рестарт OpenVPN сервера на стороне VPS. Однако после этой процедуры начались проблемы. Симптомы такие, соединение успешно устанавливается, однако после прохождения пары пакетов (например, 5-6 пакетов ICMP echo на 8.8.8.8) коннект внутри туннеля пропадает вовсе, как буд-то бы VPS по какой-то причине перестал подключаться к Интернету, хотя при этом коннект на OpenVPN сервер остаётся активным, со временем это проходит и пакеты опять могут идти внутрь туннеля, но потом опять происходит пропадание сети внутри туннеля после пары пакетов, и так по кругу. Если выключить OpenVPN на стороне роутера - то всё нормально, даже SSH на мой VPS успешно устанавливается. Поэтому мне нужна ваша помощь и хотелось бы получить ответы на пару вопросов: 1)С какими командами мне запускать nfqws, дабы обойти эту блокировку? 2)Обход надо на какой стороне делать? На стороне только сервера, только клиента или на обоих? Роутер на OpenWRT, поэтому возможность как-нибудь сделать обход на стороне клиента есть.

ghost commented 1 year ago

Спустя день всё прошло, я не могу понять, что именно такое было, поэтому дальнейшее расследование этого инцидента пока не имеет смысла, так что я закрываю этот issue.

bol-van commented 1 year ago

Операторы хаотично то включают, то выключают блокировку VPN. Видимо, чтобы приучить народ к ненадежности, чтобы слезали. Пока прямого правового основания нет, но может подтянется бешенный принтер осенью. Может поэтому пока не постоянно.

Я обхожу на телеге так : iptables -A OUTPUT -t mangle -o wan0 -p udp --dport 4646 -m mark ! --mark 0x40000000/0x40000000 -j NFQUEUE --queue-num 220 --queue-bypass nfqws --uid 2 --qnum=220 --dpi-desync=fake --dpi-desync-any-protocol --dpi-desync-cutoff=d2 --dpi-desync-repeats=10 --dpi-desync-ttl=9 --daemon

4646 - это порт openvpn сервера. wan0 - исходящий в инет интерфейс --dpi-desync-ttl = это хоп, на котором сидит DPI. подбирать индивидуально из минимально возможного, пока еще работает обход только с клиента

ghost commented 11 months ago

@bol-van Спасибо за консультацию, попробую эти параметры, когда блокировка OpenVPN вернётся. Единственный только вопрос, а есть вариант 1-ой команды для nftables?

bol-van commented 11 months ago

Команды то я могу дать, но надо понимать как и куда их прикручивать, заодно не сломав логику конкретной системы (openwrt, debian , ..._. В общем случае есть iptables-translate, он переведет базовую конструкцию в nft, но nft еще требует создания таблицы или надо помещать в уже имеющуюся таблицу. И если есть система управления фаерволом, то надо понимать как прикрутиться к ней. В openwrt можно использовать /etc/nftables.d . Тогда релоады и рестарты fw4 не будут портить когда-то неуклюже засунутые nft из, например, /etc/rc.local (rc.local - плохое решение). Из nftables.d правила попадают в собственную таблицу fw4, которая называется одноименно. Там есть закоментированные примеры. Если понимать хотя бы базис nftables, можно легко прикрутить результат iptables-translate

Можно, конечно, создать и собственную таблицу отдельно. Благо, fw4 не будет уничтожать весь ruleset, ограничиваясь лишь таблицей fw4. zapret создает свою таблицу.

Все это касается лишь прикрутки в ручном режиме. Если используются скрипты zapret, то предпочтительно использование custom scripts

samvova commented 2 weeks ago

А TCP?

bol-van commented 2 weeks ago

тор по ип заблочен Валдик делал питоновскую прогу для сканирования релеев некоторые ,которые еще не успели блокнуть, можно использовать как мосты

samvova commented 2 weeks ago

тор по ип заблочен Валдик делал питоновскую прогу для сканирования релеев некоторые ,которые еще не успели блокнуть, можно использовать как мосты

T Cи P :) есть идеи как обойти блокировку openvpn работающую по TCP. ростелек FIN присылает где то через 10 секунд после начала сессии.

и еще. не могут понять почему это правило не работает

nft 'add rule ip mangle output oifname { "pppoe-wan", "eth0.2"} tcp dport { 4433 } mark and 0x40000000 != 0x40000000 counter queue num 220 bypass' в него пакеты не попадают. целый день думаю

bol-van commented 2 weeks ago

кусок нфт без таблицы и цепочки неинформативен на счет tcp desync any protocol и ограничитель по connbytes или cutoff и пробовать разные стратегии фейки разные, косящие под иные протоколы seqovl

samvova commented 1 week ago

кусок нфт без таблицы и цепочки неинформативен

да кроме nfqws и штатных правил openwrt ничего не стоит

nft list ruleset

``` table inet fw4 { chain input { type filter hook input priority filter; policy drop; iifname "lo" accept comment "!fw4: Accept traffic from loopback" ct state established,related accept comment "!fw4: Allow inbound established and related flows" tcp flags syn / fin,syn,rst,ack jump syn_flood comment "!fw4: Rate limit TCP syn packets" iifname "br-lan" jump input_lan comment "!fw4: Handle lan IPv4/IPv6 input traffic" iifname { "eth0.2", "pppoe-wan" } jump input_wan comment "!fw4: Handle wan IPv4/IPv6 input traffic" jump handle_reject } chain forward { type filter hook forward priority filter; policy drop; ct state established,related accept comment "!fw4: Allow forwarded established and related flows" iifname "br-lan" jump forward_lan comment "!fw4: Handle lan IPv4/IPv6 forward traffic" iifname { "eth0.2", "pppoe-wan" } jump forward_wan comment "!fw4: Handle wan IPv4/IPv6 forward traffic" jump handle_reject } chain output { type filter hook output priority filter; policy accept; oifname "lo" accept comment "!fw4: Accept traffic towards loopback" ct state established,related accept comment "!fw4: Allow outbound established and related flows" oifname "br-lan" jump output_lan comment "!fw4: Handle lan IPv4/IPv6 output traffic" oifname { "eth0.2", "pppoe-wan" } jump output_wan comment "!fw4: Handle wan IPv4/IPv6 output traffic" } chain prerouting { type filter hook prerouting priority filter; policy accept; iifname "br-lan" jump helper_lan comment "!fw4: Handle lan IPv4/IPv6 helper assignment" } chain handle_reject { meta l4proto tcp reject with tcp reset comment "!fw4: Reject TCP traffic" reject comment "!fw4: Reject any other traffic" } chain syn_flood { limit rate 25/second burst 50 packets return comment "!fw4: Accept SYN packets below rate-limit" drop comment "!fw4: Drop excess packets" } chain input_lan { jump accept_from_lan } chain output_lan { jump accept_to_lan } chain forward_lan { jump accept_to_wan comment "!fw4: Accept lan to wan forwarding" jump accept_to_lan } chain helper_lan { } chain accept_from_lan { iifname "br-lan" counter packets 18760 bytes 1405514 accept comment "!fw4: accept lan IPv4/IPv6 traffic" } chain accept_to_lan { oifname "br-lan" counter packets 13909 bytes 1032108 accept comment "!fw4: accept lan IPv4/IPv6 traffic" } chain input_wan { meta nfproto ipv4 udp dport 68 counter packets 0 bytes 0 accept comment "!fw4: Allow-DHCP-Renew" icmp type echo-request counter packets 3665 bytes 248376 accept comment "!fw4: Allow-Ping" meta nfproto ipv4 meta l4proto igmp counter packets 2698 bytes 86336 accept comment "!fw4: Allow-IGMP" meta nfproto ipv6 udp dport 546 counter packets 0 bytes 0 accept comment "!fw4: Allow-DHCPv6" ip6 saddr fe80::/10 icmpv6 type . icmpv6 code { mld-listener-query . no-route, mld-listener-report . no-route, mld-listener-done . no-route, mld2-listener-report . no-route } counter packets 0 bytes 0 accept comment "!fw4: Allow-MLD" icmpv6 type { destination-unreachable, time-exceeded, echo-request, echo-reply, nd-router-solicit, nd-router-advert } limit rate 1000/second counter packets 66 bytes 6864 accept comment "!fw4: Allow-ICMPv6-Input" icmpv6 type . icmpv6 code { packet-too-big . no-route, parameter-problem . no-route, nd-neighbor-solicit . no-route, nd-neighbor-advert . no-route, parameter-problem . admin-prohibited } limit rate 1000/second counter packets 0 bytes 0 accept comment "!fw4: Allow-ICMPv6-Input" jump reject_from_wan } chain output_wan { jump accept_to_wan } chain forward_wan { icmpv6 type { destination-unreachable, time-exceeded, echo-request, echo-reply } limit rate 1000/second counter packets 0 bytes 0 accept comment "!fw4: Allow-ICMPv6-Forward" icmpv6 type . icmpv6 code { packet-too-big . no-route, parameter-problem . no-route, parameter-problem . admin-prohibited } limit rate 1000/second counter packets 0 bytes 0 accept comment "!fw4: Allow-ICMPv6-Forward" meta l4proto esp counter packets 0 bytes 0 jump accept_to_lan comment "!fw4: Allow-IPSec-ESP" udp dport 500 counter packets 0 bytes 0 jump accept_to_lan comment "!fw4: Allow-ISAKMP" jump reject_to_wan } chain accept_to_wan { meta nfproto ipv4 oifname { "eth0.2", "pppoe-wan" } ct state invalid counter packets 3650 bytes 163428 drop comment "!fw4: Prevent NAT leakage" oifname { "eth0.2", "pppoe-wan" } counter packets 38378 bytes 6046292 accept comment "!fw4: accept wan IPv4/IPv6 traffic" } chain reject_from_wan { iifname { "eth0.2", "pppoe-wan" } counter packets 28209 bytes 2006843 jump handle_reject comment "!fw4: reject wan IPv4/IPv6 traffic" } chain reject_to_wan { oifname { "eth0.2", "pppoe-wan" } counter packets 0 bytes 0 jump handle_reject comment "!fw4: reject wan IPv4/IPv6 traffic" } chain dstnat { type nat hook prerouting priority dstnat; policy accept; } chain srcnat { type nat hook postrouting priority srcnat; policy accept; oifname { "eth0.2", "pppoe-wan" } jump srcnat_wan comment "!fw4: Handle wan IPv4/IPv6 srcnat traffic" } chain srcnat_wan { meta nfproto ipv4 masquerade comment "!fw4: Masquerade IPv4 wan traffic" } chain raw_prerouting { type filter hook prerouting priority raw; policy accept; } chain raw_output { type filter hook output priority raw; policy accept; } chain mangle_prerouting { type filter hook prerouting priority mangle; policy accept; } chain mangle_postrouting { type filter hook postrouting priority mangle; policy accept; } chain mangle_input { type filter hook input priority mangle; policy accept; } chain mangle_output { type route hook output priority mangle; policy accept; } chain mangle_forward { type filter hook forward priority mangle; policy accept; iifname { "eth0.2", "pppoe-wan" } tcp flags syn tcp option maxseg size set rt mtu comment "!fw4: Zone wan IPv4/IPv6 ingress MTU fixing" oifname { "eth0.2", "pppoe-wan" } tcp flags syn tcp option maxseg size set rt mtu comment "!fw4: Zone wan IPv4/IPv6 egress MTU fixing" } } table inet zapret { set zapret { type ipv4_addr policy memory size 522288 flags interval auto-merge } set ipban { type ipv4_addr policy memory size 522288 flags interval auto-merge } set nozapret { type ipv4_addr policy memory size 65536 flags interval auto-merge elements = { 10.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.168.0.0/16 } } set lanif { type ifname elements = { "br-lan" } } set wanif { type ifname elements = { "pppoe-wan" } } set wanif6 { type ifname } map link_local { type ifname : ipv6_addr } chain dnat_output { type nat hook output priority -101; policy accept; } chain dnat_pre { type nat hook prerouting priority dstnat - 1; policy accept; } chain forward { type filter hook forward priority filter - 1; policy accept; } chain input { type filter hook input priority filter - 1; policy accept; iif != "lo" jump localnet_protect } chain flow_offload { tcp dport { 80, 443 } ct original packets 1-6 ip daddr != @nozapret return comment "direct flow offloading exemption" udp dport 443 ct original packets 1-6 ip daddr != @nozapret return comment "direct flow offloading exemption" } chain localnet_protect { ip daddr 127.0.0.127 return comment "route_localnet allow access to tpws" ip daddr 127.0.0.0/8 drop comment "route_localnet remote access protection" } chain postrouting { type filter hook postrouting priority srcnat - 1; policy accept; } chain postnat { type filter hook postrouting priority srcnat + 1; policy accept; oifname @wanif tcp dport { 80, 443 } ct original packets 1-6 meta mark & 0x40000000 == 0x00000000 ip daddr != @nozapret meta mark set meta mark | 0x20000000 queue flags bypass to 200 oifname @wanif udp dport 443 ct original packets 1-6 meta mark & 0x40000000 == 0x00000000 ip daddr != @nozapret meta mark set meta mark | 0x20000000 queue flags bypass to 210 } chain prerouting { type filter hook prerouting priority dstnat + 1; policy accept; } chain prenat { type filter hook prerouting priority dstnat - 1; policy accept; iifname @wanif tcp sport { 80, 443 } ct reply packets 1 ip saddr != @nozapret queue flags bypass to 200 } chain predefrag { type filter hook output priority -401; policy accept; meta mark & 0x40000000 != 0x00000000 jump predefrag_nfqws comment "nfqws generated : avoid drop by INVALID conntrack state" } chain predefrag_nfqws { meta mark & 0x20000000 != 0x00000000 notrack comment "postnat traffic" ip frag-off != 0 notrack comment "ipfrag" exthdr frag exists notrack comment "ipfrag" tcp flags ! syn,rst,ack notrack comment "datanoack" } } table ip mangle { chain output { type filter hook output priority filter; policy accept; oifname { "eth0.2", "pppoe-wan" } tcp dport 4433 meta mark & 0x40000000 != 0x40000000 counter packets 0 bytes 0 queue flags bypass to 220 } } ```

bol-van commented 1 week ago

nfqueue дважды не работает в таблице zapret есть свое правило если пишем свои таблес, zapret scripts надо убирать

samvova commented 1 week ago

nfqueue дважды не работает в таблице zapret есть свое правило если пишем свои таблес, zapret scripts надо убирать

возможно я не понял ответ. но ведь я другую очередь "бронирую" для другого порта - с правилами zapret пересечений нет никаких

этот трафик не проходил через очередь zapreta

bol-van commented 1 week ago

не заметил, что порт 4443 если бы был 1 фильтр, то дважды бы не вышло запихать в очередь

output работает доя исходящих с самой системы соединений vpn клиент на роутере ? используется ipv4 ? nfqws с --debug молчит ?

samvova commented 1 week ago

vpn клиент на роутере ?

нет, в локалке, подключенной к данному роутеру . неужели этот трафик по другому обслуживается? я был уверен , что хук "output" это общий выход

используется ipv4 ?

да

nfqws с --debug молчит ?

да, ничего интересного . дело в правиле, похоже Я даже у всех доступных ИИ спрашивал этот вопрос. они ответили, что такое правило должно работать. даже им полный конфиг высылал.

Кстати, откуда это аббревиатура nfqws - net filter quueu w(?) service ?

Debug

``` root@OpenWrt:~# /opt/zapret/nfq/nfqws --qnum=220 --dpi-desync=fake --dpi-desync-any-protocol --dpi-desync-cutoff=d2 --dpi-desync-repeats=10 --dpi-desync-ttl=9 --pidfile /var/run/vp nnfqws.pid --debug initializing conntrack with timeouts tcp=60:300:60 udp=60 opening library handle unbinding existing nf_queue handler for AF_INET (if any) binding nfnetlink_queue as nf_queue handler for AF_INET binding this socket to queue '220' setting copy_packet mode initializing raw sockets bind-fix4=0 bind-fix6=0 set_socket_buffers fd=4 rcvbuf=2048 sndbuf=32768 fd=4 SO_RCVBUF=4096 fd=4 SO_SNDBUF=65536 set_socket_buffers fd=5 rcvbuf=2048 sndbuf=32768 fd=5 SO_RCVBUF=4096 fd=5 SO_SNDBUF=65536 Running as UID=2147483647 GID=2147483647 set_socket_buffers fd=3 rcvbuf=65536 sndbuf=32768 fd=3 SO_RCVBUF=131072 fd=3 SO_SNDBUF=65536 ```

bol-van commented 1 week ago

нет, в локалке, подключенной к данному роутеру

тогда разберитесь какие есть хуки в нетфильтре и чем отличается оутпут от форвард