Compare commits

..

1 Commits

Author SHA1 Message Date
MAXIMILI
7c3ae941f7
Merge 905a9519ce into db0caf7d58 2024-11-06 21:45:47 +03:00
3 changed files with 146 additions and 520 deletions

View File

@ -1,379 +0,0 @@
name: build
run-name: ${{ startsWith(github.ref, 'refs/tags/v') && format('Release {0}', github.ref_name) || null }}
on:
workflow_dispatch:
push:
tags:
- v[0-9]+*
# branches:
# - master
# paths:
# - 'ip2net/**'
# - 'mdig/**'
# - 'nfq/**'
# - 'tpws/**'
jobs:
build-linux:
name: Linux ${{ matrix.arch }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- arch: arm64
tool: aarch64-unknown-linux-musl
- arch: arm
tool: arm-unknown-linux-musleabi
# - arch: armhf
# tool: arm-unknown-linux-musleabihf
# - arch: armv7
# tool: armv7-unknown-linux-musleabi
# - arch: armv7hf
# tool: armv7-unknown-linux-musleabihf
# - arch: mips64el
# tool: mips64el-unknown-linux-musl
- arch: mips64
tool: mips64-unknown-linux-musl
# - arch: mipsel
# tool: mipsel-unknown-linux-musl
- arch: mipselsf
tool: mipsel-unknown-linux-muslsf
# - arch: mips
# tool: mips-unknown-linux-musl
- arch: mipssf
tool: mips-unknown-linux-muslsf
# - arch: ppc64
# tool: powerpc64-unknown-linux-musl
- arch: ppc
tool: powerpc-unknown-linux-musl
- arch: x86
tool: i586-unknown-linux-musl
- arch: x86_64
tool: x86_64-unknown-linux-musl
steps:
- name: Checkout
uses: actions/checkout@v4
with:
path: zapret
- name: Set up build tools
env:
REPO: 'spvkgn/musl-cross'
TOOL: ${{ matrix.tool }}
run: |
sudo apt update -qq && sudo apt install -y libcap-dev
mkdir -p $HOME/tools
wget -qO- https://github.com/$REPO/releases/download/latest/$TOOL.tar.xz | tar -C $HOME/tools -xJ || exit 1
[ -d "$HOME/tools/$TOOL/bin" ] && echo "$HOME/tools/$TOOL/bin" >> $GITHUB_PATH
- name: Build
env:
ARCH: ${{ matrix.arch }}
TARGET: ${{ matrix.tool }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
DEPS_DIR=$GITHUB_WORKSPACE/deps
export CC="$TARGET-gcc"
export LD=$TARGET-ld
export AR=$TARGET-ar
export NM=$TARGET-nm
export STRIP=$TARGET-strip
export PKG_CONFIG_PATH=$DEPS_DIR/lib/pkgconfig
# optimize for size
export CFLAGS="-Os -flto=auto"
export LDFLAGS="-Os"
# netfilter libs
git clone --depth 1 -b libmnl-1.0.5 git://git.netfilter.org/libmnl
git clone --depth 1 -b libnfnetlink-1.0.2 git://git.netfilter.org/libnfnetlink
git clone --depth 1 -b libnetfilter_queue-1.0.5 git://git.netfilter.org/libnetfilter_queue
for i in libmnl libnfnetlink libnetfilter_queue ; do
(
cd $i
./autogen.sh && \
./configure --prefix= --host=$TARGET --enable-static --disable-shared && \
make install -j$(nproc) DESTDIR=$DEPS_DIR
)
sed -i "s|^prefix=.*|prefix=$DEPS_DIR|g" $DEPS_DIR/lib/pkgconfig/$i.pc
done
# zlib
gh api repos/madler/zlib/releases/latest --jq '.tag_name' |\
xargs -I{} wget -qO- https://github.com/madler/zlib/archive/refs/tags/{}.tar.gz | tar -xz
(
cd zlib-*
./configure --prefix= --static && \
make install -j$(nproc) DESTDIR=$DEPS_DIR
)
# headers
# wget https://git.alpinelinux.org/aports/plain/main/bsd-compat-headers/queue.h && \
# wget https://git.kernel.org/pub/scm/libs/libcap/libcap.git/plain/libcap/include/sys/capability.h && \
install -Dm644 -t $DEPS_DIR/include/sys /usr/include/x86_64-linux-gnu/sys/queue.h /usr/include/sys/capability.h
# zapret
CFLAGS="$CFLAGS -static-libgcc -static -I$DEPS_DIR/include" \
LDFLAGS="$LDFLAGS -L$DEPS_DIR/lib" \
make -C zapret -j$(nproc)
tar -C zapret/binaries/my -cJf zapret-linux-$ARCH.tar.xz .
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: zapret-linux-${{ matrix.arch }}
path: zapret-*.tar.xz
if-no-files-found: error
build-macos:
name: macOS
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build zapret
run: |
make mac -j$(sysctl -n hw.logicalcpu)
tar -C binaries/my -cJf zapret-mac-x64.tar.xz .
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: zapret-mac-x64
path: zapret-*.tar.xz
if-no-files-found: error
build-freebsd:
name: FreeBSD ${{ matrix.arch }}
runs-on: ubuntu-latest
strategy:
matrix:
include:
- target: x86_64
arch: x86_64
# - target: i386
# arch: x86
container:
image: empterdose/freebsd-cross-build:11.4
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install packages
run: apk add tar xz
- name: Build zapret
env:
TARGET: ${{ matrix.target }}
ARCH: ${{ matrix.arch }}
run: |
settarget $TARGET-freebsd11 make bsd -j$(nproc) || exit 1
tar -C binaries/my -cJf zapret-freebsd-$ARCH.tar.xz .
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: zapret-freebsd-${{ matrix.arch }}
path: zapret-*.tar.xz
if-no-files-found: error
build-windows:
name: Windows ${{ matrix.arch }}
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
arch: [ x86_64, x86 ]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
path: zapret
- name: Set up MinGW
uses: msys2/setup-msys2@v2
with:
msystem: ${{ matrix.arch == 'x86_64' && 'MINGW64' || 'MINGW32' }}
install: >-
${{ matrix.arch == 'x86_64' && 'mingw-w64-x86_64-toolchain' || 'mingw-w64-i686-toolchain' }}
- name: Build ip2net, mdig
shell: msys2 {0}
run: |
mkdir -p output
cd zapret
mingw32-make -C ip2net win
mingw32-make -C mdig win
cp -a {ip2net/ip2net,mdig/mdig}.exe ../output
- name: Restore psmisc from cache
id: cache-restore-psmisc
uses: actions/cache/restore@v4
with:
path: ${{ github.workspace }}/psmisc
key: psmisc-${{ matrix.arch }}
- name: Set up Cygwin
env:
PACKAGES: ${{ steps.cache-restore-psmisc.outputs.cache-hit != 'true' && 'cygport gettext-devel libiconv-devel libncurses-devel' || null }}
uses: cygwin/cygwin-install-action@v4
with:
platform: ${{ matrix.arch }}
site: ${{ matrix.arch == 'x86_64' && 'http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/64bit/2024/01/30/231215' || null }}
check-sig: ${{ matrix.arch == 'x86_64' && 'false' || null }}
packages: >-
gcc-core
make
zlib-devel
zip
unzip
wget
${{ env.PACKAGES }}
- name: Build psmisc
if: steps.cache-restore-psmisc.outputs.cache-hit != 'true'
env:
URL: https://mirrors.kernel.org/sourceware/cygwin/x86_64/release/psmisc
shell: C:\cygwin\bin\bash.exe -eo pipefail '{0}'
run: >-
export MAKEFLAGS=-j$(nproc) &&
mkdir -p psmisc && cd psmisc &&
wget -qO- ${URL} | grep -Po 'href=\"\Kpsmisc-(\d+\.)+\d+.+src\.tar\.xz(?=\")' | xargs -I{} wget -O- ${URL}/{} | tar -xJ &&
cd psmisc-*.src &&
echo CYGCONF_ARGS+=\" --disable-dependency-tracking --disable-nls\" >> psmisc.cygport &&
cygport psmisc.cygport prep compile install
- name: Save psmisc to cache
if: steps.cache-restore-psmisc.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
path: ${{ github.workspace }}/psmisc
key: psmisc-${{ matrix.arch }}
- name: Build winws
env:
TARGET: ${{ matrix.arch == 'x86_64' && 'cygwin' || 'cygwin32' }}
shell: C:\cygwin\bin\bash.exe -eo pipefail '{0}'
run: >-
export MAKEFLAGS=-j$(nproc) &&
cd zapret &&
make -C nfq ${TARGET} &&
cp -a nfq/winws.exe ../output
- name: Create zip
env:
BITS: ${{ matrix.arch == 'x86_64' && '64' || '32' }}
DIR: ${{ matrix.arch == 'x86_64' && 'x64' || 'x86' }}
shell: C:\cygwin\bin\bash.exe -e '{0}'
run: >-
cp -a -t output psmisc/psmisc-*.src/psmisc-*/inst/usr/bin/killall.exe /usr/bin/cygwin1.dll &&
wget -O WinDivert.zip https://github.com/basil00/WinDivert/releases/download/v2.2.2/WinDivert-2.2.2-A.zip &&
unzip -j WinDivert.zip "*/${DIR}/WinDivert.dll" "*/${DIR}/WinDivert${BITS}.sys" -d output &&
zip zapret-win-${{ matrix.arch }}.zip -j output/*
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: zapret-win-${{ matrix.arch }}
path: zapret-*.zip
if-no-files-found: error
release:
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
needs: [ build-linux, build-windows, build-macos, build-freebsd ]
permissions:
contents: write
runs-on: ubuntu-latest
env:
repo_dir: zapret-${{ github.ref_name }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
path: ${{ env.repo_dir }}
- name: Download artifacts
uses: actions/download-artifact@v4
id: bins
with:
path: ${{ env.repo_dir }}/binaries
pattern: zapret-*
- name: Install upx
uses: crazy-max/ghaction-upx@v3
with:
install-only: true
- name: Prepare binaries
shell: bash
run: |
cd ${{ steps.bins.outputs.download-path }}
run_upx() {
upx --best --lzma $@ || true
}
run_dir() {
for f in $dir/* ; do
# extract binaries
case $f in
*.tar.xz )
tar -C $dir -xvf $f && rm $f
if [[ $dir == *-linux-x86_64 ]]; then
tar -C $dir -czvf $dir/tpws_wsl.tgz tpws
run_upx $dir/*
elif [[ $dir =~ linux ]] && [[ $dir != *-linux-mips64 ]]; then
run_upx $dir/*
fi
;;
*.zip )
unzip $f -d $dir && rm $f
if [[ $dir =~ win ]]; then
chmod -x $dir/*
run_upx --force $dir/cygwin1.dll
fi
;;
esac
done
mv $dir $1
}
for dir in * ; do
if [ -d $dir ]; then
echo "Processing $dir"
case $dir in
*-freebsd-x86_64 ) run_dir freebsd-x64 ;;
*-linux-arm ) run_dir arm ;;
*-linux-arm64 ) run_dir aarch64 ;;
*-linux-mips64 ) run_dir mips64r2-msb ;;
*-linux-mipselsf ) run_dir mips32r1-lsb ;;
*-linux-mipssf ) run_dir mips32r1-msb ;;
*-linux-ppc ) run_dir ppc ;;
*-linux-x86 ) run_dir x86 ;;
*-linux-x86_64 ) run_dir x86_64 ;;
*-mac-x64 ) run_dir mac64 ;;
*-win-x86 ) run_dir win32 ;;
*-win-x86_64 ) run_dir win64 ;;
esac
fi
done
ls -lhR
- name: Create release bundles
run: |
rm -rf ${{ env.repo_dir }}/.git*
tar -czf ${{ env.repo_dir }}.tar.gz ${{ env.repo_dir }}
zip -qr ${{ env.repo_dir }}.zip ${{ env.repo_dir }}
- name: Upload release assets
uses: softprops/action-gh-release@v2
with:
fail_on_unmatched_files: true
prerelease: false
draft: false
body: |
### zapret ${{ github.ref_name }}
files: |
zapret*.tar.gz
zapret*.zip

View File

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

View File

@ -139,21 +139,21 @@
> направления (IP сервера). скрипт не всегда может выдать вам в итогах > направления (IP сервера). скрипт не всегда может выдать вам в итогах
> оптимальную стратегию, которую надо просто переписать в настройки. В > оптимальную стратегию, которую надо просто переписать в настройки. В
> некоторых случаях надо реально думать что происходит, анализируя результат > некоторых случаях надо реально думать что происходит, анализируя результат
> на разных стратегиях. Если вы применяете большой 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 нужно > Далее, имея понимание что работает на **http**, **https**, **quic**, нужно
> сконструировать параметры запуска `tpws` и/или `nfqws` с использованием > сконструировать параметры запуска `tpws` и/или `nfqws` с использованием
> мультистратегии. Как работают мультистратегии описано в readme.txt. > мультистратегии. Как работают мультистратегии описано в readme.txt.
> >
@ -223,14 +223,15 @@
> --filter-tcp=443 --wssize 1:6" > --filter-tcp=443 --wssize 1:6"
> ``` > ```
> >
> В этом примере `wssize` будет применяться всегда к порту tcp `443` вне > В этом примере `wssize` будет применяться всегда к порту **tcp** `443` вне
> зависимости от параметра `MODE_FILTER`. Хостлист будет игнорироваться, > зависимости от параметра `MODE_FILTER`. Хостлист будет игнорироваться,
> если таковой имеется. К http применять `wssize` вредно и бессмысленно. > если таковой имеется. К **http** применять **wssize** вредно и
> бессмысленно.
> >
> Никто не мешает использовать `tpws` для http, `nfqws` для https, либо > Никто не мешает использовать `tpws` для **http**, `nfqws` для **https**,
> комбинировать действие `nfqws` и `tpws` для одного протокола. В текущем > либо комбинировать действие `nfqws` и `tpws` для одного протокола. В
> варианте скриптов запуска это делается максимально гибко и независимо друг > текущем варианте скриптов запуска это делается максимально гибко и
> от друга. > независимо друг от друга.
7. Запустите скрипт облегченной установки - `install_easy.sh` Выберите `nfqws` 7. Запустите скрипт облегченной установки - `install_easy.sh` Выберите `nfqws`
и/или `tpws`, затем согласитесь на редактирование параметров. Откроется и/или `tpws`, затем согласитесь на редактирование параметров. Откроется
@ -251,5 +252,5 @@
подбирать такие стратегии, которые вызывают минимальные поломки. Есть стратегии подбирать такие стратегии, которые вызывают минимальные поломки. Есть стратегии
довольно безобидные, а есть сильно ломающие, которые подходят только для довольно безобидные, а есть сильно ломающие, которые подходят только для
точечного пробития отдельных ресурсов, когда ничего лучше нет. Хорошая точечного пробития отдельных ресурсов, когда ничего лучше нет. Хорошая
стратегия может сильно ломать из-за плохо подобранных ограничителей для фейков стратегия может большие проблемы из-за плохо подобранных ограничителей для
- ttl, fooling. фейков (**ttl**, **fooling**).