diff --git a/docs/readme.md b/docs/readme.md index 9f6813c..b283377 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -54,8 +54,8 @@ For english version refer to docs/readme.eng.txt Подробнее про DPI : - https://habr.com/ru/post/335436 - https://geneva.cs.umd.edu/papers/geneva_ccs19.pdf +* https://habr.com/ru/post/335436 +* https://geneva.cs.umd.edu/papers/geneva_ccs19.pdf Что сейчас происходит в России @@ -66,10 +66,13 @@ For english version refer to docs/readme.eng.txt Сейчас время простых iptables окончательно ушло. Везде активный DPI ТСПУ, но кое-где могут оставаться невыключенными дополнительные старые DPI из зоопарка. В этом случае приходится обходить сразу несколько DPI. + Все больше становится внереестровых блокировок, о которых вы узнаете только по факту недоступности чего-либо, в списках этого нет. + Применяются блокировки некоторых диапазонов ip адресов (автономный обход невозможен) и протоколов (VPN). + На некоторых диапазонах IP используется более строгий фильтр, распознающий попытки обмана через сегментацию. Должно быть это связано с некоторыми сервисами, которые пытаются таким образом обмануть DPI. @@ -128,6 +131,7 @@ tpws запускается под пользователем "tpws", для н tpws может использоваться в режиме socks proxy. В этом случае iptables не нужны, а нужно прописать socks в настройки программы (например, броузера), с которой будем обходить блокировки. + transparent proxy отличается от socks именно тем, что в варианте transparent настраивать клиентские программы не нужно. @@ -386,6 +390,7 @@ fakeknown отличается от fake тем, что применяется 2. поддельная 1-я часть пакета, поле данных заполнено нулями 3. 1-я часть пакета 4. поддельная 1-я часть пакета, поле данных заполнено нулями. отсылка 2-й раз. + Оригинальный пакет дропается всегда. Параметр --dpi-desync-split-pos позволяет указать байтовую позицию, на которой происходит разбивка. По умолчанию - 2. Если позиция больше длины пакета, позиция выбирается 1. Этой последовательностью для DPI максимально усложняется задача реконструкции начального сообщения, @@ -398,6 +403,7 @@ fakeknown отличается от fake тем, что применяется 2. 1-я часть пакета 3. поддельная 1-я часть пакета, поле данных заполнено нулями. отсылка 2-й раз. 4. 2-я часть пакета + Режим split2 отключает отправку поддельных частей. Он может быть использован как более быстрая альтернатива --wsize. @@ -497,8 +503,10 @@ mark нужен, чтобы сгенерированный поддельный В документации по geneva это называется "TCB turnaround". Попытка ввести DPI в заблуждение относительно ролей клиента и сервера. + !!! Поскольку режим нарушает работу NAT, техника может сработать только если между атакующим устройством и DPI нет NAT. Атака не сработает через NAT роутер, но может сработать с него. + Для реализации атаки в linux обязательно требуется отключить стандартное правило firewall, дропающее инвалидные пакеты в цепочке OUTPUT. Например : -A OUTPUT -m state --state INVALID -j DROP В openwrt можно отключить drop INVALID в OUTPUT и FORWARD через опцию в /etc/config/firewall : @@ -786,6 +794,7 @@ split-pos по умолчанию работает только на http и TLS когда сервер получил запрос и полностью вернул ответ. Значит запрос фактически был не только отослан, но и принят другой стороной, а следовательно буфер отсылки пуст, и следующие 2 send приведут к отсылке сегментов данных разными ip пакетами. + Резюме : tpws гарантирует сплит только за счет раздельных вызовов send, что на практике вполне достаточно для протоколов http(s). @@ -838,8 +847,8 @@ tpws поддерживает эту возможность асинхронно Если задан параметр "--no-resolve", то подключения по именам хостов запрещаются, а пул ресолверов не создается. Тем самым экономятся ресурсы. -Параметр --hostpad= добавляет паддинг-хедеров перед Host: на указанное количество байтов. -Если размер слишком большой, то идет разбивка на разные хедеры по 2K. +Параметр --hostpad=\ добавляет паддинг-хедеров перед Host: на указанное количество байтов. +Если размер \ слишком большой, то идет разбивка на разные хедеры по 2K. Общий буфер приема http запроса - 64K, больший паддинг не поддерживается, да и http сервера такое уже не принимают. Полезно против DPI, выполняющих реассемблинг TCP с ограниченным буфером. @@ -897,15 +906,17 @@ tpws поддерживает эту возможность асинхронно ------------------------------------------- !!! nftables не могут работать с ipset-ами. Собственный аналогичный механизм требует огромного количество RAM -!!! для загрузки больших листов. Например, для загона 100K записей в nfset не хватает даже 256 Mb. -!!! Если вам нужны большие листы на домашних роутерах, откатывайтесь на iptables+ipset. +для загрузки больших листов. Например, для загона 100K записей в nfset не хватает даже 256 Mb. +Если вам нужны большие листы на домашних роутерах, откатывайтесь на iptables+ipset. 1) Внесите заблокированные домены в ipset/zapret-hosts-user.txt и запустите ipset/get_user.sh + На выходе получите ipset/zapret-ip-user.txt с IP адресами. Cкрипты с названием get_reestr_* оперируют дампом реестра заблокированных сайтов : 2) ipset/get_reestr_resolve.sh получает список доменов от rublacklist и дальше их ресолвит в ip адреса + в файл ipset/zapret-ip.txt.gz. В этом списке есть готовые IP адреса, но судя во всему они там в точности в том виде, что вносит в реестр РосКомПозор. Адреса могут меняться, позор не успевает их обновлять, а провайдеры редко банят по IP : вместо этого они банят http запросы с "нехорошим" заголовком "Host:" вне зависимости @@ -995,11 +1006,13 @@ ip2net Утилита ip2net предназначена для преобразования ipv4 или ipv6 списка ip в список подсетей с целью сокращения размера списка. Входные данные берутся из stdin, выходные выдаются в stdout. +``` -4 ; лист - ipv4 (по умолчанию) -6 ; лист - ipv6 --prefix-length=min[-max] ; диапазон рассматриваемых длин префиксов. например : 22-30 (ipv4), 56-64 (ipv6) --v4-threshold=mul/div ; ipv4 : включать подсети, в которых заполнено по крайней мере mul/div адресов. например : 3/4 --v6-threshold=N ; ipv6 : минимальное количество ip для создания подсети +``` В списке могут присутствовать записи вида ip/prefix и ip1-ip2. Такие записи выкидываются в stdout без изменений. Они принимаются командой ipset. ipset умеет для листов hash:net из ip1-ip2 делать оптимальное покрытие ip/prefix. @@ -1013,21 +1026,27 @@ ip2net фильтрует входные данные, выкидывая неп Сначала в указанном диапазоне длин префиксов ищутся подсети, в которых количество адресов - максимально. Если таких сетей найдено несколько, берется наименьшая сеть (префикс больше). Например, заданы параметры v6_threshold=2 prefix_length=32-64, имеются следующие ipv6 : +``` 1234:5678:aaaa::5 1234:5678:aaaa::6 1234:5678:aaac::5 Результат будет : 1234:5678:aaa8::/45 +``` Эти адреса так же входят в подсеть /32. Однако, нет смысла проходиться ковровой бомбардировкой, когда те же самые адреса вполне влезают в /45 и их ровно столько же. Если изменить v6_threshold=4, то результат будет : +``` 1234:5678:aaaa::5 1234:5678:aaaa::6 1234:5678:aaac::5 +``` То есть ip не объединятся в подсеть, потому что их слишком мало. Если изменить prefix_length=56-64, результат будет : +``` 1234:5678:aaaa::/64 1234:5678:aaac::5 +``` Требуемое процессорное время для вычислений сильно зависит от ширины диапазона длин префиксов, размера искомых подсетей и длины листа. Если ip2net думает слишком долго, не используйте слишком большие подсети и уменьшите диапазон длин префиксов. @@ -1052,10 +1071,14 @@ ip2net фильтрует входные данные, выкидывая неп В системе запуска это обыграно следующим образом. Присутствуют 2 include списка : +``` ipset/zapret-hosts-users.txt.gz или ipset/zapret-hosts-users.txt ipset/zapret-hosts.txt.gz или ipset/zapret-hosts.txt +``` и 1 exclude список +``` ipset/zapret-hosts-users-exclude.txt.gz или ipset/zapret-hosts-users-exclude.txt +``` При режиме фильтрации MODE_FILTER=hostlist система запуска передает nfqws или tpws все листы, файлы которых присутствуют. Если вдруг листы include присутствуют, но все они пустые, то работа аналогична отсутствию include листа. @@ -1065,7 +1088,7 @@ ipset/zapret-hosts-users-exclude.txt.gz или ipset/zapret-hosts-users-exclude. Поддомены учитываются автоматически. Например, строчка "ru" вносит в список "*.ru". Строчка "*.ru" в списке не сработает. Список доменов РКН может быть получен скриптами ipset/get_reestr_hostlist.sh или ipset/get_antizapret_domains.sh -- кладется в ipset/zapret-hosts.txt.gz. +\- кладется в ipset/zapret-hosts.txt.gz. Чтобы обновить списки, перезапускать nfqws или tpws не нужно. Обновляете файлы, затем даете сигнал HUP. По HUP листы будут перечитаны. Если вдруг какого-то листа не окажется, процесс завершится с ошибкой. @@ -1399,8 +1422,10 @@ FLOWOFFLOAD=donttouch Можно индивидуально отключить ipv4 или ipv6. Если параметр закомментирован или не равен "1", использование протокола разрешено. +``` #DISABLE_IPV4=1 DISABLE_IPV6=1 +``` Количество потоков для многопоточного DNS ресолвера mdig (1..100). Чем их больше, тем быстрее, но не обидится ли на долбежку ваш DNS сервер ? @@ -1415,8 +1440,10 @@ TMPDIR=/opt/zapret/tmp Опции для создания ipset-ов и nfset-ов +``` SET_MAXELEM=262144 IPSET_OPT="hashsize 262144 maxelem 2097152" +``` Хук, позволяющий внести ip адреса динамически. $1 = имя таблицы Адреса выводятся в stdout. В случае nfset автоматически решается проблема возможного пересечения интервалов. @@ -1456,8 +1483,10 @@ GZIP_LISTS=1 На BSD системах с PF нет автоматической загрузки. Там нужно указать команду явно : pfctl -f /etc/pf.conf На более новых pfctl (есть в новых FreeBSD, нет в OpenBSD 6.8) можно дать команду загрузки только таблиц : pfctl -Tl -f /etc/pf.conf "-" означает отключение загрузки листов даже при наличии поддерживаемого backend. +``` #LISTS_RELOAD="pfctl -f /etc/pf.conf" #LISTS_RELOAD=- +``` В openwrt существует сеть по умолчанию 'lan'. Только трафик с этой сети будет перенаправлен на tpws. Но возможно задать другие сети или список сетей : @@ -1525,16 +1554,22 @@ nftables сводят практически на нет конфликты ме Посмотреть set-ы интерфейсов, относящихся к lan, wan и wan6. По ним идет завертывание трафика. А так же таблицу flow table с именами интерфейсов ingress hook. +``` /opt/zapret/init.d/sysv/zapret list_ifsets +``` Обновить set-ы интерфейсов, относящихся к lan, wan и wan6. Для традиционных linux список интерфейсов берется из переменных конфига IFACE_LAN, IFACE_WAN. Для openwrt определяется автоматически. Множество lanif может быть расширено параметром OPENWRT_LAN. Все интерфейсы lan и wan так же добавляются в ingress hook от flow table. +``` /opt/zapret/init.d/sysv/zapret reload_ifsets +``` Просмотр таблицы без содержимого set-ов. Вызывает nft -t list table inet zapret +``` /opt/zapret/init.d/sysv/zapret list_table +``` Так же возможно прицепиться своим скриптом к любой стадии применения и снятия фаервола со стороны zapret скриптов : @@ -1912,6 +1947,7 @@ vpn трафик или применить другие типы VPN, более VPS можно прибрести в множестве мест. Существуют специализированные на поиске предложений VPS порталы. Например, вот этот : https://vps.today/ + Для персонального VPN сервера обычно достаточно самой минимальной конфигурации, но с безлимитным трафиком или с большим лимитом по трафику (терабайты). Важен и тип VPS. Openvz подойдет для openvpn, но вы не поднимете на нем wireguard, ipsec, то есть все, что требует kernel mode.