diff --git a/docs/bsd.md b/docs/bsd.md new file mode 100644 index 0000000..1f7414b --- /dev/null +++ b/docs/bsd.md @@ -0,0 +1,699 @@ +# Настройка BSD-подобных систем + + +## Поддерживаемые версии +**FreeBSD** 11.x+ , **OpenBSD** 6.x+, частично **MacOS Sierra** + + +> [!CAUTION] +> На более старых может собираться, может не собираться, может работать или не +> работать. На **FreeBSD** 10 собирается и работает `dvtws`. С `tpws` есть +> проблемы из-за слишком старой версии компилятора clang. Вероятно, будет +> работать, если обновить компилятор. Возможна прикрутка к последним версиям +> pfsense без веб интерфейса в ручном режиме через консоль. + + +## Особенности BSD систем +### Отсутствие nfqueue +В **BSD** нет `nfqueue`. Похожий механизм - divert sockets. Из каталога +[`nfq/`](../nfq/) под **BSD** собирается `dvtws` вместо `nfqws`. Он разделяет с +`nfqws` большую часть кода и почти совпадает по параметрам командной строки. + +### Типы Firewall +**FreeBSD** содержит 3 фаервола : **IPFilter**, **ipfw** и **Packet Filter (PF +в дальнейшем)**. **OpenBSD** содержит только **PF**. + +### Сборка +Под **FreeBSD** `tpws` и `dvtws` собираются через `make`. + +Под **OpenBSD**: +```sh +make bsd +``` + +Под **MacOS**: +```sh +make mac +``` + +**FreeBSD** make распознает BSDmakefile, **OpenBSD** и **MacOS** - нет. Поэтому +там используется отдельный target в Makefile. Сборка всех исходников: +```sh +make -C /opt/zapret +``` + +### Divert сокеты +Divert сокет это внутренний тип сокета ядра **BSD**. Он не привязывается ни к +какому сетевому адресу, не участвует в обмене данными через сеть и +идентифицируется по номеру порта `1..65535`. Аналогия с номером очереди +`NFQUEUE`. На divert сокеты заворачивается трафик посредством правил ipfw или +PF. Если в фаерволе есть правило divert, но на divert порту никто не слушает, +то пакеты дропаются. Это поведение аналогично правилам `NFQUEUE` без параметра +`--queue-bypass`. На **FreeBSD** divert сокеты могут быть только ipv4, хотя на +них принимаются и ipv4, и ipv6 фреймы. На **OpenBSD** divert сокеты создаются +отдельно для ipv4 и ipv6 и работают только с одной версией `ip` каждый. На +**MacOS** похоже, что divert сокеты из ядра вырезаны. См подробнее раздел про +**MacOS**. Отсылка в divert сокет работает аналогично отсылке через raw socket +на linux. Передается полностью IP фрейм, начиная с ip загловка. Эти особенности +учитываются в `dvtws`. + +### Lookup Tables +Скрипты [`ipset/*.sh`](../ipset/) при наличии ipfw работают с ipfw lookup +tables. Это прямой аналог ipset. lookup tables не разделены на v4 и v6. Они +могут содержать v4 и v6 адреса и подсети одновременно. Если ipfw отсутствует, +то действие зависит от переменной `LISTS_RELOAD` в config. Если она задана, то +выполняется команда из `LISTS_RELOAD`. В противном случае не делается ничего. +Если `LISTS_RELOAD=-`, то заполнение таблиц отключается даже при наличии ipfw. + +### PF с файла +PF может загружать ip таблицы из файла. Чтобы использовать эту возможность +следует отключить сжатие gzip для листов через параметр файла config: +`GZIP_LISTS=0`. + +### Отсутствие splice +**BSD** не содержит системного вызова splice. `tpws` работает через переброску +данных в user mode в оба конца. Это медленнее, но не критически. Управление +асинхронными сокетами в `tpws` основано на linux-specific механизме epoll. В +**BSD** для его эмуляции используется epoll-shim - прослойка для эмуляции epoll +на базе kqueue. + +### mdig, ip2net +mdig и ip2net полностью работоспособны в **BSD**. В них нет ничего +системо-зависимого. + + +## FreeBSD +### Подгрузка ipdivert +Divert сокеты требуют специального модуля ядра - `ipdivert`. + +- Поместите следующие строки в `/boot/loader.conf` (создать, если отсутствует): +``` +ipdivert_load="YES" +net.inet.ip.fw.default_to_accept=1 +``` + +`/etc/rc.conf`: +``` +firewall_enable="YES" +firewall_script="/etc/rc.firewall.my" +``` + +`/etc/rc.firewall.my`: +```sh +$ ipfw -q -f flush +``` + +### Авто-восстановление правил ipfw и работа в фоне +В `/etc/rc.firewall.my` можно дописывать правила ipfw, чтобы они +восстанавливались после перезагрузки. Оттуда же можно запускать и демоны +zapret, добавив в параметры `--daemon`. Например так: +```sh +$ pkill ^dvtws$ +$ /opt/zapret/nfq/dvtws --port=989 --daemon --dpi-desync=split2 +``` + +Для перезапуска фаервола и демонов достаточно будет сделать: +```sh +$ /etc/rc.d/ipfw restart +``` + +### tpws в прозрачном режиме +Краткая инструкция по запуску `tpws` в прозрачном режиме. + +> [!NOTE] +> Предполагается, что интерфейс LAN называется `em1`, WAN - `em0`. + +#### Весь трафик +```sh +$ ipfw delete 100 +$ ipfw add 100 fwd 127.0.0.1,988 tcp from me to any 80,443 proto ip4 xmit em0 not uid daemon +$ ipfw add 100 fwd ::1,988 tcp from me to any 80,443 proto ip6 xmit em0 not uid daemon +$ ipfw add 100 fwd 127.0.0.1,988 tcp from any to any 80,443 proto ip4 recv em1 +$ ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1 +$ /opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 +``` + +#### Трафик только на таблицу zapret +> За исключением таблицы nozapret + +```sh +$ ipfw delete 100 +$ ipfw add 100 allow tcp from me to table\(nozapret\) 80,443 +$ ipfw add 100 fwd 127.0.0.1,988 tcp from me to table\(zapret\) 80,443 proto ip4 xmit em0 not uid daemon +$ ipfw add 100 fwd ::1,988 tcp from me to table\(zapret\) 80,443 proto ip6 xmit em0 not uid daemon +$ ipfw add 100 allow tcp from any to table\(nozapret\) 80,443 recv em1 +$ ipfw add 100 fwd 127.0.0.1,988 tcp from any to any 80,443 proto ip4 recv em1 +$ ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1 +$ /opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 +``` + +> [!NOTE] +> Таблицы zapret, nozapret, ipban создаются скриптами из ipset по аналогии с +> Linux. Обновление скриптов можно забить в cron под root: +> ```sh +> $ crontab -e +> ``` +> +> ``` +> <...> +> 0 12 */2 * * /opt/zapret/ipset/get_config.sh +> ``` + +> [!CAUTION] +> При использовании ipfw `tpws` не требует повышенных привилегий для реализации +> прозрачного режима. Однако, без рута невозможен бинд на порты `< 1024` и +> смена UID/GID. Без смены UID будет рекурсия, поэтому правила ipfw нужно +> создавать с учетом UID, под которым работает `tpws`. Переадресация на порты +> `>= 1024` может создать угрозу перехвата трафика непривилегированным +> процессом, если вдруг `tpws` не запущен. + + +### Запуск dvtws + +#### Весь трафик +```sh +$ ipfw delete 100 +$ ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted xmit em0 +# required for autottl mode only +$ ipfw add 100 divert 989 tcp from any 80,443 to any tcpflags syn,ack in not diverted recv em0 +$ /opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2 +``` + +#### Трафик только на таблицу zapret +> За исключением таблицы nozapret + +```sh +$ ipfw delete 100 +$ ipfw add 100 allow tcp from me to table\(nozapret\) 80,443 +$ ipfw add 100 divert 989 tcp from any to table\(zapret\) 80,443 out not diverted not sockarg xmit em0 +# required for autottl mode only +$ ipfw add 100 divert 989 tcp from table\(zapret\) 80,443 to any tcpflags syn,ack in not diverted not sockarg recv em0 +$ /opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2 +``` + + +### PF в FreeBSD +Настройка аналогична **OpenBSD**, но есть важные нюансы. + +- В **FreeBSD** поддержка PF в `tpws` отключена по умолчанию. Чтобы ее + включить, нужно использовать параметр `--enable-pf`. +- Нельзя сделать ipv6 rdr на `::1`. Нужно делать на link-local адрес входящего + интерфейса. Смотрите через `ifconfig` адрес `fe80:...` и добавляете в правило. +- Синтаксис `pf.conf` немного отличается. Более новая версия PF. +- Лимит на количество элементов таблиц задается так: + ```sh + $ sysctl net.pf.request_maxcount=2000000 + ``` +- Сломан divert-to. Он работает, но не работает механизм предотвращения + зацикливаний. Кто-то уже написал патч, но в `14-RELEASE` проблема все еще + есть. Следовательно, на данный момент работа `dvtws` через PF невозможна. + + `/etc/pf.conf`: + ``` + rdr pass on em1 inet6 proto tcp to port {80,443} -> fe80::31c:29ff:dee2:1c4d port 988 + rdr pass on em1 inet proto tcp to port {80,443} -> 127.0.0.1 port 988 + ``` + + ```sh + $ /opt/zapret/tpws/tpws --port=988 --enable-pf --bind-addr=127.0.0.1 --bind-iface6=em1 --bind-linklocal=force + ``` + + > В PF непонятно как делать rdr-to с той же системы, где работает proxy. + > Вариант с route-to у меня не заработал. + + +### pfsense + +#### Что это +pfsense основан на **FreeBSD** и использует фаервол PF, имеющий проблемы с +divert. К счастью, модули ipfw и ipdivert присутствуют в поставке последних +версий pfsense. Их можно подгрузить через `kldload`. + +#### Особенности +В некоторых более старых версиях pfsense требуется изменить порядок фаерволов +через `sysctl`, сделав ipfw первым. В более новых эти параметры `sysctl` +отсутствуют, но система работает как надо и без них. В некоторых случаях +фаервол PF может ограничивать возможности `dvtws`, в частности в области +фрагментации ip. + +#### Исполняемые файлы +Присутствуют по умолчанию правила scrub для реассемблинга фрагментов. Бинарики +из [`binaries/freebsd-x64`](../binaries/freebsd-x64) собраны под **FreeBSD +11**. Они должны работать и на последующих версиях **FreeBSD**, включая +pfsense. Можно пользоваться `install_bin.sh`. + +#### Автозапуск +Пример скрипта автозапуска лежит в [`init.d/pfsense`](../init.d/pfsense). Его +следует поместить в `/usr/local/etc/rc.d` и отредактировать на предмет правил +ipfw и запуска демонов. Есть встроенный редактор `edit` как более приемлемая +альтернатива `vi`. + +> [!NOTE] +> Поскольку `git` отсутствует, копировать файлы удобнее всего через `ssh`. +> `curl` присутствует по умолчанию. Можно скопировать zip с файлами zapret и +> распаковать в `/opt`, как это делается на других системах. Тогда `dvtws` +> нужно запускать как `/opt/zapret/nfq/dvtws`. Либо скопировать только `dvtws` +> в `/usr/local/sbin`. Как вам больше нравится. + +> [!NOTE] +> Скрипты ipset работают, крон есть. Можно сделать автообновление листов. + +> [!NOTE] +> Если вас напрягает бедность имеющегося репозитория, можно включить +> репозиторий от **FreeBSD**, который по умолчанию выключен. +> +> Поменяйте `no` на `yes` в `/usr/local/etc/pkg/repos/FreeBSD.conf` +> +> Можно установить весь привычный софт, включая `git`, чтобы напрямую скачивать +> zapret с github. + +`/usr/local/etc/rc.d/zapret.sh` (chmod `755`): +```sh +#!/bin/sh + +kldload ipfw +kldload ipdivert + +# for older pfsense versions. newer do not have these sysctls +sysctl net.inet.ip.pfil.outbound=ipfw,pf +sysctl net.inet.ip.pfil.inbound=ipfw,pf +sysctl net.inet6.ip6.pfil.outbound=ipfw,pf +sysctl net.inet6.ip6.pfil.inbound=ipfw,pf + +ipfw delete 100 +ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted xmit em0 +pkill ^dvtws$ +dvtws --daemon --port 989 --dpi-desync=split2 + +# required for newer pfsense versions (2.6.0 tested) to return ipfw to functional state +pfctl -d ; pfctl -e +``` + +#### Проблемы tpws +Что касается `tpws`, то видимо имеется некоторый конфликт двух фаерволов, и +правила fwd в ipfw не работают. Работает перенаправление средствами PF как +описано в разделе по **FreeBSD**. В PF можно изменять правила только целыми +блоками - якорями (anchors). Нельзя просто так добавить или удалить что-то. Но +чтобы какой-то anchor был обработан, на него должна быть ссылка из основного +набора правил. Его трогать нельзя, иначе порушится весь фаервол. Поэтому +придется править код скриптов pfsense. + +1. Поправьте `/etc/inc/filter.inc` следующим образом: +``` + <...> + /* MOD */ + $natrules .= "# ZAPRET redirection\n"; + $natrules .= "rdr-anchor \"zapret\"\n"; + + $natrules .= "# TFTP proxy\n"; + $natrules .= "rdr-anchor \"tftp-proxy/*\"\n"; + <...> +``` + +2. Напишите файл с содержимым anchor-а (например, `/etc/zapret.anchor`): +``` +rdr pass on em1 inet proto tcp to port {80,443} -> 127.0.0.1 port 988 +rdr pass on em1 inet6 proto tcp to port {80,443} -> fe80::20c:29ff:5ae3:4821 port 988 +``` + +`fe80::20c:29ff:5ae3:4821` замените на ваш link local адрес LAN интерфейса, +либо уберите строчку, если ipv6 не нужен. + +3. Добавьте в автозапуск `/usr/local/etc/rc.d/zapret.sh`: +```sh +$ pfctl -a zapret -f /etc/zapret.anchor +$ pkill ^tpws$ +$ tpws --daemon --port=988 --enable-pf --bind-addr=127.0.0.1 --bind-iface6=em1 --bind-linklocal=force --split-http-req=method --split-pos=2 +``` + +4. После перезагрузки проверьте, что правила создались: +```sh +$ pfctl -s nat +no nat proto carp all +nat-anchor "natearly/*" all +nat-anchor "natrules/*" all +<...> +no rdr proto carp all +rdr-anchor "zapret" all +rdr-anchor "tftp-proxy/*" all +rdr-anchor "miniupnpd" all + +$ pfctl -s nat -a zapret +rdr pass on em1 inet proto tcp from any to any port = http -> 127.0.0.1 port 988 +rdr pass on em1 inet proto tcp from any to any port = https -> 127.0.0.1 port 988 +rdr pass on em1 inet6 proto tcp from any to any port = http -> fe80::20c:29ff:5ae3:4821 port 988 +rdr pass on em1 inet6 proto tcp from any to any port = https -> fe80::20c:29ff:5ae3:4821 port 988 +``` + +> [!NOTE] +> Так же есть более элегантный способ запуска `tpws` через @reboot в cron и +> правило перенаправления в UI. Это позволит не редактировать код pfsense. + + +## OpenBSD + +### tpws бинд на ipv4 +В `tpws` бинд по умолчанию только на ipv6. для бинда на ipv4 указать +`--bind-addr=0.0.0.0` Используйте `--bind-addr=0.0.0.0 --bind-addr=::` для +достижения того же результата, как в других ОС по умолчанию. Но лучше все же +так не делать, а сажать на определенные внутренние адреса или интерфейсы. + + +### tpws для проходящего трафика + +`/etc/pf.conf`: +``` +pass in quick on em1 inet proto tcp to port {80,443} rdr-to 127.0.0.1 port 988 +pass in quick on em1 inet6 proto tcp to port {80,443} rdr-to ::1 port 988 +``` + +```sh +$ pfctl -f /etc/pf.conf +$ tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 +``` + +> [!NOTE] +> В PF непонятно как делать rdr-to с той же системы, где работает proxy. +> Вариант с route-to у меня не заработал. Поддержка rdr-to реализована через +> `/dev/pf`, поэтому прозрачный режим **требует root**. + + +### Запуск `dvtws` + +#### Весь трафик +`/etc/pf.conf`: +``` +pass in quick on em0 proto tcp from port {80,443} flags SA/SA divert-packet port 989 no state +pass in quick on em0 proto tcp from port {80,443} no state +pass out quick on em0 proto tcp to port {80,443} divert-packet port 989 no state +``` + +```sh +$ pfctl -f /etc/pf.conf +$ ./dvtws --port=989 --dpi-desync=split2 +``` + +#### Трафик только на таблицу zapret +> За исключением таблицы nozapret + +`/etc/pf.conf`: +``` +set limit table-entries 2000000 +table file "/opt/zapret/ipset/zapret-ip.txt" +table file "/opt/zapret/ipset/zapret-ip-user.txt" +table file "/opt/zapret/ipset/zapret-ip-exclude.txt" +pass out quick on em0 inet proto tcp to port {80,443} +pass in quick on em0 inet proto tcp from port {80,443} flags SA/SA divert-packet port 989 no state +pass in quick on em0 inet proto tcp from port {80,443} no state +pass out quick on em0 inet proto tcp to port {80,443} divert-packet port 989 no state +pass in quick on em0 inet proto tcp from port {80,443} flags SA/SA divert-packet port 989 no state +pass in quick on em0 inet proto tcp from port {80,443} no state +pass out quick on em0 inet proto tcp to port {80,443} divert-packet port 989 no state +table file "/opt/zapret/ipset/zapret-ip6.txt" +table file "/opt/zapret/ipset/zapret-ip-user6.txt" +table file "/opt/zapret/ipset/zapret-ip-exclude6.txt" +pass out quick on em0 inet6 proto tcp to port {80,443} +pass in quick on em0 inet6 proto tcp from port {80,443} flags SA/SA divert-packet port 989 no state +pass in quick on em0 inet6 proto tcp from port {80,443} no state +pass out quick on em0 inet6 proto tcp to port {80,443} divert-packet port 989 no state +pass in quick on em0 inet6 proto tcp from port {80,443} flags SA/SA divert-packet port 989 no state +pass in quick on em0 inet6 proto tcp from port {80,443} no state +pass out quick on em0 inet6 proto tcp to port {80,443} divert-packet port 989 no state +``` + +```sh +$ pfctl -f /etc/pf.conf +$ ./dvtws --port=989 --dpi-desync=split2 +``` + + +### Проблемы с badsum +**OpenBSD** принудительно пересчитывает tcp checksum после divert, поэтому +скорее всего `dpi-desync-fooling=badsum` у вас не заработает. При использовании +этого параметра `dvtws` предупредит о возможной проблеме. + + +### Особенность отправки fake пакетов +В **OpenBSD** `dvtws` все фейки отсылает через divert socket, поскольку эта +возможность через raw sockets заблокирована. Видимо PF автоматически +предотвращает повторный заворот diverted фреймов, поэтому проблемы зацикливания +нет. + + +### Возможная оптимизация трафика +divert-packet автоматически вносит обратное правило для перенаправления. Трюк с +no state и in правилом позволяет обойти эту проблему, чтобы напрасно не гнать +массивный трафик через `dvtws`. + + +### Перезагрузка PF таблиц +Скрипты из ipset не перезагружают таблицы в PF по умолчанию. + +Чтобы они это делали, добавьте параметр в `/opt/zapret/config`: +``` +LISTS_RELOAD="pfctl -f /etc/pf.conf" +``` + +Более новые версии `pfctl` понимают команду перезагрузить только таблицы: +> [!NOTE] +> Но это не относится к **OpenBSD 6.8**. В новых **FreeBSD** есть. +```sh +$ pfctl -Tl -f /etc/pf.conf +``` + +> [!IMPORTANT] +> Не забудьте выключить сжатие gzip: `GZIP_LISTS=0` + +> [!IMPORTANT] +> Если в вашей конфигурации какого-то файла листа нет, то его необходимо +> исключить из правил PF. Если вдруг листа нет, и он задан в pf.conf, будет +> ошибка перезагрузки фаервола. + +> [!NOTE] +> После настройки обновление листов можно поместить в cron: +> ```sh +> $ crontab -e +> ``` +> +> ``` +> <...> +> 0 12 */2 * * /opt/zapret/ipset/get_config.sh +> ``` + + +## MacOS +### Введение +Иначально ядро этой ОС "darwin" основывалось на **BSD**, потому в ней много +похожего на другие версии **BSD**. Однако, как и в других массовых коммерческих +проектах, приоритеты смещаются в сторону от оригинала. Яблочники что хотят, то +и творят. + + +### dvtws бесполезен +Раньше был ipfw, потом его убрали, заменили на PF. Есть сомнения, что divert +сокеты в ядре остались. Попытка создать divert socket не выдает ошибок, но +полученный сокет ведет себя точно так же, как raw, со всеми его унаследованными +косяками + еще яблочно специфическими. В PF divert-packet не работает. Простой +grep бинарика `pfctl` показывает, что там нет слова "divert", а в других +версиях **BSD** оно есть. `dvtws` собирается, но совершенно бесполезен. + + +### tpws +`tpws` удалось адаптировать, он работоспособен. Получение адреса назначения для +прозрачного прокси в PF (`DIOCNATLOOK`) убрали из заголовков в новых SDK, +сделав фактически недокументированным. + +В `tpws` перенесены некоторые определения из более старых версий яблочных SDK. +С ними удалось завести прозрачный режим. Однако, что будет в следующих версиях +угадать сложно. Гарантий нет. Еще одной особенностью PF в **MacOS** является +проверка на рута в момент обращения к `/dev/pf`, чего нет в остальных **BSD**. +`tpws` по умолчанию сбрасывает рутовые привилегии. Необходимо явно указать +параметр `--user=root`. В остальном PF себя ведет похоже на **FreeBSD**. +Синтаксис `pf.conf` тот же. + +> [!IMPORTANT] +> На **MacOS** работает редирект как с проходящего трафика, так и с локальной +> системы через route-to. Поскольку `tpws` вынужден работать под root, для +> исключения рекурсии приходится пускать исходящий от root трафик напрямую. +> Отсюда имеем недостаток - **обход DPI для рута работать НЕ будет**. + +#### Работа в прозрачном режиме только для исходящих запросов +`/etc/pf.conf`: +``` +rdr pass on lo0 inet proto tcp from !127.0.0.0/8 to any port {80,443} -> 127.0.0.1 port 988 +rdr pass on lo0 inet6 proto tcp from !::1 to any port {80,443} -> fe80::1 port 988 +pass out route-to (lo0 127.0.0.1) inet proto tcp from any to any port {80,443} user { >root } +pass out route-to (lo0 fe80::1) inet6 proto tcp from any to any port {80,443} user { >root } +``` + +```sh +$ pfctl -ef /etc/pf.conf +$ /opt/zapret/tpws/tpws --user=root --port=988 --bind-addr=127.0.0.1 --bind-iface6=lo0 --bind-linklocal=force +``` + +#### Работа в прозрачном режиме +> [!NOTE] +> Предполагается, что имя LAN интерфейса - `en1` + +```sh +$ ifconfig en1 | grep fe80 + inet6 fe80::bbbb:bbbb:bbbb:bbbb%en1 prefixlen 64 scopeid 0x8 +``` + +`/etc/pf.conf`: +``` +rdr pass on en1 inet proto tcp from any to any port {80,443} -> 127.0.0.1 port 988 +rdr pass on en1 inet6 proto tcp from any to any port {80,443} -> fe80::bbbb:bbbb:bbbb:bbbb port 988 +rdr pass on lo0 inet proto tcp from !127.0.0.0/8 to any port {80,443} -> 127.0.0.1 port 988 +rdr pass on lo0 inet6 proto tcp from !::1 to any port {80,443} -> fe80::1 port 988 +pass out route-to (lo0 127.0.0.1) inet proto tcp from any to any port {80,443} user { >root } +pass out route-to (lo0 fe80::1) inet6 proto tcp from any to any port {80,443} user { >root } +``` + +```sh +$ pfctl -ef /etc/pf.conf +$ /opt/zapret/tpws/tpws --user=root --port=988 --bind-addr=127.0.0.1 --bind-iface6=lo0 --bind-linklocal=force --bind-iface6=en1 --bind-linklocal=force +``` + + +### Проблема link-local адреса +Если вы пользуетесь **MaсOS** в качестве ipv6 роутера, то нужно будет +решить вопрос с регулярно изменяемым link-local адресом. С некоторых версий +**MacOS** использует по умолчанию постоянные "secured" ipv6 адреса вместо +генерируемых на базе MAC адреса. + +Все замечательно, но есть одна проблема. Постоянными остаются только global +scope адреса. Link locals периодически меняются. Смена завязана на системное +время. Перезагрузки адрес не меняют, Но если перевести время на день вперед и +перезагрузиться - link local станет другим (по крайней мере в vmware это так). +Информации по вопросу крайне мало, но тянет на баг. Не должен меняться link +local. Скрывать link local не имеет смысла, а динамический link local нельзя +использовать в качестве адреса шлюза. Проще всего отказаться от "secured" +адресов. Для этого поместите строчку `net.inet6.send.opmode=0` в +`/etc/sysctl.conf` и перезагрузите систему. + +Все равно для исходящих соединений будут использоваться temporary адреса, как и +в других системах. Или вам идея не по вкусу, можно прописать дополнительный +статический ipv6 из диапазона маски `fc00::/7` - выберите любой с длиной +префикса `128`. Это можно сделать в системных настройках, создав дополнительный +адаптер на базе того же сетевого интерфейса, отключить в нем ipv4 и вписать +статический ipv6. Он добавится к автоматически настраеваемым. + + +### Сборка +```sh +$ make -C /opt/zapret mac +``` + +> [!IMPORTANT] +> Скрипты получения листов [`ipset/*.sh`](../ipset/) работают. Если будете +> пользоваться [`get_combined.sh`](../ipset/get_combined.sh), нужно установить +> GNU grep через `brew`. Имеющийся очень старый и безумно медленный с оцией +> `-f`. + + +### Простая установка +В **MacOS** поддерживается `install_easy.sh` + +В комплекте идут бинарики, собраные под 64-bit с опцией +`-mmacosx-version-min=10.8`. Они должны работать на всех поддерживаемых версиях +**MacOS**. Если вдруг не работают - можно собрать свои. Developer tools +ставятся автоматом при запуске `make`. + +> [!WARNING] +> Internet sharing средствами системы **не поддерживается**! +> +> Поддерживается только роутер, настроенный своими силами через PF. Если вы +> вдруг включили шаринг, а потом выключили, то доступ к сайтам может пропасть +> совсем. +> +> Лечение: +> ```sh +> $ pfctl -f /etc/pf.conf +> ``` +> +> Если вам нужен шаринг интернета, лучше отказаться от прозрачного режима и +> использовать socks прокси. + +Для автостарта используется launchd (`/Library/LaunchDaemons/zapret.plist`) +Управляющий скрипт : `/opt/zapret/init.d/macos/zapret` + +Следующие команды работают с `tpws` и фаерволом одновременно (если +`INIT_APPLY_FW=1` в config) + +```sh +$ /opt/zapret/init.d/macos/zapret start +$ /opt/zapret/init.d/macos/zapret stop +$ /opt/zapret/init.d/macos/zapret restart +``` + +Работа только с tpws: +```sh +$ /opt/zapret/init.d/macos/zapret start-daemons +$ /opt/zapret/init.d/macos/zapret stop-daemons +$ /opt/zapret/init.d/macos/zapret restart-daemons + +Работа только с PF: +```sh +$ /opt/zapret/init.d/macos/zapret start-fw +$ /opt/zapret/init.d/macos/zapret stop-fw +$ /opt/zapret/init.d/macos/zapret restart-fw +``` + +Перезагрузка всех IP таблиц из файлов: +```sh +$ /opt/zapret/init.d/macos/zapret reload-fw-tables +``` + +> [!NOTE] +> Инсталятор настраивает `LISTS_RELOAD` в config, так что скрипты +> [`ipset/*.sh`](../ipset/) автоматически перезагружают IP таблицы в PF. + +> [!NOTE] +> Автоматически создается cron job на +> [`ipset/get_config.sh`](../ipset/get_config.sh), по аналогии с openwrt. + +При start-fw скрипт автоматически модицифирует `/etc/pf.conf`, вставляя туда +anchors "zapret". Модификация расчитана на `pf.conf`, в котором сохранены +дефолтные anchors от apple. Если у вас измененный `pf.conf` и модификация не +удалась, об этом будет предупреждение. Не игнорируйте его. В этом случае вам +нужно вставить в свой `pf.conf` (в соответствии с порядком типов правил): +``` +rdr-anchor "zapret" +anchor "zapret" +``` + +> [!NOTE] +> При деинсталяции через `uninstall_easy.sh` модификации `pf.conf` убираются. + +> [!NOTE] +> start-fw создает 3 файла anchors в `/etc/pf.anchors`: `zapret`, `zapret-v4`, +> `zapret-v6`. Последние 2 подключаются из anchor "zapret". + +> [!NOTE] +> Таблицы `nozapret` и `nozapret6` принадлежат anchor "zapret". +> +> Таблицы `zapret` и `zapret-user` в anchor "zapret-v4". +> +> Таблицы `zapret6` и `zapret6-user` в anchor "zapret-v6". +> +> Если какая-то версия протокола отключена - соответствующий anchor пустой и не +> упоминается в anchor "zapret". Таблицы и правила создаются только на те +> листы, которые фактически есть в директории ipset. + + +### Вариант Custom +Так же как и в других системах, поддерживаемых в простом инсталяторе, можно +создавать свои custom скрипты. + +Расположение: `/opt/zapret/init.d/macos/custom` + +`zapret_custom_daemons()` получает в `$1`: `0` или `1`. `0` = stop, `1` = start + +custom firewall отличается от linux варианта. Вместо заполнения `iptables` вам +нужно сгенерировать правила для `zapret-v4` и `zapret-v6` anchors и выдать их в +stdout. Это делается в функциях `zapret_custom_firewall_v4()` и +`zapret_custom_firewall_v6()`. Определения таблиц заполняются основным скриптом +- вам это делать не нужно. Можно ссылаться на таблицы `zapret` и `zapret-user` +в v4, `zapret6` и `zapret6-user`. + +Cм. пример [в файле](../init.d/macos/custom.d.examples/50-extra-tpws). diff --git a/docs/bsd.txt b/docs/bsd.txt deleted file mode 100644 index 829dc5c..0000000 --- a/docs/bsd.txt +++ /dev/null @@ -1,476 +0,0 @@ -Поддерживаемые версии ---------------------- - -FreeBSD 11.x+ , OpenBSD 6.x+, частично MacOS Sierra+ - -На более старых может собираться, может не собираться, может работать или не работать. -На FreeBSD 10 собирается и работает dvtws. С tpws есть проблемы из-за слишком старой версии компилятора clang. -Вероятно, будет работать, если обновить компилятор. -Возможна прикрутка к последним версиям pfsense без веб интерфейса в ручном режиме через консоль. - - -Особенности BSD систем ----------------------- - -В BSD нет nfqueue. Похожий механизм - divert sockets. -Из каталога "nfq" под BSD собирается dvtws вместо nfqws. -Он разделяет с nfqws большую часть кода и почти совпадает по параметрам командной строки. - -FreeBSD содержит 3 фаервола : IPFilter, ipfw и Packet Filter (PF). OpenBSD содержит только PF. - -Под FreeBSD tpws и dvtws собираются через "make", под OpenBSD - "make bsd", под MacOS - "make mac". -FreeBSD make распознает BSDmakefile , OpenBSD и MacOS - нет. Поэтому там используется отдельный target в Makefile. -Сборка всех исходников : make -C /opt/zapret - -divert сокет - внутренний тип сокета ядра BSD. Он не привязывается ни к какому сетевому адресу, не участвует -в обмене данными через сеть и идентифицируется по номеру порта 1..65535. Аналогия с номером очереди NFQUEUE. -На divert сокеты заворачивается трафик посредством правил ipfw или PF. -Если в фаерволе есть правило divert, но на divert порту никто не слушает, то пакеты дропаются. -Это поведение аналогично правилам NFQUEUE без параметра --queue-bypass. -На FreeBSD divert сокеты могут быть только ipv4, хотя на них принимаются и ipv4, и ipv6 фреймы. -На OpenBSD divert сокеты создаются отдельно для ipv4 и ipv6 и работают только с одной версией ip каждый. -На MacOS похоже, что divert сокеты из ядра вырезаны. См подробнее раздел про MacOS. -Отсылка в divert сокет работает аналогично отсылке через raw socket на linux. Передается полностью IP фрейм, начиная -с ip загловка . Эти особенности учитываются в dvtws. - -Скрипты ipset/*.sh при наличии ipfw работают с ipfw lookup tables. -Это прямой аналог ipset. lookup tables не разделены на v4 и v6. Они могут содержать v4 и v6 адреса и подсети одновременно. -Если ipfw отсутствует, то действие зависит от переменной LISTS_RELOAD в config. -Если она задана, то выполняется команда из LISTS_RELOAD. В противном случае не делается ничего. -Если LISTS_RELOAD=-, то заполнение таблиц отключается даже при наличии ipfw. - -PF может загружать ip таблицы из файла. Чтобы использовать эту возможность следует отключить сжатие gzip для листов -через параметр файла config "GZIP_LISTS=0". - -BSD не содержит системного вызова splice. tpws работает через переброску данных в user mode в оба конца. -Это медленнее, но не критически. -Управление асинхронными сокетами в tpws основано на linux-specific механизме epoll. -В BSD для его эмуляции используется epoll-shim - прослойка для эмуляции epoll на базе kqueue. - -mdig и ip2net полностью работоспособны в BSD. В них нет ничего системо-зависимого. - -FreeBSD -------- - -divert сокеты требуют специального модуля ядра ipdivert. -Поместите следующие строки в /boot/loader.conf (создать, если отсутствует) : ------------ -ipdivert_load="YES" -net.inet.ip.fw.default_to_accept=1 ------------ -В /etc/rc.conf : ------------ -firewall_enable="YES" -firewall_script="/etc/rc.firewall.my" ------------ -/etc/rc.firewall.my : ------------ -ipfw -q -f flush ------------ -В /etc/rc.firewall.my можно дописывать правила ipfw, чтобы они восстанавливались после перезагрузки. -Оттуда же можно запускать и демоны zapret, добавив в параметры "--daemon". Например так : ------------ -pkill ^dvtws$ -/opt/zapret/nfq/dvtws --port=989 --daemon --dpi-desync=split2 ------------ -Для перезапуска фаервола и демонов достаточно будет сделать : /etc/rc.d/ipfw restart - - -Краткая инструкция по запуску tpws в прозрачном режиме. -Предполагается, что интерфейс LAN называется em1, WAN - em0. - -Для всего трафика : -ipfw delete 100 -ipfw add 100 fwd 127.0.0.1,988 tcp from me to any 80,443 proto ip4 xmit em0 not uid daemon -ipfw add 100 fwd ::1,988 tcp from me to any 80,443 proto ip6 xmit em0 not uid daemon -ipfw add 100 fwd 127.0.0.1,988 tcp from any to any 80,443 proto ip4 recv em1 -ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1 -/opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 - -Для трафика только на таблицу zapret, за исключением таблицы nozapret : -ipfw delete 100 -ipfw add 100 allow tcp from me to table\(nozapret\) 80,443 -ipfw add 100 fwd 127.0.0.1,988 tcp from me to table\(zapret\) 80,443 proto ip4 xmit em0 not uid daemon -ipfw add 100 fwd ::1,988 tcp from me to table\(zapret\) 80,443 proto ip6 xmit em0 not uid daemon -ipfw add 100 allow tcp from any to table\(nozapret\) 80,443 recv em1 -ipfw add 100 fwd 127.0.0.1,988 tcp from any to any 80,443 proto ip4 recv em1 -ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1 -/opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 - -Таблицы zapret, nozapret, ipban создаются скриптами из ipset по аналогии с Linux. -Обновление скриптов можно забить в cron под root : - crontab -e - Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh" - -При использовании ipfw tpws не требует повышенных привилегий для реализации прозрачного режима. -Однако, без рута невозможен бинд на порты <1024 и смена UID/GID. Без смены UID будет рекурсия, -поэтому правила ipfw нужно создавать с учетом UID, под которым работает tpws. -Переадресация на порты >=1024 может создать угрозу перехвата трафика непривилегированным -процессом, если вдруг tpws не запущен. - - -Краткая инструкция по запуску dvtws. - -Для всего трафика : -ipfw delete 100 -ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted xmit em0 -# required for autottl mode only -ipfw add 100 divert 989 tcp from any 80,443 to any tcpflags syn,ack in not diverted recv em0 -/opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2 - -Для трафика только на таблицу zapret, за исключением таблицы nozapret : -ipfw delete 100 -ipfw add 100 allow tcp from me to table\(nozapret\) 80,443 -ipfw add 100 divert 989 tcp from any to table\(zapret\) 80,443 out not diverted not sockarg xmit em0 -# required for autottl mode only -ipfw add 100 divert 989 tcp from table\(zapret\) 80,443 to any tcpflags syn,ack in not diverted not sockarg recv em0 -/opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2 - - -PF в FreeBSD: -Настройка аналогична OpenBSD, но есть важные нюансы. -1) В FreeBSD поддержка PF в tpws отключена по умолчанию. Чтобы ее включить, нужно использовать параметр --enable-pf. -2) Нельзя сделать ipv6 rdr на ::1. Нужно делать на link-local адрес входящего интерфейса. -Смотрите через ifconfig адрес fe80:... и добавляете в правило -3) Синтаксис pf.conf немного отличается. Более новая версия PF. -4) Лимит на количество элементов таблиц задается так : sysctl net.pf.request_maxcount=2000000 -5) divert-to сломан. Он работает, но не работает механизм предотвращения зацикливаний. -Кто-то уже написал патч, но в 14-RELEASE проблема все еще есть. -Следовательно, на данный момент работа dvtws через pf невозможна. - -/etc/pf.conf ------------ -rdr pass on em1 inet6 proto tcp to port {80,443} -> fe80::31c:29ff:dee2:1c4d port 988 -rdr pass on em1 inet proto tcp to port {80,443} -> 127.0.0.1 port 988 ------------ -/opt/zapret/tpws/tpws --port=988 --enable-pf --bind-addr=127.0.0.1 --bind-iface6=em1 --bind-linklocal=force - -В PF непонятно как делать rdr-to с той же системы, где работает proxy. Вариант с route-to у меня не заработал. - - -pfsense -------- - -pfsense основано на FreeBSD. -pfsense использует фаервол pf, а он имеет проблемы с divert. -К счастью, модули ipfw и ipdivert присутствуют в поставке последних версий pfsense. -Их можно подгрузить через kldload. -В некоторых более старых версиях pfsense требуется изменить порядок фаерволов через sysctl, сделав ipfw первым. -В более новых эти параметры sysctl отсутствуют, но система работает как надо и без них. -В некоторых случаях фаервол pf может ограничивать возможности dvtws, в частности в области фрагментации ip. -Присутствуют по умолчанию правила scrub для реассемблинга фрагментов. -Бинарики из binaries/freebsd-x64 собраны под FreeBSD 11. Они должны работать и на последующих версиях FreeBSD, -включая pfsense. Можно пользоваться install_bin.sh. - -Пример скрипта автозапуска лежит в init.d/pfsense. Его следует поместить в /usr/local/etc/rc.d и отредактировать -на предмет правил ipfw и запуска демонов. Есть встроенный редактор edit как более приемлемая альтернатива vi. -Поскольку git отсутствует, копировать файлы удобнее всего через ssh. curl присутствует по умолчанию. -Можно скопировать zip с файлами zapret и распаковать в /opt, как это делается на других системах. -Тогда dvtws нужно запускать как /opt/zapret/nfq/dvtws. Либо скопировать только dvtws в /usr/local/sbin. -Как вам больше нравится. -ipset скрипты работают, крон есть. Можно сделать автообновление листов. - -Если вас напрягает бедность имеющегося репозитория, можно включить репозиторий от FreeBSD, который по умолчанию выключен. -Поменяйте no на yes в /usr/local/etc/pkg/repos/FreeBSD.conf -Можно установить весь привычный soft, включая git, чтобы напрямую скачивать zapret с github. - -/usr/local/etc/rc.d/zapret.sh (chmod 755) ------------ -#!/bin/sh - -kldload ipfw -kldload ipdivert - -# for older pfsense versions. newer do not have these sysctls -sysctl net.inet.ip.pfil.outbound=ipfw,pf -sysctl net.inet.ip.pfil.inbound=ipfw,pf -sysctl net.inet6.ip6.pfil.outbound=ipfw,pf -sysctl net.inet6.ip6.pfil.inbound=ipfw,pf - -ipfw delete 100 -ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted xmit em0 -pkill ^dvtws$ -dvtws --daemon --port 989 --dpi-desync=split2 - -# required for newer pfsense versions (2.6.0 tested) to return ipfw to functional state -pfctl -d ; pfctl -e ------------ - -Что касается tpws, то видимо имеется некоторый конфликт двух фаерволов, и правила fwd в ipfw не работают. -Работает перенаправление средствами pf как описано в разделе по FreeBSD. -В pf можно изменять правила только целыми блоками - якорями (anchors). Нельзя просто так добавить или удалить что-то. -Но чтобы какой-то anchor был обработан, на него должна быть ссылка из основного набора правил. -Его трогать нельзя, иначе порушится весь фаервол. -Поэтому придется править код скриптов pfsense. Поправьте /etc/inc/filter.inc следующим образом : ------------ - ................. - /* MOD */ - $natrules .= "# ZAPRET redirection\n"; - $natrules .= "rdr-anchor \"zapret\"\n"; - - $natrules .= "# TFTP proxy\n"; - $natrules .= "rdr-anchor \"tftp-proxy/*\"\n"; - ................. ------------ - -Напишите файл с содержимым anchor-а (например, /etc/zapret.anchor): ------------ -rdr pass on em1 inet proto tcp to port {80,443} -> 127.0.0.1 port 988 -rdr pass on em1 inet6 proto tcp to port {80,443} -> fe80::20c:29ff:5ae3:4821 port 988 ------------ -fe80::20c:29ff:5ae3:4821 замените на ваш link local адрес LAN интерфейса, либо уберите строчку, если ipv6 не нужен. - -Добавьте в автозапуск /usr/local/etc/rc.d/zapret.sh : ------------ -pfctl -a zapret -f /etc/zapret.anchor -pkill ^tpws$ -tpws --daemon --port=988 --enable-pf --bind-addr=127.0.0.1 --bind-iface6=em1 --bind-linklocal=force --split-http-req=method --split-pos=2 ------------ - -После перезагрузки проверьте, что правила создались : ------------ -[root@pfSense /]# pfctl -s nat -no nat proto carp all -nat-anchor "natearly/*" all -nat-anchor "natrules/*" all -................... -no rdr proto carp all -rdr-anchor "zapret" all -rdr-anchor "tftp-proxy/*" all -rdr-anchor "miniupnpd" all -[root@pfSense /]# pfctl -s nat -a zapret -rdr pass on em1 inet proto tcp from any to any port = http -> 127.0.0.1 port 988 -rdr pass on em1 inet proto tcp from any to any port = https -> 127.0.0.1 port 988 -rdr pass on em1 inet6 proto tcp from any to any port = http -> fe80::20c:29ff:5ae3:4821 port 988 -rdr pass on em1 inet6 proto tcp from any to any port = https -> fe80::20c:29ff:5ae3:4821 port 988 ------------ - -Так же есть более элегантный способ запуска tpws через @reboot в cron и правило перенаправления в UI. -Это позволит не редактировать код pfsense. - - -OpenBSD -------- - -В tpws бинд по умолчанию только на ipv6. для бинда на ipv4 указать "--bind-addr=0.0.0.0" -Используйте --bind-addr=0.0.0.0 --bind-addr=:: для достижения того же результата, как в других ОС по умолчанию. -(лучше все же так не делать, а сажать на определенные внутренние адреса или интерфейсы) - -tpws для проходящего трафика : - -/etc/pf.conf ------------- -pass in quick on em1 inet proto tcp to port {80,443} rdr-to 127.0.0.1 port 988 -pass in quick on em1 inet6 proto tcp to port {80,443} rdr-to ::1 port 988 ------------- -pfctl -f /etc/pf.conf -tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 - -В PF непонятно как делать rdr-to с той же системы, где работает proxy. Вариант с route-to у меня не заработал. -Поддержка rdr-to реализована через /dev/pf, поэтому прозрачный режим требует root. - -dvtws для всего трафика : - -/etc/pf.conf ------------- -pass in quick on em0 proto tcp from port {80,443} flags SA/SA divert-packet port 989 no state -pass in quick on em0 proto tcp from port {80,443} no state -pass out quick on em0 proto tcp to port {80,443} divert-packet port 989 no state ------------- -pfctl -f /etc/pf.conf -./dvtws --port=989 --dpi-desync=split2 - -dvtws для трафика только на таблицу zapret, за исключением таблицы nozapret : - -/etc/pf.conf ------------- -set limit table-entries 2000000 -table file "/opt/zapret/ipset/zapret-ip.txt" -table file "/opt/zapret/ipset/zapret-ip-user.txt" -table file "/opt/zapret/ipset/zapret-ip-exclude.txt" -pass out quick on em0 inet proto tcp to port {80,443} -pass in quick on em0 inet proto tcp from port {80,443} flags SA/SA divert-packet port 989 no state -pass in quick on em0 inet proto tcp from port {80,443} no state -pass out quick on em0 inet proto tcp to port {80,443} divert-packet port 989 no state -pass in quick on em0 inet proto tcp from port {80,443} flags SA/SA divert-packet port 989 no state -pass in quick on em0 inet proto tcp from port {80,443} no state -pass out quick on em0 inet proto tcp to port {80,443} divert-packet port 989 no state -table file "/opt/zapret/ipset/zapret-ip6.txt" -table file "/opt/zapret/ipset/zapret-ip-user6.txt" -table file "/opt/zapret/ipset/zapret-ip-exclude6.txt" -pass out quick on em0 inet6 proto tcp to port {80,443} -pass in quick on em0 inet6 proto tcp from port {80,443} flags SA/SA divert-packet port 989 no state -pass in quick on em0 inet6 proto tcp from port {80,443} no state -pass out quick on em0 inet6 proto tcp to port {80,443} divert-packet port 989 no state -pass in quick on em0 inet6 proto tcp from port {80,443} flags SA/SA divert-packet port 989 no state -pass in quick on em0 inet6 proto tcp from port {80,443} no state -pass out quick on em0 inet6 proto tcp to port {80,443} divert-packet port 989 no state ------------- -pfctl -f /etc/pf.conf -./dvtws --port=989 --dpi-desync=split2 - -divert-packet автоматически вносит обратное правило для перенаправления. -Трюк с no state и in правилом позволяет обойти эту проблему, чтобы напрасно не гнать массивный трафик через dvtws. - -В OpenBSD dvtws все фейки отсылает через divert socket, поскольку эта возможность через raw sockets заблокирована. -Видимо pf автоматически предотвращает повторный заворот diverted фреймов, поэтому проблемы зацикливания нет. - -OpenBSD принудительно пересчитывает tcp checksum после divert, поэтому скорее всего -dpi-desync-fooling=badsum у вас не заработает. При использовании этого параметра -dvtws предупредит о возможной проблеме. - -Скрипты из ipset не перезагружают таблицы в PF по умолчанию. -Чтобы они это делали, добавьте параметр в /opt/zapret/config : -LISTS_RELOAD="pfctl -f /etc/pf.conf" -Более новые версии pfctl понимают команду перезагрузить только таблицы : pfctl -Tl -f /etc/pf.conf -Но это не относится к OpenBSD 6.8. В новых FreeBSD есть. -Не забудьте выключить сжатие gzip : -GZIP_LISTS=0 -Если в вашей конфигурации какого-то файла листа нет, то его необходимо исключить из правил PF. -Если вдруг листа нет, и он задан в pf.conf, будет ошибка перезагрузки фаервола. -После настройки обновление листов можно поместить в cron : - crontab -e - дописать строчку : 0 12 */2 * * /opt/zapret/ipset/get_config.sh - - -MacOS ------ - -Иначально ядро этой ОС "darwin" основывалось на BSD, потому в ней много похожего на другие версии BSD. -Однако, как и в других массовых коммерческих проектах, приоритеты смещаются в сторону от оригинала. -Яблочники что хотят, то и творят. -Раньше был ipfw, потом его убрали, заменили на PF. -Есть сомнения, что divert сокеты в ядре остались. Попытка создать divert socket не выдает ошибок, -но полученный сокет ведет себя точно так же, как raw, со всеми его унаследованными косяками + еще яблочно специфическими. -В PF divert-packet не работает. Простой grep бинарика pfctl показывает, что там нет слова "divert", -а в других версиях BSD оно есть. dvtws собирается, но совершенно бесполезен. - -tpws удалось адаптировать, он работоспособен. Получение адреса назначения для прозрачного прокси в PF (DIOCNATLOOK) -убрали из заголовков в новых SDK, сделав фактически недокументированным. -В tpws перенесены некоторые определения из более старых версий яблочных SDK. С ними удалось завести прозрачный режим. -Однако, что будет в следующих версиях угадать сложно. Гарантий нет. -Еще одной особенностью PF в MacOS является проверка на рута в момент обращения к /dev/pf, чего нет в остальных BSD. -tpws по умолчанию сбрасывает рутовые привилегии. Необходимо явно указать параметр --user=root. -В остальном PF себя ведет похоже на FreeBSD. Синтаксис pf.conf тот же. - -На MacOS работает редирект как с проходящего трафика, так и с локальной системы через route-to. -Поскольку tpws вынужден работать под root, для исключения рекурсии приходится пускать исходящий от root трафик напрямую. -Отсюда имеем недостаток : обход DPI для рута работать не будет. - -Если вы пользуетесь MaсOS в качестве ipv6 роутера, то нужно будет решить вопрос с регулярно изменяемым link-local адресом. -С некоторых версий MacOS использует по умолчанию постоянные "secured" ipv6 адреса вместо генерируемых на базе MAC адреса. -Все замечательно, но есть одна проблема. Постоянными остаются только global scope адреса. -Link locals периодически меняются. Смена завязана на системное время. Перезагрузки адрес не меняют, -Но если перевести время на день вперед и перезагрузиться - link local станет другим. (по крайней мере в vmware это так) -Информации по вопросу крайне мало, но тянет на баг. Не должен меняться link local. Скрывать link local не имеет смысла, -а динамический link local нельзя использовать в качестве адреса шлюза. -Проще всего отказаться от "secured" адресов. -Поместите строчку "net.inet6.send.opmode=0" в /etc/sysctl.conf. Затем перезагрузите систему. -Все равно для исходящих соединений будут использоваться temporary адреса, как и в других системах. -Или вам идея не по вкусу, можно прописать дополнительный статический ipv6 из диапазона fc00::/7 - -выберите любой с длиной префикса 128. Это можно сделать в системных настройках, создав дополнительный адаптер на базе -того же сетевого интерфейса, отключить в нем ipv4 и вписать статический ipv6. Он добавится к автоматически настраеваемым. - -Настройка tpws на macos в прозрачном режиме только для исходящих запросов : - -/etc/pf.conf ------------- -rdr pass on lo0 inet proto tcp from !127.0.0.0/8 to any port {80,443} -> 127.0.0.1 port 988 -rdr pass on lo0 inet6 proto tcp from !::1 to any port {80,443} -> fe80::1 port 988 -pass out route-to (lo0 127.0.0.1) inet proto tcp from any to any port {80,443} user { >root } -pass out route-to (lo0 fe80::1) inet6 proto tcp from any to any port {80,443} user { >root } ------------- -pfctl -ef /etc/pf.conf -/opt/zapret/tpws/tpws --user=root --port=988 --bind-addr=127.0.0.1 --bind-iface6=lo0 --bind-linklocal=force - - -Настройка tpws на macos роутере в прозрачном режиме, где en1 - LAN. - -ifconfig en1 | grep fe80 - inet6 fe80::bbbb:bbbb:bbbb:bbbb%en1 prefixlen 64 scopeid 0x8 -/etc/pf.conf ------------- -rdr pass on en1 inet proto tcp from any to any port {80,443} -> 127.0.0.1 port 988 -rdr pass on en1 inet6 proto tcp from any to any port {80,443} -> fe80::bbbb:bbbb:bbbb:bbbb port 988 -rdr pass on lo0 inet proto tcp from !127.0.0.0/8 to any port {80,443} -> 127.0.0.1 port 988 -rdr pass on lo0 inet6 proto tcp from !::1 to any port {80,443} -> fe80::1 port 988 -pass out route-to (lo0 127.0.0.1) inet proto tcp from any to any port {80,443} user { >root } -pass out route-to (lo0 fe80::1) inet6 proto tcp from any to any port {80,443} user { >root } ------------- -pfctl -ef /etc/pf.conf -/opt/zapret/tpws/tpws --user=root --port=988 --bind-addr=127.0.0.1 --bind-iface6=lo0 --bind-linklocal=force --bind-iface6=en1 --bind-linklocal=force - - -Сборка : make -C /opt/zapret mac - -Скрипты получения листов ipset/*.sh работают. -Если будете пользоваться ipset/get_combined.sh, нужно установить gnu grep через brew. -Имеющийся очень старый и безумно медленный с оцией -f. - - -MacOS простая установка ------------------------ - -В MacOS поддерживается install_easy.sh - -В комплекте идут бинарики, собраные под 64-bit с опцией -mmacosx-version-min=10.8. -Они должны работать на всех поддерживаемых версиях macos. -Если вдруг не работают - можно собрать свои. Developer tools ставятся автоматом при запуске make. - -!! Internet sharing средствами системы НЕ ПОДДЕРЖИВАЕТСЯ !! -Поддерживается только роутер, настроенный своими силами через PF. -Если вы вдруг включили шаринг, а потом выключили, то доступ к сайтам может пропасть совсем. -Лечение : pfctl -f /etc/pf.conf -Если вам нужен шаринг интернета, лучше отказаться от прозрачного режима и использовать socks. - -Для автостарта используется launchd (/Library/LaunchDaemons/zapret.plist) -Управляющий скрипт : /opt/zapret/init.d/macos/zapret -Следующие команды работают с tpws и фаерволом одновременно (если INIT_APPLY_FW=1 в config) -/opt/zapret/init.d/macos/zapret start -/opt/zapret/init.d/macos/zapret stop -/opt/zapret/init.d/macos/zapret restart -Работа только с tpws : -/opt/zapret/init.d/macos/zapret start-daemons -/opt/zapret/init.d/macos/zapret stop-daemons -/opt/zapret/init.d/macos/zapret restart-daemons -Работа только с PF : -/opt/zapret/init.d/macos/zapret start-fw -/opt/zapret/init.d/macos/zapret stop-fw -/opt/zapret/init.d/macos/zapret restart-fw -Перезагрузка всех IP таблиц из файлов : -/opt/zapret/init.d/macos/zapret reload-fw-tables - -Инсталятор настраивает LISTS_RELOAD в config, так что скрипты ipset/*.sh автоматически перезагружают IP таблицы в PF. -Автоматически создается cron job на ipset/get_config.sh, по аналогии с openwrt. - -При start-fw скрипт автоматически модицифирует /etc/pf.conf, вставляя туда anchors "zapret". -Модификация расчитана на pf.conf, в котором сохранены дефолтные anchors от apple. -Если у вас измененный pf.conf и модификация не удалась, об этом будет предупреждение. Не игнорируйте его. -В этом случае вам нужно вставить в свой pf.conf (в соответствии с порядком типов правил) : -rdr-anchor "zapret" -anchor "zapret" -При деинсталяции через uninstall_easy.sh модификации pf.conf убираются. - -start-fw создает 3 файла anchors в /etc/pf.anchors : zapret,zapret-v4,zapret-v6. -Последние 2 подключаются из anchor "zapret". -Таблицы nozapret,nozapret6 принадлежат anchor "zapret". -Таблицы zapret,zapret-user - в anchor "zapret-v4". -Таблицы zapret6,zapret6-user - в anchor "zapret-v6". -Если какая-то версия протокола отключена - соответствующий anchor пустой и не упоминается в anchor "zapret". -Таблицы и правила создаются только на те листы, которые фактически есть в директории ipset. - - -MacOS вариант custom --------------------- - -Так же как и в других системах, поддерживаемых в простом инсталяторе, можно создавать свои custom скрипты. -Расположение : /opt/zapret/init.d/macos/custom - -zapret_custom_daemons() получает в $1 "0" или "1". "0" - stop, "1" - start -custom firewall отличается от linux варианта. -Вместо заполнения iptables вам нужно сгенерировать правила для zapret-v4 и zapret-v6 anchors и выдать их в stdout. -Это делается в функциях zapret_custom_firewall_v4() и zapret_custom_firewall_v6(). -Определения таблиц заполняются основным скриптом - вам это делать не нужно. -Можно ссылаться на таблицы zapret и zapret-user в v4, zapret6 и zapret6-user. - -Cм. пример в файле custom-tpws diff --git a/docs/quick_start.md b/docs/quick_start.md new file mode 100644 index 0000000..5eef9ef --- /dev/null +++ b/docs/quick_start.md @@ -0,0 +1,255 @@ +# Быстрая настройка Linux/OpenWrt + +> [!CAUTION] +> Не пишите в issue вопросы типа "как скопировать файл", "как скачать", "как +> запустить", ... То есть все , что касается базовых навыков обращения с ОС +> linux. Эти вопросы будут закрывать сразу. Если у вас подобные вопросы +> возникают, рекомендую не использовать данный софт или искать помощь где-то в +> другом месте. То же самое могу сказать тем, кто хочет нажать 1 кнопку, чтобы +> все заработало, и совсем не хочет читать и изучать. Увы, такое не подвезли и +> не подвезут. Ищите другие более простые методы обхода. Этот метод **не для +> рядового пользователя**. + + +## Вступление +Специально для тех, кто хочет побыстрее начать, но не хочет слишком углубляться +в простыню [readme.md](readme.md). + +Обход DPI является хакерской методикой. Под этим словом понимается метод, +которому сопротивляется окружающая среда, которому автоматически не +гарантирована работоспособность в любых условиях и на любых ресурсах, требуется +настройка под специфические условия у вашего провайдера. Условия могут меняться +со временем, и методика может начинать или переставать работать, может +потребоваться повторный анализ ситуации. Могут обнаруживаться отдельные +ресурсы, которые заблокированы иначе, и которые не работают или перестали +работать. Могут и сломаться отдельные не заблокированные ресурсы. Поэтому очень +желательно иметь знания в области сетей, чтобы иметь возможность +проанализировать техническую ситуацию. Не будет лишним иметь обходные каналы +проксирования трафика на случай, если обход DPI не помогает. + +Будем считать, что у вас есть система на базе традиционного **linux** или +**openwrt**. Если у вас традиционный linux - задача обойти блокировки только на +этой системе, если openwrt - обойти блокировки для подключенных устройств. Это +наиболее распространенный случай. + + +## Настройка +> [!TIP] +> Чтобы процедура установки сработала в штатном режиме на openwrt, нужно +> рассчитывать на свободное место около 1-2 Mb для установки самого zapret и +> необходимых дополнительных пакетов. Если места мало и нет возможности его +> увеличить за счет `extroot`, возможно придется отказаться от варианта простой +> установки и прикручивать в ручном режиме без имеющихся скриптов запуска. +> Можно использовать [облегченный `tpws` вариант](../init.d/openwrt-minimal), +> либо попробовать засунуть требуемые zapret дополнительные пакеты в сжатый +> образ `squashfs` с помощью `image builder` и перешить этим вариантом роутер. + +1. Скачайте zip архив проекта с github в `/tmp`, распакуйте его там, либо + клонируйте проект через: + ```sh + $ git clone --depth 1 https://github.com/bol-van/zapret + ``` + +2. Убедитесь, что у вас отключены все средства обхода блокировок, в том числе и + сам zapret. Гарантированно уберет zapret скрипт `uninstall_easy.sh`. + +3. Если вы работаете в виртуальной машине, необходимо использовать соединение с + сетью в режиме bridge. NAT **не** подходит. + +4. Выполните однократные действия по установке требуемых пакетов в ОС и + настройке исполняемых файлов правильной архитектуры: + ```sh + $ install_bin.sh + $ install_prereq.sh + ``` + + > Вас могут спросить о типе фаервола (iptables/nftables) и использовании + > ipv6. Это нужно для установки правильных пакетов в ОС, чтобы не + > устанавливать лишнее. + +5. Запустите `blockcheck.sh`. Скрипт вначале проверяет DNS. Если выводятся + сообщения о подмене адресов, то нужно будет решить проблему с DNS. + `blockcheck.sh` перейдет в этом случае на DoH и будет пытаться получить и + использовать реальные IP адреса. Но если вы не настроите решение этой + проблемы, обход будет работать только для тех программ или ОС, которые сами + реализуют механизмы SecureDNS. Для других программ обход работать не будет. + + > Решение проблемы DNS выходит за рамки проекта. Обычно она решается либо + > заменой DNS серверов от провайдера на публичные (`1.1.1.1`, `8.8.8.8`), + > либо в случае перехвата провайдером обращений к сторонним серверам - через + > специальные средства шифрования DNS запросов, такие как `dnscrypt`, `DoT`, + > `DoH`. + > + > Еще один эффективный вариант - использовать ресолвер от yandex + > (`77.88.8.88`) на нестандартном порту `1253`. Многие провайдеры не + > анализируют обращения к DNS на нестандартных портах. + > + > Проверить работает ли этот вариант можно так: + > ```sh + > $ dig -p 53 @77.88.8.88 rutracker.org dig -p 1253 @77.88.8.88 rutracker.org + > ``` + > + > Если DNS действительно подменяется, и ответ на эти 2 команды разный, + > значит метод вероятно работает. + > + > В openwrt DNS на нестандартном порту можно прописать в `/etc/config/dhcp` + > таким способом : + > + > ``` + > config dnsmasq + > <...> + > list server '77.88.8.88#1253' + > ``` + > + > Если настройки IP и DNS получаются автоматически от провайдера, в + > `/etc/config/network` найдите секцию интерфейса `wan` и сделайте так: + > + > ``` + > config interface 'wan' + > <...> + > option peerdns '0' + > ``` + > + > ```sh + > $ /etc/init.d/network restart + > $ /etc/init.d/dnsmasq restart + > ``` + > + > Если это не подходит, можно перенаправлять обращения на UDP и TCP порты + > `53` вашего DNS сервера на `77.88.8.88:1253` средствами + > `iptables`/`nftables`. В `/etc/resolv.conf` нельзя прописать DNS на + > нестандартном порту. + +6. `blockcheck.sh` позволяет выявить рабочую стратегию обхода блокировок. По + результатам скрипта нужно понять какой вариант будете использовать : `nfqws` + или `tpws` и запомнить найденные стратегии для дальнейшего применения. + + Следует понимать, что скрипт проверяет доступность только конкретного + домена, который вы вводите в начале. Вероятно, все остальные домены + блокированы подобным образом, **но не факт**. В большинстве случаев можно + объединить несколько стратегий в одну универсальную, и это **крайне + желательно**. Необходимо понимать как работают стратегии. zapret **не может + пробить блокировку по IP адресу**. Для проверки нескольких доменов вводите + их через пробел. + + > Сейчас блокираторы ставят на магистральных каналах. В сложных случаях у + > вас может быть несколько маршрутов с различной длиной по ХОПам, с DPI на + > разных хопах. Приходится преодолевать целый зоопарк DPI, которые еще и + > включаются в работу хаотичным образом или образом, зависящим от + > направления (IP сервера). скрипт не всегда может выдать вам в итогах + > оптимальную стратегию, которую надо просто переписать в настройки. В + > некоторых случаях надо реально думать что происходит, анализируя результат + > на разных стратегиях. Если вы применяете большой TTL, чтобы достать до + > магистрала, то не лишним будет добавить дополнительный ограничитель + > `--dpi-desync-fooling`, чтобы не сломать сайты на более коротких + > дистанциях. `md5sig` наиболее совместим, но работает **только** на linux + > серверах. `badseq` может работать только на https и не работать на http. + > Чтобы выяснить какие дополнительные ограничители работают, смотрите + > результат теста аналогичных стратегий без TTL с каждым из этих + > ограничителей. + > + > При использовании `autottl` следует протестировать как можно больше разных + > доменов. Эта техника может на одних провайдерах работать стабильно, на + > других потребуется выяснить при каких параметрах она стабильна, на третьих + > полный хаос, и проще отказаться. + > + > Далее, имея понимание что работает на http, https, quic нужно + > сконструировать параметры запуска `tpws` и/или `nfqws` с использованием + > мультистратегии. Как работают мультистратегии описано в readme.txt. + > + > Если кратко, то обычно параметры конструируются так: + > ```sh + > "--filter-udp=443 'параметры для quic' --new + > --filter-tcp=80,443 'обьединенные параметры для http и https' " + > ``` + > + > Или так: + > ```sh + > "--filter-udp=443 'параметры для quic' --new + > --filter-tcp=80 'параметры для http' --new + > --filter-tcp=443 'параметры для https' " + > ``` + > + > `` и `` так и пишутся. Их не надо на что-то + > заменять. Это сделают скрипты запуска, если вы выбрали режим фильтрации по + > хостлистам, и уберут в противном случае. Если для какого-то протокола надо + > дурить все без стандартного хостлиста - просто уберите оттуда `` + > и ``. Можно писать свои параметры `--hostlist` и + > `--hostlist-exclude` для дополнительных хостлистов или в профилях + > специализаций под конкретный ресурс. В последнем случае стандартный + > хостлист там не нужен. Следует избегать указания собственных параметров + > `--hostlist` на листы из директории ipset. Эта логика включена в + > `` и ``. Отличие `` в том, что + > стандартный автолист по этому профилю используется как обычный, то есть + > без автоматического добавления доменов. Однако, добавления в других + > профилях автоматически отражаются во всех остальных. + > + > Если стратегии отличаются по версии ip протокола, и вы не можете их + > обьединить, фильтр пишется так: + > ```sh + > "--filter-l3=ipv4 --filter-udp=443 lпараметры для quic ipv4' --new + > --filter-l3=ipv4 --filter-tcp=80 'параметры для http ipv4' --new + > --filter-l3=ipv4 --filter-tcp=443 'параметры для https ipv4' --new + > --filter-l3=ipv6 --filter-udp=443 "параметры для quic ipv6" --new + > --filter-l3=ipv6 --filter-tcp=80 'параметры для http ipv6' --new + > --filter-l3=ipv6 --filter-tcp=443 'параметры для https ipv6' " + > ``` + > + > Но здесь совсем "копи-пастный" вариант. Чем больше вы объедините стратегий и + > сократите их общее количество, тем будет лучше. + > + > Если вам не нужно дурение отдельных протоколов, лучше всего будет их + > убрать из системы перехвата трафика через параметры `TPWS_PORTS`, + > `NFQWS_PORTS_TCP`, `NFQWS_PORTS_UDP` и убрать соответствующие им профили + > мультистратегии. + > + > | Протокол | Порт | Примечание | + > |---|---|---| + > | `tcp` | `80` | `http` соединение | + > | `tcp` | `443` | `https` соединение | + > | `udp` | `443` | `quic` соединение | + > + > Если используются методы нулевой фазы десинхронизации (`--mss`, + > `--wssize`, `--dpi-desync=syndata`) и режим фильтрации `hostlist`, то все + > параметры, относящиеся к этим методам, следует помещать в отдельные + > профили мульистратегии, которые получат управление до определения имени + > хоста. Необходимо понимать алгоритм работы мультистратегий. Самым надежным + > вариантом будет дублирование этих параметров на 2 профиля. Какой-нибудь + > сработает в зависимости от параметра `MODE_FILTER`. + > + > ```sh + > "--filter-tcp=80 'параметры для http' --new + > --filter-tcp=443 'параметры для https' --wssize 1:6 --new + > --filter-tcp=443 --wssize 1:6" + > ``` + > + > В этом примере `wssize` будет применяться всегда к порту tcp `443` вне + > зависимости от параметра `MODE_FILTER`. Хостлист будет игнорироваться, + > если таковой имеется. К http применять `wssize` вредно и бессмысленно. + > + > Никто не мешает использовать `tpws` для http, `nfqws` для https, либо + > комбинировать действие `nfqws` и `tpws` для одного протокола. В текущем + > варианте скриптов запуска это делается максимально гибко и независимо друг + > от друга. + +7. Запустите скрипт облегченной установки - `install_easy.sh` Выберите `nfqws` + и/или `tpws`, затем согласитесь на редактирование параметров. Откроется + редактор, куда впишите созданную на предыдущем этапе стратегию. + +8. На все остальные вопросы `install_easy.sh` отвечайте согласно выводимой + аннотации. + + +## Итог +Это минимальная инструкция, чтобы быстро сориентироваться с чего начать. +Однако, это не гарантированное решение и в некоторых случаях вы не обойдетесь +без знаний и основного "талмуда". Подробности и полное техническое описание +расписаны в [README](readme.md). + +Если ломаются отдельные **не заблокированные** ресурсы, следует вносить их в +исключения, либо пользоваться ограничивающим `ipset` или хост листом. Лучше +подбирать такие стратегии, которые вызывают минимальные поломки. Есть стратегии +довольно безобидные, а есть сильно ломающие, которые подходят только для +точечного пробития отдельных ресурсов, когда ничего лучше нет. Хорошая +стратегия может сильно ломать из-за плохо подобранных ограничителей для фейков +- ttl, fooling. diff --git a/docs/quick_start.txt b/docs/quick_start.txt deleted file mode 100644 index cc08378..0000000 --- a/docs/quick_start.txt +++ /dev/null @@ -1,179 +0,0 @@ -Специально для тех, кто хочет побыстрее начать, но не хочет слишком углубляться в простыню readme.txt. - -Предупреждение : не пишите в issue вопросы типа "как скопировать файл", "как скачать", "как запустить", ... -То есть все , что касается базовых навыков обращения с ОС linux. Эти вопросы буду закрывать сразу. -Если у вас подобные вопросы возникают, рекомендую не использовать данный софт или искать помощь где-то в другом месте. -То же самое могу сказать тем, кто хочет нажать 1 кнопку, чтобы все заработало, и совсем не хочет читать и изучать. -Увы, такое не подвезли и не подвезут. Ищите другие более простые методы обхода. Этот метод не для рядового пользователя. - -Обход DPI является хакерской методикой. Под этим словом понимается метод, которому сопротивляется окружающая среда, -которому автоматически не гарантирована работоспособность в любых условиях и на любых ресурсах, -требуется настройка под специфические условия у вашего провайдера. Условия могут меняться со временем, -и методика может начинать или переставать работать, может потребоваться повторный анализ ситуации. -Могут обнаруживаться отдельные ресурсы, которые заблокированы иначе, и которые не работают или перестали работать. -Могут и сломаться отдельные незаблокированные ресурсы. -Поэтому очень желательно иметь знания в области сетей, чтобы иметь возможность проанализировать техническую ситуацию. -Не будет лишним иметь обходные каналы проксирования трафика на случай, если обход DPI не помогает. - -Будем считать, что у вас есть система на базе традиционного linux или openwrt. -Если у вас традиционный linux - задача обойти блокировки только на этой системе, если openwrt - обойти блокировки -для подключенных устройств. Это наиболее распространенный случай. - -1) Чтобы процедура установки сработала в штатном режиме на openwrt, нужно раcсчитывать на свободное место около 1-2 Mb -для установки самого zapret и необходимых дополнительных пакетов. -Если места мало и нет возможности его увеличить за счет extroot, возможно придется отказаться от варианта -простой установки и прикручивать в ручном режиме без имеющихся скриптов запуска. -Можно использовать облегченный tpws вариант из init.d/openwrt-minimal, либо попробовать засунуть требуемые zapret -дополнительные пакеты в сжатый образ squashfs с помощью image builder и перешить этим вариантом роутер. - -2) Скачайте zip архив проекта с github в /tmp, распакуйте его там, -либо клонируйте проект через : git clone --depth 1 https://github.com/bol-van/zapret - -3) Убедитесь, что у вас отключены все средства обхода блокировок, в том числе и сам zapret. -Гарантированно уберет zapret скрипт uninstall_easy.sh. - -4) Если вы работаете в виртуальной машине, необходимо использовать соединение с сетью в режиме bridge. nat не подходит - -5) Выполните однократные действия по установке требуемых пакетов в ОС и настройке бинариков правильной архитектуры - -install_bin.sh -install_prereq.sh - -Вас могут спросить о типе фаервола (iptables/nftables) и использовании ipv6. Это нужно для установки -правильных пакетов в ОС, чтобы не устанавливать лишнее. - -6) Запустите blockcheck.sh. blockcheck.sh в начале проверяет DNS. -Если выводятся сообщения о подмене адресов, то нужно будет решить проблему с DNS. -blockcheck перейдет в этом случае на DoH и будет пытаться получить и использовать реальные IP адреса. -Но если вы не настроите решение этой проблемы, обход будет работать только для тех программ -или ОС, которые сами реализуют механизмы SecureDNS. Для других программ обход работать не будет. - -Решение проблемы DNS выходит за рамки проекта. Обычно она решается либо заменой DNS серверов -от провайдера на публичные (1.1.1.1, 8.8.8.8), либо в случае перехвата провайдером обращений -к сторонним серверам - через специальные средства шифрования DNS запросов, такие как dnscrypt, DoT, DoH. - -Еще один эффективный вариант - использовать ресолвер от yandex 77.88.8.88 на нестандартном порту 1253. -Многие провайдеры не анализируют обращения к DNS на нестандартных портах. - -Проверить работает ли этот вариант можно так : - -dig -p 53 @77.88.8.88 rutracker.org -dig -p 1253 @77.88.8.88 rutracker.org - -Если DNS действительно подменяется, и ответ на эти 2 команды разный, значит метод вероятно работает. - -В openwrt DNS на нестандартном порту можно прописать в /etc/config/dhcp таким способом : - -config dnsmasq - ............. - list server '77.88.8.88#1253' - -Если настройки IP и DNS получаются автоматически от провайдера, в /etc/config/network -найдите секцию интерфейса 'wan' и сделайте так : - -config interface 'wan' - ............. - option peerdns '0' - -/etc/init.d/network restart -/etc/init.d/dnsmasq restart - -Если это не подходит, можно перенаправлять обращения на udp и tcp порты 53 вашего DNS сервера на 77.88.8.88:1253 средствами -iptables/nftables. В /etc/resolv.conf нельзя прописать DNS на нестандартном порту. - -7) blockcheck позволяет выявить рабочую стратегию обхода блокировок -По результатам blockcheck нужно понять какой вариант будете использовать : nfqws или tpws -И запомнить найденные стратегии. - -Следует понимать, что blockcheck проверяет доступность только конкретного домена, который вы вводите в начале. -Вероятно, все остальные домены блокированы подобным образом, но не факт. -В большинстве случаев можно обьединить несколько стратегий в одну универсальную, и это крайне желательно. -Необходимо понимать как работают стратегии. -zapret не может пробить блокировку по IP адресу. Для проверки нескольких доменов вводите их через пробел. - -Сейчас блокираторы ставят на магистральных каналах. В сложных случаях у вас может быть несколько маршрутов -с различной длиной по ХОПам, с DPI на разных хопах. Приходится преодолевать целый зоопарк DPI, -которые еще и включаются в работу хаотичным образом или образом, зависящим от направления (IP сервера). -blockcheck не всегда может выдать вам в итогах оптимальную стратегию, которую надо просто переписать в настройки. -В некоторых случаях надо реально думать что происходит, анализируя результат на разных стратегиях. -Если вы применяете большой TTL, чтобы достать до магистрала, то не лишним будет добавить дополнительный ограничитель ---dpi-desync-fooling, чтобы не сломать сайты на более коротких дистанциях. -md5sig наиболее совместим, но работает только на linux серверах. -badseq может работать только на https и не работать на http. -Чтобы выяснить какие дополнительные ограничители работают, смотрите результат теста аналогичных стратегий без TTL -с каждым из этих ограничителей. - -При использовании autottl следует протестировать как можно больше разных доменов. Эта техника -может на одних провайдерах работать стабильно, на других потребуется выяснить при каких параметрах -она стабильна, на третьих полный хаос, и проще отказаться. - -Далее, имея понимание что работает на http, https, quic, нужно сконструировать параметры запуска tpws и/или nfqws -с использованием мультистратегии. Как работают мультистратегии описано в readme.txt. - -Если кратко, то обычно параметры конструируются так : -"--filter-udp=443 'параметры для quic' --new ---filter-tcp=80,443 'обьединенные параметры для http и https' " - -Или так : -"--filter-udp=443 "параметры для quic" --new ---filter-tcp=80 'параметры для http' --new ---filter-tcp=443 'параметры для https' " - -"" и "" так и пишутся. Их не надо на что-то заменять. Это сделают скрипты запуска, -если вы выбрали режим фильтрации по хостлистам, и уберут в противном случае. -Если для какого-то протокола надо дурить все без стандартного хостлиста - просто уберите оттуда "" -и "". -Можно писать свои параметры --hostlist и --hostlist-exclude для дополнительных хостлистов -или в профилях специализаций под конкретный ресурс. В последнем случае стандартный хостлист там не нужен. -Следует избегать указания собственных параметров --hostlist на листы из директории ipset. -Эта логика включена в "" и "". -Отличие "" в том, что стандартный автолист по этому профилю используется как обычный, -то есть без автоматического добавления доменов. Однако, добавления в других профилях автоматически -отражаются во всех остальных. - -Если стратегии отличаются по версии ip протокола, и вы не можете их обьединить, фильтр пишется так : -"--filter-l3=ipv4 --filter-udp=443 "параметры для quic ipv4" --new ---filter-l3=ipv4 --filter-tcp=80 'параметры для http ipv4' --new ---filter-l3=ipv4 --filter-tcp=443 'параметры для https ipv4' --new ---filter-l3=ipv6 --filter-udp=443 "параметры для quic ipv6" --new ---filter-l3=ipv6 --filter-tcp=80 'параметры для http ipv6' --new ---filter-l3=ipv6 --filter-tcp=443 'параметры для https ipv6' " - -Но здесь совсем "копи-пастный" вариант. -Чем больше вы обьедините стратегий и сократите их общее количество, тем будет лучше. - -Если вам не нужно дурение отдельных протоколов, лучше всего будет их убрать из системы перехвата трафика через -параметры TPWS_PORTS, NFQWS_PORTS_TCP, NFQWS_PORTS_UDP и убрать соответствующие им профили мультистратегии. -tcp 80 - http, tcp 443 - https, udp 443 - quic. - -Если используются методы нулевой фазы десинхронизации (--mss, --wssize, --dpi-desync=syndata) и режим фильтрации hostlist, -то все параметры, относящиеся к этим методам, следует помещать в отдельные профили мульистратегии, которые получат -управление до определения имени хоста. Необходимо понимать алгоритм работы мультистратегий. -Самым надежным вариантом будет дублирование этих параметров на 2 профиля. Какой-нибудь сработает в зависимости -от параметра MODE_FILTER. - -"--filter-tcp=80 'параметры для http' --new ---filter-tcp=443 'параметры для https' --wssize 1:6 --new ---filter-tcp=443 --wssize 1:6" - -В этом примере wssize будет применяться всегда к порту tcp 443 вне зависимости от параметра MODE_FILTER. -Хостлист будет игнорироваться, если таковой имеется. К http применять wssize вредно и бессмысленно. - -Никто не мешает использовать tpws для http, nfqws для https, либо комбинировать действие nfqws и tpws для одного протокола. -В текущем варианте скриптов запуска это делается максимально гибко и независимо друг от друга. - -8) Запустите install_easy.sh. -Выберите nfqws и/или tpws, затем согласитесь на редактирование параметров. -Откроется редактор, куда впишите созданную на предыдущем этапе стратегию. - -9) На все остальные вопросы install_easy.sh отвечайте согласно выводимой аннонтации. - -10) Если ломаются отдельные незаблокированные ресурсы, следует вносить их в исключения, либо пользоваться ограничивающим -ipset или хост листом. Читайте основной талмуд readme.txt ради подробностей. -Но еще лучше будет подбирать такие стратегии, которые ломают минимум. -Есть стратегии довольно безобидные, а есть сильно ломающие, которые подходят только для точечного пробития отдельных ресурсов, -когда ничего лучше нет. Хорошая стратегия может сильно ломать из-за плохо подобранных ограничителей для фейков - ttl, fooling. - -Это минимальная инструкция, чтобы соориентироваться с чего начать. Однако, это - не панацея. -В некоторых случаях вы не обойдетесь без знаний и основного "талмуда". -Подробности и полное техническое описание расписаны в readme.txt diff --git a/docs/quick_start_windows.md b/docs/quick_start_windows.md index d53ed5e..5868b8a 100644 --- a/docs/quick_start_windows.md +++ b/docs/quick_start_windows.md @@ -1,7 +1,7 @@ -# Windows quick start +# Быстрая настройка Windows Специально для тех, кто хочет побыстрее начать, но не хочет слишком углубляться в простыню [readme.md](./readme.md). -> [!CAUTION] +> [!CAUTION] > Как обычно, компьютерная грамотность ложится полностью на вас. > Вы должны уметь работать с консолью windows и иметь минимальные навыки обращения с командными файлами `bat`, `cmd`. > Если грамотность отсутствует и возникает куча _"как?"_ на базовых вещах, значит эта программа не для вас. @@ -22,7 +22,7 @@ Будем считать, что у вас есть windows 7 или выше. Задача - обойти блокировки с самой системы. -> [!NOTE] +> [!NOTE] > Есть решение самое простое, а есть "как положено". ## САМОЕ ПРОСТОЕ РЕШЕНИЕ @@ -30,7 +30,7 @@ _"Совсем ничего не могу, все очень сложно, дайте мне таблетку."_ ©Простой пользователь 1) Скачайте и распакуйте архив https://github.com/bol-van/zapret-win-bundle/archive/refs/heads/master.zip. -2) Запустите `zapret-winws/preset_russia.cmd` от имени администратора. Возможно, заведется сразу. +2) Запустите `zapret-winws/preset_russia.cmd` от имени администратора. Возможно, заведется сразу. То же самое с ограничителем по автоматически создаваемому хост-листу `preset_russia_autohostlist.cmd`. Что такое `autohostlist` - читайте [readme.md](./readme.md). Проще говоря, мы обходим только то, что долго и упорно не хочет открываться. @@ -45,7 +45,7 @@ _"Совсем ничего не могу, все очень сложно, да 2) Если у вас Windows 7 x64, читайте [docs/windows.md](./windows.md). Без описанной там подготовки может не работать. -> [!WARNING] +> [!WARNING] > Для 32-битных систем Windows нет готового полного варианта. На windows 11 arm64 выполните `arm64/install_arm64.cmd` от имени администратора и перезагрузите компьютер. @@ -80,11 +80,11 @@ win11 поддерживает системные DoH из коробки. Он Лог скрипта будет сохранен в `blockcheck\blockcheck.log`. Запомните/перепишите найденные стратегии. -> [!WARNING] +> [!WARNING] > Следует понимать, что blockcheck проверяет доступность только конкретного домена, который вы вводите в начале. > Вероятно, все остальные домены блокированы подобным образом, но не факт. -> [!TIP] +> [!TIP] > В большинстве случаев можно обьединить несколько стратегий в одну универсальную, и это крайне желательно. Необходимо понимать [как работают стратегии](./readme.md/#nfqws). @@ -116,12 +116,12 @@ badseq может работать только на https и не работа Пример стандартного фильтра для перехвата http, https, quic : `--wf-tcp=80,443` `--wf-udp=443` -> [!WARNING] +> [!WARNING] > Фильтр должен быть минимально необходимым. Перехват лишнего трафика приведет только к бессмысленному расходованию ресурсов процессора и замедлению интернета. Если кратко по мультистратегии, то обычно параметры конструируются так : ``` ---filter-udp=443 'параметры для quic' --new +--filter-udp=443 'параметры для quic' --new --filter-tcp=80,443 'обьединенные параметры для http и https' ``` @@ -196,7 +196,7 @@ ipset или хост листом. Читайте основной талмуд Есть стратегии довольно безобидные, а есть сильно ломающие, которые подходят только для точечного пробития отдельных ресурсов, когда ничего лучше нет. Хорошая стратегия может сильно ломать из-за плохо подобранных ограничителей для фейков - ttl, fooling. -> [!CAUTION] +> [!CAUTION] > Это минимальная инструкция, чтобы соориентироваться с чего начать. Однако, это - не панацея. > В некоторых случаях вы не обойдетесь без знаний и основного "талмуда". diff --git a/docs/readme.en.md b/docs/readme.en.md index 488b76d..195a80b 100644 --- a/docs/readme.en.md +++ b/docs/readme.en.md @@ -1318,11 +1318,11 @@ Now its possible to run `/data/local/tmp/zapret/tpws` from any app such as taske ### FreeBSD, OpenBSD, MacOS -see [docs/bsd.en.md](./bsd.en.md) +see [BSD documentation](./bsd.en.md) ### Windows (WSL) -see [docs/windows.en.md](./windows.en.md) +see [Windows documentation](./windows.en.md) ### Other devices @@ -1351,6 +1351,12 @@ If this is the case then run another script in background and add some delay the Are welcome here : -USDT USDT 0x3d52Ce15B7Be734c53fc9526ECbAB8267b63d66E +USDT USDT +``` +0x3d52Ce15B7Be734c53fc9526ECbAB8267b63d66E +``` -USDT BTC bc1qhqew3mrvp47uk2vevt5sctp7p2x9m7m5kkchve +USDT BTC +``` +bc1qhqew3mrvp47uk2vevt5sctp7p2x9m7m5kkchve +``` diff --git a/docs/readme.md b/docs/readme.md index 57a038d..f9a3580 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -64,9 +64,8 @@ VPN. ## Быстрый старт -> *Linux/openwrt:* [docs/quick_start.txt](./quick_start.txt) -> ->*Windows:* [docs/quick_start_windows.md](./quick_start_windows.md) +- Linux/openWrt: [Документация](./quick_start.md) +- Windows: [Документация](./quick_start_windows.md) ## Как это работает @@ -240,7 +239,7 @@ NFQUEUE работает без изменений. ## nfqws Эта программа - модификатор пакетов и обработчик очереди NFQUEUE. Для BSD систем существует адаптированный вариант - -dvtws, собираемый из тех же исходников (см. [bsd.txt](./bsd.txt)). +dvtws, собираемый из тех же исходников (см. [документация BSD](./bsd.md)). ``` @|$ ; читать конфигурацию из файла. опция должна быть первой. остальные опции игнорируются. @@ -1179,7 +1178,7 @@ mdig --family=6 --dns-make-query=rutracker.org | curl --data-binary @- -H "Conte В системе запуска это обыграно следующим образом. Присутствуют 2 include списка : -`ipset/zapret-hosts-users.txt.gz` или `ipset/zapret-hosts-users.txt`, +`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` @@ -2054,11 +2053,11 @@ curl: (7) Failed to connect to www.ru port 80: Host is unreachable ## FreeBSD, OpenBSD, MacOS -Описано в [docs/bsd.txt](./bsd.txt) +Описано в [документации BSD](./bsd.md) ## Windows -Описано в [docs/windows.md](./windows.md) +Описано в [документации Windows](./windows.md) ## Другие прошивки @@ -2172,5 +2171,12 @@ VPS можно прибрести в множестве мест. Существ [Реквизиты](https://github.com/bol-van/zapret/issues/590): -USDT USDT 0x3d52Ce15B7Be734c53fc9526ECbAB8267b63d66E -USDT BTC bc1qhqew3mrvp47uk2vevt5sctp7p2x9m7m5kkchve +USDT USDT +``` +0x3d52Ce15B7Be734c53fc9526ECbAB8267b63d66E +``` + +USDT BTC +``` +bc1qhqew3mrvp47uk2vevt5sctp7p2x9m7m5kkchve +```