diff --git a/blockcheck.sh b/blockcheck.sh index 6af68ef..0fbc4da 100755 --- a/blockcheck.sh +++ b/blockcheck.sh @@ -340,7 +340,7 @@ pktws_ipt_prepare() IPT OUTPUT -p tcp --dport $1 -m conntrack --ctstate INVALID -j ACCEPT if [ "$IPV" = 6 -a -n "$IP6_DEFRAG_DISABLE" ]; then # the only way to reliable disable ipv6 defrag. works only in 4.16+ kernels - IPT OUTPUT -t raw -p tcp --dport $1 -j CT --notrack + IPT OUTPUT -t raw -p tcp -m frag -j CT --notrack elif [ "$IPV" = 4 ]; then # enable fragments IPT OUTPUT -f -j ACCEPT @@ -363,7 +363,7 @@ pktws_ipt_unprepare() IPT_DEL INPUT -p tcp --sport $1 ! --syn -j ACCEPT IPT_DEL OUTPUT -p tcp --dport $1 -m conntrack --ctstate INVALID -j ACCEPT if [ "$IPV" = 6 -a -n "$IP6_DEFRAG_DISABLE" ]; then - IPT_DEL OUTPUT -t raw -p tcp --dport $1 -j CT --notrack + IPT_DEL OUTPUT -t raw -p tcp -m frag -j CT --notrack elif [ "$IPV" = 4 ]; then IPT_DEL OUTPUT -f -j ACCEPT fi diff --git a/docs/readme.eng.md b/docs/readme.eng.md index c6836bc..8ca95b3 100644 --- a/docs/readme.eng.md +++ b/docs/readme.eng.md @@ -248,6 +248,7 @@ walk through the extension header chain until transport header is found. `hopbyhop`, `destopt`, `ipfrag1` modes can be used with any second phase mode except `ipfrag1+ipfrag2`. For example, `hopbyhop,split2` means split original tcp packet into 2 pieces and add hop-by-hop header to both. With `hopbyhop,ipfrag2` header sequence will be : `ipv6,hop-by-hop,fragment,tcp/udp`. +`ipfrag1` mode may not always work without special preparations. See "IP Fragmentation" notices. There are DPIs that analyze responses from the server, particularly the certificate from the ServerHello that contain domain name(s). The ClientHello delivery confirmation is an ACK packet from the server @@ -424,6 +425,8 @@ Sometimes it works, sometimes system defragments packets. Looks like kernels <4.16 have no simple way to solve this problem. Unloading of nf_conntrack module and its dependency nf_defrag_ipv6 helps but this severely impacts functionality. Kernels 4.16+ exclude from defragmentation untracked packets. +Sometimes it's required to load `ip6table_raw` kernel module with parameter raw_before_defrag=1. +In openwrt module parameters are specified after module names separated by space in files located in `/etc/modules.d` See `blockcheck.sh` code for example. diff --git a/docs/readme.txt b/docs/readme.txt index ed3cb15..ad71762 100644 --- a/docs/readme.txt +++ b/docs/readme.txt @@ -304,6 +304,7 @@ extension хедерам в поисках транспортного хедер Может сочетаться с любыми режимами 2-й фазы, кроме варианта "ipfrag1+ipfrag2". Например, "hopbyhop,split2" означает разбить tcp пакет на 2 сегмента, в каждый из них добавить hop-by-hop. При "hopbyhop,ipfrag2" последовательность хедеров будет : ipv6,hop-by-hop,fragment,tcp/udp. +Режим "ipfrag1" может срабатывать не всегда без специальной подготовки. См. раздел "IP фрагментация". Есть DPI, которые анализируют ответы от сервера, в частности сертификат из ServerHello, где прописаны домены. Подтверждением доставки ClientHello является ACK пакет от сервера с номером ACK sequence, соответствующим длине ClientHello+1. @@ -460,6 +461,8 @@ ipv6 : Нет способа для приложения гарантирова Для ядер <4.16 похоже, что нет иного способа решить эту проблему, кроме как выгрузить модуль nf_conntrack, который подтягивает зависимость nf_defrag_ipv6. Он то как раз и выполняет дефрагментацию. Для ядер 4.16+ ситуация чуть лучше. Из дефрагментации исключаются пакеты в состоянии NOTRACK. +Иногда требуется подгружать модуль ip6table_raw с параметром raw_before_defrag=1. +В openwrt параметры модулей указываются через пробел после их названий в файлах /etc/modules.d. Чтобы не загромождать описание, смотрите пример решения этой проблемы в blockcheck.sh.