Compare commits

..

7 Commits

Author SHA1 Message Date
MAXIMILI
337a291086
Merge e1e55b1653 into abe507c9c3 2024-11-07 16:05:18 +00:00
maximilionus
e1e55b1653 docs: Fix quick_start, bsd formatting cleanup 2024-11-07 19:04:23 +03:00
bol-van
abe507c9c3
Merge pull request #726 from spvkgn/fix-actions
github: set env variable for directory name
2024-11-07 14:54:51 +03:00
spvkgn
fa1430b604 github: set env variable for directory name 2024-11-07 16:43:31 +05:00
bol-van
a5e6b20e71 git build: rename directory to zapret-<tag> 2024-11-07 12:50:09 +03:00
bol-van
b79d8becd3
Merge pull request #721 from spvkgn/actions
github: Add Actions builder
2024-11-07 11:31:56 +03:00
spvkgn
6250a26127 github: Add Actions builder 2024-11-06 20:55:57 +05:00
3 changed files with 520 additions and 146 deletions

379
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,379 @@
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** под **BSD** собирается `dvtws` вместо `nfqws`. Он разделяет с `nfqws` [`nfq/`](../nfq/) под **BSD** собирается `dvtws` вместо `nfqws`. Он разделяет с
большую часть кода и почти совпадает по параметрам командной строки. `nfqws` большую часть кода и почти совпадает по параметрам командной строки.
### Типы Firewall ### Типы Firewall
**FreeBSD** содержит 3 фаервола : **IPFilter**, **ipfw** и **Packet Filter (PF **FreeBSD** содержит 3 фаервола : **IPFilter**, **ipfw** и **Packet Filter (PF
@ -35,49 +35,46 @@ 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 сокеты* могут быть `--queue-bypass`. На **FreeBSD** divert сокеты могут быть только ipv4, хотя на
только **ipv4**, хотя на них принимаются и **ipv4**, и **ipv6** фреймы. На них принимаются и ipv4, и ipv6 фреймы. На **OpenBSD** divert сокеты создаются
**OpenBSD** *divert сокеты* создаются отдельно для **ipv4** и **ipv6** и отдельно для ipv4 и ipv6 и работают только с одной версией `ip` каждый. На
работают только с одной версией `ip` каждый. На **MacOS** похоже, что *divert **MacOS** похоже, что divert сокеты из ядра вырезаны. См подробнее раздел про
сокеты* из ядра вырезаны. См подробнее раздел про **MacOS**. Отсылка в *divert **MacOS**. Отсылка в divert сокет работает аналогично отсылке через raw socket
сокет* работает аналогично отсылке через *raw socket* на linux. Передается на linux. Передается полностью IP фрейм, начиная с ip загловка. Эти особенности
полностью IP фрейм, начиная с ip загловка. Эти особенности учитываются в учитываются в `dvtws`.
`dvtws`.
### Lookup Tables ### Lookup Tables
Скрипты `ipset/*.sh` при наличии **ipfw** работают с *ipfw lookup tables*. Это Скрипты [`ipset/*.sh`](../ipset/) при наличии ipfw работают с ipfw lookup
прямой аналог **ipset**. *lookup tables* не разделены на **v4** и **v6**. Они tables. Это прямой аналог ipset. lookup tables не разделены на v4 и v6. Они
могут содержать **v4** и **v6** адреса и подсети одновременно. Если **ipfw** могут содержать v4 и v6 адреса и подсети одновременно. Если ipfw отсутствует,
отсутствует, то действие зависит от переменной `LISTS_RELOAD` в *config*. Если то действие зависит от переменной `LISTS_RELOAD` в config. Если она задана, то
она задана, то выполняется команда из `LISTS_RELOAD`. В противном случае не выполняется команда из `LISTS_RELOAD`. В противном случае не делается ничего.
делается ничего. Если `LISTS_RELOAD=-`, то заполнение таблиц отключается даже Если `LISTS_RELOAD=-`, то заполнение таблиц отключается даже при наличии ipfw.
при наличии **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* - прослойка для эмуляции **BSD** для его эмуляции используется epoll-shim - прослойка для эмуляции epoll
*epoll* на базе *kqueue*. на базе kqueue.
### mdig, ip2net ### mdig, ip2net
mdig и ip2net полностью работоспособны в **BSD**. В них нет ничего mdig и ip2net полностью работоспособны в **BSD**. В них нет ничего
@ -86,7 +83,7 @@ mdig и ip2net полностью работоспособны в **BSD**. В н
## FreeBSD ## FreeBSD
### Подгрузка ipdivert ### Подгрузка ipdivert
*Divert сокеты* требуют специального модуля ядра - `ipdivert`. Divert сокеты требуют специального модуля ядра - `ipdivert`.
- Поместите следующие строки в `/boot/loader.conf` (создать, если отсутствует): - Поместите следующие строки в `/boot/loader.conf` (создать, если отсутствует):
``` ```
@ -94,19 +91,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
@ -123,7 +120,7 @@ $ /etc/rc.d/ipfw restart
Краткая инструкция по запуску `tpws` в прозрачном режиме. Краткая инструкция по запуску `tpws` в прозрачном режиме.
> [!NOTE] > [!NOTE]
> Предполагается, что интерфейс **LAN** называется `em1`, **WAN** - `em0`. > Предполагается, что интерфейс LAN называется `em1`, WAN - `em0`.
#### Весь трафик #### Весь трафик
```sh ```sh
@ -151,7 +148,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
> ``` > ```
@ -162,15 +159,15 @@ $ /opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127
> ``` > ```
> [!CAUTION] > [!CAUTION]
> При использовании **ipfw** `tpws` не требует повышенных привилегий для > При использовании ipfw `tpws` не требует повышенных привилегий для реализации
> реализации прозрачного режима. Однако, без рута невозможен бинд на порты > прозрачного режима. Однако, без рута невозможен бинд на порты `< 1024` и
> <1024 и смена UID/GID. Без смены UID будет рекурсия, поэтому правила **ipfw** > смена UID/GID. Без смены UID будет рекурсия, поэтому правила ipfw нужно
> нужно создавать с учетом UID, под которым работает `tpws`. Переадресация на > создавать с учетом UID, под которым работает `tpws`. Переадресация на порты
> порты >=1024 может создать угрозу перехвата трафика непривилегированным > `>= 1024` может создать угрозу перехвата трафика непривилегированным
> процессом, если вдруг `tpws` не запущен. > процессом, если вдруг `tpws` не запущен.
### Запуск `dvtws` ### Запуск dvtws
#### Весь трафик #### Весь трафик
```sh ```sh
@ -197,22 +194,20 @@ $ /opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2
### PF в FreeBSD ### PF в FreeBSD
Настройка аналогична **OpenBSD**, но есть важные нюансы. Настройка аналогична **OpenBSD**, но есть важные нюансы.
1. В **FreeBSD** поддержка PF в `tpws` отключена по умолчанию. Чтобы ее - В **FreeBSD** поддержка PF в `tpws` отключена по умолчанию. Чтобы ее
включить, нужно использовать параметр `--enable-pf`. включить, нужно использовать параметр `--enable-pf`.
2. Нельзя сделать **ipv6** rdr на `::1`. Нужно делать на *link-local* адрес - Нельзя сделать ipv6 rdr на `::1`. Нужно делать на link-local адрес входящего
входящего интерфейса. Смотрите через `ifconfig` адрес `fe80:...` и интерфейса. Смотрите через `ifconfig` адрес `fe80:...` и добавляете в правило.
добавляете в правило - Синтаксис `pf.conf` немного отличается. Более новая версия PF.
3. Синтаксис `pf.conf` немного отличается. Более новая версия **PF**. - Лимит на количество элементов таблиц задается так:
4. Лимит на количество элементов таблиц задается так:
```sh ```sh
$ sysctl net.pf.request_maxcount=2000000 $ sysctl net.pf.request_maxcount=2000000
``` ```
5. *divert-to* сломан. Он работает, но не работает механизм предотвращения - Сломан divert-to. Он работает, но не работает механизм предотвращения
зацикливаний. Кто-то уже написал патч, но в `14-RELEASE` проблема все еще зацикливаний. Кто-то уже написал патч, но в `14-RELEASE` проблема все еще
есть. Следовательно, на данный момент работа `dvtws` через **PF** есть. Следовательно, на данный момент работа `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
@ -227,29 +222,30 @@ $ /opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2
### pfsense ### pfsense
#### Что это #### Что это
**pfsense** основан на **FreeBSD** и использует фаервол **PF**, имеющий pfsense основан на **FreeBSD** и использует фаервол PF, имеющий проблемы с
проблемы с *divert*. К счастью, модули **ipfw** и **ipdivert** присутствуют в divert. К счастью, модули ipfw и ipdivert присутствуют в поставке последних
поставке последних версий **pfsense**. Их можно подгрузить через `kldload`. версий pfsense. Их можно подгрузить через `kldload`.
#### Особенности #### Особенности
В некоторых более старых версиях **pfsense** требуется изменить порядок В некоторых более старых версиях pfsense требуется изменить порядок фаерволов
фаерволов через `sysctl`, сделав **ipfw** первым. В более новых эти параметры через `sysctl`, сделав ipfw первым. В более новых эти параметры `sysctl`
`sysctl` отсутствуют, но система работает как надо и без них. В некоторых отсутствуют, но система работает как надо и без них. В некоторых случаях
случаях фаервол **PF** может ограничивать возможности `dvtws`, в частности в фаервол PF может ограничивать возможности `dvtws`, в частности в области
области фрагментации ip. фрагментации ip.
#### Исполняемые файлы #### Исполняемые файлы
Присутствуют по умолчанию правила scrub для реассемблинга фрагментов. Присутствуют по умолчанию правила scrub для реассемблинга фрагментов. Бинарики
Бинарики из [`binaries/freebsd-x64`](../binaries/freebsd-x64) собраны под из [`binaries/freebsd-x64`](../binaries/freebsd-x64) собраны под **FreeBSD
**FreeBSD 11**. Они должны работать и на последующих версиях **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`.
@ -265,12 +261,12 @@ $ /opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2
> Если вас напрягает бедность имеющегося репозитория, можно включить > Если вас напрягает бедность имеющегося репозитория, можно включить
> репозиторий от **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
@ -294,12 +290,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` следующим образом:
``` ```
@ -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 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
@ -349,14 +345,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=::` для
достижения того же результата, как в других ОС по умолчанию. Но лучше все же достижения того же результата, как в других ОС по умолчанию. Но лучше все же
так не делать, а сажать на определенные внутренние адреса или интерфейсы. так не делать, а сажать на определенные внутренние адреса или интерфейсы.
@ -364,7 +360,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
@ -376,7 +372,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**.
@ -384,7 +380,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
@ -399,7 +395,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"
@ -438,7 +434,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 фреймов, поэтому проблемы зацикливания
нет. нет.
@ -450,7 +446,7 @@ no state и in правилом позволяет обойти эту проб
### Перезагрузка PF таблиц ### Перезагрузка PF таблиц
Скрипты из **ipset** не перезагружают таблицы в **PF** по умолчанию. Скрипты из ipset не перезагружают таблицы в PF по умолчанию.
Чтобы они это делали, добавьте параметр в `/opt/zapret/config`: Чтобы они это делали, добавьте параметр в `/opt/zapret/config`:
``` ```
@ -473,7 +469,7 @@ $ pfctl -Tl -f /etc/pf.conf
> ошибка перезагрузки фаервола. > ошибка перезагрузки фаервола.
> [!NOTE] > [!NOTE]
> После настройки обновление листов можно поместить в `cron`: > После настройки обновление листов можно поместить в cron:
> ```sh > ```sh
> $ crontab -e > $ crontab -e
> ``` > ```
@ -493,27 +489,26 @@ $ pfctl -Tl -f /etc/pf.conf
### dvtws бесполезен ### dvtws бесполезен
Раньше был **ipfw**, потом его убрали, заменили на **PF**. Есть сомнения, что Раньше был ipfw, потом его убрали, заменили на PF. Есть сомнения, что divert
*divert сокеты* в ядре остались. Попытка создать *divert socket* не выдает сокеты в ядре остались. Попытка создать divert socket не выдает ошибок, но
ошибок, но полученный сокет ведет себя точно так же, как *raw*, со всеми его полученный сокет ведет себя точно так же, как raw, со всеми его унаследованными
унаследованными косяками + еще яблочно специфическими. В **PF** *divert-packet* косяками + еще яблочно специфическими. В PF divert-packet не работает. Простой
не работает. Простой grep бинарика `pfctl` показывает, что там нет слова grep бинарика `pfctl` показывает, что там нет слова "divert", а в других
"divert", а в других версиях **BSD** оно есть. `dvtws` собирается, но версиях **BSD** оно есть. `dvtws` собирается, но совершенно бесполезен.
совершенно бесполезен.
### tpws ### tpws
`tpws` удалось адаптировать, он работоспособен. Получение адреса назначения для `tpws` удалось адаптировать, он работоспособен. Получение адреса назначения для
прозрачного прокси в **PF** (`DIOCNATLOOK`) убрали из заголовков в новых SDK, прозрачного прокси в PF (`DIOCNATLOOK`) убрали из заголовков в новых SDK,
сделав фактически недокументированным. сделав фактически недокументированным.
В `tpws` перенесены некоторые определения из более старых версий яблочных SDK. В `tpws` перенесены некоторые определения из более старых версий яблочных SDK.
С ними удалось завести прозрачный режим. Однако, что будет в следующих версиях С ними удалось завести прозрачный режим. Однако, что будет в следующих версиях
угадать сложно. Гарантий нет. Еще одной особенностью **PF** в **MacOS** угадать сложно. Гарантий нет. Еще одной особенностью PF в **MacOS** является
является проверка на рута в момент обращения к `/dev/pf`, чего нет в остальных проверка на рута в момент обращения к `/dev/pf`, чего нет в остальных **BSD**.
**BSD**. `tpws` по умолчанию сбрасывает рутовые привилегии. Необходимо явно `tpws` по умолчанию сбрасывает рутовые привилегии. Необходимо явно указать
указать параметр `--user=root`. В остальном **PF** себя ведет похоже на параметр `--user=root`. В остальном PF себя ведет похоже на **FreeBSD**.
**FreeBSD**. Синтаксис `pf.conf` тот же. Синтаксис `pf.conf` тот же.
> [!IMPORTANT] > [!IMPORTANT]
> На **MacOS** работает редирект как с проходящего трафика, так и с локальной > На **MacOS** работает редирект как с проходящего трафика, так и с локальной
@ -522,7 +517,7 @@ $ pfctl -Tl -f /etc/pf.conf
> Отсюда имеем недостаток - **обход 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
@ -544,7 +539,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
@ -561,7 +556,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 адреса.
@ -578,10 +573,10 @@ local. Скрывать link local не имеет смысла, а динами
Все равно для исходящих соединений будут использоваться temporary адреса, как и Все равно для исходящих соединений будут использоваться temporary адреса, как и
в других системах. Или вам идея не по вкусу, можно прописать дополнительный в других системах. Или вам идея не по вкусу, можно прописать дополнительный
статический **ipv6** из диапазона маски `fc00::/7` - выберите любой с длиной статический ipv6 из диапазона маски `fc00::/7` - выберите любой с длиной
префикса `128`. Это можно сделать в системных настройках, создав дополнительный префикса `128`. Это можно сделать в системных настройках, создав дополнительный
адаптер на базе того же сетевого интерфейса, отключить в нем **ipv4** и вписать адаптер на базе того же сетевого интерфейса, отключить в нем ipv4 и вписать
статический **ipv6**. Он добавится к автоматически настраеваемым. статический ipv6. Он добавится к автоматически настраеваемым.
### Сборка ### Сборка
@ -590,9 +585,10 @@ $ make -C /opt/zapret mac
``` ```
> [!IMPORTANT] > [!IMPORTANT]
> Скрипты получения листов ipset/*.sh работают. Если будете пользоваться > Скрипты получения листов [`ipset/*.sh`](../ipset/) работают. Если будете
> `ipset/get_combined.sh`, нужно установить `GNU grep` через `brew`. Имеющийся > пользоваться [`get_combined.sh`](../ipset/get_combined.sh), нужно установить
> очень старый и безумно медленный с оцией `-f`. > GNU grep через `brew`. Имеющийся очень старый и безумно медленный с оцией
> `-f`.
### Простая установка ### Простая установка
@ -606,7 +602,7 @@ $ make -C /opt/zapret mac
> [!WARNING] > [!WARNING]
> Internet sharing средствами системы **не поддерживается**! > Internet sharing средствами системы **не поддерживается**!
> >
> Поддерживается только роутер, настроенный своими силами через **PF**. Если вы > Поддерживается только роутер, настроенный своими силами через PF. Если вы
> вдруг включили шаринг, а потом выключили, то доступ к сайтам может пропасть > вдруг включили шаринг, а потом выключили, то доступ к сайтам может пропасть
> совсем. > совсем.
> >
@ -618,7 +614,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` и фаерволом одновременно (если
@ -653,8 +649,8 @@ $ /opt/zapret/init.d/macos/zapret reload-fw-tables
> [`ipset/*.sh`](../ipset/) автоматически перезагружают IP таблицы в PF. > [`ipset/*.sh`](../ipset/) автоматически перезагружают IP таблицы в PF.
> [!NOTE] > [!NOTE]
> Автоматически создается cron job на `ipset/get_config.sh`, по аналогии с > Автоматически создается cron job на
> openwrt. > [`ipset/get_config.sh`](../ipset/get_config.sh), по аналогии с openwrt.
При start-fw скрипт автоматически модицифирует `/etc/pf.conf`, вставляя туда При start-fw скрипт автоматически модицифирует `/etc/pf.conf`, вставляя туда
anchors "zapret". Модификация расчитана на `pf.conf`, в котором сохранены anchors "zapret". Модификация расчитана на `pf.conf`, в котором сохранены
@ -695,9 +691,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** и не работать на > серверах. `badseq` может работать только на https и не работать на http.
> **http**. Чтобы выяснить какие дополнительные ограничители работают, > Чтобы выяснить какие дополнительные ограничители работают, смотрите
> смотрите результат теста аналогичных стратегий без **TTL** с каждым из > результат теста аналогичных стратегий без TTL с каждым из этих
> этих ограничителей. > ограничителей.
> >
> При использовании `autottl` следует протестировать как можно больше разных > При использовании `autottl` следует протестировать как можно больше разных
> доменов. Эта техника может на одних провайдерах работать стабильно, на > доменов. Эта техника может на одних провайдерах работать стабильно, на
> других потребуется выяснить при каких параметрах она стабильна, на третьих > других потребуется выяснить при каких параметрах она стабильна, на третьих
> полный хаос, и проще отказаться. > полный хаос, и проще отказаться.
> >
> Далее, имея понимание что работает на **http**, **https**, **quic**, нужно > Далее, имея понимание что работает на http, https, quic нужно
> сконструировать параметры запуска `tpws` и/или `nfqws` с использованием > сконструировать параметры запуска `tpws` и/или `nfqws` с использованием
> мультистратегии. Как работают мультистратегии описано в readme.txt. > мультистратегии. Как работают мультистратегии описано в readme.txt.
> >
@ -223,15 +223,14 @@
> --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`, затем согласитесь на редактирование параметров. Откроется
@ -252,5 +251,5 @@
подбирать такие стратегии, которые вызывают минимальные поломки. Есть стратегии подбирать такие стратегии, которые вызывают минимальные поломки. Есть стратегии
довольно безобидные, а есть сильно ломающие, которые подходят только для довольно безобидные, а есть сильно ломающие, которые подходят только для
точечного пробития отдельных ресурсов, когда ничего лучше нет. Хорошая точечного пробития отдельных ресурсов, когда ничего лучше нет. Хорошая
стратегия может большие проблемы из-за плохо подобранных ограничителей для стратегия может сильно ломать из-за плохо подобранных ограничителей для фейков
фейков (**ttl**, **fooling**). - ttl, fooling.