mirror of
https://github.com/bol-van/zapret.git
synced 2024-11-26 12:10:53 +03:00
Compare commits
7 Commits
7c3ae941f7
...
337a291086
Author | SHA1 | Date | |
---|---|---|---|
|
337a291086 | ||
|
e1e55b1653 | ||
|
abe507c9c3 | ||
|
fa1430b604 | ||
|
a5e6b20e71 | ||
|
b79d8becd3 | ||
|
6250a26127 |
379
.github/workflows/build.yml
vendored
Normal file
379
.github/workflows/build.yml
vendored
Normal 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
|
230
docs/bsd.md
230
docs/bsd.md
@ -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,22 +194,20 @@ $ /opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2
|
||||
### PF в FreeBSD
|
||||
Настройка аналогична **OpenBSD**, но есть важные нюансы.
|
||||
|
||||
1. В **FreeBSD** поддержка PF в `tpws` отключена по умолчанию. Чтобы ее
|
||||
- В **FreeBSD** поддержка PF в `tpws` отключена по умолчанию. Чтобы ее
|
||||
включить, нужно использовать параметр `--enable-pf`.
|
||||
2. Нельзя сделать **ipv6** rdr на `::1`. Нужно делать на *link-local* адрес
|
||||
входящего интерфейса. Смотрите через `ifconfig` адрес `fe80:...` и
|
||||
добавляете в правило
|
||||
3. Синтаксис `pf.conf` немного отличается. Более новая версия **PF**.
|
||||
4. Лимит на количество элементов таблиц задается так:
|
||||
- Нельзя сделать ipv6 rdr на `::1`. Нужно делать на link-local адрес входящего
|
||||
интерфейса. Смотрите через `ifconfig` адрес `fe80:...` и добавляете в правило.
|
||||
- Синтаксис `pf.conf` немного отличается. Более новая версия PF.
|
||||
- Лимит на количество элементов таблиц задается так:
|
||||
```sh
|
||||
$ sysctl net.pf.request_maxcount=2000000
|
||||
```
|
||||
5. *divert-to* сломан. Он работает, но не работает механизм предотвращения
|
||||
- Сломан divert-to. Он работает, но не работает механизм предотвращения
|
||||
зацикливаний. Кто-то уже написал патч, но в `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 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** основан на **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).
|
||||
|
@ -139,21 +139,21 @@
|
||||
> направления (IP сервера). скрипт не всегда может выдать вам в итогах
|
||||
> оптимальную стратегию, которую надо просто переписать в настройки. В
|
||||
> некоторых случаях надо реально думать что происходит, анализируя результат
|
||||
> на разных стратегиях. Если вы применяете большой **TTL**, чтобы достать до
|
||||
> на разных стратегиях. Если вы применяете большой TTL, чтобы достать до
|
||||
> магистрала, то не лишним будет добавить дополнительный ограничитель
|
||||
> `--dpi-desync-fooling`, чтобы не сломать сайты на более коротких
|
||||
> дистанциях. `md5sig` наиболее совместим, но работает **только** на linux
|
||||
> серверах. `badseq` может работать только на **https** и не работать на
|
||||
> **http**. Чтобы выяснить какие дополнительные ограничители работают,
|
||||
> смотрите результат теста аналогичных стратегий без **TTL** с каждым из
|
||||
> этих ограничителей.
|
||||
> серверах. `badseq` может работать только на https и не работать на http.
|
||||
> Чтобы выяснить какие дополнительные ограничители работают, смотрите
|
||||
> результат теста аналогичных стратегий без TTL с каждым из этих
|
||||
> ограничителей.
|
||||
>
|
||||
> При использовании `autottl` следует протестировать как можно больше разных
|
||||
> доменов. Эта техника может на одних провайдерах работать стабильно, на
|
||||
> других потребуется выяснить при каких параметрах она стабильна, на третьих
|
||||
> полный хаос, и проще отказаться.
|
||||
>
|
||||
> Далее, имея понимание что работает на **http**, **https**, **quic**, нужно
|
||||
> Далее, имея понимание что работает на http, https, quic нужно
|
||||
> сконструировать параметры запуска `tpws` и/или `nfqws` с использованием
|
||||
> мультистратегии. Как работают мультистратегии описано в readme.txt.
|
||||
>
|
||||
@ -223,15 +223,14 @@
|
||||
> --filter-tcp=443 --wssize 1:6"
|
||||
> ```
|
||||
>
|
||||
> В этом примере `wssize` будет применяться всегда к порту **tcp** `443` вне
|
||||
> В этом примере `wssize` будет применяться всегда к порту tcp `443` вне
|
||||
> зависимости от параметра `MODE_FILTER`. Хостлист будет игнорироваться,
|
||||
> если таковой имеется. К **http** применять **wssize** вредно и
|
||||
> бессмысленно.
|
||||
> если таковой имеется. К http применять `wssize` вредно и бессмысленно.
|
||||
>
|
||||
> Никто не мешает использовать `tpws` для **http**, `nfqws` для **https**,
|
||||
> либо комбинировать действие `nfqws` и `tpws` для одного протокола. В
|
||||
> текущем варианте скриптов запуска это делается максимально гибко и
|
||||
> независимо друг от друга.
|
||||
> Никто не мешает использовать `tpws` для http, `nfqws` для https, либо
|
||||
> комбинировать действие `nfqws` и `tpws` для одного протокола. В текущем
|
||||
> варианте скриптов запуска это делается максимально гибко и независимо друг
|
||||
> от друга.
|
||||
|
||||
7. Запустите скрипт облегченной установки - `install_easy.sh` Выберите `nfqws`
|
||||
и/или `tpws`, затем согласитесь на редактирование параметров. Откроется
|
||||
@ -252,5 +251,5 @@
|
||||
подбирать такие стратегии, которые вызывают минимальные поломки. Есть стратегии
|
||||
довольно безобидные, а есть сильно ломающие, которые подходят только для
|
||||
точечного пробития отдельных ресурсов, когда ничего лучше нет. Хорошая
|
||||
стратегия может большие проблемы из-за плохо подобранных ограничителей для
|
||||
фейков (**ttl**, **fooling**).
|
||||
стратегия может сильно ломать из-за плохо подобранных ограничителей для фейков
|
||||
- ttl, fooling.
|
||||
|
Loading…
Reference in New Issue
Block a user