|
|
@ -2,7 +2,7 @@ |
|
|
|
|
|
|
|
|
|
|
|
## Поддерживаемые версии |
|
|
|
**FreeBSD** 11.x+ , **OpenBSD** 6.x+, частично **MacOS Sierra +** |
|
|
|
**FreeBSD** 11.x+ , **OpenBSD** 6.x+, частично **MacOS Sierra** + |
|
|
|
|
|
|
|
> [!CAUTION] |
|
|
|
> На более старых может собираться, может не собираться, может работать или не |
|
|
@ -14,9 +14,9 @@ |
|
|
|
|
|
|
|
## Особенности BSD систем |
|
|
|
### Отсутствие nfqueue |
|
|
|
В **BSD** нет `nfqueue`. Похожий механизм - *divert sockets*. Из каталога |
|
|
|
**nfq** под **BSD** собирается `dvtws` вместо `nfqws`. Он разделяет с `nfqws` |
|
|
|
большую часть кода и почти совпадает по параметрам командной строки. |
|
|
|
В **BSD** нет `nfqueue`. Похожий механизм - divert sockets. Из каталога |
|
|
|
[`nfq/`](../nfq/) под **BSD** собирается `dvtws` вместо `nfqws`. Он разделяет с |
|
|
|
`nfqws` большую часть кода и почти совпадает по параметрам командной строки. |
|
|
|
|
|
|
|
### Типы Firewall |
|
|
|
**FreeBSD** содержит 3 фаервола : **IPFilter**, **ipfw** и **Packet Filter (PF |
|
|
@ -35,49 +35,46 @@ make bsd |
|
|
|
make mac |
|
|
|
``` |
|
|
|
|
|
|
|
**FreeBSD** make распознает *BSDmakefile*, **OpenBSD** и **MacOS** - нет. |
|
|
|
Поэтому там используется отдельный *target* в *Makefile*. Сборка всех |
|
|
|
исходников: |
|
|
|
**FreeBSD** make распознает BSDmakefile, **OpenBSD** и **MacOS** - нет. Поэтому |
|
|
|
там используется отдельный target в Makefile. Сборка всех исходников: |
|
|
|
```sh |
|
|
|
make -C /opt/zapret |
|
|
|
``` |
|
|
|
|
|
|
|
### Divert сокеты |
|
|
|
*Divert сокет* это внутренний тип сокета ядра **BSD**. Он не привязывается ни к |
|
|
|
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`. |
|
|
|
`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` при наличии **ipfw** работают с *ipfw lookup tables*. Это |
|
|
|
прямой аналог **ipset**. *lookup tables* не разделены на **v4** и **v6**. Они |
|
|
|
могут содержать **v4** и **v6** адреса и подсети одновременно. Если **ipfw** |
|
|
|
отсутствует, то действие зависит от переменной `LISTS_RELOAD` в *config*. Если |
|
|
|
она задана, то выполняется команда из `LISTS_RELOAD`. В противном случае не |
|
|
|
делается ничего. Если `LISTS_RELOAD=-`, то заполнение таблиц отключается даже |
|
|
|
при наличии **ipfw**. |
|
|
|
Скрипты [`ipset/*.sh`](../ipset/) при наличии ipfw работают с ipfw lookup |
|
|
|
tables. Это прямой аналог ipset. lookup tables не разделены на v4 и v6. Они |
|
|
|
могут содержать v4 и v6 адреса и подсети одновременно. Если ipfw отсутствует, |
|
|
|
то действие зависит от переменной `LISTS_RELOAD` в config. Если она задана, то |
|
|
|
выполняется команда из `LISTS_RELOAD`. В противном случае не делается ничего. |
|
|
|
Если `LISTS_RELOAD=-`, то заполнение таблиц отключается даже при наличии ipfw. |
|
|
|
|
|
|
|
### PF с файла |
|
|
|
**PF** может загружать ip таблицы из файла. Чтобы использовать эту возможность |
|
|
|
следует отключить сжатие gzip для листов через параметр файла *config* |
|
|
|
PF может загружать ip таблицы из файла. Чтобы использовать эту возможность |
|
|
|
следует отключить сжатие gzip для листов через параметр файла config: |
|
|
|
`GZIP_LISTS=0`. |
|
|
|
|
|
|
|
### Отсутствие splice |
|
|
|
**BSD** не содержит системного вызова splice. `tpws` работает через переброску |
|
|
|
данных в *user mode* в оба конца. Это медленнее, но не критически. Управление |
|
|
|
асинхронными сокетами в `tpws` основано на linux-specific механизме *epoll*. В |
|
|
|
**BSD** для его эмуляции используется *epoll-shim* - прослойка для эмуляции |
|
|
|
*epoll* на базе *kqueue*. |
|
|
|
данных в user mode в оба конца. Это медленнее, но не критически. Управление |
|
|
|
асинхронными сокетами в `tpws` основано на linux-specific механизме epoll. В |
|
|
|
**BSD** для его эмуляции используется epoll-shim - прослойка для эмуляции epoll |
|
|
|
на базе kqueue. |
|
|
|
|
|
|
|
### mdig, ip2net |
|
|
|
mdig и ip2net полностью работоспособны в **BSD**. В них нет ничего |
|
|
@ -86,7 +83,7 @@ mdig и ip2net полностью работоспособны в **BSD**. В н |
|
|
|
|
|
|
|
## FreeBSD |
|
|
|
### Подгрузка ipdivert |
|
|
|
*Divert сокеты* требуют специального модуля ядра - `ipdivert`. |
|
|
|
Divert сокеты требуют специального модуля ядра - `ipdivert`. |
|
|
|
|
|
|
|
- Поместите следующие строки в `/boot/loader.conf` (создать, если отсутствует): |
|
|
|
``` |
|
|
@ -94,19 +91,19 @@ ipdivert_load="YES" |
|
|
|
net.inet.ip.fw.default_to_accept=1 |
|
|
|
``` |
|
|
|
|
|
|
|
- `/etc/rc.conf`: |
|
|
|
`/etc/rc.conf`: |
|
|
|
``` |
|
|
|
firewall_enable="YES" |
|
|
|
firewall_script="/etc/rc.firewall.my" |
|
|
|
``` |
|
|
|
|
|
|
|
- `/etc/rc.firewall.my`: |
|
|
|
`/etc/rc.firewall.my`: |
|
|
|
```sh |
|
|
|
$ ipfw -q -f flush |
|
|
|
``` |
|
|
|
|
|
|
|
### Авто-восстановление правил ipfw и работа в фоне |
|
|
|
В `/etc/rc.firewall.my` можно дописывать правила **ipfw**, чтобы они |
|
|
|
В `/etc/rc.firewall.my` можно дописывать правила ipfw, чтобы они |
|
|
|
восстанавливались после перезагрузки. Оттуда же можно запускать и демоны |
|
|
|
zapret, добавив в параметры `--daemon`. Например так: |
|
|
|
```sh |
|
|
@ -123,7 +120,7 @@ $ /etc/rc.d/ipfw restart |
|
|
|
Краткая инструкция по запуску `tpws` в прозрачном режиме. |
|
|
|
|
|
|
|
> [!NOTE] |
|
|
|
> Предполагается, что интерфейс **LAN** называется `em1`, **WAN** - `em0`. |
|
|
|
> Предполагается, что интерфейс LAN называется `em1`, WAN - `em0`. |
|
|
|
|
|
|
|
#### Весь трафик |
|
|
|
```sh |
|
|
@ -151,7 +148,7 @@ $ /opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127 |
|
|
|
|
|
|
|
> [!NOTE] |
|
|
|
> Таблицы zapret, nozapret, ipban создаются скриптами из ipset по аналогии с |
|
|
|
> Linux. Обновление скриптов можно забить в `cron` под root: |
|
|
|
> Linux. Обновление скриптов можно забить в cron под root: |
|
|
|
> ```sh |
|
|
|
> $ crontab -e |
|
|
|
> ``` |
|
|
@ -162,15 +159,15 @@ $ /opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127 |
|
|
|
> ``` |
|
|
|
|
|
|
|
> [!CAUTION] |
|
|
|
> При использовании **ipfw** `tpws` не требует повышенных привилегий для |
|
|
|
> реализации прозрачного режима. Однако, без рута невозможен бинд на порты |
|
|
|
> <1024 и смена UID/GID. Без смены UID будет рекурсия, поэтому правила **ipfw** |
|
|
|
> нужно создавать с учетом UID, под которым работает `tpws`. Переадресация на |
|
|
|
> порты >=1024 может создать угрозу перехвата трафика непривилегированным |
|
|
|
> При использовании ipfw `tpws` не требует повышенных привилегий для реализации |
|
|
|
> прозрачного режима. Однако, без рута невозможен бинд на порты `< 1024` и |
|
|
|
> смена UID/GID. Без смены UID будет рекурсия, поэтому правила ipfw нужно |
|
|
|
> создавать с учетом UID, под которым работает `tpws`. Переадресация на порты |
|
|
|
> `>= 1024` может создать угрозу перехвата трафика непривилегированным |
|
|
|
> процессом, если вдруг `tpws` не запущен. |
|
|
|
|
|
|
|
|
|
|
|
### Запуск `dvtws` |
|
|
|
### Запуск dvtws |
|
|
|
|
|
|
|
#### Весь трафик |
|
|
|
```sh |
|
|
@ -197,59 +194,58 @@ $ /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. Лимит на количество элементов таблиц задается так: |
|
|
|
```sh |
|
|
|
$ 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 |
|
|
|
``` |
|
|
|
|
|
|
|
```sh |
|
|
|
$ /opt/zapret/tpws/tpws --port=988 --enable-pf --bind-addr=127.0.0.1 --bind-iface6=em1 --bind-linklocal=force |
|
|
|
``` |
|
|
|
|
|
|
|
> В PF непонятно как делать rdr-to с той же системы, где работает proxy. |
|
|
|
> Вариант с route-to у меня не заработал. |
|
|
|
- В **FreeBSD** поддержка PF в `tpws` отключена по умолчанию. Чтобы ее |
|
|
|
включить, нужно использовать параметр `--enable-pf`. |
|
|
|
- Нельзя сделать ipv6 rdr на `::1`. Нужно делать на link-local адрес входящего |
|
|
|
интерфейса. Смотрите через `ifconfig` адрес `fe80:...` и добавляете в правило. |
|
|
|
- Синтаксис `pf.conf` немного отличается. Более новая версия PF. |
|
|
|
- Лимит на количество элементов таблиц задается так: |
|
|
|
```sh |
|
|
|
$ sysctl net.pf.request_maxcount=2000000 |
|
|
|
``` |
|
|
|
- Сломан divert-to. Он работает, но не работает механизм предотвращения |
|
|
|
зацикливаний. Кто-то уже написал патч, но в `14-RELEASE` проблема все еще |
|
|
|
есть. Следовательно, на данный момент работа `dvtws` через PF невозможна. |
|
|
|
|
|
|
|
`/etc/pf.conf`: |
|
|
|
``` |
|
|
|
rdr pass on em1 inet6 proto tcp to port {80,443} -> fe80::31c:29ff:dee2:1c4d port 988 |
|
|
|
rdr pass on em1 inet proto tcp to port {80,443} -> 127.0.0.1 port 988 |
|
|
|
``` |
|
|
|
|
|
|
|
```sh |
|
|
|
$ /opt/zapret/tpws/tpws --port=988 --enable-pf --bind-addr=127.0.0.1 --bind-iface6=em1 --bind-linklocal=force |
|
|
|
``` |
|
|
|
|
|
|
|
> В PF непонятно как делать rdr-to с той же системы, где работает proxy. |
|
|
|
> Вариант с route-to у меня не заработал. |
|
|
|
|
|
|
|
|
|
|
|
### pfsense |
|
|
|
|
|
|
|
#### Что это |
|
|
|
**pfsense** основан на **FreeBSD** и использует фаервол **PF**, имеющий |
|
|
|
проблемы с *divert*. К счастью, модули **ipfw** и **ipdivert** присутствуют в |
|
|
|
поставке последних версий **pfsense**. Их можно подгрузить через `kldload`. |
|
|
|
pfsense основан на **FreeBSD** и использует фаервол PF, имеющий проблемы с |
|
|
|
divert. К счастью, модули ipfw и ipdivert присутствуют в поставке последних |
|
|
|
версий pfsense. Их можно подгрузить через `kldload`. |
|
|
|
|
|
|
|
#### Особенности |
|
|
|
В некоторых более старых версиях **pfsense** требуется изменить порядок |
|
|
|
фаерволов через `sysctl`, сделав **ipfw** первым. В более новых эти параметры |
|
|
|
`sysctl` отсутствуют, но система работает как надо и без них. В некоторых |
|
|
|
случаях фаервол **PF** может ограничивать возможности `dvtws`, в частности в |
|
|
|
области фрагментации ip. |
|
|
|
В некоторых более старых версиях pfsense требуется изменить порядок фаерволов |
|
|
|
через `sysctl`, сделав ipfw первым. В более новых эти параметры `sysctl` |
|
|
|
отсутствуют, но система работает как надо и без них. В некоторых случаях |
|
|
|
фаервол PF может ограничивать возможности `dvtws`, в частности в области |
|
|
|
фрагментации ip. |
|
|
|
|
|
|
|
#### Исполняемые файлы |
|
|
|
Присутствуют по умолчанию правила scrub для реассемблинга фрагментов. |
|
|
|
Бинарики из [`binaries/freebsd-x64`](../binaries/freebsd-x64) собраны под |
|
|
|
**FreeBSD 11**. Они должны работать и на последующих версиях **FreeBSD**, |
|
|
|
включая **pfsense**. Можно пользоваться `install_bin.sh`. |
|
|
|
Присутствуют по умолчанию правила 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`. |
|
|
|
ipfw и запуска демонов. Есть встроенный редактор `edit` как более приемлемая |
|
|
|
альтернатива `vi`. |
|
|
|
|
|
|
|
> [!NOTE] |
|
|
|
> Поскольку `git` отсутствует, копировать файлы удобнее всего через `ssh`. |
|
|
@ -265,12 +261,12 @@ $ /opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2 |
|
|
|
> Если вас напрягает бедность имеющегося репозитория, можно включить |
|
|
|
> репозиторий от **FreeBSD**, который по умолчанию выключен. |
|
|
|
> |
|
|
|
> Поменяйте *no* на *yes* в `/usr/local/etc/pkg/repos/FreeBSD.conf` |
|
|
|
> Поменяйте `no` на `yes` в `/usr/local/etc/pkg/repos/FreeBSD.conf` |
|
|
|
> |
|
|
|
> Можно установить весь привычный софт, включая `git`, чтобы напрямую скачивать |
|
|
|
> zapret с github. |
|
|
|
|
|
|
|
- `/usr/local/etc/rc.d/zapret.sh` (chmod `755`): |
|
|
|
`/usr/local/etc/rc.d/zapret.sh` (chmod `755`): |
|
|
|
```sh |
|
|
|
#!/bin/sh |
|
|
|
|
|
|
@ -294,12 +290,12 @@ pfctl -d ; pfctl -e |
|
|
|
|
|
|
|
#### Проблемы tpws |
|
|
|
Что касается `tpws`, то видимо имеется некоторый конфликт двух фаерволов, и |
|
|
|
правила fwd в **ipfw** не работают. Работает перенаправление средствами **PF** |
|
|
|
как описано в разделе по **FreeBSD**. В **PF** можно изменять правила только |
|
|
|
целыми блоками - якорями (anchors). Нельзя просто так добавить или удалить |
|
|
|
что-то. Но чтобы какой-то anchor был обработан, на него должна быть ссылка из |
|
|
|
основного набора правил. Его трогать нельзя, иначе порушится весь фаервол. |
|
|
|
Поэтому придется править код скриптов pfsense. |
|
|
|
правила fwd в ipfw не работают. Работает перенаправление средствами PF как |
|
|
|
описано в разделе по **FreeBSD**. В PF можно изменять правила только целыми |
|
|
|
блоками - якорями (anchors). Нельзя просто так добавить или удалить что-то. Но |
|
|
|
чтобы какой-то anchor был обработан, на него должна быть ссылка из основного |
|
|
|
набора правил. Его трогать нельзя, иначе порушится весь фаервол. Поэтому |
|
|
|
придется править код скриптов pfsense. |
|
|
|
|
|
|
|
1. Поправьте `/etc/inc/filter.inc` следующим образом: |
|
|
|
``` |
|
|
@ -319,8 +315,8 @@ 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** не нужен. |
|
|
|
`fe80::20c:29ff:5ae3:4821` замените на ваш link local адрес LAN интерфейса, |
|
|
|
либо уберите строчку, если ipv6 не нужен. |
|
|
|
|
|
|
|
3. Добавьте в автозапуск `/usr/local/etc/rc.d/zapret.sh`: |
|
|
|
```sh |
|
|
@ -349,14 +345,14 @@ rdr pass on em1 inet6 proto tcp from any to any port = https -> fe80::20c:29ff:5 |
|
|
|
``` |
|
|
|
|
|
|
|
> [!NOTE] |
|
|
|
> Так же есть более элегантный способ запуска `tpws` через @reboot в `cron` и |
|
|
|
> Так же есть более элегантный способ запуска `tpws` через @reboot в cron и |
|
|
|
> правило перенаправления в UI. Это позволит не редактировать код pfsense. |
|
|
|
|
|
|
|
|
|
|
|
## OpenBSD |
|
|
|
|
|
|
|
### tpws бинд на ipv4 |
|
|
|
В `tpws` бинд по умолчанию только на **ipv6**. для бинда на **ipv4** указать |
|
|
|
В `tpws` бинд по умолчанию только на ipv6. для бинда на ipv4 указать |
|
|
|
`--bind-addr=0.0.0.0` Используйте `--bind-addr=0.0.0.0 --bind-addr=::` для |
|
|
|
достижения того же результата, как в других ОС по умолчанию. Но лучше все же |
|
|
|
так не делать, а сажать на определенные внутренние адреса или интерфейсы. |
|
|
@ -364,7 +360,7 @@ rdr pass on em1 inet6 proto tcp from any to any port = https -> fe80::20c:29ff:5 |
|
|
|
|
|
|
|
### tpws для проходящего трафика |
|
|
|
|
|
|
|
- `/etc/pf.conf`: |
|
|
|
`/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 |
|
|
@ -376,7 +372,7 @@ $ tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 |
|
|
|
``` |
|
|
|
|
|
|
|
> [!NOTE] |
|
|
|
> В **PF** непонятно как делать rdr-to с той же системы, где работает proxy. |
|
|
|
> В PF непонятно как делать rdr-to с той же системы, где работает proxy. |
|
|
|
> Вариант с route-to у меня не заработал. Поддержка rdr-to реализована через |
|
|
|
> `/dev/pf`, поэтому прозрачный режим **требует root**. |
|
|
|
|
|
|
@ -384,7 +380,7 @@ $ tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 |
|
|
|
### Запуск `dvtws` |
|
|
|
|
|
|
|
#### Весь трафик |
|
|
|
- `/etc/pf.conf`: |
|
|
|
`/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 |
|
|
@ -399,7 +395,7 @@ $ ./dvtws --port=989 --dpi-desync=split2 |
|
|
|
#### Трафик только на таблицу zapret |
|
|
|
> За исключением таблицы nozapret |
|
|
|
|
|
|
|
- `/etc/pf.conf`: |
|
|
|
`/etc/pf.conf`: |
|
|
|
``` |
|
|
|
set limit table-entries 2000000 |
|
|
|
table <zapret> file "/opt/zapret/ipset/zapret-ip.txt" |
|
|
@ -438,7 +434,7 @@ $ ./dvtws --port=989 --dpi-desync=split2 |
|
|
|
|
|
|
|
### Особенность отправки fake пакетов |
|
|
|
В **OpenBSD** `dvtws` все фейки отсылает через divert socket, поскольку эта |
|
|
|
возможность через raw sockets заблокирована. Видимо **PF** автоматически |
|
|
|
возможность через raw sockets заблокирована. Видимо PF автоматически |
|
|
|
предотвращает повторный заворот diverted фреймов, поэтому проблемы зацикливания |
|
|
|
нет. |
|
|
|
|
|
|
@ -450,7 +446,7 @@ no state и in правилом позволяет обойти эту проб |
|
|
|
|
|
|
|
|
|
|
|
### Перезагрузка PF таблиц |
|
|
|
Скрипты из **ipset** не перезагружают таблицы в **PF** по умолчанию. |
|
|
|
Скрипты из ipset не перезагружают таблицы в PF по умолчанию. |
|
|
|
|
|
|
|
Чтобы они это делали, добавьте параметр в `/opt/zapret/config`: |
|
|
|
``` |
|
|
@ -473,7 +469,7 @@ $ pfctl -Tl -f /etc/pf.conf |
|
|
|
> ошибка перезагрузки фаервола. |
|
|
|
|
|
|
|
> [!NOTE] |
|
|
|
> После настройки обновление листов можно поместить в `cron`: |
|
|
|
> После настройки обновление листов можно поместить в cron: |
|
|
|
> ```sh |
|
|
|
> $ crontab -e |
|
|
|
> ``` |
|
|
@ -493,27 +489,26 @@ $ pfctl -Tl -f /etc/pf.conf |
|
|
|
|
|
|
|
|
|
|
|
### dvtws бесполезен |
|
|
|
Раньше был **ipfw**, потом его убрали, заменили на **PF**. Есть сомнения, что |
|
|
|
*divert сокеты* в ядре остались. Попытка создать *divert socket* не выдает |
|
|
|
ошибок, но полученный сокет ведет себя точно так же, как *raw*, со всеми его |
|
|
|
унаследованными косяками + еще яблочно специфическими. В **PF** *divert-packet* |
|
|
|
не работает. Простой grep бинарика `pfctl` показывает, что там нет слова |
|
|
|
"divert", а в других версиях **BSD** оно есть. `dvtws` собирается, но |
|
|
|
совершенно бесполезен. |
|
|
|
Раньше был ipfw, потом его убрали, заменили на PF. Есть сомнения, что divert |
|
|
|
сокеты в ядре остались. Попытка создать divert socket не выдает ошибок, но |
|
|
|
полученный сокет ведет себя точно так же, как raw, со всеми его унаследованными |
|
|
|
косяками + еще яблочно специфическими. В PF divert-packet не работает. Простой |
|
|
|
grep бинарика `pfctl` показывает, что там нет слова "divert", а в других |
|
|
|
версиях **BSD** оно есть. `dvtws` собирается, но совершенно бесполезен. |
|
|
|
|
|
|
|
|
|
|
|
### tpws |
|
|
|
`tpws` удалось адаптировать, он работоспособен. Получение адреса назначения для |
|
|
|
прозрачного прокси в **PF** (`DIOCNATLOOK`) убрали из заголовков в новых SDK, |
|
|
|
прозрачного прокси в PF (`DIOCNATLOOK`) убрали из заголовков в новых SDK, |
|
|
|
сделав фактически недокументированным. |
|
|
|
|
|
|
|
В `tpws` перенесены некоторые определения из более старых версий яблочных SDK. |
|
|
|
С ними удалось завести прозрачный режим. Однако, что будет в следующих версиях |
|
|
|
угадать сложно. Гарантий нет. Еще одной особенностью **PF** в **MacOS** |
|
|
|
является проверка на рута в момент обращения к `/dev/pf`, чего нет в остальных |
|
|
|
**BSD**. `tpws` по умолчанию сбрасывает рутовые привилегии. Необходимо явно |
|
|
|
указать параметр `--user=root`. В остальном **PF** себя ведет похоже на |
|
|
|
**FreeBSD**. Синтаксис `pf.conf` тот же. |
|
|
|
угадать сложно. Гарантий нет. Еще одной особенностью PF в **MacOS** является |
|
|
|
проверка на рута в момент обращения к `/dev/pf`, чего нет в остальных **BSD**. |
|
|
|
`tpws` по умолчанию сбрасывает рутовые привилегии. Необходимо явно указать |
|
|
|
параметр `--user=root`. В остальном PF себя ведет похоже на **FreeBSD**. |
|
|
|
Синтаксис `pf.conf` тот же. |
|
|
|
|
|
|
|
> [!IMPORTANT] |
|
|
|
> На **MacOS** работает редирект как с проходящего трафика, так и с локальной |
|
|
@ -522,7 +517,7 @@ $ pfctl -Tl -f /etc/pf.conf |
|
|
|
> Отсюда имеем недостаток - **обход DPI для рута работать НЕ будет**. |
|
|
|
|
|
|
|
#### Работа в прозрачном режиме только для исходящих запросов |
|
|
|
- `/etc/pf.conf`: |
|
|
|
`/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 |
|
|
@ -544,7 +539,7 @@ $ ifconfig en1 | grep fe80 |
|
|
|
inet6 fe80::bbbb:bbbb:bbbb:bbbb%en1 prefixlen 64 scopeid 0x8 |
|
|
|
``` |
|
|
|
|
|
|
|
- `/etc/pf.conf`: |
|
|
|
`/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 |
|
|
@ -561,7 +556,7 @@ $ /opt/zapret/tpws/tpws --user=root --port=988 --bind-addr=127.0.0.1 --bind-ifac |
|
|
|
|
|
|
|
|
|
|
|
### Проблема link-local адреса |
|
|
|
Если вы пользуетесь **MaсOS** в качестве **ipv6** роутера, то нужно будет |
|
|
|
Если вы пользуетесь **MaсOS** в качестве ipv6 роутера, то нужно будет |
|
|
|
решить вопрос с регулярно изменяемым link-local адресом. С некоторых версий |
|
|
|
**MacOS** использует по умолчанию постоянные "secured" ipv6 адреса вместо |
|
|
|
генерируемых на базе MAC адреса. |
|
|
@ -578,10 +573,10 @@ local. Скрывать link local не имеет смысла, а динами |
|
|
|
|
|
|
|
Все равно для исходящих соединений будут использоваться temporary адреса, как и |
|
|
|
в других системах. Или вам идея не по вкусу, можно прописать дополнительный |
|
|
|
статический **ipv6** из диапазона маски `fc00::/7` - выберите любой с длиной |
|
|
|
статический ipv6 из диапазона маски `fc00::/7` - выберите любой с длиной |
|
|
|
префикса `128`. Это можно сделать в системных настройках, создав дополнительный |
|
|
|
адаптер на базе того же сетевого интерфейса, отключить в нем **ipv4** и вписать |
|
|
|
статический **ipv6**. Он добавится к автоматически настраеваемым. |
|
|
|
адаптер на базе того же сетевого интерфейса, отключить в нем ipv4 и вписать |
|
|
|
статический ipv6. Он добавится к автоматически настраеваемым. |
|
|
|
|
|
|
|
|
|
|
|
### Сборка |
|
|
@ -590,9 +585,10 @@ $ make -C /opt/zapret mac |
|
|
|
``` |
|
|
|
|
|
|
|
> [!IMPORTANT] |
|
|
|
> Скрипты получения листов ipset/*.sh работают. Если будете пользоваться |
|
|
|
> `ipset/get_combined.sh`, нужно установить `GNU grep` через `brew`. Имеющийся |
|
|
|
> очень старый и безумно медленный с оцией `-f`. |
|
|
|
> Скрипты получения листов [`ipset/*.sh`](../ipset/) работают. Если будете |
|
|
|
> пользоваться [`get_combined.sh`](../ipset/get_combined.sh), нужно установить |
|
|
|
> GNU grep через `brew`. Имеющийся очень старый и безумно медленный с оцией |
|
|
|
> `-f`. |
|
|
|
|
|
|
|
|
|
|
|
### Простая установка |
|
|
@ -606,7 +602,7 @@ $ make -C /opt/zapret mac |
|
|
|
> [!WARNING] |
|
|
|
> Internet sharing средствами системы **не поддерживается**! |
|
|
|
> |
|
|
|
> Поддерживается только роутер, настроенный своими силами через **PF**. Если вы |
|
|
|
> Поддерживается только роутер, настроенный своими силами через PF. Если вы |
|
|
|
> вдруг включили шаринг, а потом выключили, то доступ к сайтам может пропасть |
|
|
|
> совсем. |
|
|
|
> |
|
|
@ -618,7 +614,7 @@ $ make -C /opt/zapret mac |
|
|
|
> Если вам нужен шаринг интернета, лучше отказаться от прозрачного режима и |
|
|
|
> использовать socks прокси. |
|
|
|
|
|
|
|
Для автостарта используется **launchd** (`/Library/LaunchDaemons/zapret.plist`) |
|
|
|
Для автостарта используется launchd (`/Library/LaunchDaemons/zapret.plist`) |
|
|
|
Управляющий скрипт : `/opt/zapret/init.d/macos/zapret` |
|
|
|
|
|
|
|
Следующие команды работают с `tpws` и фаерволом одновременно (если |
|
|
@ -653,8 +649,8 @@ $ /opt/zapret/init.d/macos/zapret reload-fw-tables |
|
|
|
> [`ipset/*.sh`](../ipset/) автоматически перезагружают IP таблицы в PF. |
|
|
|
|
|
|
|
> [!NOTE] |
|
|
|
> Автоматически создается cron job на `ipset/get_config.sh`, по аналогии с |
|
|
|
> openwrt. |
|
|
|
> Автоматически создается cron job на |
|
|
|
> [`ipset/get_config.sh`](../ipset/get_config.sh), по аналогии с openwrt. |
|
|
|
|
|
|
|
При start-fw скрипт автоматически модицифирует `/etc/pf.conf`, вставляя туда |
|
|
|
anchors "zapret". Модификация расчитана на `pf.conf`, в котором сохранены |
|
|
@ -695,9 +691,9 @@ anchor "zapret" |
|
|
|
|
|
|
|
custom firewall отличается от linux варианта. Вместо заполнения `iptables` вам |
|
|
|
нужно сгенерировать правила для `zapret-v4` и `zapret-v6` anchors и выдать их в |
|
|
|
**stdout**. Это делается в функциях `zapret_custom_firewall_v4()` и |
|
|
|
stdout. Это делается в функциях `zapret_custom_firewall_v4()` и |
|
|
|
`zapret_custom_firewall_v6()`. Определения таблиц заполняются основным скриптом |
|
|
|
- вам это делать не нужно. Можно ссылаться на таблицы zapret и zapret-user в |
|
|
|
v4, zapret6 и zapret6-user. |
|
|
|
- вам это делать не нужно. Можно ссылаться на таблицы `zapret` и `zapret-user` |
|
|
|
в v4, `zapret6` и `zapret6-user`. |
|
|
|
|
|
|
|
Cм. пример [в файле](../init.d/macos/custom.d.examples/50-extra-tpws) |
|
|
|
Cм. пример [в файле](../init.d/macos/custom.d.examples/50-extra-tpws). |
|
|
|