mirror of
https://github.com/bol-van/zapret.git
synced 2024-11-26 20:20:53 +03:00
Compare commits
No commits in common. "ad0aa2786095acc627fa6f180a60306856170b31" and "abe507c9c383a09949ec24ad02fa5e30b3e3e3ee" have entirely different histories.
ad0aa27860
...
abe507c9c3
@ -217,9 +217,8 @@ ipfrag2 desync mode.
|
|||||||
|
|
||||||
There's autostart script example in `init.d/pfsense`. It should be placed to
|
There's autostart script example in `init.d/pfsense`. It should be placed to
|
||||||
`/usr/local/etc/rc.d` and edited. Write your ipfw rules and daemon start
|
`/usr/local/etc/rc.d` and edited. Write your ipfw rules and daemon start
|
||||||
commands.
|
commands. Because git is absent the most convinient way to copy files is ssh.
|
||||||
curl is present by default. You can use it to download `tar.gz` release directly from github.
|
curl is present by default.
|
||||||
Or you can copy files using sftp.
|
|
||||||
|
|
||||||
Copy zip with zapret files to `/opt` and unpack there as it's done in other
|
Copy zip with zapret files to `/opt` and unpack there as it's done in other
|
||||||
systems. In this case run `dvtws` as `/opt/zapret/nfq/dvtws`. Or just copy
|
systems. In this case run `dvtws` as `/opt/zapret/nfq/dvtws`. Or just copy
|
||||||
@ -228,6 +227,9 @@ present. It's possible to renew lists.
|
|||||||
|
|
||||||
If you dont like poverty of default repos its possible to enable FreeBSD repo.
|
If you dont like poverty of default repos its possible to enable FreeBSD repo.
|
||||||
Change `no` to `yes` in `/usr/local/etc/pkg/repos/FreeBSD.conf` and `/usr/local/etc/pkg/repos/pfSense.conf`.
|
Change `no` to `yes` in `/usr/local/etc/pkg/repos/FreeBSD.conf` and `/usr/local/etc/pkg/repos/pfSense.conf`.
|
||||||
|
Then it becomes possible to install all the required software including git to download
|
||||||
|
zapret from github directly.
|
||||||
|
|
||||||
|
|
||||||
`/usr/local/etc/rc.d/zapret.sh` (chmod 755)
|
`/usr/local/etc/rc.d/zapret.sh` (chmod 755)
|
||||||
```
|
```
|
||||||
|
725
docs/bsd.md
725
docs/bsd.md
@ -1,725 +0,0 @@
|
|||||||
# Настройка BSD-подобных систем
|
|
||||||
|
|
||||||
* [Поддерживаемые версии](#поддерживаемые-версии)
|
|
||||||
* [Особенности BSD систем](#особенности-bsd-систем)
|
|
||||||
* [Отсутствие nfqueue](#отсутствие-nfqueue)
|
|
||||||
* [Типы Firewall](#типы-firewall)
|
|
||||||
* [Сборка](#сборка)
|
|
||||||
* [Divert сокеты](#divert-сокеты)
|
|
||||||
* [Lookup Tables](#lookup-tables)
|
|
||||||
* [Загрузка ip таблиц из файла](#загрузка-ip-таблиц-из-файла)
|
|
||||||
* [Отсутствие splice](#отсутствие-splice)
|
|
||||||
* [mdig и ip2net](#mdig-и-ip2net)
|
|
||||||
* [FreeBSD](#freebsd)
|
|
||||||
* [Подгрузка ipdivert](#подгрузка-ipdivert)
|
|
||||||
* [Авто-восстановление правил ipfw и работа в фоне](#авто-восстановление-правил-ipfw-и-работа-в-фоне)
|
|
||||||
* [tpws в прозрачном режиме](#tpws-в-прозрачном-режиме)
|
|
||||||
* [Запуск dvtws](#запуск-dvtws)
|
|
||||||
* [PF в FreeBSD](#pf-в-freebsd)
|
|
||||||
* [pfsense](#pfsense)
|
|
||||||
* [OpenBSD](#openbsd)
|
|
||||||
* [tpws bind на ipv4](#tpws-bind-на-ipv4)
|
|
||||||
* [tpws для проходящего трафика](#tpws-для-проходящего-трафика)
|
|
||||||
* [Запуск dvtws](#запуск-dvtws)
|
|
||||||
* [Проблемы с badsum](#проблемы-с-badsum)
|
|
||||||
* [Особенность отправки fake пакетов](#особенность-отправки-fake-пакетов)
|
|
||||||
* [Перезагрузка PF таблиц](#перезагрузка-pf-таблиц)
|
|
||||||
* [MacOS](#macos)
|
|
||||||
* [Введение](#введение)
|
|
||||||
* [dvtws бесполезен](#dvtws-бесполезен)
|
|
||||||
* [tpws](#tpws)
|
|
||||||
* [Проблема link-local адреса](#проблема-link-local-адреса)
|
|
||||||
* [Сборка](#сборка)
|
|
||||||
* [Простая установка](#простая-установка)
|
|
||||||
* [Вариант Custom](#вариант-custom)
|
|
||||||
|
|
||||||
|
|
||||||
## Поддерживаемые версии
|
|
||||||
**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.
|
|
||||||
|
|
||||||
### Загрузка ip таблиц из файла
|
|
||||||
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` не требует повышенных привилегий для реализации
|
|
||||||
> прозрачного режима. Однако, без рута невозможен bind на порты `< 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
|
|
||||||
```
|
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> В PF не выходит делать rdr-to с той же системы, где работает proxy.
|
|
||||||
> Вариант с route-to не сохраняет мета информацию. Адрес назначения теряется.
|
|
||||||
> Поэтому этот вариант годится для squid, берущего адрес из протокола прикладного уровня, но не годится для tpws, полагающегося на метаданные ОС.
|
|
||||||
> Поддержка rdr-to реализована через `/dev/pf`, поэтому прозрачный режим **требует root**.
|
|
||||||
|
|
||||||
|
|
||||||
### 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 bind на ipv4
|
|
||||||
В `tpws` bind по умолчанию только на ipv6. Для bind на 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 не сохраняет мета информацию. Адрес назначения теряется.
|
|
||||||
> Поэтому этот вариант годится для squid, берущего адрес из протокола прикладного уровня, но не годится для tpws, полагающегося на метаданные ОС.
|
|
||||||
> Поддержка 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 <zapret> file "/opt/zapret/ipset/zapret-ip.txt"
|
|
||||||
table <zapret-user> file "/opt/zapret/ipset/zapret-ip-user.txt"
|
|
||||||
table <nozapret> file "/opt/zapret/ipset/zapret-ip-exclude.txt"
|
|
||||||
pass out quick on em0 inet proto tcp to <nozapret> port {80,443}
|
|
||||||
pass in quick on em0 inet proto tcp from <zapret> port {80,443} flags SA/SA divert-packet port 989 no state
|
|
||||||
pass in quick on em0 inet proto tcp from <zapret> port {80,443} no state
|
|
||||||
pass out quick on em0 inet proto tcp to <zapret> port {80,443} divert-packet port 989 no state
|
|
||||||
pass in quick on em0 inet proto tcp from <zapret-user> port {80,443} flags SA/SA divert-packet port 989 no state
|
|
||||||
pass in quick on em0 inet proto tcp from <zapret-user> port {80,443} no state
|
|
||||||
pass out quick on em0 inet proto tcp to <zapret-user> port {80,443} divert-packet port 989 no state
|
|
||||||
table <zapret6> file "/opt/zapret/ipset/zapret-ip6.txt"
|
|
||||||
table <zapret6-user> file "/opt/zapret/ipset/zapret-ip-user6.txt"
|
|
||||||
table <nozapret6> file "/opt/zapret/ipset/zapret-ip-exclude6.txt"
|
|
||||||
pass out quick on em0 inet6 proto tcp to <nozapret6> port {80,443}
|
|
||||||
pass in quick on em0 inet6 proto tcp from <zapret6> port {80,443} flags SA/SA divert-packet port 989 no state
|
|
||||||
pass in quick on em0 inet6 proto tcp from <zapret6> port {80,443} no state
|
|
||||||
pass out quick on em0 inet6 proto tcp to <zapret6> port {80,443} divert-packet port 989 no state
|
|
||||||
pass in quick on em0 inet6 proto tcp from <zapret6-user> port {80,443} flags SA/SA divert-packet port 989 no state
|
|
||||||
pass in quick on em0 inet6 proto tcp from <zapret6-user> port {80,443} no state
|
|
||||||
pass out quick on em0 inet6 proto tcp to <zapret6-user> 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` понимают команду перезагрузить только таблицы. Но это не относится к **OpenBSD**. В новых **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
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Простая установка
|
|
||||||
В **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).
|
|
476
docs/bsd.txt
Normal file
476
docs/bsd.txt
Normal file
@ -0,0 +1,476 @@
|
|||||||
|
Поддерживаемые версии
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
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 <zapret> file "/opt/zapret/ipset/zapret-ip.txt"
|
||||||
|
table <zapret-user> file "/opt/zapret/ipset/zapret-ip-user.txt"
|
||||||
|
table <nozapret> file "/opt/zapret/ipset/zapret-ip-exclude.txt"
|
||||||
|
pass out quick on em0 inet proto tcp to <nozapret> port {80,443}
|
||||||
|
pass in quick on em0 inet proto tcp from <zapret> port {80,443} flags SA/SA divert-packet port 989 no state
|
||||||
|
pass in quick on em0 inet proto tcp from <zapret> port {80,443} no state
|
||||||
|
pass out quick on em0 inet proto tcp to <zapret> port {80,443} divert-packet port 989 no state
|
||||||
|
pass in quick on em0 inet proto tcp from <zapret-user> port {80,443} flags SA/SA divert-packet port 989 no state
|
||||||
|
pass in quick on em0 inet proto tcp from <zapret-user> port {80,443} no state
|
||||||
|
pass out quick on em0 inet proto tcp to <zapret-user> port {80,443} divert-packet port 989 no state
|
||||||
|
table <zapret6> file "/opt/zapret/ipset/zapret-ip6.txt"
|
||||||
|
table <zapret6-user> file "/opt/zapret/ipset/zapret-ip-user6.txt"
|
||||||
|
table <nozapret6> file "/opt/zapret/ipset/zapret-ip-exclude6.txt"
|
||||||
|
pass out quick on em0 inet6 proto tcp to <nozapret6> port {80,443}
|
||||||
|
pass in quick on em0 inet6 proto tcp from <zapret6> port {80,443} flags SA/SA divert-packet port 989 no state
|
||||||
|
pass in quick on em0 inet6 proto tcp from <zapret6> port {80,443} no state
|
||||||
|
pass out quick on em0 inet6 proto tcp to <zapret6> port {80,443} divert-packet port 989 no state
|
||||||
|
pass in quick on em0 inet6 proto tcp from <zapret6-user> port {80,443} flags SA/SA divert-packet port 989 no state
|
||||||
|
pass in quick on em0 inet6 proto tcp from <zapret6-user> port {80,443} no state
|
||||||
|
pass out quick on em0 inet6 proto tcp to <zapret6-user> 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
|
@ -1,21 +1,42 @@
|
|||||||
How to compile native programs for use in openwrt
|
How to compile native programs for use in openwrt
|
||||||
-------------------------------------------------
|
-------------------------------------------------
|
||||||
|
|
||||||
1) Download latest SDK for your platform from https://downloads.openwrt.org
|
1) <fetch correct version of openwrt>
|
||||||
|
|
||||||
curl -o - https://downloads.openwrt.org/releases/23.05.5/targets/x86/64/openwrt-sdk-23.05.5-x86-64_gcc-12.3.0_musl.Linux-x86_64.tar.xz | tar -Jxvf -
|
cd ~
|
||||||
cd openwrt-sdk-23.05.5-x86-64_gcc-12.3.0_musl.Linux-x86_64
|
|
||||||
|
<chaos calmer>
|
||||||
|
git clone git://git.openwrt.org/15.05/openwrt.git
|
||||||
|
<barrier breaker>
|
||||||
|
git clone git://git.openwrt.org/14.07/openwrt.git
|
||||||
|
<trunk>
|
||||||
|
git clone git://git.openwrt.org/openwrt.git
|
||||||
|
|
||||||
|
cd openwrt
|
||||||
|
|
||||||
2) ./scripts/feeds update -a
|
2) ./scripts/feeds update -a
|
||||||
./scripts/feeds install -a
|
./scripts/feeds install -a
|
||||||
|
|
||||||
3) cp -R /opt/zapret/docs/compile/openwrt/. .
|
3) #add zapret packages to build root
|
||||||
cp -R /opt/zapret/tpws package/zapret/tpws
|
#copy package descriptions
|
||||||
cp -R /opt/zapret/nfq package/zapret/nfqws
|
copy compile/openwrt/* to ~/openwrt
|
||||||
cp -R /opt/zapret/mdig package/zapret/mdig
|
#copy source code of tpws
|
||||||
cp -R /opt/zapret/ip2net package/zapret/ip2net
|
copy tpws to ~/openwrt/package/zapret/tpws
|
||||||
|
#copy source code of nfq
|
||||||
|
copy nfq to ~/openwrt/package/zapret/nfq
|
||||||
|
#copy source code of ip2net
|
||||||
|
copy ip2net to ~/openwrt/package/zapret/ip2net
|
||||||
|
|
||||||
4) make package/{tpws,nfqws,mdig,ip2net}/compile
|
4) make menuconfig
|
||||||
|
#select your target architecture
|
||||||
|
#select packages Network/Zapret/* as "M"
|
||||||
|
|
||||||
5) find bin -name tpws*.ipk
|
5) make toolchain/compile
|
||||||
|
|
||||||
|
6) make package/tpws/compile
|
||||||
|
make package/nfqws/compile
|
||||||
|
make package/ip2net/compile
|
||||||
|
make package/mdig/compile
|
||||||
|
|
||||||
|
7) find bin -name tpws*.ipk
|
||||||
#take your tpws*.ipk , nfqws*.ipk , ip2net*.ipk, mdig*.ipk from there
|
#take your tpws*.ipk , nfqws*.ipk , ip2net*.ipk, mdig*.ipk from there
|
||||||
|
282
docs/manual_setup.txt
Normal file
282
docs/manual_setup.txt
Normal file
@ -0,0 +1,282 @@
|
|||||||
|
Пример ручной установки на debian-подобную систему
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
На debian основано большое количество дистрибутивов linux, включая ubuntu.
|
||||||
|
Здесь рассматриваются прежде всего Debian 8+ и Ubuntu 16+.
|
||||||
|
Но с большой вероятностью может сработать и на производных от них.
|
||||||
|
Главное условие - наличие systemd, apt и нескольких стандартных пакетов в репозитории.
|
||||||
|
|
||||||
|
Установить пакеты :
|
||||||
|
apt-get update
|
||||||
|
apt-get install ipset curl dnsutils git
|
||||||
|
|
||||||
|
Если хотите использовать nftables, то нужен пакет nftables, а ipset не обязателен.
|
||||||
|
|
||||||
|
Скопировать директорию zapret в /opt или скачать через git :
|
||||||
|
cd /opt
|
||||||
|
git clone --depth 1 https://github.com/bol-van/zapret
|
||||||
|
|
||||||
|
Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики.
|
||||||
|
/opt/zapret/install_bin.sh
|
||||||
|
АЛЬТЕРНАТИВА : make -C /opt/zapret. Получите динамические бинарики под вашу ось.
|
||||||
|
Для сборки требуются dev пакеты : zlib1g-dev libcap-dev libnetfilter-queue-dev
|
||||||
|
|
||||||
|
Создать конфиг по умолчанию :
|
||||||
|
cp /opt/zapret/config.default /opt/zapret/config
|
||||||
|
|
||||||
|
Настроить параметры согласно разделу "Выбор параметров".
|
||||||
|
|
||||||
|
Создать user листы по умолчанию :
|
||||||
|
cp /opt/zapret/ipset/zapret-hosts-user-exclude.txt.default /opt/zapret/ipset/zapret-hosts-user-exclude.txt
|
||||||
|
echo nonexistent.domain >/opt/zapret/ipset/zapret-hosts-user.txt
|
||||||
|
touch /opt/zapret/ipset/zapret-hosts-user-ipban.txt
|
||||||
|
|
||||||
|
Создать ссылку на service unit в systemd :
|
||||||
|
ln -fs /opt/zapret/init.d/systemd/zapret.service /lib/systemd/system
|
||||||
|
|
||||||
|
Удалить старые листы, если они были созданы ранее :
|
||||||
|
/opt/zapret/ipset/clear_lists.sh
|
||||||
|
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
|
||||||
|
Выполнить скрипт обновления листа :
|
||||||
|
/opt/zapret/ipset/get_config.sh
|
||||||
|
Настроить таймер systemd для обновления листа :
|
||||||
|
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.service /lib/systemd/system
|
||||||
|
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.timer /lib/systemd/system
|
||||||
|
|
||||||
|
Принять изменения в systemd :
|
||||||
|
systemctl daemon-reload
|
||||||
|
|
||||||
|
Включить автозапуск службы :
|
||||||
|
systemctl enable zapret
|
||||||
|
|
||||||
|
Включить таймер обновления листа :
|
||||||
|
systemctl enable zapret-list-update.timer
|
||||||
|
|
||||||
|
Запустить службу :
|
||||||
|
systemctl start zapret
|
||||||
|
|
||||||
|
Шпаргалка по управлению службой и таймером :
|
||||||
|
|
||||||
|
enable auto start : systemctl enable zapret
|
||||||
|
disable auto start : systemctl disable zapret
|
||||||
|
start : systemctl start zapret
|
||||||
|
stop : systemctl stop zapret
|
||||||
|
status, output messages : systemctl status zapret
|
||||||
|
timer info : systemctl list-timer
|
||||||
|
delete service : systemctl disable zapret ; rm /lib/systemd/system/zapret.service
|
||||||
|
delete timer : systemctl disable zapret-list-update.timer ; rm /lib/systemd/system/zapret-list-update.*
|
||||||
|
|
||||||
|
Centos 7+, Fedora
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Centos с 7 версии и более-менее новые федоры построены на systemd.
|
||||||
|
В качестве пакетного менеджера используется yum.
|
||||||
|
|
||||||
|
Установить пакеты :
|
||||||
|
yum install -y curl ipset dnsutils git
|
||||||
|
|
||||||
|
Далее все аналогично debian.
|
||||||
|
|
||||||
|
OpenSUSE
|
||||||
|
--------
|
||||||
|
|
||||||
|
Новые OpenSUSE основаны на systemd и менеджере пакетов zypper.
|
||||||
|
|
||||||
|
Установить пакеты :
|
||||||
|
zypper --non-interactive install curl ipset
|
||||||
|
|
||||||
|
Далее все аналогично debian, кроме расположения systemd.
|
||||||
|
В opensuse он находится не в /lib/systemd, а в /usr/lib/systemd.
|
||||||
|
Правильные команды будут :
|
||||||
|
|
||||||
|
ln -fs /opt/zapret/init.d/systemd/zapret.service /usr/lib/systemd/system
|
||||||
|
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.service /usr/lib/systemd/system
|
||||||
|
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.timer /usr/lib/systemd/system
|
||||||
|
|
||||||
|
Arch linux
|
||||||
|
----------
|
||||||
|
|
||||||
|
Построен на базе systemd.
|
||||||
|
|
||||||
|
Установить пакеты :
|
||||||
|
pacman -Syy
|
||||||
|
pacman --noconfirm -S ipset curl
|
||||||
|
|
||||||
|
Далее все аналогично debian.
|
||||||
|
|
||||||
|
Gentoo
|
||||||
|
------
|
||||||
|
|
||||||
|
Эта система использует OpenRC - улучшенную версию sysvinit.
|
||||||
|
Установка пакетов производится командой : emerge <package_name>
|
||||||
|
Пакеты собираются из исходников.
|
||||||
|
|
||||||
|
Требуются все те же ipset, curl, git для скачивания с github.
|
||||||
|
git и curl по умолчанию могут присутствовать, ipset отсутствует.
|
||||||
|
|
||||||
|
emerge ipset
|
||||||
|
|
||||||
|
Настроить параметры согласно разделу "Выбор параметров".
|
||||||
|
|
||||||
|
Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики.
|
||||||
|
/opt/zapret/install_bin.sh
|
||||||
|
АЛЬТЕРНАТИВА : make -C /opt/zapret. Получите динамические бинарики под вашу ось.
|
||||||
|
|
||||||
|
Удалить старые листы, если они были созданы ранее :
|
||||||
|
/opt/zapret/ipset/clear_lists.sh
|
||||||
|
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
|
||||||
|
Выполнить скрипт обновления листа :
|
||||||
|
/opt/zapret/ipset/get_config.sh
|
||||||
|
Зашедулить обновление листа :
|
||||||
|
crontab -e
|
||||||
|
Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh"
|
||||||
|
|
||||||
|
Подключить init скрипт :
|
||||||
|
|
||||||
|
ln -fs /opt/zapret/init.d/openrc/zapret /etc/init.d
|
||||||
|
rc-update add zapret
|
||||||
|
|
||||||
|
Запустить службу :
|
||||||
|
|
||||||
|
rc-service zapret start
|
||||||
|
|
||||||
|
Шпаргалка по управлению службой :
|
||||||
|
|
||||||
|
enable auto start : rc-update add zapret
|
||||||
|
disable auto start : rc-update del zapret
|
||||||
|
start : rc-service zapret start
|
||||||
|
stop : rc-service zapret stop
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Ручная установка на openwrt/LEDE 15.xx-21.xx
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
|
!!! Данная инструкция написана для систем, основанных на iptables+firewall3
|
||||||
|
!!! В новых версиях openwrt переходит на nftables+firewall4, инструкция неприменима. Пользуйтесь install_easy.sh
|
||||||
|
|
||||||
|
Установить дополнительные пакеты :
|
||||||
|
opkg update
|
||||||
|
opkg install iptables-mod-extra iptables-mod-nfqueue iptables-mod-filter iptables-mod-ipopt iptables-mod-conntrack-extra ipset curl
|
||||||
|
(ipv6) opkg install ip6tables-mod-nat
|
||||||
|
(опционально) opkg install gzip
|
||||||
|
(опционально) opkg install coreutils-sort
|
||||||
|
|
||||||
|
ЭКОНОМИЯ МЕСТА :
|
||||||
|
|
||||||
|
gzip от busybox в разы медленней полноценного варианта. gzip используется скриптами получения листов.
|
||||||
|
sort от busybox медленней полноценного варианта и жрет намного больше памяти. sort используется скриптами получения листов.
|
||||||
|
iptables-mod-nfqueue можно выкинуть, если не будем пользоваться nfqws
|
||||||
|
curl можно выкинуть, если для получения ip листа будет использоваться только get_user.sh
|
||||||
|
|
||||||
|
Самая главная трудность - скомпилировать программы на C. Это можно сделать на linux x64 при помощи SDK, который
|
||||||
|
можно скачать с официального сайта openwrt или LEDE. Но процесс кросс компиляции - это всегда сложности.
|
||||||
|
Недостаточно запустить make как на традиционной linux системе.
|
||||||
|
Поэтому в binaries имеются готовые статические бинарики для всех самых распространенных архитектур.
|
||||||
|
Статическая сборка означает, что бинарик не зависит от типа libc (glibc, uclibc или musl) и наличия установленных so.
|
||||||
|
Его можно использовать сразу. Лишь бы подходил тип CPU. У ARM и MIPS есть несколько версий.
|
||||||
|
Скорее всего найдется рабочий вариант. Если нет - вам придется собирать самостоятельно.
|
||||||
|
Для всех поддерживаемых архитектур бинарики запакованы upx. На текущий момент все, кроме mips64.
|
||||||
|
|
||||||
|
Скопировать директорию "zapret" в /opt на роутер.
|
||||||
|
|
||||||
|
Если места достаточно, самый простой способ :
|
||||||
|
opkg update
|
||||||
|
opkg install git-http
|
||||||
|
mkdir /opt
|
||||||
|
cd /opt
|
||||||
|
git clone --depth 1 https://github.com/bol-van/zapret
|
||||||
|
|
||||||
|
Если места немного :
|
||||||
|
opkg update
|
||||||
|
opkg install openssh-sftp-server unzip
|
||||||
|
ifconfig br-lan
|
||||||
|
Скачать на комп с github zip архив кнопкой "Clone or download"->Download ZIP
|
||||||
|
Скопировать средствами sftp zip архив на роутер в /tmp.
|
||||||
|
mkdir /opt
|
||||||
|
cd /opt
|
||||||
|
unzip /tmp/zapret-master.zip
|
||||||
|
mv zapret-master zapret
|
||||||
|
rm /tmp/zapret-master.zip
|
||||||
|
|
||||||
|
Если места совсем мало :
|
||||||
|
На linux системе скачать и распаковать zapret. Оставить необходимый минимум файлов.
|
||||||
|
Запаковать в архив zapret.tar.gz.
|
||||||
|
nc -l -p 1111 <zapret.tar.gz
|
||||||
|
На роутере
|
||||||
|
cd /tmp
|
||||||
|
nc <linux_system_ip> 1111 >zapret.tar.gz
|
||||||
|
|
||||||
|
Не стоит работать с распакованной версией zapret на windows. Потеряются ссылки и chmod.
|
||||||
|
|
||||||
|
Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики.
|
||||||
|
/opt/zapret/install_bin.sh
|
||||||
|
|
||||||
|
Создать ссылку на скрипт запуска :
|
||||||
|
ln -fs /opt/zapret/init.d/openwrt/zapret /etc/init.d
|
||||||
|
Создать ссылку на скрипт события поднятия интерфейса :
|
||||||
|
ln -fs /opt/zapret/init.d/openwrt/90-zapret /etc/hotplug.d/iface
|
||||||
|
|
||||||
|
Создать конфиг по умолчанию :
|
||||||
|
cp /opt/zapret/config.default /opt/zapret/config
|
||||||
|
|
||||||
|
Настроить параметры согласно разделу "Выбор параметров".
|
||||||
|
|
||||||
|
Создать user листы по умолчанию :
|
||||||
|
cp /opt/zapret/ipset/zapret-hosts-user-exclude.txt.default /opt/zapret/ipset/zapret-hosts-user-exclude.txt
|
||||||
|
echo nonexistent.domain >/opt/zapret/ipset/zapret-hosts-user.txt
|
||||||
|
touch /opt/zapret/ipset/zapret-hosts-user-ipban.txt
|
||||||
|
|
||||||
|
Удалить старые листы, если они были созданы ранее :
|
||||||
|
/opt/zapret/ipset/clear_lists.sh
|
||||||
|
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
|
||||||
|
Выполнить скрипт обновления листа :
|
||||||
|
/opt/zapret/ipset/get_config.sh
|
||||||
|
Зашедулить обновление листа :
|
||||||
|
crontab -e
|
||||||
|
Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh"
|
||||||
|
|
||||||
|
Включить автозапуск службы и запустить ее :
|
||||||
|
/etc/init.d/zapret enable
|
||||||
|
/etc/init.d/zapret start
|
||||||
|
ПРИМЕЧАНИЕ : на этапе старта системы интерфейсы еще не подняты. в некоторых случаях невозможно правильно
|
||||||
|
сформировать параметры запуска демонов, не зная имя физического интерфейса LAN.
|
||||||
|
Cкрипт из /etc/hotplug.d/iface перезапустит демоны по событию поднятия LAN.
|
||||||
|
|
||||||
|
Создать ссылку на firewall include :
|
||||||
|
ln -fs /opt/zapret/init.d/openwrt/firewall.zapret /etc/firewall.zapret
|
||||||
|
Проверить была ли создана ранее запись о firewall include :
|
||||||
|
uci show firewall | grep firewall.zapret
|
||||||
|
Если firewall.zapret нет, значит добавить :
|
||||||
|
uci add firewall include
|
||||||
|
uci set firewall.@include[-1].path="/etc/firewall.zapret"
|
||||||
|
uci set firewall.@include[-1].reload="1"
|
||||||
|
uci commit firewall
|
||||||
|
Проверить не включен ли flow offload :
|
||||||
|
uci show firewall.@defaults[0]
|
||||||
|
Если flow_offloading=1 или flow_offloading_hw=1 ,
|
||||||
|
uci set firewall.@defaults[0].flow_offloading=0
|
||||||
|
uci set firewall.@defaults[0].flow_offloading_hw=0
|
||||||
|
uci commit firewall
|
||||||
|
Перезапустить фаервол :
|
||||||
|
fw3 restart
|
||||||
|
|
||||||
|
Посмотреть через iptables -nL, ip6tables -nL или через luci вкладку "firewall" появились ли нужные правила.
|
||||||
|
|
||||||
|
ЭКОНОМИЯ МЕСТА : если его мало, то можно оставить в директории zapret лишь подкаталоги
|
||||||
|
ipset, common, файл config, init.d/openwrt.
|
||||||
|
Далее нужно создать подкаталоги с реально используемыми бинариками (ip2net, mdig, tpws, nfq)
|
||||||
|
и скопировать туда из binaries рабочие executables.
|
||||||
|
|
||||||
|
ЕСЛИ ВСЕ ПЛОХО С МЕСТОМ : откажитесь от работы со списком РКН. используйте только get_user.sh
|
||||||
|
|
||||||
|
ЕСЛИ СОВСЕМ ВСЕ УЖАСНО С МЕСТОМ : берете tpws и делаете все своими руками. поднятие iptables, автостарт бинарика.
|
||||||
|
С некоторых версий скрипты запуска zapret без ipset не работают (он требуется для ip exclude)
|
||||||
|
|
||||||
|
СОВЕТ : Покупайте только роутеры с USB. В USB можно воткнуть флэшку и вынести на нее корневую файловую систему
|
||||||
|
или использовать ее в качестве оверлея. Не надо мучать себя, запихивая незапихиваемое в 8 мб встроенной флэшки.
|
||||||
|
Для комфортной работы с zapret нужен роутер с 16 Mb встроенной памяти или USB разъемом и 128+ Mb RAM.
|
||||||
|
На 64 Mb без swap будут проблемы с листами РКН. Если у вас только 64 Mb, и вы хотите листы РКН, подключите swap.
|
||||||
|
32 Mb для современных версий openwrt - конфигурация на грани живучести. Возможны хаотические падения процессов в oom.
|
||||||
|
Работа с листами РКН невозможна в принципе.
|
||||||
|
|
@ -1,251 +0,0 @@
|
|||||||
# Быстрая настройка 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. Скачайте последний [tar.gz релиз](https://github.com/bol-van/zapret/releases) в /tmp, распакуйте его, затем удалите архив.
|
|
||||||
|
|
||||||
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' <HOSTLIST_NOAUTO> --new
|
|
||||||
> --filter-tcp=80,443 'обьединенные параметры для http и https' <HOSTLIST>"
|
|
||||||
> ```
|
|
||||||
>
|
|
||||||
> Или так:
|
|
||||||
> ```sh
|
|
||||||
> "--filter-udp=443 'параметры для quic' <HOSTLIST_NOAUTO> --new
|
|
||||||
> --filter-tcp=80 'параметры для http' <HOSTLIST> --new
|
|
||||||
> --filter-tcp=443 'параметры для https' <HOSTLIST>"
|
|
||||||
> ```
|
|
||||||
>
|
|
||||||
> `<HOSTLIST>` и `<HOSTLIST_NOAUTO>` так и пишутся. Их не надо на что-то
|
|
||||||
> заменять. Это сделают скрипты запуска, если вы выбрали режим фильтрации по
|
|
||||||
> хостлистам, и уберут в противном случае. Если для какого-то протокола надо
|
|
||||||
> дурить все без стандартного хостлиста - просто уберите оттуда `<HOSTLIST>`
|
|
||||||
> и `<HOSTLIST_NOAUTO>`. Можно писать свои параметры `--hostlist` и
|
|
||||||
> `--hostlist-exclude` для дополнительных хостлистов или в профилях
|
|
||||||
> специализаций под конкретный ресурс. В последнем случае стандартный
|
|
||||||
> хостлист там не нужен. Следует избегать указания собственных параметров
|
|
||||||
> `--hostlist` на листы из директории ipset. Эта логика включена в
|
|
||||||
> `<HOSTLIST>` и `<HOSTLIST_NOAUTO>`. Отличие `<HOSTLIST_NOAUTO>` в том, что
|
|
||||||
> стандартный автолист по этому профилю используется как обычный, то есть
|
|
||||||
> без автоматического добавления доменов. Однако, добавления в других
|
|
||||||
> профилях автоматически отражаются во всех остальных.
|
|
||||||
>
|
|
||||||
> Если стратегии отличаются по версии ip протокола, и вы не можете их
|
|
||||||
> обьединить, фильтр пишется так:
|
|
||||||
> ```sh
|
|
||||||
> "--filter-l3=ipv4 --filter-udp=443 lпараметры для quic ipv4' <HOSTLIST_NOAUTO> --new
|
|
||||||
> --filter-l3=ipv4 --filter-tcp=80 'параметры для http ipv4' <HOSTLIST> --new
|
|
||||||
> --filter-l3=ipv4 --filter-tcp=443 'параметры для https ipv4' <HOSTLIST> --new
|
|
||||||
> --filter-l3=ipv6 --filter-udp=443 "параметры для quic ipv6" <HOSTLIST_NOAUTO> --new
|
|
||||||
> --filter-l3=ipv6 --filter-tcp=80 'параметры для http ipv6' <HOSTLIST> --new
|
|
||||||
> --filter-l3=ipv6 --filter-tcp=443 'параметры для https ipv6' <HOSTLIST>"
|
|
||||||
> ```
|
|
||||||
>
|
|
||||||
> Но здесь совсем "копи-пастный" вариант. Чем больше вы объедините стратегий и
|
|
||||||
> сократите их общее количество, тем будет лучше.
|
|
||||||
>
|
|
||||||
> Если вам не нужно дурение отдельных протоколов, лучше всего будет их
|
|
||||||
> убрать из системы перехвата трафика через параметры `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' <HOSTLIST> --new
|
|
||||||
> --filter-tcp=443 'параметры для https' --wssize 1:6 <HOSTLIST> --new
|
|
||||||
> --filter-tcp=443 --wssize 1:6"
|
|
||||||
> ```
|
|
||||||
>
|
|
||||||
> В этом примере `wssize` будет применяться всегда к порту tcp `443` вне
|
|
||||||
> зависимости от параметра `MODE_FILTER`. Хостлист будет игнорироваться,
|
|
||||||
> если таковой имеется. К http применять `wssize` вредно и бессмысленно.
|
|
||||||
|
|
||||||
7. Запустите скрипт облегченной установки - `install_easy.sh` Выберите `nfqws`
|
|
||||||
и/или `tpws`, затем согласитесь на редактирование параметров. Откроется
|
|
||||||
редактор, куда впишите созданную на предыдущем этапе стратегию.
|
|
||||||
|
|
||||||
8. На все остальные вопросы `install_easy.sh` отвечайте согласно выводимой
|
|
||||||
аннотации.
|
|
||||||
|
|
||||||
|
|
||||||
## Итог
|
|
||||||
Это минимальная инструкция, чтобы быстро сориентироваться с чего начать.
|
|
||||||
Однако, это не гарантированное решение и в некоторых случаях вы не обойдетесь
|
|
||||||
без знаний и основного "талмуда". Подробности и полное техническое описание
|
|
||||||
расписаны в [README](readme.md).
|
|
||||||
|
|
||||||
Если ломаются отдельные **не заблокированные** ресурсы, следует вносить их в
|
|
||||||
исключения, либо пользоваться ограничивающим `ipset` или хост листом. Лучше
|
|
||||||
подбирать такие стратегии, которые вызывают минимальные поломки. Есть стратегии
|
|
||||||
довольно безобидные, а есть сильно ломающие, которые подходят только для
|
|
||||||
точечного пробития отдельных ресурсов, когда ничего лучше нет. Хорошая
|
|
||||||
стратегия может сильно ломать из-за плохо подобранных ограничителей для фейков
|
|
||||||
\- ttl, fooling.
|
|
179
docs/quick_start.txt
Normal file
179
docs/quick_start.txt
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
Специально для тех, кто хочет побыстрее начать, но не хочет слишком углубляться в простыню 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' <HOSTLIST_NOAUTO> --new
|
||||||
|
--filter-tcp=80,443 'обьединенные параметры для http и https' <HOSTLIST>"
|
||||||
|
|
||||||
|
Или так :
|
||||||
|
"--filter-udp=443 "параметры для quic" <HOSTLIST_NOAUTO> --new
|
||||||
|
--filter-tcp=80 'параметры для http' <HOSTLIST> --new
|
||||||
|
--filter-tcp=443 'параметры для https' <HOSTLIST>"
|
||||||
|
|
||||||
|
"<HOSTLIST>" и "<HOSTLIST_NOAUTO>" так и пишутся. Их не надо на что-то заменять. Это сделают скрипты запуска,
|
||||||
|
если вы выбрали режим фильтрации по хостлистам, и уберут в противном случае.
|
||||||
|
Если для какого-то протокола надо дурить все без стандартного хостлиста - просто уберите оттуда "<HOSTLIST>"
|
||||||
|
и "<HOSTLIST_NOAUTO>".
|
||||||
|
Можно писать свои параметры --hostlist и --hostlist-exclude для дополнительных хостлистов
|
||||||
|
или в профилях специализаций под конкретный ресурс. В последнем случае стандартный хостлист там не нужен.
|
||||||
|
Следует избегать указания собственных параметров --hostlist на листы из директории ipset.
|
||||||
|
Эта логика включена в "<HOSTLIST>" и "<HOSTLIST_NOAUTO>".
|
||||||
|
Отличие "<HOSTLIST_NOAUTO>" в том, что стандартный автолист по этому профилю используется как обычный,
|
||||||
|
то есть без автоматического добавления доменов. Однако, добавления в других профилях автоматически
|
||||||
|
отражаются во всех остальных.
|
||||||
|
|
||||||
|
Если стратегии отличаются по версии ip протокола, и вы не можете их обьединить, фильтр пишется так :
|
||||||
|
"--filter-l3=ipv4 --filter-udp=443 "параметры для quic ipv4" <HOSTLIST_NOAUTO> --new
|
||||||
|
--filter-l3=ipv4 --filter-tcp=80 'параметры для http ipv4' <HOSTLIST> --new
|
||||||
|
--filter-l3=ipv4 --filter-tcp=443 'параметры для https ipv4' <HOSTLIST> --new
|
||||||
|
--filter-l3=ipv6 --filter-udp=443 "параметры для quic ipv6" <HOSTLIST_NOAUTO> --new
|
||||||
|
--filter-l3=ipv6 --filter-tcp=80 'параметры для http ipv6' <HOSTLIST> --new
|
||||||
|
--filter-l3=ipv6 --filter-tcp=443 'параметры для https ipv6' <HOSTLIST>"
|
||||||
|
|
||||||
|
Но здесь совсем "копи-пастный" вариант.
|
||||||
|
Чем больше вы обьедините стратегий и сократите их общее количество, тем будет лучше.
|
||||||
|
|
||||||
|
Если вам не нужно дурение отдельных протоколов, лучше всего будет их убрать из системы перехвата трафика через
|
||||||
|
параметры 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' <HOSTLIST> --new
|
||||||
|
--filter-tcp=443 'параметры для https' --wssize 1:6 <HOSTLIST> --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
|
@ -1,4 +1,4 @@
|
|||||||
# Быстрая настройка Windows
|
# Windows quick start
|
||||||
|
|
||||||
Специально для тех, кто хочет побыстрее начать, но не хочет слишком углубляться в простыню [readme.md](./readme.md).
|
Специально для тех, кто хочет побыстрее начать, но не хочет слишком углубляться в простыню [readme.md](./readme.md).
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
@ -20,14 +20,6 @@
|
|||||||
Поэтому очень желательно иметь знания в области сетей, чтобы иметь возможность проанализировать техническую ситуацию.
|
Поэтому очень желательно иметь знания в области сетей, чтобы иметь возможность проанализировать техническую ситуацию.
|
||||||
Не будет лишним иметь обходные каналы проксирования трафика на случай, если обход DPI не помогает.
|
Не будет лишним иметь обходные каналы проксирования трафика на случай, если обход DPI не помогает.
|
||||||
|
|
||||||
Вариант, когда вы нашли стратегию где-то в интернете и пытаетесь ее приспособить к своему случаю - заведомо проблемный.
|
|
||||||
Нет универсальной таблетки. Везде ситуация разная. В сети гуляют написанные кем-то откровенные глупости, которые тиражируются массово ничего не понимающей публикой.
|
|
||||||
Такие варианты чаще всего работают нестабильно, только на части ресурсов, только на части провайдеров, не работают вообще или ломают другие ресурсы. В худших случаях еще и устраивают флуд в сети.
|
|
||||||
Если даже вариант когда-то и работал неплохо, завтра он может перестать, а в сети останется устаревшая информация.
|
|
||||||
|
|
||||||
Особо осторожным нужно быть со сторонними сборками. Там могут быть вирусы. Не в каждой сборке, но уже были замечены скаммеры.
|
|
||||||
Видео на ютубе как просто обойти блокировку, прилагающийся архив, в котором какая-то ерунда, написанная на питоне, скачивающая зловред.
|
|
||||||
|
|
||||||
Будем считать, что у вас есть windows 7 или выше. Задача - обойти блокировки с самой системы.
|
Будем считать, что у вас есть windows 7 или выше. Задача - обойти блокировки с самой системы.
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
@ -40,10 +32,10 @@ _"Совсем ничего не могу, все очень сложно, да
|
|||||||
1) Скачайте и распакуйте архив https://github.com/bol-van/zapret-win-bundle/archive/refs/heads/master.zip.
|
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`.
|
То же самое с ограничителем по автоматически создаваемому хост-листу `preset_russia_autohostlist.cmd`.
|
||||||
> Что такое `autohostlist` - читайте [readme.md](./readme.md). Проще говоря, мы обходим только то, что долго и упорно не хочет открываться.
|
Что такое `autohostlist` - читайте [readme.md](./readme.md). Проще говоря, мы обходим только то, что долго и упорно не хочет открываться.
|
||||||
> Сначала не будет, но надо пытаться много раз, и тогда сработает, а дальше будет всегда срабатывать.
|
Сначала не будет, но надо пытаться много раз, и тогда сработает, а дальше будет всегда срабатывать.
|
||||||
> Остальное не будет ломаться. Использовать только, если первый вариант тоже работает.
|
Остальное не будет ломаться. Использовать только, если первый вариант тоже работает.
|
||||||
|
|
||||||
Не помогла _"таблетка"_ ? Это вовсе не значит, что ничего не получится. Но придется делать по нормальному.
|
Не помогла _"таблетка"_ ? Это вовсе не значит, что ничего не получится. Но придется делать по нормальному.
|
||||||
|
|
||||||
@ -56,13 +48,13 @@ _"Совсем ничего не могу, все очень сложно, да
|
|||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Для 32-битных систем Windows нет готового полного варианта.
|
> Для 32-битных систем Windows нет готового полного варианта.
|
||||||
|
|
||||||
> На windows 11 arm64 выполните `arm64/install_arm64.cmd` от имени администратора и перезагрузите компьютер.
|
На windows 11 arm64 выполните `arm64/install_arm64.cmd` от имени администратора и перезагрузите компьютер.
|
||||||
> Читайте [docs/windows.md](./windows.md)
|
Читайте [docs/windows.md](./windows.md)
|
||||||
>
|
|
||||||
> Имейте в виду, что антивирусы могут плохо реагировать на windivert.
|
Имейте в виду, что антивирусы могут плохо реагировать на windivert.
|
||||||
> cygwin так же имеет внушительный список несовместимостей с антивирусами, хотя современные антивирусы
|
cygwin так же имеет внушительный список несовместимостей с антивирусами, хотя современные антивирусы
|
||||||
> более-менее научились с ним дружить.
|
более-менее научились с ним дружить.
|
||||||
> Если проблема имеет место , используйте исключения. Если не помогает - отключайте антивирус совсем.
|
Если проблема имеет место , используйте исключения. Если не помогает - отключайте антивирус совсем.
|
||||||
|
|
||||||
3) Убедитесь, что у вас отключены все средства обхода блокировок, в том числе и сам zapret.
|
3) Убедитесь, что у вас отключены все средства обхода блокировок, в том числе и сам zapret.
|
||||||
|
|
||||||
@ -74,15 +66,15 @@ blockcheck перейдет в этом случае на **DoH** _(DNS over HTT
|
|||||||
Но если вы не настроите решение этой проблемы, обход будет работать только для тех программ,
|
Но если вы не настроите решение этой проблемы, обход будет работать только для тех программ,
|
||||||
которые сами реализуют механизмы SecureDNS. Для других программ обход работать не будет.
|
которые сами реализуют механизмы SecureDNS. Для других программ обход работать не будет.
|
||||||
|
|
||||||
> Решение проблемы DNS выходит за рамки проекта. Обычно она решается либо заменой DNS серверов
|
Решение проблемы DNS выходит за рамки проекта. Обычно она решается либо заменой DNS серверов
|
||||||
> от провайдера на публичные (`1.1.1.1`, `8.8.8.8`), либо в случае перехвата провайдером обращений
|
от провайдера на публичные (`1.1.1.1`, `8.8.8.8`), либо в случае перехвата провайдером обращений
|
||||||
> к сторонним серверам - через специальные средства шифрования DNS запросов, такие как [dnscrypt](https://www.dnscrypt.org/), **DoT** _(DNS over TLS)_, **DoH**.
|
к сторонним серверам - через специальные средства шифрования DNS запросов, такие как [dnscrypt](https://www.dnscrypt.org/), **DoT** _(DNS over TLS)_, **DoH**.
|
||||||
> В современных броузерах чаще всего DoH включен по умолчанию, но curl будет использовать обычный системный DNS.
|
В современных броузерах чаще всего DoH включен по умолчанию, но curl будет использовать обычный системный DNS.
|
||||||
> win11 поддерживает системные DoH из коробки. Они не настроены по умолчанию.
|
win11 поддерживает системные DoH из коробки. Они не настроены по умолчанию.
|
||||||
> В последних билдах win10 существует неофициальный обходной путь для включения DoH.
|
В последних билдах win10 существует неофициальный обходной путь для включения DoH.
|
||||||
> Для остальных систем нужно стороннее решение, работающие по принципу DNS proxy.
|
Для остальных систем нужно стороннее решение, работающие по принципу DNS proxy.
|
||||||
>
|
|
||||||
> Тут все разжевано как и где это включается : https://hackware.ru/?p=13707
|
Тут все разжевано как и где это включается : https://hackware.ru/?p=13707
|
||||||
|
|
||||||
6) blockcheck позволяет выявить рабочую стратегию обхода блокировок.
|
6) blockcheck позволяет выявить рабочую стратегию обхода блокировок.
|
||||||
Лог скрипта будет сохранен в `blockcheck\blockcheck.log`.
|
Лог скрипта будет сохранен в `blockcheck\blockcheck.log`.
|
||||||
@ -95,86 +87,87 @@ blockcheck перейдет в этом случае на **DoH** _(DNS over HTT
|
|||||||
> [!TIP]
|
> [!TIP]
|
||||||
> В большинстве случаев можно обьединить несколько стратегий в одну универсальную, и это крайне желательно.
|
> В большинстве случаев можно обьединить несколько стратегий в одну универсальную, и это крайне желательно.
|
||||||
|
|
||||||
> Необходимо понимать [как работают стратегии](./readme.md/#nfqws).
|
Необходимо понимать [как работают стратегии](./readme.md/#nfqws).
|
||||||
> zapret не может пробить блокировку по IP адресу. Для проверки нескольких доменов вводите их через пробел.
|
zapret не может пробить блокировку по IP адресу. Для проверки нескольких доменов вводите их через пробел.
|
||||||
>
|
|
||||||
> Сейчас блокираторы ставят на магистральных каналах. В сложных случаях у вас может быть несколько маршрутов
|
Сейчас блокираторы ставят на магистральных каналах. В сложных случаях у вас может быть несколько маршрутов
|
||||||
> с различной длиной по ХОПам, с DPI на разных хопах. Приходится преодолевать целый зоопарк DPI,
|
с различной длиной по ХОПам, с DPI на разных хопах. Приходится преодолевать целый зоопарк DPI,
|
||||||
> которые еще и включаются в работу хаотичным образом или образом, зависящим от направления (IP сервера).
|
которые еще и включаются в работу хаотичным образом или образом, зависящим от направления (IP сервера).
|
||||||
> blockcheck не всегда может выдать вам в итогах оптимальную стратегию, которую надо просто переписать в настройки.
|
blockcheck не всегда может выдать вам в итогах оптимальную стратегию, которую надо просто переписать в настройки.
|
||||||
> В некоторых случаях надо реально думать что происходит, анализируя результат на разных стратегиях.
|
В некоторых случаях надо реально думать что происходит, анализируя результат на разных стратегиях.
|
||||||
> Если вы применяете большой TTL, чтобы достать до магистрала, то не лишним будет добавить дополнительный ограничитель
|
Если вы применяете большой TTL, чтобы достать до магистрала, то не лишним будет добавить дополнительный ограничитель
|
||||||
> `--dpi-desync-fooling`, чтобы не сломать сайты на более коротких дистанциях.
|
`--dpi-desync-fooling`, чтобы не сломать сайты на более коротких дистанциях.
|
||||||
> _md5sig_ наиболее совместим, но работатет только на linux серверах.
|
_md5sig_ наиболее совместим, но работатет только на linux серверах.
|
||||||
> badseq может работать только на https и не работать на http.
|
badseq может работать только на https и не работать на http.
|
||||||
> Чтобы выяснить какие дополнительные ограничители работают, смотрите результат теста аналогичных стратегий без TTL
|
Чтобы выяснить какие дополнительные ограничители работают, смотрите результат теста аналогичных стратегий без TTL
|
||||||
> с каждым из этих ограничителей.
|
с каждым из этих ограничителей.
|
||||||
>
|
|
||||||
> При использовании autottl следует протестировать как можно больше разных доменов. Эта техника
|
При использовании autottl следует протестировать как можно больше разных доменов. Эта техника
|
||||||
> может на одних провайдерах работать стабильно, на других потребуется выяснить при каких параметрах
|
может на одних провайдерах работать стабильно, на других потребуется выяснить при каких параметрах
|
||||||
> она стабильна, на третьих полный хаос, и проще отказаться.
|
она стабильна, на третьих полный хаос, и проще отказаться.
|
||||||
>
|
|
||||||
> Далее, имея понимание что работает на http, https, quic, нужно сконструировать параметры запуска winws
|
Далее, имея понимание что работает на http, https, quic, нужно сконструировать параметры запуска winws
|
||||||
> с использованием мультистратегии. Как работают мультистратегии описано в [readme.md](./readme.md).
|
с использованием мультистратегии. Как работают мультистратегии описано в [readme.md](./readme.md).
|
||||||
>
|
|
||||||
> Прежде всего вам нужно собрать фильтр перехватываемого трафика. Это делается через параметры
|
Прежде всего вам нужно собрать фильтр перехватываемого трафика. Это делается через параметры
|
||||||
> `--wf-l3`, `--wf-tcp`, `--wf-udp`.
|
`--wf-l3`, `--wf-tcp`, `--wf-udp`.
|
||||||
> `--wf-l3` относится к версии ip протокола - ipv4 или ipv6.
|
`--wf-l3` относится к версии ip протокола - ipv4 или ipv6.
|
||||||
> `--wf-tcp` и `--wf-udp` содержат перечень портов или диапазонов портов через запятую.
|
`--wf-tcp` и `--wf-udp` содержат перечень портов или диапазонов портов через запятую.
|
||||||
>
|
|
||||||
> Пример стандартного фильтра для перехвата http, https, quic : `--wf-tcp=80,443` `--wf-udp=443`
|
Пример стандартного фильтра для перехвата http, https, quic : `--wf-tcp=80,443` `--wf-udp=443`
|
||||||
>
|
|
||||||
> Фильтр должен быть минимально необходимым. Перехват лишнего трафика приведет только к бессмысленному расходованию ресурсов процессора и замедлению интернета.
|
> [!WARNING]
|
||||||
>
|
> Фильтр должен быть минимально необходимым. Перехват лишнего трафика приведет только к бессмысленному расходованию ресурсов процессора и замедлению интернета.
|
||||||
> Если кратко по мультистратегии, то обычно параметры конструируются так :
|
|
||||||
> ```
|
Если кратко по мультистратегии, то обычно параметры конструируются так :
|
||||||
> --filter-udp=443 'параметры для quic' --new
|
```
|
||||||
> --filter-tcp=80,443 'обьединенные параметры для http и https'
|
--filter-udp=443 'параметры для quic' --new
|
||||||
> ```
|
--filter-tcp=80,443 'обьединенные параметры для http и https'
|
||||||
>
|
```
|
||||||
> Или так :
|
|
||||||
> ```
|
Или так :
|
||||||
> --filter-udp=443 'параметры для quic' --new
|
```
|
||||||
> --filter-tcp=80 'параметры для http' --new
|
--filter-udp=443 'параметры для quic' --new
|
||||||
> --filter-tcp=443 'параметры для https'
|
--filter-tcp=80 'параметры для http' --new
|
||||||
> ```
|
--filter-tcp=443 'параметры для https'
|
||||||
>
|
```
|
||||||
> Если стратегии отличаются по версии ip протокола, и вы не можете их обьединить, фильтр пишется так :
|
|
||||||
> ```
|
Если стратегии отличаются по версии ip протокола, и вы не можете их обьединить, фильтр пишется так :
|
||||||
> --filter-l3=ipv4 --filter-udp=443 "параметры для quic ipv4" --new
|
```
|
||||||
> --filter-l3=ipv4 --filter-tcp=80 'параметры для http ipv4' --new
|
--filter-l3=ipv4 --filter-udp=443 "параметры для quic ipv4" --new
|
||||||
> --filter-l3=ipv4 --filter-tcp=443 'параметры для https ipv4' --new
|
--filter-l3=ipv4 --filter-tcp=80 'параметры для http ipv4' --new
|
||||||
> --filter-l3=ipv6 --filter-udp=443 "параметры для quic ipv6" --new
|
--filter-l3=ipv4 --filter-tcp=443 'параметры для https ipv4' --new
|
||||||
> --filter-l3=ipv6 --filter-tcp=80 "параметры для http ipv6" --new
|
--filter-l3=ipv6 --filter-udp=443 "параметры для quic ipv6" --new
|
||||||
> --filter-l3=ipv6 --filter-tcp=443 "параметры для https ipv6"
|
--filter-l3=ipv6 --filter-tcp=80 "параметры для http ipv6" --new
|
||||||
> ```
|
--filter-l3=ipv6 --filter-tcp=443 "параметры для https ipv6"
|
||||||
>
|
```
|
||||||
> Но здесь совсем _"копи-пастный"_ вариант.
|
|
||||||
> Чем больше вы обьедините стратегий и сократите их общее количество, тем будет лучше.
|
Но здесь совсем _"копи-пастный"_ вариант.
|
||||||
>
|
Чем больше вы обьедините стратегий и сократите их общее количество, тем будет лучше.
|
||||||
> Если вам не нужно дурение отдельных протоколов, лучше всего будет их убрать из системы перехвата трафика через
|
|
||||||
> параметры `--wf-*` и убрать соответствующие им профили мультистратегии.
|
Если вам не нужно дурение отдельных протоколов, лучше всего будет их убрать из системы перехвата трафика через
|
||||||
> tcp 80 - http, tcp 443 - https, udp 443 - quic.
|
параметры `--wf-*` и убрать соответствующие им профили мультистратегии.
|
||||||
>
|
tcp 80 - http, tcp 443 - https, udp 443 - quic.
|
||||||
> Если используются методы нулевой фазы десинхронизации (`--mss`, `--wssize`, `--dpi-desync=syndata`) и фильтрация hostlist,
|
|
||||||
> то все параметры, относящиеся к этим методам, следует помещать в отдельные профили мультистратегии, которые получат
|
Если используются методы нулевой фазы десинхронизации (`--mss`, `--wssize`, `--dpi-desync=syndata`) и фильтрация hostlist,
|
||||||
> управление до определения имени хоста. Необходимо понимать алгоритм работы мультистратегий.
|
то все параметры, относящиеся к этим методам, следует помещать в отдельные профили мультистратегии, которые получат
|
||||||
>
|
управление до определения имени хоста. Необходимо понимать алгоритм работы мультистратегий.
|
||||||
> ```
|
|
||||||
> --filter-tcp=80 'параметры для http' --new
|
```
|
||||||
> --filter-tcp=443 'параметры для https' --hostlist=d:/users/user/temp/list.txt --new
|
--filter-tcp=80 'параметры для http' --new
|
||||||
> --filter-tcp=443 --wssize 1:6
|
--filter-tcp=443 'параметры для https' --hostlist=d:/users/user/temp/list.txt --new
|
||||||
> ```
|
--filter-tcp=443 --wssize 1:6
|
||||||
>
|
```
|
||||||
> autohostlist профиль приоритетен, поэтому wssize нужно писать туда :
|
|
||||||
>
|
autohostlist профиль приоритетен, поэтому wssize нужно писать туда :
|
||||||
> ```
|
|
||||||
> --filter-tcp=80 'параметры для http' --new
|
```
|
||||||
> --filter-tcp=443 'параметры для https' --wssize 1:6 --hostlist-auto=d:/users/user/temp/autolist.txt
|
--filter-tcp=80 'параметры для http' --new
|
||||||
> ```
|
--filter-tcp=443 'параметры для https' --wssize 1:6 --hostlist-auto=d:/users/user/temp/autolist.txt
|
||||||
>
|
```
|
||||||
> В этих примерах wssize будет применяться всегда к порту tcp 443, а хостлист будет игнорироваться.
|
|
||||||
> К http применять wssize вредно и бессмысленно.
|
В этих примерах wssize будет применяться всегда к порту tcp 443, а хостлист будет игнорироваться.
|
||||||
|
К http применять wssize вредно и бессмысленно.
|
||||||
|
|
||||||
7) Протестируйте найденные стратегии на winws. Winws следует брать из zapret-winws.
|
7) Протестируйте найденные стратегии на winws. Winws следует брать из zapret-winws.
|
||||||
Для этого откройте командную строку windows от имени администратора в директории zapret-winws.
|
Для этого откройте командную строку windows от имени администратора в директории zapret-winws.
|
||||||
@ -182,18 +175,20 @@ blockcheck перейдет в этом случае на **DoH** _(DNS over HTT
|
|||||||
|
|
||||||
8) Обеспечьте удобную загрузку обхода блокировок.
|
8) Обеспечьте удобную загрузку обхода блокировок.
|
||||||
|
|
||||||
> Есть 2 варианта. Ручной запуск через ярлык или автоматический при старте системы, вне контекста текущего пользователя.
|
Есть 2 варианта. Ручной запуск через ярлык или автоматический при старте системы, вне контекста текущего пользователя.
|
||||||
> Последний вариант разделяется на запуск через планировщик задач и через службы windows.
|
Последний вариант разделяется на запуск через планировщик задач и через службы windows.
|
||||||
>
|
|
||||||
> Если хотите ручной запуск, скопируйте `preset_russia.cmd` в `preset_my.cmd` (`<ваше_название>.cmd`) и адаптируйте его под ваши параметра запуска.
|
Если хотите ручной запуск, скопируйте `preset_russia.cmd` в `preset_my.cmd` (`<ваше_название>.cmd`) и адаптируйте его под ваши параметра запуска.
|
||||||
> Потом можно создать ярлык на рабочем столе на `preset_my.cmd`. Не забудьте, что требуется запускать от имени администратора.
|
Потом можно создать ярлык на рабочем столе на `preset_my.cmd`. Не забудьте, что требуется запускать от имени администратора.
|
||||||
>
|
|
||||||
> Но лучше будет сделать неинтерактивный автоматический запуск вместе с системой.
|
Но лучше будет сделать неинтерактивный автоматический запуск вместе с системой.
|
||||||
> В zapret-winws есть командные файлы `task_*`, предназначенные для управления задачами планировщика.
|
В zapret-winws есть командные файлы `task_*`, предназначенные для управления задачами планировщика.
|
||||||
> Там следует поменять содержимое переменной `WINWS1` на свои параметры запуска winws. Пути с пробелами нужно экранировать кавычками с обратным слэшем : `\"`.
|
Там следует поменять содержимое переменной `WINWS1` на свою стратегию.
|
||||||
> После создания задач запустите их. Проверьте, что обход встает после перезагрузки windows.
|
Если вы не можете обьединить несколько стратегий для разных протоколов в одну, дублируйте код в каждом из cmd
|
||||||
>
|
для поддержки нескольких задач : _winws1_, _winws2_, _winws3_.
|
||||||
> Аналогично настраиваются и службы windows. Смотрите `service_*.cmd`
|
После создания задач запустите их. Проверьте, что обход встает после перезагрузки windows.
|
||||||
|
|
||||||
|
Аналогично настраиваются и службы windows. Смотрите `service_*.cmd`
|
||||||
|
|
||||||
9) Если ломаются отдельные незаблокированные ресурсы, нужно пользоваться ограничивающим
|
9) Если ломаются отдельные незаблокированные ресурсы, нужно пользоваться ограничивающим
|
||||||
ipset или хост листом. Читайте основной талмуд [readme.md](./readme.md) ради подробностей.
|
ipset или хост листом. Читайте основной талмуд [readme.md](./readme.md) ради подробностей.
|
||||||
|
@ -47,7 +47,7 @@ ___
|
|||||||
A stand-alone (without 3rd party servers) DPI circumvention tool.
|
A stand-alone (without 3rd party servers) DPI circumvention tool.
|
||||||
May allow to bypass http(s) website blocking or speed shaping, resist signature tcp/udp protocol discovery.
|
May allow to bypass http(s) website blocking or speed shaping, resist signature tcp/udp protocol discovery.
|
||||||
|
|
||||||
The project is mainly aimed at the Russian audience.
|
The project is mainly aimed at the Russian audience to fight russian regulator named "Roskomnadzor".
|
||||||
Some features of the project are russian reality specific (such as getting list of sites
|
Some features of the project are russian reality specific (such as getting list of sites
|
||||||
blocked by Roskomnadzor), but most others are common.
|
blocked by Roskomnadzor), but most others are common.
|
||||||
|
|
||||||
@ -1318,11 +1318,11 @@ Now its possible to run `/data/local/tmp/zapret/tpws` from any app such as taske
|
|||||||
|
|
||||||
### FreeBSD, OpenBSD, MacOS
|
### FreeBSD, OpenBSD, MacOS
|
||||||
|
|
||||||
see [BSD documentation](./bsd.en.md)
|
see [docs/bsd.en.md](./bsd.en.md)
|
||||||
|
|
||||||
### Windows (WSL)
|
### Windows (WSL)
|
||||||
|
|
||||||
see [Windows documentation](./windows.en.md)
|
see [docs/windows.en.md](./windows.en.md)
|
||||||
|
|
||||||
### Other devices
|
### Other devices
|
||||||
|
|
||||||
@ -1351,12 +1351,6 @@ If this is the case then run another script in background and add some delay the
|
|||||||
|
|
||||||
Are welcome here :
|
Are welcome here :
|
||||||
|
|
||||||
<img src=https://cdn-icons-png.flaticon.com/16/14446/14446252.png alt="USDT" style="vertical-align: middle;"/> USDT
|
<img src=https://cdn-icons-png.flaticon.com/16/14446/14446252.png alt="USDT" style="vertical-align: middle;"/> USDT 0x3d52Ce15B7Be734c53fc9526ECbAB8267b63d66E
|
||||||
```
|
|
||||||
0x3d52Ce15B7Be734c53fc9526ECbAB8267b63d66E
|
|
||||||
```
|
|
||||||
|
|
||||||
<img src=https://cdn-icons-png.flaticon.com/16/5968/5968260.png alt="USDT" style="vertical-align: middle;"/> BTC
|
<img src=https://cdn-icons-png.flaticon.com/16/5968/5968260.png alt="USDT" style="vertical-align: middle;"/> BTC bc1qhqew3mrvp47uk2vevt5sctp7p2x9m7m5kkchve
|
||||||
```
|
|
||||||
bc1qhqew3mrvp47uk2vevt5sctp7p2x9m7m5kkchve
|
|
||||||
```
|
|
||||||
|
@ -64,8 +64,9 @@ VPN.
|
|||||||
|
|
||||||
## Быстрый старт
|
## Быстрый старт
|
||||||
|
|
||||||
- [Linux/openWrt](./quick_start.md)
|
> *Linux/openwrt:* [docs/quick_start.txt](./quick_start.txt)
|
||||||
- [Windows](./quick_start_windows.md)
|
>
|
||||||
|
>*Windows:* [docs/quick_start_windows.md](./quick_start_windows.md)
|
||||||
|
|
||||||
## Как это работает
|
## Как это работает
|
||||||
|
|
||||||
@ -239,7 +240,7 @@ NFQUEUE работает без изменений.
|
|||||||
## nfqws
|
## nfqws
|
||||||
|
|
||||||
Эта программа - модификатор пакетов и обработчик очереди NFQUEUE. Для BSD систем существует адаптированный вариант -
|
Эта программа - модификатор пакетов и обработчик очереди NFQUEUE. Для BSD систем существует адаптированный вариант -
|
||||||
dvtws, собираемый из тех же исходников (см. [документация BSD](./bsd.md)).
|
dvtws, собираемый из тех же исходников (см. [bsd.txt](./bsd.txt)).
|
||||||
|
|
||||||
```
|
```
|
||||||
@<config_file>|$<config_file> ; читать конфигурацию из файла. опция должна быть первой. остальные опции игнорируются.
|
@<config_file>|$<config_file> ; читать конфигурацию из файла. опция должна быть первой. остальные опции игнорируются.
|
||||||
@ -1464,15 +1465,6 @@ nfqws начнет получать адреса пакетов из локал
|
|||||||
Таким образом, все 3 режима вполне могут задействоваться вместе.
|
Таким образом, все 3 режима вполне могут задействоваться вместе.
|
||||||
Так же безусловно и независимо, в добавок к стандартным опциям, применяются все custom скрипты в `init.d/{sysv,openwrt,macos}/custom.d`.
|
Так же безусловно и независимо, в добавок к стандартным опциям, применяются все custom скрипты в `init.d/{sysv,openwrt,macos}/custom.d`.
|
||||||
|
|
||||||
Однако, при комбинировании tpws и nfqws не все так просто , как может показаться на первый взгляд.
|
|
||||||
Первым всегда работает tpws, за ним - nfqws. На nfqws попадает уже "задуренный" трафик от tpws.
|
|
||||||
Получается, что дурилка дурит дурилку, и дурилка не срабатывает, потому что ее задурили.
|
|
||||||
Вот такой веселый момент. nfqws перестает распознавать протоколы и применять методы.
|
|
||||||
Некоторые методы дурения от tpws nfqws в состоянии распознать и отработать корректно, но большинство - нет.
|
|
||||||
Решение - использование `--dpi-desync-any-protocol` в nfqws и работа как с неизвестным протоколом.
|
|
||||||
Комбинирование tpws и nfqws является продвинутым вариантом, требующим глубокого понимания происходящего.
|
|
||||||
Очень желательно проанализировать действия nfqws по `--debug` логу. Все ли так, как вы задумали.
|
|
||||||
|
|
||||||
`tpws-socks` требует настройки параметров `tpws`, но не требует перехвата трафика.
|
`tpws-socks` требует настройки параметров `tpws`, но не требует перехвата трафика.
|
||||||
Остальные опции требуют раздельно настройки перехвата трафика и опции самих демонов.
|
Остальные опции требуют раздельно настройки перехвата трафика и опции самих демонов.
|
||||||
Каждая опция предполагает запуск одного инстанса соответствующего демона. Все различия методов дурения
|
Каждая опция предполагает запуск одного инстанса соответствующего демона. Все различия методов дурения
|
||||||
@ -1814,7 +1806,7 @@ zapret_custom_firewall_nft поднимает правила nftables.
|
|||||||
|
|
||||||
## Простая установка
|
## Простая установка
|
||||||
|
|
||||||
`install_easy.sh` автоматизирует ручные варианты процедур установки.
|
`install_easy.sh` автоматизирует ручные варианты процедур установки (см [manual_setup.txt](./manual_setup.txt)).
|
||||||
Он поддерживает OpenWRT, linux системы на базе systemd или openrc и MacOS.
|
Он поддерживает OpenWRT, linux системы на базе systemd или openrc и MacOS.
|
||||||
|
|
||||||
Для более гибкой настройки перед запуском инсталлятора следует выполнить раздел "Выбор параметров".
|
Для более гибкой настройки перед запуском инсталлятора следует выполнить раздел "Выбор параметров".
|
||||||
@ -2062,11 +2054,11 @@ curl: (7) Failed to connect to www.ru port 80: Host is unreachable
|
|||||||
|
|
||||||
## FreeBSD, OpenBSD, MacOS
|
## FreeBSD, OpenBSD, MacOS
|
||||||
|
|
||||||
Описано в [документации BSD](./bsd.md)
|
Описано в [docs/bsd.txt](./bsd.txt)
|
||||||
|
|
||||||
## Windows
|
## Windows
|
||||||
|
|
||||||
Описано в [документации Windows](./windows.md)
|
Описано в [docs/windows.md](./windows.md)
|
||||||
|
|
||||||
|
|
||||||
## Другие прошивки
|
## Другие прошивки
|
||||||
@ -2178,12 +2170,7 @@ VPS можно прибрести в множестве мест. Существ
|
|||||||
|
|
||||||
## Поддержать разработчика
|
## Поддержать разработчика
|
||||||
|
|
||||||
<img src=https://cdn-icons-png.flaticon.com/16/14446/14446252.png alt="USDT" style="vertical-align: middle;"/> USDT
|
[Реквизиты](https://github.com/bol-van/zapret/issues/590):
|
||||||
```
|
|
||||||
0x3d52Ce15B7Be734c53fc9526ECbAB8267b63d66E
|
|
||||||
```
|
|
||||||
|
|
||||||
<img src=https://cdn-icons-png.flaticon.com/16/5968/5968260.png alt="USDT" style="vertical-align: middle;"/> BTC
|
<img src=https://cdn-icons-png.flaticon.com/16/14446/14446252.png alt="USDT" style="vertical-align: middle;"/> USDT 0x3d52Ce15B7Be734c53fc9526ECbAB8267b63d66E
|
||||||
```
|
<img src=https://cdn-icons-png.flaticon.com/16/5968/5968260.png alt="USDT" style="vertical-align: middle;"/> BTC bc1qhqew3mrvp47uk2vevt5sctp7p2x9m7m5kkchve
|
||||||
bc1qhqew3mrvp47uk2vevt5sctp7p2x9m7m5kkchve
|
|
||||||
```
|
|
||||||
|
Loading…
Reference in New Issue
Block a user