mirror of
https://github.com/bol-van/zapret.git
synced 2025-05-24 22:32:58 +03:00
Compare commits
191 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
d7ce95ed50 | ||
|
c2413e4944 | ||
|
ad0aa27860 | ||
|
b5ade9baf0 | ||
|
68c7631713 | ||
|
4f31fb3b6b | ||
|
22534787a9 | ||
|
9e79c17a9f | ||
|
9345bdfe1e | ||
|
72cca01172 | ||
|
2466d5c758 | ||
|
43c24c501b | ||
|
b9962a0308 | ||
|
29520c9827 | ||
|
14dc328940 | ||
|
3bdedb2a9d | ||
|
f45fb421d8 | ||
|
6695245357 | ||
|
ca39017d10 | ||
|
7129923a70 | ||
|
9f1687ffec | ||
|
e1e55b1653 | ||
|
abe507c9c3 | ||
|
fa1430b604 | ||
|
a5e6b20e71 | ||
|
b79d8becd3 | ||
|
905a9519ce | ||
|
527c11e86f | ||
|
6250a26127 | ||
|
e1d417578d | ||
|
7ee5306d06 | ||
|
db0caf7d58 | ||
|
34c6c5e9ba | ||
|
868d115c5d | ||
|
969ddfb84c | ||
|
a5be4da22e | ||
|
a9dbb74973 | ||
|
6481f2204e | ||
|
a585d09c03 | ||
|
7f4356aa7e | ||
|
773da6383b | ||
|
07cd46bf90 | ||
|
c07fe4225a | ||
|
4374ca2290 | ||
|
cf320a7a2d | ||
|
086a0e4408 | ||
|
b28447e796 | ||
|
cff12dd431 | ||
|
cbba8a7876 | ||
|
bbeee9d640 | ||
|
466a142ebe | ||
|
8aa8bb5941 | ||
|
ffa701e497 | ||
|
e0063eecd5 | ||
|
2d530d5f63 | ||
|
95b3830afd | ||
|
0ea3215187 | ||
|
27745a3747 | ||
|
c68b75d4ac | ||
|
f4d31cdcb6 | ||
|
f2ea38cf93 | ||
|
9e84bf7a42 | ||
|
4559169e78 | ||
|
1987209613 | ||
|
913372a574 | ||
|
0ea4709726 | ||
|
9eef0ca113 | ||
|
88d7fd4088 | ||
|
1144f9afdc | ||
|
380d104407 | ||
|
31d4eaaa14 | ||
|
b2f94b083c | ||
|
4bdce508af | ||
|
74b6281770 | ||
|
a581e13498 | ||
|
174772e87f | ||
|
8f8e082ab4 | ||
|
7abf105777 | ||
|
db7078dcca | ||
|
cc38472e32 | ||
|
8b4b8c3fb0 | ||
|
228572afb5 | ||
|
ebb89c48e0 | ||
|
067be122b3 | ||
|
a4632ef6d7 | ||
|
c964677913 | ||
|
e0f8ff06b9 | ||
|
34e632a1f8 | ||
|
4adeb9499b | ||
|
149a7ed927 | ||
|
f22dcb2487 | ||
|
794336a509 | ||
|
d8082fbaec | ||
|
abb3cd3316 | ||
|
7f0eccb39c | ||
|
f8bf9bbb38 | ||
|
1548c86f87 | ||
|
bb74fa765a | ||
|
ee5d4c5017 | ||
|
d04eb28c7f | ||
|
ce2a51a137 | ||
|
4f37c19771 | ||
|
9d43dfdc71 | ||
|
b176af43a4 | ||
|
a6ef91124e | ||
|
1a722c1b78 | ||
|
2452a529eb | ||
|
daac1d2127 | ||
|
acfd844a49 | ||
|
2464d27550 | ||
|
1fdf5477b4 | ||
|
6686c4a190 | ||
|
e979f88963 | ||
|
840292e7d9 | ||
|
43cd263cff | ||
|
d8c07baab7 | ||
|
6e8dbb045a | ||
|
8446470de3 | ||
|
552ddee0da | ||
|
6be62d775b | ||
|
d59c77a899 | ||
|
37b5651976 | ||
|
5572bf7c2b | ||
|
3c7f7c3831 | ||
|
906e67af55 | ||
|
d86aa42f48 | ||
|
8bc5e16ec1 | ||
|
086f15c29f | ||
|
d548d76c1b | ||
|
f649743d70 | ||
|
629e0c5835 | ||
|
2dc7332533 | ||
|
c645e17b0b | ||
|
00e0b28616 | ||
|
de095dd2f2 | ||
|
c6645a0c53 | ||
|
e31a13a158 | ||
|
b058f9f128 | ||
|
d9e539f217 | ||
|
8dc7ebaec4 | ||
|
7f8803afe4 | ||
|
7e4d084c41 | ||
|
7190b00849 | ||
|
ea1545b45c | ||
|
076397eb99 | ||
|
2cbb497cb7 | ||
|
2286996223 | ||
|
d5516dac8a | ||
|
7b07074ad7 | ||
|
a5b68959f3 | ||
|
8e336b746c | ||
|
47578bf891 | ||
|
d596d311e9 | ||
|
cc0de2aa8b | ||
|
852b7bb717 | ||
|
5aa90185b4 | ||
|
438e8a98b3 | ||
|
6b2ce5410a | ||
|
4a81603d05 | ||
|
af6a01f56d | ||
|
a371ca6ea2 | ||
|
83a629b832 | ||
|
5963ba617a | ||
|
ebecc423c7 | ||
|
89ccf0bbc0 | ||
|
1099f248e5 | ||
|
6be111f7b7 | ||
|
33caf4fd4a | ||
|
84fe7817e0 | ||
|
d80e415c63 | ||
|
4d66496cc3 | ||
|
6773370a87 | ||
|
47c08d0ab5 | ||
|
ea97e9ade2 | ||
|
01b3f4d3cf | ||
|
390c9419e8 | ||
|
94cd2212b8 | ||
|
5d4c81d3a5 | ||
|
05978d9b35 | ||
|
e23f61ed7d | ||
|
7171c776db | ||
|
baca5a184d | ||
|
f32df7d701 | ||
|
2fa48f48ea | ||
|
db14cee73b | ||
|
f8ccb564ca | ||
|
20e6ba721a | ||
|
5a5d9f7f31 | ||
|
fbc5b8e491 | ||
|
f1392a3cf1 | ||
|
8ff0b9bab9 |
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -1,4 +1,5 @@
|
||||
* text=auto eol=lf
|
||||
binaries/win64/readme.txt eol=crlf
|
||||
binaries/win32/readme.txt eol=crlf
|
||||
*.cmd eol=crlf
|
||||
*.bat eol=crlf
|
||||
|
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
|
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,10 +1,9 @@
|
||||
config
|
||||
/config
|
||||
ip2net/ip2net
|
||||
mdig/mdig
|
||||
nfq/nfqws
|
||||
tpws/tpws
|
||||
binaries/my/
|
||||
binaries/win64/zapret-winws/autohostlist.txt
|
||||
init.d/**/custom
|
||||
ipset/zapret-ip*.txt
|
||||
ipset/zapret-ip*.gz
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,9 +0,0 @@
|
||||
Standalone version in zapret-winws folder !!
|
||||
From this folder winws can be started only from cygwin shell.
|
||||
|
||||
Cygwin refuses to start winws if a copy of cygwin1.dll is present !
|
||||
|
||||
How to get win7 and winws compatible version of cygwin :
|
||||
|
||||
curl -O https://www.cygwin.com/setup-x86_64.exe
|
||||
setup-x86_64.exe --allow-unsupported-windows --no-verify --site http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/64bit/2024/01/30/231215
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,3 +0,0 @@
|
||||
googlevideo.com
|
||||
youtubei.googleapis.com
|
||||
i.ytimg.com
|
@@ -1,7 +0,0 @@
|
||||
start "zapret: http,https,quic" /min "%~dp0winws.exe" ^
|
||||
--wf-tcp=80,443 --wf-udp=443 ^
|
||||
--filter-udp=443 --hostlist="%~dp0list-youtube.txt" --dpi-desync=fake --dpi-desync-repeats=11 --dpi-desync-fake-quic="%~dp0quic_initial_www_google_com.bin" --new ^
|
||||
--filter-udp=443 --dpi-desync=fake --dpi-desync-repeats=11 --new ^
|
||||
--filter-tcp=80 --dpi-desync=fake,split2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig --new ^
|
||||
--filter-tcp=443 --hostlist="%~dp0list-youtube.txt" --dpi-desync=fake,split2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig --dpi-desync-fake-tls="%~dp0tls_clienthello_www_google_com.bin" --new ^
|
||||
--dpi-desync=fake,disorder2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig
|
@@ -1,7 +0,0 @@
|
||||
start "zapret: http,https,quic" /min "%~dp0winws.exe" ^
|
||||
--wf-tcp=80,443 --wf-udp=443 ^
|
||||
--filter-udp=443 --hostlist="%~dp0list-youtube.txt" --dpi-desync=fake --dpi-desync-repeats=11 --dpi-desync-fake-quic="%~dp0quic_initial_www_google_com.bin" --new ^
|
||||
--filter-udp=443 --dpi-desync=fake --dpi-desync-repeats=11 --new ^
|
||||
--filter-tcp=80 --dpi-desync=fake,split2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig --hostlist-auto="%~dp0autohostlist.txt" --new ^
|
||||
--filter-tcp=443 --hostlist="%~dp0list-youtube.txt" --dpi-desync=fake,split2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig --dpi-desync-fake-tls="%~dp0tls_clienthello_www_google_com.bin" --new ^
|
||||
--dpi-desync=fake,disorder2 --dpi-desync-autottl=2 --dpi-desync-fooling=md5sig --hostlist-auto="%~dp0autohostlist.txt"
|
Binary file not shown.
@@ -1,12 +0,0 @@
|
||||
set ARGS=--wf-l3=ipv4,ipv6 --wf-tcp=80,443 --dpi-desync=fake,split --dpi-desync-ttl=7 --dpi-desync-fooling=md5sig
|
||||
call :srvinst winws1
|
||||
rem set ARGS=--wf-l3=ipv4,ipv6 --wf-udp=443 --dpi-desync=fake
|
||||
rem call :srvinst winws2
|
||||
goto :eof
|
||||
|
||||
:srvinst
|
||||
net stop %1
|
||||
sc delete %1
|
||||
sc create %1 binPath= "\"%~dp0winws.exe\" %ARGS%" DisplayName= "zapret DPI bypass : %1" start= auto
|
||||
sc description %1 "zapret DPI bypass software"
|
||||
sc start %1
|
@@ -1,7 +0,0 @@
|
||||
call :srvdel winws1
|
||||
rem call :srvdel winws2
|
||||
goto :eof
|
||||
|
||||
:srvdel
|
||||
net stop %1
|
||||
sc delete %1
|
@@ -1,2 +0,0 @@
|
||||
sc start winws1
|
||||
rem sc start winws2
|
@@ -1,2 +0,0 @@
|
||||
net stop winws1
|
||||
rem net stop winws2
|
@@ -1,4 +0,0 @@
|
||||
set WINWS1=--wf-l3=ipv4,ipv6 --wf-tcp=80,443 --dpi-desync=fake,split --dpi-desync-ttl=7 --dpi-desync-fooling=md5sig
|
||||
schtasks /Create /F /TN winws1 /NP /RU "" /SC onstart /TR "\"%~dp0winws.exe\" %WINWS1%"
|
||||
rem set WINWS2=--wf-l3=ipv4,ipv6 --wf-udp=443 --dpi-desync=fake
|
||||
rem schtasks /Create /F /TN winws2 /NP /RU "" /SC onstart /TR "\"%~dp0winws.exe\" %WINWS2%"
|
@@ -1,4 +0,0 @@
|
||||
schtasks /End /TN winws1
|
||||
schtasks /Delete /TN winws1 /F
|
||||
rem schtasks /End /TN winws2
|
||||
rem schtasks /Delete /TN winws2 /F
|
@@ -1,2 +0,0 @@
|
||||
schtasks /Run /TN winws1
|
||||
rem schtasks /Run /TN winws2
|
@@ -1,2 +0,0 @@
|
||||
schtasks /End /TN winws1
|
||||
rem schtasks /End /TN winws2
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
222
blockcheck.sh
222
blockcheck.sh
@@ -53,10 +53,13 @@ NFT_TABLE=blockcheck
|
||||
|
||||
DNSCHECK_DNS=${DNSCHECK_DNS:-8.8.8.8 1.1.1.1 77.88.8.1}
|
||||
DNSCHECK_DOM=${DNSCHECK_DOM:-pornhub.com ntc.party rutracker.org www.torproject.org bbc.com}
|
||||
DOH_SERVERS=${DOH_SERVERS:-"https://cloudflare-dns.com/dns-query https://dns.google/dns-query https://dns.quad9.net/dns-query https://dns.adguard.com/dns-query https://common.dot.dns.yandex.net/dns-query"}
|
||||
DNSCHECK_DIG1=/tmp/dig1.txt
|
||||
DNSCHECK_DIG2=/tmp/dig2.txt
|
||||
DNSCHECK_DIGS=/tmp/digs.txt
|
||||
|
||||
IPSET_FILE=/tmp/blockcheck_ipset.txt
|
||||
|
||||
unset PF_STATUS
|
||||
PF_RULES_SAVE=/tmp/pf-zapret-save.conf
|
||||
|
||||
@@ -129,19 +132,22 @@ opf_dvtws_anchor()
|
||||
{
|
||||
# $1 - tcp/udp
|
||||
# $2 - port
|
||||
local family=inet
|
||||
# $3 - ip list
|
||||
local iplist family=inet
|
||||
[ "$IPV" = 6 ] && family=inet6
|
||||
make_comma_list iplist "$3"
|
||||
echo "set reassemble no"
|
||||
[ "$1" = tcp ] && echo "pass in quick $family proto $1 from port $2 flags SA/SA divert-packet port $IPFW_DIVERT_PORT no state"
|
||||
echo "pass in quick $family proto $1 from port $2 no state"
|
||||
echo "pass out quick $family proto $1 to port $2 divert-packet port $IPFW_DIVERT_PORT no state"
|
||||
[ "$1" = tcp ] && echo "pass in quick $family proto $1 from {$iplist} port $2 flags SA/SA divert-packet port $IPFW_DIVERT_PORT no state"
|
||||
echo "pass in quick $family proto $1 from {$iplist} port $2 no state"
|
||||
echo "pass out quick $family proto $1 to {$iplist} port $2 divert-packet port $IPFW_DIVERT_PORT no state"
|
||||
echo "pass"
|
||||
}
|
||||
opf_prepare_dvtws()
|
||||
{
|
||||
# $1 - tcp/udp
|
||||
# $2 - port
|
||||
opf_dvtws_anchor $1 $2 | pfctl -qf -
|
||||
# $3 - ip list
|
||||
opf_dvtws_anchor $1 $2 "$3" | pfctl -qf -
|
||||
pfctl -qe
|
||||
}
|
||||
|
||||
@@ -201,6 +207,35 @@ nft_has_nfq()
|
||||
}
|
||||
return $res
|
||||
}
|
||||
|
||||
doh_resolve()
|
||||
{
|
||||
# $1 - ip version 4/6
|
||||
# $2 - hostname
|
||||
# $3 - doh server URL. use $DOH_SERVER if empty
|
||||
$MDIG --family=$1 --dns-make-query=$2 | curl -s --data-binary @- -H "Content-Type: application/dns-message" "${3:-$DOH_SERVER}" | $MDIG --dns-parse-query
|
||||
}
|
||||
doh_find_working()
|
||||
{
|
||||
local doh
|
||||
|
||||
[ -n "$DOH_SERVER" ] && return 0
|
||||
echo "* searching working DoH server"
|
||||
DOH_SERVER=
|
||||
for doh in $DOH_SERVERS; do
|
||||
echo -n "$doh : "
|
||||
if doh_resolve 4 iana.org $doh >/dev/null 2>/dev/null; then
|
||||
echo OK
|
||||
DOH_SERVER="$doh"
|
||||
return 0
|
||||
else
|
||||
echo FAIL
|
||||
fi
|
||||
done
|
||||
echo all DoH servers failed
|
||||
return 1
|
||||
}
|
||||
|
||||
mdig_vars()
|
||||
{
|
||||
# $1 - ip version 4/6
|
||||
@@ -219,7 +254,11 @@ mdig_cache()
|
||||
mdig_vars "$@"
|
||||
[ -n "$count" ] || {
|
||||
# windows version of mdig outputs 0D0A line ending. remove 0D.
|
||||
if [ "$SECURE_DNS" = 1 ]; then
|
||||
ips="$(echo $2 | doh_resolve $1 $2 | tr -d '\r' | xargs)"
|
||||
else
|
||||
ips="$(echo $2 | "$MDIG" --family=$1 | tr -d '\r' | xargs)"
|
||||
fi
|
||||
[ -n "$ips" ] || return 1
|
||||
count=0
|
||||
for ip in $ips; do
|
||||
@@ -360,7 +399,7 @@ zp_already_running()
|
||||
}
|
||||
check_already()
|
||||
{
|
||||
echo \* checking already running zapret processes
|
||||
echo \* checking already running DPI bypass processes
|
||||
if zp_already_running; then
|
||||
echo "!!! WARNING. some dpi bypass processes already running !!!"
|
||||
echo "!!! WARNING. blockcheck requires all DPI bypass methods disabled !!!"
|
||||
@@ -387,7 +426,7 @@ check_prerequisites()
|
||||
{
|
||||
echo \* checking prerequisites
|
||||
|
||||
[ "$UNAME" = Darwin -o -x "$PKTWS" ] && [ "$UNAME" = CYGWIN -o -x "$TPWS" ] && [ -x "$MDIG" ] || {
|
||||
[ "$SKIP_PKTWS" = 1 -o "$UNAME" = Darwin -o -x "$PKTWS" ] && [ "$SKIP_TPWS" = 1 -o "$UNAME" = CYGWIN -o -x "$TPWS" ] && [ -x "$MDIG" ] || {
|
||||
local target
|
||||
case $UNAME in
|
||||
Darwin)
|
||||
@@ -402,26 +441,27 @@ check_prerequisites()
|
||||
}
|
||||
|
||||
local prog progs='curl'
|
||||
[ "$SKIP_PKTWS" = 1 ] || {
|
||||
case "$UNAME" in
|
||||
Linux)
|
||||
case "$FWTYPE" in
|
||||
iptables)
|
||||
progs="$progs iptables ip6tables"
|
||||
ipt_has_nfq || {
|
||||
echo NFQUEUE iptables or ip6tables target is missing. pls install modules.
|
||||
exitp 6
|
||||
}
|
||||
progs="$progs iptables ip6tables"
|
||||
;;
|
||||
nftables)
|
||||
nft_has_nfq || {
|
||||
echo nftables queue support is not available. pls install modules.
|
||||
exitp 6
|
||||
}
|
||||
progs="$progs nft"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
FreeBSD)
|
||||
progs="$progs ipfw"
|
||||
freebsd_modules_loaded ipfw ipdivert || {
|
||||
echo ipfw or ipdivert kernel module not loaded
|
||||
exitp 6
|
||||
@@ -443,17 +483,20 @@ check_prerequisites()
|
||||
pf_restore
|
||||
}
|
||||
}
|
||||
progs="$progs ipfw"
|
||||
;;
|
||||
OpenBSD|Darwin)
|
||||
progs="$progs pfctl"
|
||||
pf_is_avail || {
|
||||
echo pf is not available
|
||||
exitp 6
|
||||
}
|
||||
# no divert sockets in MacOS
|
||||
[ "$UNAME" = "Darwin" ] && SKIP_PKTWS=1
|
||||
pf_save
|
||||
progs="$progs pfctl"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
case "$UNAME" in
|
||||
CYGWIN)
|
||||
SKIP_TPWS=1
|
||||
;;
|
||||
@@ -518,7 +561,7 @@ curl_supports_tls13()
|
||||
[ $? = 2 ] && return 1
|
||||
# curl can have tlsv1.3 key present but ssl library without TLS 1.3 support
|
||||
# this is online test because there's no other way to trigger library incompatibility case
|
||||
$CURL --tlsv1.3 --max-time $CURL_MAX_TIME -Is -o /dev/null https://w3.org 2>/dev/null
|
||||
$CURL --tlsv1.3 --max-time $CURL_MAX_TIME -Is -o /dev/null https://iana.org 2>/dev/null
|
||||
r=$?
|
||||
[ $r != 4 -a $r != 35 ]
|
||||
}
|
||||
@@ -666,13 +709,12 @@ curl_test_http3()
|
||||
curl_with_dig $1 $2 $QUIC_PORT -ISs -A "$USER_AGENT" --max-time $CURL_MAX_TIME_QUIC --http3-only $CURL_OPT "https://$2" -o /dev/null 2>&1
|
||||
}
|
||||
|
||||
ipt_scheme()
|
||||
ipt_aux_scheme()
|
||||
{
|
||||
# $1 - 1 - add , 0 - del
|
||||
# $2 - tcp/udp
|
||||
# $3 - port
|
||||
|
||||
IPT_ADD_DEL $1 OUTPUT -t mangle -p $2 --dport $3 -m mark ! --mark $DESYNC_MARK/$DESYNC_MARK -j NFQUEUE --queue-num $QNUM
|
||||
# to avoid possible INVALID state drop
|
||||
[ "$2" = tcp ] && IPT_ADD_DEL $1 INPUT -p $2 --sport $3 ! --syn -j ACCEPT
|
||||
# for strategies with incoming packets involved (autottl)
|
||||
@@ -688,13 +730,42 @@ ipt_scheme()
|
||||
# raw table may not be present
|
||||
IPT_ADD_DEL $1 OUTPUT -t raw -m mark --mark $DESYNC_MARK/$DESYNC_MARK -j CT --notrack
|
||||
}
|
||||
ipt_scheme()
|
||||
{
|
||||
# $1 - tcp/udp
|
||||
# $2 - port
|
||||
# $3 - ip list
|
||||
|
||||
local ip
|
||||
|
||||
$IPTABLES -t mangle -N blockcheck_output 2>/dev/null
|
||||
$IPTABLES -t mangle -F blockcheck_output
|
||||
IPT OUTPUT -t mangle -j blockcheck_output
|
||||
|
||||
# prevent loop
|
||||
$IPTABLES -t mangle -A blockcheck_output -m mark --mark $DESYNC_MARK/$DESYNC_MARK -j RETURN
|
||||
$IPTABLES -t mangle -A blockcheck_output ! -p $1 -j RETURN
|
||||
$IPTABLES -t mangle -A blockcheck_output -p $1 ! --dport $2 -j RETURN
|
||||
|
||||
for ip in $3; do
|
||||
$IPTABLES -t mangle -A blockcheck_output -d $ip -j NFQUEUE --queue-num $QNUM
|
||||
done
|
||||
|
||||
ipt_aux_scheme 1 $1 $2
|
||||
}
|
||||
nft_scheme()
|
||||
{
|
||||
# $1 - tcp/udp
|
||||
# $2 - port
|
||||
# $3 - ip list
|
||||
|
||||
local iplist ipver=$IPV
|
||||
[ "$IPV" = 6 ] || ipver=
|
||||
make_comma_list iplist $3
|
||||
|
||||
nft add table inet $NFT_TABLE
|
||||
nft "add chain inet $NFT_TABLE postnat { type filter hook output priority 102; }"
|
||||
nft "add rule inet $NFT_TABLE postnat meta nfproto ipv${IPV} $1 dport $2 mark and $DESYNC_MARK != $DESYNC_MARK queue num $QNUM"
|
||||
nft "add rule inet $NFT_TABLE postnat meta nfproto ipv${IPV} $1 dport $2 mark and $DESYNC_MARK != $DESYNC_MARK ip${ipver} daddr {$iplist} queue num $QNUM"
|
||||
# for strategies with incoming packets involved (autottl)
|
||||
nft "add chain inet $NFT_TABLE prenat { type filter hook prerouting priority -102; }"
|
||||
# enable everything generated by nfqws (works only in OUTPUT, not in FORWARD)
|
||||
@@ -706,23 +777,33 @@ pktws_ipt_prepare()
|
||||
{
|
||||
# $1 - tcp/udp
|
||||
# $2 - port
|
||||
# $3 - ip list
|
||||
|
||||
local ip
|
||||
|
||||
case "$FWTYPE" in
|
||||
iptables)
|
||||
ipt_scheme 1 $1 $2
|
||||
ipt_scheme $1 $2 "$3"
|
||||
;;
|
||||
nftables)
|
||||
nft_scheme $1 $2
|
||||
nft_scheme $1 $2 "$3"
|
||||
;;
|
||||
ipfw)
|
||||
# disable PF to avoid interferences
|
||||
pf_is_avail && pfctl -qd
|
||||
IPFW_ADD divert $IPFW_DIVERT_PORT $1 from me to any $2 proto ip${IPV} out not diverted not sockarg
|
||||
for ip in $3; do
|
||||
IPFW_ADD divert $IPFW_DIVERT_PORT $1 from me to $ip $2 proto ip${IPV} out not diverted not sockarg
|
||||
done
|
||||
;;
|
||||
opf)
|
||||
opf_prepare_dvtws $1 $2
|
||||
opf_prepare_dvtws $1 $2 "$3"
|
||||
;;
|
||||
windivert)
|
||||
WF="--wf-l3=ipv${IPV} --wf-${1}=$2"
|
||||
rm -f "$IPSET_FILE"
|
||||
for ip in $3; do
|
||||
echo $ip >>"$IPSET_FILE"
|
||||
done
|
||||
;;
|
||||
|
||||
esac
|
||||
@@ -731,9 +812,13 @@ pktws_ipt_unprepare()
|
||||
{
|
||||
# $1 - tcp/udp
|
||||
# $2 - port
|
||||
|
||||
case "$FWTYPE" in
|
||||
iptables)
|
||||
ipt_scheme 0 $1 $2
|
||||
ipt_aux_scheme 0 $1 $2
|
||||
IPT_DEL OUTPUT -t mangle -j blockcheck_output
|
||||
$IPTABLES -t mangle -F blockcheck_output 2>/dev/null
|
||||
$IPTABLES -t mangle -X blockcheck_output 2>/dev/null
|
||||
;;
|
||||
nftables)
|
||||
nft delete table inet $NFT_TABLE 2>/dev/null
|
||||
@@ -747,6 +832,7 @@ pktws_ipt_unprepare()
|
||||
;;
|
||||
windivert)
|
||||
unset WF
|
||||
rm -f "$IPSET_FILE"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
@@ -754,21 +840,35 @@ pktws_ipt_unprepare()
|
||||
pktws_ipt_prepare_tcp()
|
||||
{
|
||||
# $1 - port
|
||||
# $2 - ip list
|
||||
|
||||
pktws_ipt_prepare tcp $1
|
||||
local ip iplist ipver
|
||||
|
||||
pktws_ipt_prepare tcp $1 "$2"
|
||||
|
||||
# for autottl mode
|
||||
case "$FWTYPE" in
|
||||
iptables)
|
||||
# for autottl
|
||||
IPT INPUT -t mangle -p tcp --sport $1 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 1:1 -j NFQUEUE --queue-num $QNUM
|
||||
$IPTABLES -N blockcheck_input -t mangle 2>/dev/null
|
||||
$IPTABLES -F blockcheck_input -t mangle 2>/dev/null
|
||||
IPT INPUT -t mangle -j blockcheck_input
|
||||
$IPTABLES -t mangle -A blockcheck_input ! -p tcp -j RETURN
|
||||
$IPTABLES -t mangle -A blockcheck_input -p tcp ! --sport $1 -j RETURN
|
||||
$IPTABLES -t mangle -A blockcheck_input -p tcp ! --tcp-flags SYN,ACK SYN,ACK -j RETURN
|
||||
for ip in $2; do
|
||||
$IPTABLES -A blockcheck_input -t mangle -s $ip -j NFQUEUE --queue-num $QNUM
|
||||
done
|
||||
;;
|
||||
nftables)
|
||||
# for autottl
|
||||
nft "add rule inet $NFT_TABLE prenat meta nfproto ipv${IPV} tcp sport $1 ct original packets 1 queue num $QNUM"
|
||||
ipver=$IPV
|
||||
[ "$IPV" = 6 ] || ipver=
|
||||
make_comma_list iplist $2
|
||||
nft "add rule inet $NFT_TABLE prenat meta nfproto ipv${IPV} tcp sport $1 tcp flags & (syn | ack) == (syn | ack) ip${ipver} saddr {$iplist} queue num $QNUM"
|
||||
;;
|
||||
ipfw)
|
||||
# for autottl mode
|
||||
IPFW_ADD divert $IPFW_DIVERT_PORT tcp from any $1 to me proto ip${IPV} tcpflags syn,ack in not diverted not sockarg
|
||||
for ip in $2; do
|
||||
IPFW_ADD divert $IPFW_DIVERT_PORT tcp from $ip $1 to me proto ip${IPV} tcpflags syn,ack in not diverted not sockarg
|
||||
done
|
||||
;;
|
||||
esac
|
||||
}
|
||||
@@ -780,15 +880,18 @@ pktws_ipt_unprepare_tcp()
|
||||
|
||||
case "$FWTYPE" in
|
||||
iptables)
|
||||
IPT_DEL INPUT -t mangle -p tcp --sport $1 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 1:1 -j NFQUEUE --queue-num $QNUM
|
||||
IPT_DEL INPUT -t mangle -j blockcheck_input
|
||||
$IPTABLES -t mangle -F blockcheck_input 2>/dev/null
|
||||
$IPTABLES -t mangle -X blockcheck_input 2>/dev/null
|
||||
;;
|
||||
esac
|
||||
}
|
||||
pktws_ipt_prepare_udp()
|
||||
{
|
||||
# $1 - port
|
||||
# $2 - ip list
|
||||
|
||||
pktws_ipt_prepare udp $1
|
||||
pktws_ipt_prepare udp $1 "$2"
|
||||
}
|
||||
pktws_ipt_unprepare_udp()
|
||||
{
|
||||
@@ -807,7 +910,7 @@ pktws_start()
|
||||
"$DVTWS" --port=$IPFW_DIVERT_PORT "$@" >/dev/null &
|
||||
;;
|
||||
CYGWIN)
|
||||
"$WINWS" $WF "$@" >/dev/null &
|
||||
"$WINWS" $WF --ipset="$IPSET_FILE" "$@" >/dev/null &
|
||||
;;
|
||||
esac
|
||||
PID=$!
|
||||
@@ -816,7 +919,9 @@ pktws_start()
|
||||
}
|
||||
tpws_start()
|
||||
{
|
||||
"$TPWS" --uid $TPWS_UID:$TPWS_GID --socks --bind-addr=127.0.0.1 --port=$SOCKS_PORT "$@" >/dev/null &
|
||||
local uid
|
||||
[ -n "$HAVE_ROOT" ] && uid="--uid $TPWS_UID:$TPWS_GID"
|
||||
"$TPWS" $uid --socks --bind-addr=127.0.0.1 --port=$SOCKS_PORT "$@" >/dev/null &
|
||||
PID=$!
|
||||
# give some time to initialize
|
||||
minsleep
|
||||
@@ -905,17 +1010,17 @@ tpws_curl_test()
|
||||
# $1 - test function
|
||||
# $2 - domain
|
||||
# $3,$4,$5, ... - tpws params
|
||||
echo - checking tpws $3 $4 $5 $6 $7 $8 $9 $TPWS_EXTRA "$TPWS_EXTRA_1" "$TPWS_EXTRA_2" "$TPWS_EXTRA_3" "$TPWS_EXTRA_4" "$TPWS_EXTRA_5" "$TPWS_EXTRA_6" "$TPWS_EXTRA_7" "$TPWS_EXTRA_8" "$TPWS_EXTRA_9"
|
||||
echo - checking tpws $3 $4 $5 $6 $7 $8 $9${TPWS_EXTRA:+ $TPWS_EXTRA}${TPWS_EXTRA_1:+ "$TPWS_EXTRA_1"}${TPWS_EXTRA_2:+ "$TPWS_EXTRA_2"}${TPWS_EXTRA_3:+ "$TPWS_EXTRA_3"}${TPWS_EXTRA_4:+ "$TPWS_EXTRA_4"}${TPWS_EXTRA_5:+ "$TPWS_EXTRA_5"}${TPWS_EXTRA_6:+ "$TPWS_EXTRA_6"}${TPWS_EXTRA_7:+ "$TPWS_EXTRA_7"}${TPWS_EXTRA_8:+ "$TPWS_EXTRA_8"}${TPWS_EXTRA_9:+ "$TPWS_EXTRA_9"}
|
||||
local ALL_PROXY="socks5://127.0.0.1:$SOCKS_PORT"
|
||||
ws_curl_test tpws_start "$@" $TPWS_EXTRA "$TPWS_EXTRA_1" "$TPWS_EXTRA_2" "$TPWS_EXTRA_3" "$TPWS_EXTRA_4" "$TPWS_EXTRA_5" "$TPWS_EXTRA_6" "$TPWS_EXTRA_7" "$TPWS_EXTRA_8" "$TPWS_EXTRA_9"
|
||||
ws_curl_test tpws_start "$@"${TPWS_EXTRA:+ $TPWS_EXTRA}${TPWS_EXTRA_1:+ "$TPWS_EXTRA_1"}${TPWS_EXTRA_2:+ "$TPWS_EXTRA_2"}${TPWS_EXTRA_3:+ "$TPWS_EXTRA_3"}${TPWS_EXTRA_4:+ "$TPWS_EXTRA_4"}${TPWS_EXTRA_5:+ "$TPWS_EXTRA_5"}${TPWS_EXTRA_6:+ "$TPWS_EXTRA_6"}${TPWS_EXTRA_7:+ "$TPWS_EXTRA_7"}${TPWS_EXTRA_8:+ "$TPWS_EXTRA_8"}${TPWS_EXTRA_9:+ "$TPWS_EXTRA_9"}
|
||||
}
|
||||
pktws_curl_test()
|
||||
{
|
||||
# $1 - test function
|
||||
# $2 - domain
|
||||
# $3,$4,$5, ... - nfqws/dvtws params
|
||||
echo - checking $PKTWSD ${WF:+$WF }$3 $4 $5 $6 $7 $8 $9 $PKTWS_EXTRA "$PKTWS_EXTRA_1" "$PKTWS_EXTRA_2" "$PKTWS_EXTRA_3" "$PKTWS_EXTRA_4" "$PKTWS_EXTRA_5" "$PKTWS_EXTRA_6" "$PKTWS_EXTRA_7" "$PKTWS_EXTRA_8" "$PKTWS_EXTRA_9"
|
||||
ws_curl_test pktws_start "$@" $PKTWS_EXTRA "$PKTWS_EXTRA_1" "$PKTWS_EXTRA_2" "$PKTWS_EXTRA_3" "$PKTWS_EXTRA_4" "$PKTWS_EXTRA_5" "$PKTWS_EXTRA_6" "$PKTWS_EXTRA_7" "$PKTWS_EXTRA_8" "$PKTWS_EXTRA_9"
|
||||
echo - checking $PKTWSD ${WF:+$WF }$3 $4 $5 $6 $7 $8 $9${PKTWS_EXTRA:+ $PKTWS_EXTRA}${PKTWS_EXTRA_1:+ "$PKTWS_EXTRA_1"}${PKTWS_EXTRA_2:+ "$PKTWS_EXTRA_2"}${PKTWS_EXTRA_3:+ "$PKTWS_EXTRA_3"}${PKTWS_EXTRA_4:+ "$PKTWS_EXTRA_4"}${PKTWS_EXTRA_5:+ "$PKTWS_EXTRA_5"}${PKTWS_EXTRA_6:+ "$PKTWS_EXTRA_6"}${PKTWS_EXTRA_7:+ "$PKTWS_EXTRA_7"}${PKTWS_EXTRA_8:+ "$PKTWS_EXTRA_8"}${PKTWS_EXTRA_9:+ "$PKTWS_EXTRA_9"}
|
||||
ws_curl_test pktws_start "$@"${PKTWS_EXTRA:+ $PKTWS_EXTRA}${PKTWS_EXTRA_1:+ "$PKTWS_EXTRA_1"}${PKTWS_EXTRA_2:+ "$PKTWS_EXTRA_2"}${PKTWS_EXTRA_3:+ "$PKTWS_EXTRA_3"}${PKTWS_EXTRA_4:+ "$PKTWS_EXTRA_4"}${PKTWS_EXTRA_5:+ "$PKTWS_EXTRA_5"}${PKTWS_EXTRA_6:+ "$PKTWS_EXTRA_6"}${PKTWS_EXTRA_7:+ "$PKTWS_EXTRA_7"}${PKTWS_EXTRA_8:+ "$PKTWS_EXTRA_8"}${PKTWS_EXTRA_9:+ "$PKTWS_EXTRA_9"}
|
||||
}
|
||||
xxxws_curl_test_update()
|
||||
{
|
||||
@@ -1173,7 +1278,7 @@ pktws_check_domain_http_bypass()
|
||||
|
||||
local strategy
|
||||
pktws_check_domain_http_bypass_ "$@"
|
||||
strategy="${strategy:+$strategy $PKTWS_EXTRA $PKTWS_EXTRA_1 $PKTWS_EXTRA_2 $PKTWS_EXTRA_3 $PKTWS_EXTRA_4 $PKTWS_EXTRA_5 $PKTWS_EXTRA_6 $PKTWS_EXTRA_7 $PKTWS_EXTRA_8 $PKTWS_EXTRA_9}"
|
||||
strategy="${strategy:+$strategy${PKTWS_EXTRA:+ $PKTWS_EXTRA}${PKTWS_EXTRA_1:+ "$PKTWS_EXTRA_1"}${PKTWS_EXTRA_2:+ "$PKTWS_EXTRA_2"}${PKTWS_EXTRA_3:+ "$PKTWS_EXTRA_3"}${PKTWS_EXTRA_4:+ "$PKTWS_EXTRA_4"}${PKTWS_EXTRA_5:+ "$PKTWS_EXTRA_5"}${PKTWS_EXTRA_6:+ "$PKTWS_EXTRA_6"}${PKTWS_EXTRA_7:+ "$PKTWS_EXTRA_7"}${PKTWS_EXTRA_8:+ "$PKTWS_EXTRA_8"}${PKTWS_EXTRA_9:+ "$PKTWS_EXTRA_9"}}"
|
||||
report_strategy $1 $3 $PKTWSD
|
||||
}
|
||||
|
||||
@@ -1288,7 +1393,7 @@ tpws_check_domain_http_bypass()
|
||||
|
||||
local strategy
|
||||
tpws_check_domain_http_bypass_ "$@"
|
||||
strategy="${strategy:+$strategy $TPWS_EXTRA $TPWS_EXTRA_1 $TPWS_EXTRA_2 $TPWS_EXTRA_3 $TPWS_EXTRA_4 $TPWS_EXTRA_5 $TPWS_EXTRA_6 $TPWS_EXTRA_7 $TPWS_EXTRA_8 $TPWS_EXTRA_9}"
|
||||
strategy="${strategy:+$strategy${TPWS_EXTRA:+ $TPWS_EXTRA}${TPWS_EXTRA_1:+ "$TPWS_EXTRA_1"}${TPWS_EXTRA_2:+ "$TPWS_EXTRA_2"}${TPWS_EXTRA_3:+ "$TPWS_EXTRA_3"}${TPWS_EXTRA_4:+ "$TPWS_EXTRA_4"}${TPWS_EXTRA_5:+ "$TPWS_EXTRA_5"}${TPWS_EXTRA_6:+ "$TPWS_EXTRA_6"}${TPWS_EXTRA_7:+ "$TPWS_EXTRA_7"}${TPWS_EXTRA_8:+ "$TPWS_EXTRA_8"}${TPWS_EXTRA_9:+ "$TPWS_EXTRA_9"}}"
|
||||
report_strategy $1 $3 tpws
|
||||
}
|
||||
|
||||
@@ -1379,7 +1484,7 @@ check_domain_http_tcp()
|
||||
[ "$SKIP_PKTWS" = 1 ] || {
|
||||
echo
|
||||
echo preparing $PKTWSD redirection
|
||||
pktws_ipt_prepare_tcp $2
|
||||
pktws_ipt_prepare_tcp $2 "$(mdig_resolve_all $IPV $4)"
|
||||
|
||||
pktws_check_domain_http_bypass $1 $3 $4
|
||||
|
||||
@@ -1402,7 +1507,7 @@ check_domain_http_udp()
|
||||
[ "$SKIP_PKTWS" = 1 ] || {
|
||||
echo
|
||||
echo preparing $PKTWSD redirection
|
||||
pktws_ipt_prepare_udp $2
|
||||
pktws_ipt_prepare_udp $2 "$(mdig_resolve_all $IPV $3)"
|
||||
|
||||
pktws_check_domain_http3_bypass $1 $3
|
||||
|
||||
@@ -1605,7 +1710,7 @@ ask_params()
|
||||
SCANLEVEL=${SCANLEVEL:-standard}
|
||||
ask_list SCANLEVEL "quick standard force" "$SCANLEVEL"
|
||||
# disable tpws checks by default in quick mode
|
||||
[ "$SCANLEVEL" = quick -a -z "$SKIP_TPWS" ] && SKIP_TPWS=1
|
||||
[ "$SCANLEVEL" = quick -a -z "$SKIP_TPWS" -a "$UNAME" != Darwin ] && SKIP_TPWS=1
|
||||
|
||||
echo
|
||||
|
||||
@@ -1677,7 +1782,7 @@ pingtest()
|
||||
dnstest()
|
||||
{
|
||||
# $1 - dns server. empty for system resolver
|
||||
"$LOOKUP" w3.org $1 >/dev/null 2>/dev/null
|
||||
"$LOOKUP" iana.org $1 >/dev/null 2>/dev/null
|
||||
}
|
||||
find_working_public_dns()
|
||||
{
|
||||
@@ -1722,10 +1827,14 @@ check_dns_cleanup()
|
||||
{
|
||||
rm -f "$DNSCHECK_DIG1" "$DNSCHECK_DIG2" "$DNSCHECK_DIGS" 2>/dev/null
|
||||
}
|
||||
check_dns()
|
||||
check_dns_()
|
||||
{
|
||||
local C1 C2 dom
|
||||
|
||||
DNS_IS_SPOOFED=0
|
||||
|
||||
[ "$SKIP_DNSCHECK" = 1 ] && return 0
|
||||
|
||||
echo \* checking DNS
|
||||
|
||||
[ -f "$DNSCHECK_DIGS" ] && rm -f "$DNSCHECK_DIGS"
|
||||
@@ -1748,6 +1857,7 @@ check_dns()
|
||||
check_dns_cleanup
|
||||
echo -- POSSIBLE DNS HIJACK DETECTED. ZAPRET WILL NOT HELP YOU IN CASE DNS IS SPOOFED !!!
|
||||
echo -- DNS CHANGE OR DNSCRYPT MAY BE REQUIRED
|
||||
DNS_IS_SPOOFED=1
|
||||
return 1
|
||||
else
|
||||
echo $dom : OK
|
||||
@@ -1759,8 +1869,8 @@ check_dns()
|
||||
for dom in $DNSCHECK_DOM; do echo $dom; done | "$MDIG" --threads=10 --family=4 >"$DNSCHECK_DIGS"
|
||||
fi
|
||||
|
||||
echo checking resolved IP uniqueness for : $DNSCHECK_DOM
|
||||
echo censor\'s DNS can return equal result for multiple blocked domains.
|
||||
echo "checking resolved IP uniqueness for : $DNSCHECK_DOM"
|
||||
echo "censor's DNS can return equal result for multiple blocked domains."
|
||||
C1=$(wc -l <"$DNSCHECK_DIGS")
|
||||
C2=$(sort -u "$DNSCHECK_DIGS" | wc -l)
|
||||
[ "$C1" -eq 0 ] &&
|
||||
@@ -1777,6 +1887,7 @@ check_dns()
|
||||
echo -- POSSIBLE DNS HIJACK DETECTED. ZAPRET WILL NOT HELP YOU IN CASE DNS IS SPOOFED !!!
|
||||
echo -- DNSCRYPT MAY BE REQUIRED
|
||||
check_dns_cleanup
|
||||
DNS_IS_SPOOFED=1
|
||||
return 1
|
||||
}
|
||||
echo all resolved IPs are unique
|
||||
@@ -1786,6 +1897,20 @@ check_dns()
|
||||
return 0
|
||||
}
|
||||
|
||||
check_dns()
|
||||
{
|
||||
local r
|
||||
check_dns_
|
||||
r=$?
|
||||
[ "$DNS_IS_SPOOFED" = 1 ] && SECURE_DNS=${SECURE_DNS:-1}
|
||||
[ "$SECURE_DNS" = 1 ] && {
|
||||
doh_find_working || {
|
||||
echo could not find working DoH server. exiting.
|
||||
exitp 7
|
||||
}
|
||||
}
|
||||
return $r
|
||||
}
|
||||
|
||||
unprepare_all()
|
||||
{
|
||||
@@ -1818,14 +1943,17 @@ sigsilent()
|
||||
exit 1
|
||||
}
|
||||
|
||||
|
||||
fsleep_setup
|
||||
fix_sbin_path
|
||||
check_system
|
||||
check_already
|
||||
[ "$UNAME" = CYGWIN ] || require_root
|
||||
# no divert sockets in MacOS
|
||||
[ "$UNAME" = "Darwin" ] && SKIP_PKTWS=1
|
||||
[ "$UNAME" != CYGWIN -a "$SKIP_PKTWS" != 1 ] && require_root
|
||||
check_prerequisites
|
||||
trap sigint_cleanup INT
|
||||
[ "$SKIP_DNSCHECK" = 1 ] || check_dns
|
||||
check_dns
|
||||
check_virt
|
||||
ask_params
|
||||
trap - INT
|
||||
|
@@ -62,6 +62,10 @@ starts_with()
|
||||
}
|
||||
find_str_in_list()
|
||||
{
|
||||
# $1 - string
|
||||
# $2 - space separated values
|
||||
|
||||
local v
|
||||
[ -n "$1" ] && {
|
||||
for v in $2; do
|
||||
[ "$v" = "$1" ] && return 0
|
||||
@@ -74,6 +78,19 @@ end_with_newline()
|
||||
local c="$(tail -c 1)"
|
||||
[ "$c" = "" ]
|
||||
}
|
||||
trim()
|
||||
{
|
||||
awk '{gsub(/^ +| +$/,"")}1'
|
||||
}
|
||||
|
||||
dir_is_not_empty()
|
||||
{
|
||||
# $1 - directory
|
||||
local n
|
||||
[ -d "$1" ] || return 1
|
||||
n=$(ls "$1" | wc -c | xargs)
|
||||
[ "$n" != 0 ]
|
||||
}
|
||||
|
||||
append_separator_list()
|
||||
{
|
||||
@@ -275,6 +292,14 @@ replace_char()
|
||||
echo "$@" | tr $a $b
|
||||
}
|
||||
|
||||
replace_str()
|
||||
{
|
||||
local a=$(echo "$1" | sed 's/\//\\\//g')
|
||||
local b=$(echo "$2" | sed 's/\//\\\//g')
|
||||
shift; shift
|
||||
echo "$@" | sed "s/$a/$b/g"
|
||||
}
|
||||
|
||||
setup_md5()
|
||||
{
|
||||
[ -n "$MD5" ] && return
|
||||
@@ -329,12 +354,62 @@ win_process_exists()
|
||||
tasklist /NH /FI "IMAGENAME eq ${1}.exe" | grep -q "^${1}.exe"
|
||||
}
|
||||
|
||||
alloc_num()
|
||||
{
|
||||
# $1 - source var name
|
||||
# $2 - target var name
|
||||
# $3 - min
|
||||
# $4 - max
|
||||
|
||||
local v
|
||||
eval v="\$$2"
|
||||
# do not replace existing value
|
||||
[ -n "$v" ] && return
|
||||
eval v="\$$1"
|
||||
[ -n "$v" ] || v=$3
|
||||
eval $2="$v"
|
||||
v=$((v + 1))
|
||||
[ $v -gt $4 ] && v=$3
|
||||
eval $1="$v"
|
||||
}
|
||||
|
||||
std_ports()
|
||||
{
|
||||
HTTP_PORTS=${HTTP_PORTS:-80}
|
||||
HTTPS_PORTS=${HTTPS_PORTS:-443}
|
||||
QUIC_PORTS=${QUIC_PORTS:-443}
|
||||
HTTP_PORTS_IPT=$(replace_char - : $HTTP_PORTS)
|
||||
HTTPS_PORTS_IPT=$(replace_char - : $HTTPS_PORTS)
|
||||
QUIC_PORTS_IPT=$(replace_char - : $QUIC_PORTS)
|
||||
TPWS_PORTS_IPT=$(replace_char - : $TPWS_PORTS)
|
||||
NFQWS_PORTS_TCP_IPT=$(replace_char - : $NFQWS_PORTS_TCP)
|
||||
NFQWS_PORTS_TCP_KEEPALIVE_IPT=$(replace_char - : $NFQWS_PORTS_TCP_KEEPALIVE)
|
||||
NFQWS_PORTS_UDP_IPT=$(replace_char - : $NFQWS_PORTS_UDP)
|
||||
NFQWS_PORTS_UDP_KEEPALIVE_IPT=$(replace_char - : $NFQWS_PORTS_UDP_KEEPALIVE)
|
||||
}
|
||||
|
||||
has_bad_ws_options()
|
||||
{
|
||||
# $1 - nfqws/tpws opts
|
||||
# ПРИМЕЧАНИЕ ДЛЯ РАСПРОСТРАНИТЕЛЕЙ КОПИПАСТЫ
|
||||
# ЭТОТ КОД СДЕЛАН СПЕЦИАЛЬНО ДЛЯ ВАС, ЧТОБЫ ВЫ НЕ ПОСТИЛИ В СЕТЬ ПЛОХИЕ РЕЦЕПТЫ
|
||||
# ЕСЛИ ВАМ ХОЧЕТСЯ ЕГО УДАЛИТЬ И НАПИСАТЬ ИНСТРУКЦИЮ КАК ЕГО УДАЛЯТЬ, ВЫ ДЕЛАЕТЕ ХРЕНОВУЮ УСЛУГУ. НАПИШИТЕ ЛУЧШЕ custom script.
|
||||
# custom script - ЭТО ФАЙЛИК, КОТОРЫЙ ДОСТАТОЧНО СКОПИРОВАТЬ В НУЖНУЮ ДИРЕКТОРИЮ, ЧТОБЫ ОН СДЕЛАЛ ТОЖЕ САМОЕ, НО ЭФФЕКТИВНО.
|
||||
# ФИЛЬТРАЦИЯ ПО IPSET В ЯДРЕ НЕСРАВНИМО ЭФФЕКТИВНЕЕ, ЧЕМ ПЕРЕКИДЫВАТЬ ВСЕ ПАКЕТЫ В nfqws И ТАМ ФИЛЬТРОВАТЬ
|
||||
# --ipset СУЩЕСТВУЕТ ТОЛЬКО ДЛЯ ВИНДЫ И LINUX СИСТЕМ БЕЗ ipset (НАПРИМЕР, Android).
|
||||
# И ТОЛЬКО ПО ЭТОЙ ПРИЧИНЕ ОНО НЕ ВЫКИНУТО ПОЛНОСТЬЮ ИЗ LINUX ВЕРСИИ
|
||||
contains "$1" "--ipset"
|
||||
}
|
||||
check_bad_ws_options()
|
||||
{
|
||||
# $1 - 0 = stop, 1 = start
|
||||
# $2 - nfqws/tpws options
|
||||
if [ "$1" = 1 ] && has_bad_ws_options "$2"; then
|
||||
echo "!!! REFUSING TO USE BAD OPTIONS : $2"
|
||||
help_bad_ws_options
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
help_bad_ws_options()
|
||||
{
|
||||
echo "WARNING ! you have specified --ipset option"
|
||||
echo "WARNING ! it would work but on ${UNAME:-$(uname)} it's not the best option"
|
||||
echo "WARNING ! you should use kernel mode sets. they are much more efficient."
|
||||
echo "WARNING ! to use ipsets you have to write your own custom script"
|
||||
}
|
||||
|
@@ -7,15 +7,10 @@ custom_runner()
|
||||
|
||||
shift
|
||||
|
||||
[ -f "$CUSTOM_DIR/custom" ] && {
|
||||
unset -f $FUNC
|
||||
. "$CUSTOM_DIR/custom"
|
||||
existf $FUNC && $FUNC "$@"
|
||||
}
|
||||
[ -d "$CUSTOM_DIR/custom.d" ] && {
|
||||
n=$(ls "$CUSTOM_DIR/custom.d" | wc -c | xargs)
|
||||
[ "$n" = 0 ] || {
|
||||
dir_is_not_empty "$CUSTOM_DIR/custom.d" && {
|
||||
for script in "$CUSTOM_DIR/custom.d/"*; do
|
||||
[ -f "$script" ] || continue
|
||||
unset -f $FUNC
|
||||
. "$script"
|
||||
existf $FUNC && $FUNC "$@"
|
||||
@@ -23,3 +18,20 @@ custom_runner()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
alloc_tpws_port()
|
||||
{
|
||||
# $1 - target var name
|
||||
alloc_num NUMPOOL_TPWS_PORT $1 910 979
|
||||
}
|
||||
alloc_qnum()
|
||||
{
|
||||
# $1 - target var name
|
||||
alloc_num NUMPOOL_QNUM $1 65400 65499
|
||||
}
|
||||
alloc_dnum()
|
||||
{
|
||||
# alloc daemon number
|
||||
# $1 - target var name
|
||||
alloc_num NUMPOOL_DNUM $1 1000 1999
|
||||
}
|
||||
|
@@ -1,13 +1,28 @@
|
||||
require_root()
|
||||
{
|
||||
local exe
|
||||
local exe preserve_env
|
||||
echo \* checking privileges
|
||||
[ $(id -u) -ne "0" ] && {
|
||||
echo root is required
|
||||
exe="$EXEDIR/$(basename "$0")"
|
||||
exists sudo && exec sudo sh "$exe"
|
||||
exists su && exec su root -c "sh \"$exe\""
|
||||
exists sudo && {
|
||||
echo elevating with sudo
|
||||
exec sudo -E sh "$exe"
|
||||
}
|
||||
exists su && {
|
||||
echo elevating with su
|
||||
case "$UNAME" in
|
||||
Linux)
|
||||
preserve_env="--preserve-environment"
|
||||
;;
|
||||
FreeBSD|OpenBSD|Darwin)
|
||||
preserve_env="-m"
|
||||
;;
|
||||
esac
|
||||
exec su $preserve_env root -c "sh \"$exe\""
|
||||
}
|
||||
echo su or sudo not found
|
||||
exitp 2
|
||||
}
|
||||
HAVE_ROOT=1
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
GET_LIST_PREFIX=/ipset/get_
|
||||
readonly GET_LIST_PREFIX=/ipset/get_
|
||||
|
||||
SYSTEMD_DIR=/lib/systemd
|
||||
[ -d "$SYSTEMD_DIR" ] || SYSTEMD_DIR=/usr/lib/systemd
|
||||
@@ -15,13 +15,99 @@ exitp()
|
||||
exit $1
|
||||
}
|
||||
|
||||
extract_var_def()
|
||||
{
|
||||
# $1 - var name
|
||||
# this sed script parses single or multi line shell var assignments with optional ' or " enclosure
|
||||
sed -n \
|
||||
"/^$1=\"/ {
|
||||
:s1
|
||||
/\".*\"/ {
|
||||
p
|
||||
b
|
||||
}
|
||||
N
|
||||
t c1
|
||||
b s1
|
||||
:c1
|
||||
}
|
||||
/^$1='/ {
|
||||
:s2
|
||||
/'.*'/ {
|
||||
p
|
||||
b
|
||||
}
|
||||
N
|
||||
t c2
|
||||
b s2
|
||||
:c2
|
||||
}
|
||||
/^$1=/p
|
||||
"
|
||||
}
|
||||
replace_var_def()
|
||||
{
|
||||
# $1 - var name
|
||||
# $2 - new val
|
||||
# $3 - conf file
|
||||
# this sed script replaces single or multi line shell var assignments with optional ' or " enclosure
|
||||
local repl
|
||||
if [ -z "$2" ]; then
|
||||
repl="#$1="
|
||||
elif contains "$2" " "; then
|
||||
repl="$1=\"$2\""
|
||||
else
|
||||
repl="$1=$2"
|
||||
fi
|
||||
local script=\
|
||||
"/^#*[[:space:]]*$1=\"/ {
|
||||
:s1
|
||||
/\".*\"/ {
|
||||
c\\
|
||||
$repl
|
||||
b
|
||||
}
|
||||
N
|
||||
t c1
|
||||
b s1
|
||||
:c1
|
||||
}
|
||||
/^#*[[:space:]]*$1='/ {
|
||||
:s2
|
||||
/'.*'/ {
|
||||
c\\
|
||||
$repl
|
||||
b
|
||||
}
|
||||
N
|
||||
t c2
|
||||
b s2
|
||||
:c2
|
||||
}
|
||||
/^#*[[:space:]]*$1=/c\\
|
||||
$repl"
|
||||
# there's incompatibility with -i option on MacOS/BSD and busybox/GNU
|
||||
if [ "$UNAME" = "Linux" ]; then
|
||||
sed -i -e "$script" "$3"
|
||||
else
|
||||
sed -i '' -e "$script" "$3"
|
||||
fi
|
||||
}
|
||||
|
||||
parse_var_checked()
|
||||
{
|
||||
# $1 - file name
|
||||
# $2 - var name
|
||||
local sed="sed -nre s/^[[:space:]]*$2=[\\\"|\']?([^\\\"|\']*)[\\\"|\']?/\1/p"
|
||||
local v="$($sed <"$1" | tail -n 1)"
|
||||
eval $2=\"$v\"
|
||||
|
||||
local tmp="/tmp/zvar-pid-$$.sh"
|
||||
local v
|
||||
cat "$1" | extract_var_def "$2" >"$tmp"
|
||||
. "$tmp"
|
||||
rm -f "$tmp"
|
||||
eval v="\$$2"
|
||||
# trim
|
||||
v="$(echo "$v" | trim)"
|
||||
eval $2=\""$v"\"
|
||||
}
|
||||
parse_vars_checked()
|
||||
{
|
||||
@@ -48,22 +134,44 @@ edit_file()
|
||||
}
|
||||
[ -n "$ed" ] && "$ed" "$1"
|
||||
}
|
||||
echo_var()
|
||||
{
|
||||
local v
|
||||
eval v="\$$1"
|
||||
if find_str_in_list $1 "$EDITVAR_NEWLINE_VARS"; then
|
||||
echo "$1=\""
|
||||
echo "$v\"" | sed "s/$EDITVAR_NEWLINE_DELIMETER /$EDITVAR_NEWLINE_DELIMETER\n/g"
|
||||
else
|
||||
if contains "$v" " "; then
|
||||
echo $1=\"$v\"
|
||||
else
|
||||
echo $1=$v
|
||||
fi
|
||||
fi
|
||||
}
|
||||
edit_vars()
|
||||
{
|
||||
# $1,$2,... - var names
|
||||
local n=1 var v tmp="/tmp/zvars"
|
||||
local n=1 var tmp="/tmp/zvars-pid-$$.txt"
|
||||
rm -f "$tmp"
|
||||
while [ 1=1 ]; do
|
||||
while : ; do
|
||||
eval var="\${$n}"
|
||||
[ -n "$var" ] || break
|
||||
eval v="\$$var"
|
||||
echo $var=\"$v\" >>"$tmp"
|
||||
echo_var $var >> "$tmp"
|
||||
n=$(($n+1))
|
||||
done
|
||||
edit_file "$tmp" && parse_vars_checked "$tmp" "$@"
|
||||
rm -f "$tmp"
|
||||
}
|
||||
|
||||
list_vars()
|
||||
{
|
||||
while [ -n "$1" ] ; do
|
||||
echo_var $1
|
||||
shift
|
||||
done
|
||||
}
|
||||
|
||||
openrc_test()
|
||||
{
|
||||
exists rc-update || return 1
|
||||
@@ -483,30 +591,14 @@ write_config_var()
|
||||
# $1 - mode var
|
||||
local M
|
||||
eval M="\$$1"
|
||||
|
||||
if grep -q "^$1=\|^#$1=" "$ZAPRET_CONFIG"; then
|
||||
# replace / => \/
|
||||
#M=${M//\//\\\/}
|
||||
M=$(echo $M | sed 's/\//\\\//g')
|
||||
if [ -n "$M" ]; then
|
||||
if contains "$M" " "; then
|
||||
sedi -Ee "s/^#?$1=.*$/$1=\"$M\"/" "$ZAPRET_CONFIG"
|
||||
else
|
||||
sedi -Ee "s/^#?$1=.*$/$1=$M/" "$ZAPRET_CONFIG"
|
||||
fi
|
||||
else
|
||||
# write with comment at the beginning
|
||||
sedi -Ee "s/^#?$1=.*$/#$1=/" "$ZAPRET_CONFIG"
|
||||
fi
|
||||
else
|
||||
M=$(echo $M | sed 's/\//\\\//g' | trim)
|
||||
grep -q "^[[:space:]]*$1=\|^#*[[:space:]]*$1=" "$ZAPRET_CONFIG" || {
|
||||
# var does not exist in config. add it
|
||||
contains "$M" " " && M="\"$M\""
|
||||
if [ -n "$M" ]; then
|
||||
echo "$1=$M" >>"$ZAPRET_CONFIG"
|
||||
else
|
||||
echo "#$1=$M" >>"$ZAPRET_CONFIG"
|
||||
fi
|
||||
fi
|
||||
echo $1= >>"$ZAPRET_CONFIG"
|
||||
}
|
||||
replace_var_def $1 "$M" "$ZAPRET_CONFIG"
|
||||
}
|
||||
|
||||
check_prerequisites_linux()
|
||||
@@ -590,6 +682,20 @@ check_prerequisites_linux()
|
||||
fi
|
||||
}
|
||||
|
||||
removable_pkgs_openwrt()
|
||||
{
|
||||
PKGS="iptables-mod-extra iptables-mod-nfqueue iptables-mod-filter iptables-mod-ipopt iptables-mod-conntrack-extra ip6tables-mod-nat ip6tables-extra kmod-nft-queue gzip coreutils-sort coreutils-sleep curl"
|
||||
}
|
||||
|
||||
remove_extra_pkgs_openwrt()
|
||||
{
|
||||
local PKGS
|
||||
echo \* remove dependencies
|
||||
removable_pkgs_openwrt
|
||||
echo these packages may have been installed by install_easy.sh : $PKGS
|
||||
ask_yes_no N "do you want to remove them" && opkg remove --autoremove $PKGS
|
||||
}
|
||||
|
||||
check_prerequisites_openwrt()
|
||||
{
|
||||
echo \* checking prerequisites
|
||||
|
185
common/ipt.sh
185
common/ipt.sh
@@ -3,15 +3,15 @@ readonly ipt_connbytes="-m connbytes --connbytes-dir=original --connbytes-mode=p
|
||||
|
||||
ipt()
|
||||
{
|
||||
iptables -C "$@" >/dev/null 2>/dev/null || iptables -I "$@"
|
||||
iptables $FW_EXTRA_PRE -C "$@" $FW_EXTRA_POST >/dev/null 2>/dev/null || iptables $FW_EXTRA_PRE -I "$@" $FW_EXTRA_POST
|
||||
}
|
||||
ipta()
|
||||
{
|
||||
iptables -C "$@" >/dev/null 2>/dev/null || iptables -A "$@"
|
||||
iptables $FW_EXTRA_PRE -C "$@" $FW_EXTRA_POST >/dev/null 2>/dev/null || iptables $FW_EXTRA_PRE -A "$@" $FW_EXTRA_POST
|
||||
}
|
||||
ipt_del()
|
||||
{
|
||||
iptables -C "$@" >/dev/null 2>/dev/null && iptables -D "$@"
|
||||
iptables $FW_EXTRA_PRE -C "$@" $FW_EXTRA_POST >/dev/null 2>/dev/null && iptables $FW_EXTRA_PRE -D "$@" $FW_EXTRA_POST
|
||||
}
|
||||
ipt_add_del()
|
||||
{
|
||||
@@ -48,28 +48,6 @@ is_ipt_flow_offload_avail()
|
||||
grep -q FLOWOFFLOAD 2>/dev/null /proc/net/ip$1_tables_targets
|
||||
}
|
||||
|
||||
filter_apply_port_target()
|
||||
{
|
||||
# $1 - var name of iptables filter
|
||||
local f
|
||||
if [ "$MODE_HTTP" = "1" ] && [ "$MODE_HTTPS" = "1" ]; then
|
||||
f="-p tcp -m multiport --dports $HTTP_PORTS_IPT,$HTTPS_PORTS_IPT"
|
||||
elif [ "$MODE_HTTPS" = "1" ]; then
|
||||
f="-p tcp -m multiport --dports $HTTPS_PORTS_IPT"
|
||||
elif [ "$MODE_HTTP" = "1" ]; then
|
||||
f="-p tcp -m multiport --dports $HTTP_PORTS_IPT"
|
||||
else
|
||||
echo WARNING !!! HTTP and HTTPS are both disabled
|
||||
fi
|
||||
eval $1="\"\$$1 $f\""
|
||||
}
|
||||
filter_apply_port_target_quic()
|
||||
{
|
||||
# $1 - var name of nftables filter
|
||||
local f
|
||||
f="-p udp -m multiport --dports $QUIC_PORTS_IPT"
|
||||
eval $1="\"\$$1 $f\""
|
||||
}
|
||||
filter_apply_ipset_target4()
|
||||
{
|
||||
# $1 - var name of ipv4 iptables filter
|
||||
@@ -134,7 +112,7 @@ unprepare_tpws_fw()
|
||||
ipt_print_op()
|
||||
{
|
||||
if [ "$1" = "1" ]; then
|
||||
echo "Adding ip$4tables rule for $3 : $2"
|
||||
echo "Inserting ip$4tables rule for $3 : $2"
|
||||
else
|
||||
echo "Deleting ip$4tables rule for $3 : $2"
|
||||
fi
|
||||
@@ -220,7 +198,7 @@ _fw_nfqws_post4()
|
||||
|
||||
ipt_print_op $1 "$2" "nfqws postrouting (qnum $3)"
|
||||
|
||||
rule="$2 $IPSET_EXCLUDE dst -j NFQUEUE --queue-num $3 --queue-bypass"
|
||||
rule="-m mark ! --mark $DESYNC_MARK/$DESYNC_MARK $2 $IPSET_EXCLUDE dst -j NFQUEUE --queue-num $3 --queue-bypass"
|
||||
if [ -n "$4" ] ; then
|
||||
for i in $4; do
|
||||
ipt_add_del $1 POSTROUTING -t mangle -o $i $rule
|
||||
@@ -241,7 +219,7 @@ _fw_nfqws_post6()
|
||||
|
||||
ipt_print_op $1 "$2" "nfqws postrouting (qnum $3)" 6
|
||||
|
||||
rule="$2 $IPSET_EXCLUDE6 dst -j NFQUEUE --queue-num $3 --queue-bypass"
|
||||
rule="-m mark ! --mark $DESYNC_MARK/$DESYNC_MARK $2 $IPSET_EXCLUDE6 dst -j NFQUEUE --queue-num $3 --queue-bypass"
|
||||
if [ -n "$4" ] ; then
|
||||
for i in $4; do
|
||||
ipt6_add_del $1 POSTROUTING -t mangle -o $i $rule
|
||||
@@ -320,27 +298,13 @@ fw_nfqws_pre()
|
||||
}
|
||||
|
||||
|
||||
produce_reverse_nfqws_rule()
|
||||
{
|
||||
local rule="$1"
|
||||
if contains "$rule" "$ipt_connbytes"; then
|
||||
# autohostlist - need several incoming packets
|
||||
# autottl - need only one incoming packet
|
||||
[ "$MODE_FILTER" = autohostlist ] || rule=$(echo "$rule" | sed -re "s/$ipt_connbytes [0-9]+:[0-9]+/$ipt_connbytes 1:1/")
|
||||
else
|
||||
local n=1
|
||||
[ "$MODE_FILTER" = autohostlist ] && n=$(first_packets_for_mode)
|
||||
rule="$ipt_connbytes 1:$n $rule"
|
||||
fi
|
||||
echo "$rule" | reverse_nfqws_rule_stream
|
||||
}
|
||||
fw_reverse_nfqws_rule4()
|
||||
{
|
||||
fw_nfqws_pre4 $1 "$(produce_reverse_nfqws_rule "$2")" $3
|
||||
fw_nfqws_pre4 $1 "$(reverse_nfqws_rule "$2")" $3
|
||||
}
|
||||
fw_reverse_nfqws_rule6()
|
||||
{
|
||||
fw_nfqws_pre6 $1 "$(produce_reverse_nfqws_rule "$2")" $3
|
||||
fw_nfqws_pre6 $1 "$(reverse_nfqws_rule "$2")" $3
|
||||
}
|
||||
fw_reverse_nfqws_rule()
|
||||
{
|
||||
@@ -353,93 +317,66 @@ fw_reverse_nfqws_rule()
|
||||
fw_reverse_nfqws_rule6 $1 "$3" $4
|
||||
}
|
||||
|
||||
|
||||
zapret_do_firewall_rules_ipt()
|
||||
ipt_first_packets()
|
||||
{
|
||||
local mode="${MODE_OVERRIDE:-$MODE}"
|
||||
# $1 - packet count
|
||||
[ -n "$1" -a "$1" != keepalive ] && [ "$1" -ge 1 ] && echo "$ipt_connbytes 1:$1"
|
||||
}
|
||||
ipt_do_nfqws_in_out()
|
||||
{
|
||||
# $1 - 1 - add, 0 - del
|
||||
# $2 - tcp,udp
|
||||
# $3 - ports
|
||||
# $4 - PKT_OUT. special value : 'keepalive'
|
||||
# $5 - PKT_IN
|
||||
local f4 f6 first_packets_only
|
||||
[ -n "$3" ] || return
|
||||
[ -n "$4" -a "$4" != 0 ] &&
|
||||
{
|
||||
first_packets_only="$(ipt_first_packets $4)"
|
||||
f4="-p $2 -m multiport --dports $3 $first_packets_only"
|
||||
f6=$f4
|
||||
filter_apply_ipset_target f4 f6
|
||||
fw_nfqws_post $1 "$f4" "$f6" $QNUM
|
||||
}
|
||||
[ -n "$5" -a "$5" != 0 ] &&
|
||||
{
|
||||
first_packets_only="$(ipt_first_packets $5)"
|
||||
f4="-p $2 -m multiport --dports $3 $first_packets_only"
|
||||
f6=$f4
|
||||
filter_apply_ipset_target f4 f6
|
||||
fw_reverse_nfqws_rule $1 "$f4" "$f6" $QNUM
|
||||
}
|
||||
}
|
||||
|
||||
local first_packet_only="$ipt_connbytes 1:$(first_packets_for_mode)"
|
||||
local desync="-m mark ! --mark $DESYNC_MARK/$DESYNC_MARK"
|
||||
local n f4 f6 qn qns qn6 qns6
|
||||
zapret_do_firewall_standard_rules_ipt()
|
||||
{
|
||||
# $1 - 1 - add, 0 - del
|
||||
|
||||
case "$mode" in
|
||||
tpws)
|
||||
if [ ! "$MODE_HTTP" = "1" ] && [ ! "$MODE_HTTPS" = "1" ]; then
|
||||
echo both http and https are disabled. not applying redirection.
|
||||
else
|
||||
filter_apply_port_target f4
|
||||
local f4 f6
|
||||
|
||||
[ "$TPWS_ENABLE" = 1 -a -n "$TPWS_PORTS" ] &&
|
||||
{
|
||||
f4="-p tcp -m multiport --dports $TPWS_PORTS_IPT"
|
||||
f6=$f4
|
||||
filter_apply_ipset_target f4 f6
|
||||
fw_tpws $1 "$f4" "$f6" $TPPORT
|
||||
fi
|
||||
;;
|
||||
}
|
||||
[ "$NFQWS_ENABLE" = 1 ] &&
|
||||
{
|
||||
ipt_do_nfqws_in_out $1 tcp "$NFQWS_PORTS_TCP_IPT" "$NFQWS_TCP_PKT_OUT" "$NFQWS_TCP_PKT_IN"
|
||||
ipt_do_nfqws_in_out $1 tcp "$NFQWS_PORTS_TCP_KEEPALIVE_IPT" keepalive "$NFQWS_TCP_PKT_IN"
|
||||
ipt_do_nfqws_in_out $1 udp "$NFQWS_PORTS_UDP_IPT" "$NFQWS_UDP_PKT_OUT" "$NFQWS_UDP_PKT_IN"
|
||||
ipt_do_nfqws_in_out $1 udp "$NFQWS_PORTS_UDP_KEEPALIVE_IPT" keepalive "$NFQWS_UDP_PKT_IN"
|
||||
}
|
||||
}
|
||||
|
||||
nfqws)
|
||||
# quite complex but we need to minimize nfqws processes to save RAM
|
||||
get_nfqws_qnums qn qns qn6 qns6
|
||||
if [ "$MODE_HTTP_KEEPALIVE" != "1" ] && [ -n "$qn" ] && [ "$qn" = "$qns" ]; then
|
||||
filter_apply_port_target f4
|
||||
f4="$f4 $first_packet_only"
|
||||
filter_apply_ipset_target4 f4
|
||||
fw_nfqws_post4 $1 "$f4 $desync" $qn
|
||||
fw_reverse_nfqws_rule4 $1 "$f4" $qn
|
||||
else
|
||||
if [ -n "$qn" ]; then
|
||||
f4="-p tcp -m multiport --dports $HTTP_PORTS_IPT"
|
||||
[ "$MODE_HTTP_KEEPALIVE" = "1" ] || f4="$f4 $first_packet_only"
|
||||
filter_apply_ipset_target4 f4
|
||||
fw_nfqws_post4 $1 "$f4 $desync" $qn
|
||||
fw_reverse_nfqws_rule4 $1 "$f4" $qn
|
||||
fi
|
||||
if [ -n "$qns" ]; then
|
||||
f4="-p tcp -m multiport --dports $HTTPS_PORTS_IPT $first_packet_only"
|
||||
filter_apply_ipset_target4 f4
|
||||
fw_nfqws_post4 $1 "$f4 $desync" $qns
|
||||
fw_reverse_nfqws_rule4 $1 "$f4" $qns
|
||||
fi
|
||||
fi
|
||||
if [ "$MODE_HTTP_KEEPALIVE" != "1" ] && [ -n "$qn6" ] && [ "$qn6" = "$qns6" ]; then
|
||||
filter_apply_port_target f6
|
||||
f6="$f6 $first_packet_only"
|
||||
filter_apply_ipset_target6 f6
|
||||
fw_nfqws_post6 $1 "$f6 $desync" $qn6
|
||||
fw_reverse_nfqws_rule6 $1 "$f6" $qn6
|
||||
else
|
||||
if [ -n "$qn6" ]; then
|
||||
f6="-p tcp -m multiport --dports $HTTP_PORTS_IPT"
|
||||
[ "$MODE_HTTP_KEEPALIVE" = "1" ] || f6="$f6 $first_packet_only"
|
||||
filter_apply_ipset_target6 f6
|
||||
fw_nfqws_post6 $1 "$f6 $desync" $qn6
|
||||
fw_reverse_nfqws_rule6 $1 "$f6" $qn6
|
||||
fi
|
||||
if [ -n "$qns6" ]; then
|
||||
f6="-p tcp -m multiport --dports $HTTPS_PORTS_IPT $first_packet_only"
|
||||
filter_apply_ipset_target6 f6
|
||||
fw_nfqws_post6 $1 "$f6 $desync" $qns6
|
||||
fw_reverse_nfqws_rule6 $1 "$f6" $qns6
|
||||
fi
|
||||
fi
|
||||
zapret_do_firewall_rules_ipt()
|
||||
{
|
||||
# $1 - 1 - add, 0 - del
|
||||
|
||||
get_nfqws_qnums_quic qn qn6
|
||||
if [ -n "$qn" ]; then
|
||||
f4=
|
||||
filter_apply_port_target_quic f4
|
||||
f4="$f4 $first_packet_only"
|
||||
filter_apply_ipset_target4 f4
|
||||
fw_nfqws_post4 $1 "$f4 $desync" $qn
|
||||
fi
|
||||
if [ -n "$qn6" ]; then
|
||||
f6=
|
||||
filter_apply_port_target_quic f6
|
||||
f6="$f6 $first_packet_only"
|
||||
filter_apply_ipset_target6 f6
|
||||
fw_nfqws_post6 $1 "$f6 $desync" $qn6
|
||||
fi
|
||||
;;
|
||||
custom)
|
||||
zapret_do_firewall_standard_rules_ipt $1
|
||||
custom_runner zapret_custom_firewall $1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
zapret_do_firewall_ipt()
|
||||
@@ -452,10 +389,6 @@ zapret_do_firewall_ipt()
|
||||
echo Clearing iptables
|
||||
fi
|
||||
|
||||
local mode="${MODE_OVERRIDE:-$MODE}"
|
||||
|
||||
[ "$mode" = "tpws-socks" ] && return 0
|
||||
|
||||
# always create ipsets. ip_exclude ipset is required
|
||||
[ "$1" = 1 ] && create_ipset no-update
|
||||
|
||||
|
@@ -23,7 +23,7 @@ zapret_do_firewall()
|
||||
# switch on liberal mode on zapret firewall start and switch off on zapret firewall stop
|
||||
# this is only required for processing incoming bad RSTs. incoming rules are only applied in autohostlist mode
|
||||
# calling this after firewall because conntrack module can be not loaded before applying conntrack firewall rules
|
||||
[ "$MODE_FILTER" = "autohostlist" -a "$MODE" != tpws -a "$MODE" != tpws-socks ] && set_conntrack_liberal_mode $1
|
||||
[ "$MODE_FILTER" = "autohostlist" ] && set_conntrack_liberal_mode $1
|
||||
|
||||
[ "$1" = 1 -a -n "$INIT_FW_POST_UP_HOOK" ] && $INIT_FW_POST_UP_HOOK
|
||||
[ "$1" = 0 -a -n "$INIT_FW_POST_DOWN_HOOK" ] && $INIT_FW_POST_DOWN_HOOK
|
||||
@@ -38,16 +38,3 @@ zapret_unapply_firewall()
|
||||
{
|
||||
zapret_do_firewall 0 "$@"
|
||||
}
|
||||
|
||||
first_packets_for_mode()
|
||||
{
|
||||
# autohostlist and autottl modes requires incoming traffic sample
|
||||
# always use conntrack packet limiter or nfqws will deal with gigabytes
|
||||
local n
|
||||
if [ "$MODE_FILTER" = "autohostlist" ]; then
|
||||
n=$((6+${AUTOHOSTLIST_RETRANS_THRESHOLD:-3}))
|
||||
else
|
||||
n=6
|
||||
fi
|
||||
echo $n
|
||||
}
|
||||
|
@@ -1,3 +1,6 @@
|
||||
readonly HOSTLIST_MARKER="<HOSTLIST>"
|
||||
readonly HOSTLIST_NOAUTO_MARKER="<HOSTLIST_NOAUTO>"
|
||||
|
||||
find_hostlists()
|
||||
{
|
||||
[ -n "$HOSTLIST_BASE" ] || HOSTLIST_BASE="$ZAPRET_BASE/ipset"
|
||||
@@ -18,38 +21,35 @@ find_hostlists()
|
||||
HOSTLIST_AUTO_DEBUGLOG="$HOSTLIST_BASE/zapret-hosts-auto-debug.log"
|
||||
}
|
||||
|
||||
filter_apply_autohostlist_target()
|
||||
{
|
||||
# $1 - var name of tpws or nfqws params
|
||||
|
||||
local parm1="${AUTOHOSTLIST_FAIL_THRESHOLD:+--hostlist-auto-fail-threshold=$AUTOHOSTLIST_FAIL_THRESHOLD}"
|
||||
local parm2="${AUTOHOSTLIST_FAIL_TIME:+--hostlist-auto-fail-time=$AUTOHOSTLIST_FAIL_TIME}"
|
||||
local parm3 parm4
|
||||
[ "$MODE" = "tpws" -o "$MODE" = "tpws-socks" ] || parm3="${AUTOHOSTLIST_RETRANS_THRESHOLD:+--hostlist-auto-retrans-threshold=$AUTOHOSTLIST_RETRANS_THRESHOLD}"
|
||||
[ "$AUTOHOSTLIST_DEBUGLOG" = 1 ] && parm4="--hostlist-auto-debug=$HOSTLIST_AUTO_DEBUGLOG"
|
||||
eval $1="\"\$$1 --hostlist-auto=$HOSTLIST_AUTO $parm1 $parm2 $parm3 $parm4\""
|
||||
}
|
||||
|
||||
filter_apply_hostlist_target()
|
||||
{
|
||||
# $1 - var name of tpws or nfqws params
|
||||
|
||||
[ "$MODE_FILTER" = "hostlist" -o "$MODE_FILTER" = "autohostlist" ] || return
|
||||
|
||||
local HOSTLIST_BASE HOSTLIST HOSTLIST_USER HOSTLIST_EXCLUDE
|
||||
|
||||
local v parm parm1 parm2 parm3 parm4 parm5 parm6 parm7 parm8 parmNA
|
||||
eval v="\$$1"
|
||||
if contains "$v" "$HOSTLIST_MARKER" || contains "$v" "$HOSTLIST_NOAUTO_MARKER"; then
|
||||
[ "$MODE_FILTER" = hostlist -o "$MODE_FILTER" = autohostlist ] &&
|
||||
{
|
||||
find_hostlists
|
||||
|
||||
[ -n "$HOSTLIST" ] && eval $1="\"\$$1 --hostlist=$HOSTLIST\""
|
||||
[ -n "$HOSTLIST_USER" ] && eval $1="\"\$$1 --hostlist=$HOSTLIST_USER\""
|
||||
[ -n "$HOSTLIST_EXCLUDE" ] && eval $1="\"\$$1 --hostlist-exclude=$HOSTLIST_EXCLUDE\""
|
||||
[ "$MODE_FILTER" = "autohostlist" ] && filter_apply_autohostlist_target $1
|
||||
}
|
||||
|
||||
filter_apply_suffix()
|
||||
{
|
||||
# $1 - var name of tpws or nfqws params
|
||||
# $2 - suffix value
|
||||
local v="${2:+ --new $2}"
|
||||
eval $1="\"\$$1$v\""
|
||||
parm1="${HOSTLIST_USER:+--hostlist=$HOSTLIST_USER}"
|
||||
parm2="${HOSTLIST:+--hostlist=$HOSTLIST}"
|
||||
parm3="${HOSTLIST_EXCLUDE:+--hostlist-exclude=$HOSTLIST_EXCLUDE}"
|
||||
[ "$MODE_FILTER" = autohostlist ] &&
|
||||
{
|
||||
parm4="--hostlist-auto=$HOSTLIST_AUTO"
|
||||
parm5="${AUTOHOSTLIST_FAIL_THRESHOLD:+--hostlist-auto-fail-threshold=$AUTOHOSTLIST_FAIL_THRESHOLD}"
|
||||
parm6="${AUTOHOSTLIST_FAIL_TIME:+--hostlist-auto-fail-time=$AUTOHOSTLIST_FAIL_TIME}"
|
||||
parm7="${AUTOHOSTLIST_RETRANS_THRESHOLD:+--hostlist-auto-retrans-threshold=$AUTOHOSTLIST_RETRANS_THRESHOLD}"
|
||||
parm8="--hostlist=$HOSTLIST_AUTO"
|
||||
}
|
||||
parm="$parm1${parm2:+ $parm2}${parm3:+ $parm3}${parm4:+ $parm4}${parm5:+ $parm5}${parm6:+ $parm6}${parm7:+ $parm7}"
|
||||
parmNA="$parm1${parm2:+ $parm2}${parm3:+ $parm3}${parm8:+ $parm8}"
|
||||
}
|
||||
v="$(replace_str $HOSTLIST_NOAUTO_MARKER "$parmNA" "$v")"
|
||||
v="$(replace_str $HOSTLIST_MARKER "$parm" "$v")"
|
||||
[ "$MODE_FILTER" = autohostlist -a "$AUTOHOSTLIST_DEBUGLOG" = 1 ] && {
|
||||
v="$v --hostlist-auto-debug=$HOSTLIST_AUTO_DEBUGLOG"
|
||||
}
|
||||
eval $1=\""$v"\"
|
||||
fi
|
||||
}
|
||||
|
235
common/nft.sh
235
common/nft.sh
@@ -86,10 +86,16 @@ cat << EOF | nft -f -
|
||||
add rule inet $ZAPRET_NFT_TABLE localnet_protect ip daddr $TPWS_LOCALHOST4 return comment "route_localnet allow access to tpws"
|
||||
add rule inet $ZAPRET_NFT_TABLE localnet_protect ip daddr 127.0.0.0/8 drop comment "route_localnet remote access protection"
|
||||
add rule inet $ZAPRET_NFT_TABLE input iif != lo jump localnet_protect
|
||||
add chain inet $ZAPRET_NFT_TABLE postrouting { type filter hook postrouting priority 99; }
|
||||
add chain inet $ZAPRET_NFT_TABLE postrouting
|
||||
flush chain inet $ZAPRET_NFT_TABLE postrouting
|
||||
add chain inet $ZAPRET_NFT_TABLE postnat { type filter hook postrouting priority 101; }
|
||||
add chain inet $ZAPRET_NFT_TABLE postrouting_hook { type filter hook postrouting priority 99; }
|
||||
flush chain inet $ZAPRET_NFT_TABLE postrouting_hook
|
||||
add rule inet $ZAPRET_NFT_TABLE postrouting_hook mark and $DESYNC_MARK == 0 jump postrouting
|
||||
add chain inet $ZAPRET_NFT_TABLE postnat
|
||||
flush chain inet $ZAPRET_NFT_TABLE postnat
|
||||
add chain inet $ZAPRET_NFT_TABLE postnat_hook { type filter hook postrouting priority 101; }
|
||||
flush chain inet $ZAPRET_NFT_TABLE postnat_hook
|
||||
add rule inet $ZAPRET_NFT_TABLE postnat_hook mark and $DESYNC_MARK == 0 jump postnat
|
||||
add chain inet $ZAPRET_NFT_TABLE prerouting { type filter hook prerouting priority -99; }
|
||||
flush chain inet $ZAPRET_NFT_TABLE prerouting
|
||||
add chain inet $ZAPRET_NFT_TABLE prenat { type filter hook prerouting priority -101; }
|
||||
@@ -107,6 +113,7 @@ cat << EOF | nft -f -
|
||||
add set inet $ZAPRET_NFT_TABLE wanif { type ifname; }
|
||||
add set inet $ZAPRET_NFT_TABLE wanif6 { type ifname; }
|
||||
add map inet $ZAPRET_NFT_TABLE link_local { type ifname : ipv6_addr; }
|
||||
|
||||
EOF
|
||||
[ -n "$POSTNAT_ALL" ] && {
|
||||
nft_flush_chain predefrag_nfqws
|
||||
@@ -118,6 +125,12 @@ nft_del_chains()
|
||||
# do not delete all chains because of additional user hooks
|
||||
# they must be inside zapret table to use nfsets
|
||||
|
||||
# these chains are newer. do not fail all because chains are not present
|
||||
cat << EOF | nft -f - 2>/dev/null
|
||||
delete chain inet $ZAPRET_NFT_TABLE postrouting_hook
|
||||
delete chain inet $ZAPRET_NFT_TABLE postnat_hook
|
||||
EOF
|
||||
|
||||
cat << EOF | nft -f - 2>/dev/null
|
||||
delete chain inet $ZAPRET_NFT_TABLE dnat_output
|
||||
delete chain inet $ZAPRET_NFT_TABLE dnat_pre
|
||||
@@ -199,7 +212,15 @@ nft_add_rule()
|
||||
# $2,$3,... - rule(s)
|
||||
local chain="$1"
|
||||
shift
|
||||
nft add rule inet $ZAPRET_NFT_TABLE $chain "$@"
|
||||
nft add rule inet $ZAPRET_NFT_TABLE $chain $FW_EXTRA_PRE "$@"
|
||||
}
|
||||
nft_insert_rule()
|
||||
{
|
||||
# $1 - chain
|
||||
# $2,$3,... - rule(s)
|
||||
local chain="$1"
|
||||
shift
|
||||
nft insert rule inet $ZAPRET_NFT_TABLE $chain $FW_EXTRA_PRE "$@"
|
||||
}
|
||||
nft_add_set_element()
|
||||
{
|
||||
@@ -227,6 +248,7 @@ nft_clean_nfqws_rule()
|
||||
nft_add_nfqws_flow_exempt_rule()
|
||||
{
|
||||
# $1 - rule (must be all filters in one var)
|
||||
local FW_EXTRA_POST= FW_EXTRA_PRE=
|
||||
nft_add_rule flow_offload $(nft_clean_nfqws_rule $1) return comment \"direct flow offloading exemption\"
|
||||
# do not need this because of oifname @wanif/@wanif6 filter in forward chain
|
||||
#nft_add_rule flow_offload $(nft_reverse_nfqws_rule $1) return comment \"reverse flow offloading exemption\"
|
||||
@@ -236,6 +258,7 @@ nft_add_flow_offload_exemption()
|
||||
# "$1" - rule for ipv4
|
||||
# "$2" - rule for ipv6
|
||||
# "$3" - comment
|
||||
local FW_EXTRA_POST= FW_EXTRA_PRE=
|
||||
[ "$DISABLE_IPV4" = "1" -o -z "$1" ] || nft_add_rule flow_offload oifname @wanif $1 ip daddr != @nozapret return comment \"$3\"
|
||||
[ "$DISABLE_IPV6" = "1" -o -z "$2" ] || nft_add_rule flow_offload oifname @wanif6 $2 ip6 daddr != @nozapret6 return comment \"$3\"
|
||||
}
|
||||
@@ -275,28 +298,6 @@ nft_apply_flow_offloading()
|
||||
|
||||
|
||||
|
||||
nft_filter_apply_port_target()
|
||||
{
|
||||
# $1 - var name of nftables filter
|
||||
local f
|
||||
if [ "$MODE_HTTP" = "1" ] && [ "$MODE_HTTPS" = "1" ]; then
|
||||
f="tcp dport {$HTTP_PORTS,$HTTPS_PORTS}"
|
||||
elif [ "$MODE_HTTPS" = "1" ]; then
|
||||
f="tcp dport {$HTTPS_PORTS}"
|
||||
elif [ "$MODE_HTTP" = "1" ]; then
|
||||
f="tcp dport {$HTTP_PORTS}"
|
||||
else
|
||||
echo WARNING !!! HTTP and HTTPS are both disabled
|
||||
fi
|
||||
eval $1="\"\$$1 $f\""
|
||||
}
|
||||
nft_filter_apply_port_target_quic()
|
||||
{
|
||||
# $1 - var name of nftables filter
|
||||
local f
|
||||
f="udp dport {$QUIC_PORTS}"
|
||||
eval $1="\"\$$1 $f\""
|
||||
}
|
||||
nft_filter_apply_ipset_target4()
|
||||
{
|
||||
# $1 - var name of ipv4 nftables filter
|
||||
@@ -399,7 +400,7 @@ nft_only()
|
||||
|
||||
nft_print_op()
|
||||
{
|
||||
echo "Adding nftables ipv$3 rule for $2 : $1"
|
||||
echo "Inserting nftables ipv$3 rule for $2 : $1"
|
||||
}
|
||||
_nft_fw_tpws4()
|
||||
{
|
||||
@@ -410,8 +411,8 @@ _nft_fw_tpws4()
|
||||
[ "$DISABLE_IPV4" = "1" -o -z "$1" ] || {
|
||||
local filter="$1" port="$2"
|
||||
nft_print_op "$filter" "tpws (port $2)" 4
|
||||
nft_add_rule dnat_output skuid != $WS_USER ${3:+oifname @wanif }$filter ip daddr != @nozapret dnat ip to $TPWS_LOCALHOST4:$port
|
||||
nft_add_rule dnat_pre iifname @lanif $filter ip daddr != @nozapret dnat ip to $TPWS_LOCALHOST4:$port
|
||||
nft_insert_rule dnat_output skuid != $WS_USER ${3:+oifname @wanif }$filter ip daddr != @nozapret $FW_EXTRA_POST dnat ip to $TPWS_LOCALHOST4:$port
|
||||
nft_insert_rule dnat_pre iifname @lanif $filter ip daddr != @nozapret $FW_EXTRA_POST dnat ip to $TPWS_LOCALHOST4:$port
|
||||
prepare_route_localnet
|
||||
}
|
||||
}
|
||||
@@ -425,9 +426,9 @@ _nft_fw_tpws6()
|
||||
[ "$DISABLE_IPV6" = "1" -o -z "$1" ] || {
|
||||
local filter="$1" port="$2" DNAT6 i
|
||||
nft_print_op "$filter" "tpws (port $port)" 6
|
||||
nft_add_rule dnat_output skuid != $WS_USER ${4:+oifname @wanif6 }$filter ip6 daddr != @nozapret6 dnat ip6 to [::1]:$port
|
||||
nft_insert_rule dnat_output skuid != $WS_USER ${4:+oifname @wanif6 }$filter ip6 daddr != @nozapret6 $FW_EXTRA_POST dnat ip6 to [::1]:$port
|
||||
[ -n "$3" ] && {
|
||||
nft_add_rule dnat_pre $filter ip6 daddr != @nozapret6 dnat ip6 to iifname map @link_local:$port
|
||||
nft_insert_rule dnat_pre $filter ip6 daddr != @nozapret6 $FW_EXTRA_POST dnat ip6 to iifname map @link_local:$port
|
||||
for i in $3; do
|
||||
_dnat6_target $i DNAT6
|
||||
# can be multiple tpws processes on different ports
|
||||
@@ -476,7 +477,7 @@ _nft_fw_nfqws_post4()
|
||||
nft_print_op "$filter" "nfqws postrouting (qnum $port)" 4
|
||||
rule="${3:+oifname @wanif }$filter ip daddr != @nozapret"
|
||||
is_postnat && setmark="meta mark set meta mark or $DESYNC_MARK_POSTNAT"
|
||||
nft_add_rule $chain $rule $setmark queue num $port bypass
|
||||
nft_insert_rule $chain $rule $setmark $FW_EXTRA_POST queue num $port bypass
|
||||
nft_add_nfqws_flow_exempt_rule "$rule"
|
||||
}
|
||||
}
|
||||
@@ -491,7 +492,7 @@ _nft_fw_nfqws_post6()
|
||||
nft_print_op "$filter" "nfqws postrouting (qnum $port)" 6
|
||||
rule="${3:+oifname @wanif6 }$filter ip6 daddr != @nozapret6"
|
||||
is_postnat && setmark="meta mark set meta mark or $DESYNC_MARK_POSTNAT"
|
||||
nft_add_rule $chain $rule $setmark queue num $port bypass
|
||||
nft_insert_rule $chain $rule $setmark $FW_EXTRA_POST queue num $port bypass
|
||||
nft_add_nfqws_flow_exempt_rule "$rule"
|
||||
}
|
||||
}
|
||||
@@ -515,7 +516,7 @@ _nft_fw_nfqws_pre4()
|
||||
local filter="$1" port="$2" rule
|
||||
nft_print_op "$filter" "nfqws prerouting (qnum $port)" 4
|
||||
rule="${3:+iifname @wanif }$filter ip saddr != @nozapret"
|
||||
nft_add_rule $(get_prechain) $rule queue num $port bypass
|
||||
nft_insert_rule $(get_prechain) $rule $FW_EXTRA_POST queue num $port bypass
|
||||
}
|
||||
}
|
||||
_nft_fw_nfqws_pre6()
|
||||
@@ -528,7 +529,7 @@ _nft_fw_nfqws_pre6()
|
||||
local filter="$1" port="$2" rule
|
||||
nft_print_op "$filter" "nfqws prerouting (qnum $port)" 6
|
||||
rule="${3:+iifname @wanif6 }$filter ip6 saddr != @nozapret6"
|
||||
nft_add_rule $(get_prechain) $rule queue num $port bypass
|
||||
nft_insert_rule $(get_prechain) $rule $FW_EXTRA_POST queue num $port bypass
|
||||
}
|
||||
}
|
||||
nft_fw_nfqws_pre()
|
||||
@@ -582,29 +583,13 @@ zapret_list_table()
|
||||
|
||||
|
||||
|
||||
nft_produce_reverse_nfqws_rule()
|
||||
{
|
||||
local rule="$1"
|
||||
if contains "$rule" "$nft_connbytes "; then
|
||||
# autohostlist - need several incoming packets
|
||||
# autottl - need only one incoming packet
|
||||
[ "$MODE_FILTER" = autohostlist ] || rule=$(echo "$rule" | sed -re "s/$nft_connbytes [0-9]+-[0-9]+/$nft_connbytes 1/")
|
||||
else
|
||||
# old nft does not swallow 1-1
|
||||
local range=1
|
||||
[ "$MODE_FILTER" = autohostlist ] && range=$(first_packets_for_mode)
|
||||
[ "$range" = 1 ] || range="1-$range"
|
||||
rule="$nft_connbytes $range $rule"
|
||||
fi
|
||||
nft_reverse_nfqws_rule $rule
|
||||
}
|
||||
nft_fw_reverse_nfqws_rule4()
|
||||
{
|
||||
nft_fw_nfqws_pre4 "$(nft_produce_reverse_nfqws_rule "$1")" $2
|
||||
nft_fw_nfqws_pre4 "$(nft_reverse_nfqws_rule "$1")" $2
|
||||
}
|
||||
nft_fw_reverse_nfqws_rule6()
|
||||
{
|
||||
nft_fw_nfqws_pre6 "$(nft_produce_reverse_nfqws_rule "$1")" $2
|
||||
nft_fw_nfqws_pre6 "$(nft_reverse_nfqws_rule "$1")" $2
|
||||
}
|
||||
nft_fw_reverse_nfqws_rule()
|
||||
{
|
||||
@@ -616,108 +601,75 @@ nft_fw_reverse_nfqws_rule()
|
||||
nft_fw_reverse_nfqws_rule6 "$2" $3
|
||||
}
|
||||
|
||||
zapret_apply_firewall_rules_nft()
|
||||
nft_first_packets()
|
||||
{
|
||||
local mode="${MODE_OVERRIDE:-$MODE}"
|
||||
|
||||
local first_packets_only
|
||||
local desync="mark and $DESYNC_MARK == 0"
|
||||
local f4 f6 qn qns qn6 qns6
|
||||
|
||||
first_packets_only="$nft_connbytes 1-$(first_packets_for_mode)"
|
||||
|
||||
case "$mode" in
|
||||
tpws)
|
||||
if [ ! "$MODE_HTTP" = "1" ] && [ ! "$MODE_HTTPS" = "1" ]; then
|
||||
echo both http and https are disabled. not applying redirection.
|
||||
# $1 - packet count
|
||||
[ -n "$1" -a "$1" != keepalive ] && [ "$1" -ge 1 ] &&
|
||||
{
|
||||
if [ "$1" = 1 ] ; then
|
||||
echo "$nft_connbytes 1"
|
||||
else
|
||||
nft_filter_apply_port_target f4
|
||||
echo "$nft_connbytes 1-$1"
|
||||
fi
|
||||
}
|
||||
}
|
||||
|
||||
nft_apply_nfqws_in_out()
|
||||
{
|
||||
# $1 - tcp,udp
|
||||
# $2 - ports
|
||||
# $3 - PKT_OUT. special value : 'keepalive'
|
||||
# $4 - PKT_IN
|
||||
local f4 f6 first_packets_only
|
||||
[ -n "$2" ] || return
|
||||
[ -n "$3" -a "$3" != 0 ] &&
|
||||
{
|
||||
first_packets_only="$(nft_first_packets $3)"
|
||||
f4="$1 dport {$2} $first_packets_only"
|
||||
f6=$f4
|
||||
nft_filter_apply_ipset_target f4 f6
|
||||
nft_fw_nfqws_post "$f4" "$f6" $QNUM
|
||||
}
|
||||
[ -n "$4" -a "$4" != 0 ] &&
|
||||
{
|
||||
first_packets_only="$(nft_first_packets $4)"
|
||||
f4="$1 dport {$2} $first_packets_only"
|
||||
f6=$f4
|
||||
nft_filter_apply_ipset_target f4 f6
|
||||
nft_fw_reverse_nfqws_rule "$f4" "$f6" $QNUM
|
||||
}
|
||||
}
|
||||
|
||||
zapret_apply_firewall_standard_rules_nft()
|
||||
{
|
||||
local f4 f6
|
||||
|
||||
[ "$TPWS_ENABLE" = 1 -a -n "$TPWS_PORTS" ] &&
|
||||
{
|
||||
f4="tcp dport {$TPWS_PORTS}"
|
||||
f6=$f4
|
||||
nft_filter_apply_ipset_target f4 f6
|
||||
nft_fw_tpws "$f4" "$f6" $TPPORT
|
||||
fi
|
||||
;;
|
||||
nfqws)
|
||||
local POSTNAT_SAVE=$POSTNAT
|
||||
}
|
||||
[ "$NFQWS_ENABLE" = 1 ] &&
|
||||
{
|
||||
nft_apply_nfqws_in_out tcp "$NFQWS_PORTS_TCP" "$NFQWS_TCP_PKT_OUT" "$NFQWS_TCP_PKT_IN"
|
||||
nft_apply_nfqws_in_out tcp "$NFQWS_PORTS_TCP_KEEPALIVE" keepalive "$NFQWS_TCP_PKT_IN"
|
||||
nft_apply_nfqws_in_out udp "$NFQWS_PORTS_UDP" "$NFQWS_UDP_PKT_OUT" "$NFQWS_UDP_PKT_IN"
|
||||
nft_apply_nfqws_in_out udp "$NFQWS_PORTS_UDP_KEEPALIVE" keepalive "$NFQWS_UDP_PKT_IN"
|
||||
}
|
||||
}
|
||||
|
||||
POSTNAT=1
|
||||
# quite complex but we need to minimize nfqws processes to save RAM
|
||||
get_nfqws_qnums qn qns qn6 qns6
|
||||
if [ "$MODE_HTTP_KEEPALIVE" != "1" ] && [ -n "$qn" ] && [ "$qn" = "$qns" ]; then
|
||||
nft_filter_apply_port_target f4
|
||||
f4="$f4 $first_packets_only"
|
||||
nft_filter_apply_ipset_target4 f4
|
||||
nft_fw_nfqws_post4 "$f4 $desync" $qn
|
||||
nft_fw_reverse_nfqws_rule4 "$f4" $qn
|
||||
else
|
||||
if [ -n "$qn" ]; then
|
||||
f4="tcp dport {$HTTP_PORTS}"
|
||||
[ "$MODE_HTTP_KEEPALIVE" = "1" ] || f4="$f4 $first_packets_only"
|
||||
nft_filter_apply_ipset_target4 f4
|
||||
nft_fw_nfqws_post4 "$f4 $desync" $qn
|
||||
nft_fw_reverse_nfqws_rule4 "$f4" $qn
|
||||
fi
|
||||
if [ -n "$qns" ]; then
|
||||
f4="tcp dport {$HTTPS_PORTS} $first_packets_only"
|
||||
nft_filter_apply_ipset_target4 f4
|
||||
nft_fw_nfqws_post4 "$f4 $desync" $qns
|
||||
nft_fw_reverse_nfqws_rule4 "$f4" $qns
|
||||
fi
|
||||
fi
|
||||
if [ "$MODE_HTTP_KEEPALIVE" != "1" ] && [ -n "$qn6" ] && [ "$qn6" = "$qns6" ]; then
|
||||
nft_filter_apply_port_target f6
|
||||
f6="$f6 $first_packets_only"
|
||||
nft_filter_apply_ipset_target6 f6
|
||||
nft_fw_nfqws_post6 "$f6 $desync" $qn6
|
||||
nft_fw_reverse_nfqws_rule6 "$f6" $qn6
|
||||
else
|
||||
if [ -n "$qn6" ]; then
|
||||
f6="tcp dport {$HTTP_PORTS}"
|
||||
[ "$MODE_HTTP_KEEPALIVE" = "1" ] || f6="$f6 $first_packets_only"
|
||||
nft_filter_apply_ipset_target6 f6
|
||||
nft_fw_nfqws_post6 "$f6 $desync" $qn6
|
||||
nft_fw_reverse_nfqws_rule6 "$f6" $qn6
|
||||
fi
|
||||
if [ -n "$qns6" ]; then
|
||||
f6="tcp dport {$HTTPS_PORTS} $first_packets_only"
|
||||
nft_filter_apply_ipset_target6 f6
|
||||
nft_fw_nfqws_post6 "$f6 $desync" $qns6
|
||||
nft_fw_reverse_nfqws_rule6 "$f6" $qns6
|
||||
fi
|
||||
fi
|
||||
|
||||
get_nfqws_qnums_quic qn qn6
|
||||
if [ -n "$qn" ]; then
|
||||
f4=
|
||||
nft_filter_apply_port_target_quic f4
|
||||
f4="$f4 $first_packets_only"
|
||||
nft_filter_apply_ipset_target4 f4
|
||||
nft_fw_nfqws_post4 "$f4 $desync" $qn
|
||||
fi
|
||||
if [ -n "$qn6" ]; then
|
||||
f6=
|
||||
nft_filter_apply_port_target_quic f6
|
||||
f6="$f6 $first_packets_only"
|
||||
nft_filter_apply_ipset_target6 f6
|
||||
nft_fw_nfqws_post6 "$f6 $desync" $qn6
|
||||
fi
|
||||
|
||||
POSTNAT=$POSTNAT_SAVE
|
||||
;;
|
||||
custom)
|
||||
zapret_apply_firewall_rules_nft()
|
||||
{
|
||||
zapret_apply_firewall_standard_rules_nft
|
||||
custom_runner zapret_custom_firewall_nft
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
zapret_apply_firewall_nft()
|
||||
{
|
||||
echo Applying nftables
|
||||
|
||||
local mode="${MODE_OVERRIDE:-$MODE}"
|
||||
|
||||
[ "$mode" = "tpws-socks" ] && return 0
|
||||
|
||||
create_ipset no-update
|
||||
nft_create_firewall
|
||||
nft_fill_ifsets_overload
|
||||
@@ -734,6 +686,7 @@ zapret_unapply_firewall_nft()
|
||||
|
||||
unprepare_route_localnet
|
||||
nft_del_firewall
|
||||
custom_runner zapret_custom_firewall_nft_flush
|
||||
return 0
|
||||
}
|
||||
zapret_do_firewall_nft()
|
||||
|
69
common/pf.sh
69
common/pf.sh
@@ -1,5 +1,5 @@
|
||||
PF_MAIN="/etc/pf.conf"
|
||||
PF_ANCHOR_DIR=/etc/pf.anchors
|
||||
PF_ANCHOR_DIR="/etc/pf.anchors"
|
||||
PF_ANCHOR_ZAPRET="$PF_ANCHOR_DIR/zapret"
|
||||
PF_ANCHOR_ZAPRET_V4="$PF_ANCHOR_DIR/zapret-v4"
|
||||
PF_ANCHOR_ZAPRET_V6="$PF_ANCHOR_DIR/zapret-v6"
|
||||
@@ -108,33 +108,17 @@ pf_anchor_zapret_tables()
|
||||
}
|
||||
pf_nat_reorder_rules()
|
||||
{
|
||||
# this is dirty hack to move rdr above route-to and remove route-to dups
|
||||
sort -rfu
|
||||
}
|
||||
pf_anchor_port_target()
|
||||
{
|
||||
if [ "$MODE_HTTP" = "1" ] && [ "$MODE_HTTPS" = "1" ]; then
|
||||
echo "{$HTTP_PORTS_IPT,$HTTPS_PORTS_IPT}"
|
||||
elif [ "$MODE_HTTPS" = "1" ]; then
|
||||
echo "{$HTTPS_PORTS_IPT}"
|
||||
elif [ "$MODE_HTTP" = "1" ]; then
|
||||
echo "{$HTTP_PORTS_IPT}"
|
||||
fi
|
||||
# this is dirty hack to move rdr above route-to
|
||||
# use only first word as a key and preserve order within a single key
|
||||
sort -srfk 1,1
|
||||
}
|
||||
|
||||
pf_anchor_zapret_v4_tpws()
|
||||
{
|
||||
# $1 - tpws listen port
|
||||
# $2 - rdr ports. defaults are used if empty
|
||||
|
||||
local rule port
|
||||
|
||||
if [ -n "$2" ]; then
|
||||
port="{$2}"
|
||||
else
|
||||
port=$(pf_anchor_port_target)
|
||||
fi
|
||||
# $2 - rdr ports
|
||||
|
||||
local rule port="{$2}"
|
||||
for lan in $IFACE_LAN; do
|
||||
for t in $tbl; do
|
||||
echo "rdr on $lan inet proto tcp from any to $t port $port -> 127.0.0.1 port $1"
|
||||
@@ -157,31 +141,19 @@ pf_anchor_zapret_v4()
|
||||
{
|
||||
local tbl port
|
||||
[ "$DISABLE_IPV4" = "1" ] || {
|
||||
case "${MODE_OVERRIDE:-$MODE}" in
|
||||
tpws)
|
||||
[ ! "$MODE_HTTP" = "1" ] && [ ! "$MODE_HTTPS" = "1" ] && return
|
||||
{
|
||||
pf_anchor_zapret_tables tbl zapret-user "$ZIPLIST_USER" zapret "$ZIPLIST"
|
||||
pf_anchor_zapret_v4_tpws $TPPORT
|
||||
;;
|
||||
custom)
|
||||
pf_anchor_zapret_tables tbl zapret-user "$ZIPLIST_USER" zapret "$ZIPLIST"
|
||||
custom_runner zapret_custom_firewall_v4 | pf_nat_reorder_rules
|
||||
;;
|
||||
esac
|
||||
custom_runner zapret_custom_firewall_v4
|
||||
[ "$TPWS_ENABLE" = 1 -a -n "$TPWS_PORTS" ] && pf_anchor_zapret_v4_tpws $TPPORT "$TPWS_PORTS_IPT"
|
||||
} | pf_nat_reorder_rules
|
||||
}
|
||||
}
|
||||
pf_anchor_zapret_v6_tpws()
|
||||
{
|
||||
# $1 - tpws listen port
|
||||
# $2 - rdr ports. defaults are used if empty
|
||||
# $2 - rdr ports
|
||||
|
||||
local rule LL_LAN port
|
||||
|
||||
if [ -n "$2" ]; then
|
||||
port="{$2}"
|
||||
else
|
||||
port=$(pf_anchor_port_target)
|
||||
fi
|
||||
local rule LL_LAN port="{$2}"
|
||||
|
||||
# LAN link local is only for router
|
||||
for lan in $IFACE_LAN; do
|
||||
@@ -207,19 +179,12 @@ pf_anchor_zapret_v6_tpws()
|
||||
pf_anchor_zapret_v6()
|
||||
{
|
||||
local tbl port
|
||||
|
||||
[ "$DISABLE_IPV6" = "1" ] || {
|
||||
case "${MODE_OVERRIDE:-$MODE}" in
|
||||
tpws)
|
||||
[ ! "$MODE_HTTP" = "1" ] && [ ! "$MODE_HTTPS" = "1" ] && return
|
||||
pf_anchor_zapret_tables tbl zapret6-user "$ZIPLIST_USER6" zapret6 "$ZIPLIST6"
|
||||
pf_anchor_zapret_v6_tpws $TPPORT
|
||||
;;
|
||||
custom)
|
||||
pf_anchor_zapret_tables tbl zapret6-user "$ZIPLIST_USER6" zapret6 "$ZIPLIST6"
|
||||
custom_runner zapret_custom_firewall_v6 | pf_nat_reorder_rules
|
||||
;;
|
||||
esac
|
||||
{
|
||||
pf_anchor_zapret_tables tbl zapret-user "$ZIPLIST_USER" zapret "$ZIPLIST"
|
||||
custom_runner zapret_custom_firewall_v6
|
||||
[ "$TPWS_ENABLE" = 1 -a -n "$TPWS_PORTS_IPT" ] && pf_anchor_zapret_v6_tpws $TPPORT "$TPWS_PORTS_IPT"
|
||||
} | pf_nat_reorder_rules
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -9,6 +9,9 @@
|
||||
|
||||
# override firewall type : iptables,nftables,ipfw
|
||||
#FWTYPE=iptables
|
||||
# nftables only : set this to 0 to use pre-nat mode. default is post-nat.
|
||||
# pre-nat mode disables some bypass techniques for forwarded traffic but allows to see client IP addresses in debug log
|
||||
#POSTNAT=0
|
||||
|
||||
# options for ipsets
|
||||
# maximum number of elements in sets. also used for nft sets
|
||||
@@ -40,53 +43,59 @@ GZIP_LISTS=1
|
||||
# set to "-" to disable reload
|
||||
#LISTS_RELOAD="pfctl -f /etc/pf.conf"
|
||||
|
||||
# override ports
|
||||
#HTTP_PORTS=80-81,85
|
||||
#HTTPS_PORTS=443,500-501
|
||||
#QUIC_PORTS=443,444
|
||||
|
||||
# CHOOSE OPERATION MODE
|
||||
# MODE : nfqws,tpws,tpws-socks,filter,custom
|
||||
# nfqws : nfqws for dpi desync
|
||||
# tpws : tpws transparent mode
|
||||
# tpws-socks : tpws socks mode
|
||||
# filter : no daemon, just create ipset or download hostlist
|
||||
# custom : custom mode. should modify custom init script and add your own code
|
||||
MODE=tpws
|
||||
# apply fooling to http
|
||||
MODE_HTTP=1
|
||||
# for nfqws only. support http keep alives. enable only if DPI checks for http request in any outgoing packet
|
||||
MODE_HTTP_KEEPALIVE=0
|
||||
# apply fooling to https
|
||||
MODE_HTTPS=1
|
||||
# apply fooling to quic
|
||||
MODE_QUIC=0
|
||||
# none,ipset,hostlist,autohostlist
|
||||
MODE_FILTER=none
|
||||
|
||||
# CHOOSE NFQWS DAEMON OPTIONS for DPI desync mode. run "nfq/nfqws --help" for option list
|
||||
# SUFFIX VARS define additional lower priority desync profile. it's required if MODE_FILTER=hostlist and strategy has hostlist-incompatible 0-phase desync methods (syndata,wssize)
|
||||
# mark bit used by nfqws to prevent loop
|
||||
DESYNC_MARK=0x40000000
|
||||
DESYNC_MARK_POSTNAT=0x20000000
|
||||
NFQWS_OPT_DESYNC="--dpi-desync=fake --dpi-desync-ttl=0 --dpi-desync-ttl6=0 --dpi-desync-fooling=badsum"
|
||||
#NFQWS_OPT_DESYNC_SUFFIX="--dpi-desync=syndata"
|
||||
#NFQWS_OPT_DESYNC_HTTP=""
|
||||
#NFQWS_OPT_DESYNC_HTTP_SUFFIX="--dpi-desync=syndata"
|
||||
#NFQWS_OPT_DESYNC_HTTPS=""
|
||||
#NFQWS_OPT_DESYNC_HTTPS_SUFFIX="--wssize 1:6"
|
||||
#NFQWS_OPT_DESYNC_HTTP6=""
|
||||
#NFQWS_OPT_DESYNC_HTTP6_SUFFIX="--dpi-desync=syndata"
|
||||
#NFQWS_OPT_DESYNC_HTTPS6=""
|
||||
#NFQWS_OPT_DESYNC_HTTPS6_SUFFIX="--wssize 1:6"
|
||||
NFQWS_OPT_DESYNC_QUIC="--dpi-desync=fake --dpi-desync-repeats=6"
|
||||
#NFQWS_OPT_DESYNC_QUIC_SUFFIX=""
|
||||
#NFQWS_OPT_DESYNC_QUIC6="--dpi-desync=hopbyhop"
|
||||
#NFQWS_OPT_DESYNC_QUIC6_SUFFIX=""
|
||||
|
||||
# CHOOSE TPWS DAEMON OPTIONS. run "tpws/tpws --help" for option list
|
||||
# SUFFIX VARS define additional lower priority desync profile. it's required if MODE_FILTER=hostlist and strategy has hostlist-incompatible 0-phase desync methods (mss)
|
||||
TPWS_OPT="--hostspell=HOST --split-http-req=method --split-pos=3 --oob"
|
||||
#TPWS_OPT_SUFFIX="--mss 88"
|
||||
TPWS_SOCKS_ENABLE=0
|
||||
# tpws socks listens on this port on localhost and LAN interfaces
|
||||
TPPORT_SOCKS=987
|
||||
# use <HOSTLIST> and <HOSTLIST_NOAUTO> placeholders to engage standard hostlists and autohostlist in ipset dir
|
||||
# hostlist markers are replaced to empty string if MODE_FILTER does not satisfy
|
||||
# <HOSTLIST_NOAUTO> appends ipset/zapret-hosts-auto.txt as normal list
|
||||
TPWS_SOCKS_OPT="
|
||||
--filter-tcp=80 --methodeol <HOSTLIST> --new
|
||||
--filter-tcp=443 --split-tls=sni --disorder <HOSTLIST>
|
||||
"
|
||||
|
||||
TPWS_ENABLE=0
|
||||
TPWS_PORTS=80,443
|
||||
# use <HOSTLIST> and <HOSTLIST_NOAUTO> placeholders to engage standard hostlists and autohostlist in ipset dir
|
||||
# hostlist markers are replaced to empty string if MODE_FILTER does not satisfy
|
||||
# <HOSTLIST_NOAUTO> appends ipset/zapret-hosts-auto.txt as normal list
|
||||
TPWS_OPT="
|
||||
--filter-tcp=80 --methodeol <HOSTLIST> --new
|
||||
--filter-tcp=443 --split-tls=sni --disorder <HOSTLIST>
|
||||
"
|
||||
|
||||
NFQWS_ENABLE=0
|
||||
# redirect outgoing traffic with connbytes limiter applied in both directions.
|
||||
NFQWS_PORTS_TCP=80,443
|
||||
NFQWS_PORTS_UDP=443
|
||||
# PKT_OUT means connbytes dir original
|
||||
# PKT_IN means connbytes dir reply
|
||||
# this is --dpi-desync-cutoff=nX kernel mode implementation for linux. it saves a lot of CPU.
|
||||
NFQWS_TCP_PKT_OUT=$((6+$AUTOHOSTLIST_RETRANS_THRESHOLD))
|
||||
NFQWS_TCP_PKT_IN=3
|
||||
NFQWS_UDP_PKT_OUT=$((6+$AUTOHOSTLIST_RETRANS_THRESHOLD))
|
||||
NFQWS_UDP_PKT_IN=0
|
||||
# redirect outgoing traffic without connbytes limiter and incoming with connbytes limiter
|
||||
# normally it's needed only for stateless DPI that matches every packet in a single TCP session
|
||||
# typical example are plain HTTP keep alives
|
||||
# this mode can be very CPU consuming. enable with care !
|
||||
#NFQWS_PORTS_TCP_KEEPALIVE=80
|
||||
#NFQWS_PORTS_UDP_KEEPALIVE=
|
||||
# use <HOSTLIST> and <HOSTLIST_NOAUTO> placeholders to engage standard hostlists and autohostlist in ipset dir
|
||||
# hostlist markers are replaced to empty string if MODE_FILTER does not satisfy
|
||||
# <HOSTLIST_NOAUTO> appends ipset/zapret-hosts-auto.txt as normal list
|
||||
NFQWS_OPT="
|
||||
--filter-tcp=80 --dpi-desync=fake,split2 --dpi-desync-fooling=md5sig <HOSTLIST> --new
|
||||
--filter-tcp=443 --dpi-desync=fake,disorder2 --dpi-desync-fooling=md5sig <HOSTLIST> --new
|
||||
--filter-udp=443 --dpi-desync=fake --dpi-desync-repeats=6 <HOSTLIST_NOAUTO>
|
||||
"
|
||||
|
||||
# none,ipset,hostlist,autohostlist
|
||||
MODE_FILTER=none
|
||||
|
||||
# openwrt only : donttouch,none,software,hardware
|
||||
FLOWOFFLOAD=donttouch
|
||||
@@ -123,4 +132,4 @@ DISABLE_IPV6=1
|
||||
# select which init script will be used to get ip or host list
|
||||
# possible values : get_user.sh get_antizapret.sh get_combined.sh get_reestr.sh get_hostlist.sh
|
||||
# comment if not required
|
||||
GETLIST=get_antifilter_ipsmart.sh
|
||||
#GETLIST=
|
||||
|
@@ -217,8 +217,9 @@ ipfrag2 desync mode.
|
||||
|
||||
There's autostart script example in `init.d/pfsense`. It should be placed to
|
||||
`/usr/local/etc/rc.d` and edited. Write your ipfw rules and daemon start
|
||||
commands. Because git is absent the most convinient way to copy files is ssh.
|
||||
curl is present by default.
|
||||
commands.
|
||||
curl is present by default. You can use it to download `tar.gz` release directly from github.
|
||||
Or you can copy files using sftp.
|
||||
|
||||
Copy zip with zapret files to `/opt` and unpack there as it's done in other
|
||||
systems. In this case run `dvtws` as `/opt/zapret/nfq/dvtws`. Or just copy
|
||||
@@ -227,9 +228,6 @@ present. It's possible to renew lists.
|
||||
|
||||
If you dont like poverty of default repos its possible to enable FreeBSD repo.
|
||||
Change `no` to `yes` in `/usr/local/etc/pkg/repos/FreeBSD.conf` and `/usr/local/etc/pkg/repos/pfSense.conf`.
|
||||
Then it becomes possible to install all the required software including git to download
|
||||
zapret from github directly.
|
||||
|
||||
|
||||
`/usr/local/etc/rc.d/zapret.sh` (chmod 755)
|
||||
```
|
725
docs/bsd.md
Normal file
725
docs/bsd.md
Normal file
@@ -0,0 +1,725 @@
|
||||
# Настройка BSD-подобных систем
|
||||
|
||||
* [Поддерживаемые версии](#поддерживаемые-версии)
|
||||
* [Особенности BSD систем](#особенности-bsd-систем)
|
||||
* [Отсутствие nfqueue](#отсутствие-nfqueue)
|
||||
* [Типы Firewall](#типы-firewall)
|
||||
* [Сборка](#сборка)
|
||||
* [Divert сокеты](#divert-сокеты)
|
||||
* [Lookup Tables](#lookup-tables)
|
||||
* [Загрузка ip таблиц из файла](#загрузка-ip-таблиц-из-файла)
|
||||
* [Отсутствие splice](#отсутствие-splice)
|
||||
* [mdig и ip2net](#mdig-и-ip2net)
|
||||
* [FreeBSD](#freebsd)
|
||||
* [Подгрузка ipdivert](#подгрузка-ipdivert)
|
||||
* [Авто-восстановление правил ipfw и работа в фоне](#авто-восстановление-правил-ipfw-и-работа-в-фоне)
|
||||
* [tpws в прозрачном режиме](#tpws-в-прозрачном-режиме)
|
||||
* [Запуск dvtws](#запуск-dvtws)
|
||||
* [PF в FreeBSD](#pf-в-freebsd)
|
||||
* [pfsense](#pfsense)
|
||||
* [OpenBSD](#openbsd)
|
||||
* [tpws bind на ipv4](#tpws-bind-на-ipv4)
|
||||
* [tpws для проходящего трафика](#tpws-для-проходящего-трафика)
|
||||
* [Запуск dvtws](#запуск-dvtws)
|
||||
* [Проблемы с badsum](#проблемы-с-badsum)
|
||||
* [Особенность отправки fake пакетов](#особенность-отправки-fake-пакетов)
|
||||
* [Перезагрузка PF таблиц](#перезагрузка-pf-таблиц)
|
||||
* [MacOS](#macos)
|
||||
* [Введение](#введение)
|
||||
* [dvtws бесполезен](#dvtws-бесполезен)
|
||||
* [tpws](#tpws)
|
||||
* [Проблема link-local адреса](#проблема-link-local-адреса)
|
||||
* [Сборка](#сборка)
|
||||
* [Простая установка](#простая-установка)
|
||||
* [Вариант Custom](#вариант-custom)
|
||||
|
||||
|
||||
## Поддерживаемые версии
|
||||
**FreeBSD** 11.x+ , **OpenBSD** 6.x+, частично **MacOS Sierra** +
|
||||
|
||||
> [!CAUTION]
|
||||
> На более старых может собираться, может не собираться, может работать или не
|
||||
> работать. На **FreeBSD** 10 собирается и работает `dvtws`. С `tpws` есть
|
||||
> проблемы из-за слишком старой версии компилятора clang. Вероятно, будет
|
||||
> работать, если обновить компилятор. Возможна прикрутка к последним версиям
|
||||
> pfsense без веб интерфейса в ручном режиме через консоль.
|
||||
|
||||
|
||||
## Особенности BSD систем
|
||||
|
||||
### Отсутствие nfqueue
|
||||
В **BSD** нет `nfqueue`. Похожий механизм - divert sockets. Из каталога
|
||||
[`nfq/`](../nfq/) под **BSD** собирается `dvtws` вместо `nfqws`. Он разделяет с
|
||||
`nfqws` большую часть кода и почти совпадает по параметрам командной строки.
|
||||
|
||||
### Типы Firewall
|
||||
**FreeBSD** содержит 3 фаервола : **IPFilter**, **ipfw** и **Packet Filter (PF
|
||||
в дальнейшем)**. **OpenBSD** содержит только **PF**.
|
||||
|
||||
### Сборка
|
||||
Под **FreeBSD** `tpws` и `dvtws` собираются через `make`.
|
||||
|
||||
Под **OpenBSD**:
|
||||
```sh
|
||||
make bsd
|
||||
```
|
||||
|
||||
Под **MacOS**:
|
||||
```sh
|
||||
make mac
|
||||
```
|
||||
|
||||
**FreeBSD** make распознает BSDmakefile, **OpenBSD** и **MacOS** - нет. Поэтому
|
||||
там используется отдельный target в Makefile. Сборка всех исходников:
|
||||
```sh
|
||||
make -C /opt/zapret
|
||||
```
|
||||
|
||||
### Divert сокеты
|
||||
Divert сокет это внутренний тип сокета ядра **BSD**. Он не привязывается ни к
|
||||
какому сетевому адресу, не участвует в обмене данными через сеть и
|
||||
идентифицируется по номеру порта `1..65535`. Аналогия с номером очереди
|
||||
`NFQUEUE`. На divert сокеты заворачивается трафик посредством правил ipfw или
|
||||
PF. Если в фаерволе есть правило divert, но на divert порту никто не слушает,
|
||||
то пакеты дропаются. Это поведение аналогично правилам `NFQUEUE` без параметра
|
||||
`--queue-bypass`. На **FreeBSD** divert сокеты могут быть только ipv4, хотя на
|
||||
них принимаются и ipv4, и ipv6 фреймы. На **OpenBSD** divert сокеты создаются
|
||||
отдельно для ipv4 и ipv6 и работают только с одной версией `ip` каждый. На
|
||||
**MacOS** похоже, что divert сокеты из ядра вырезаны. См подробнее раздел про
|
||||
**MacOS**. Отсылка в divert сокет работает аналогично отсылке через raw socket
|
||||
на linux. Передается полностью IP фрейм, начиная с ip загловка. Эти особенности
|
||||
учитываются в `dvtws`.
|
||||
|
||||
### Lookup Tables
|
||||
Скрипты [`ipset/*.sh`](../ipset/) при наличии ipfw работают с ipfw lookup
|
||||
tables. Это прямой аналог ipset. lookup tables не разделены на v4 и v6. Они
|
||||
могут содержать v4 и v6 адреса и подсети одновременно. Если ipfw отсутствует,
|
||||
то действие зависит от переменной `LISTS_RELOAD` в config. Если она задана, то
|
||||
выполняется команда из `LISTS_RELOAD`. В противном случае не делается ничего.
|
||||
Если `LISTS_RELOAD=-`, то заполнение таблиц отключается даже при наличии ipfw.
|
||||
|
||||
### Загрузка ip таблиц из файла
|
||||
PF может загружать ip таблицы из файла. Чтобы использовать эту возможность
|
||||
следует отключить сжатие gzip для листов через параметр файла config:
|
||||
`GZIP_LISTS=0`.
|
||||
|
||||
### Отсутствие splice
|
||||
**BSD** не содержит системного вызова splice. `tpws` работает через переброску
|
||||
данных в user mode в оба конца. Это медленнее, но не критически. Управление
|
||||
асинхронными сокетами в `tpws` основано на linux-specific механизме epoll. В
|
||||
**BSD** для его эмуляции используется epoll-shim - прослойка для эмуляции epoll
|
||||
на базе kqueue.
|
||||
|
||||
### mdig и ip2net
|
||||
mdig и ip2net полностью работоспособны в **BSD**. В них нет ничего
|
||||
системо-зависимого.
|
||||
|
||||
|
||||
## FreeBSD
|
||||
|
||||
### Подгрузка ipdivert
|
||||
Divert сокеты требуют специального модуля ядра - `ipdivert`.
|
||||
|
||||
- Поместите следующие строки в `/boot/loader.conf` (создать, если отсутствует):
|
||||
```
|
||||
ipdivert_load="YES"
|
||||
net.inet.ip.fw.default_to_accept=1
|
||||
```
|
||||
|
||||
`/etc/rc.conf`:
|
||||
```
|
||||
firewall_enable="YES"
|
||||
firewall_script="/etc/rc.firewall.my"
|
||||
```
|
||||
|
||||
`/etc/rc.firewall.my`:
|
||||
```sh
|
||||
$ ipfw -q -f flush
|
||||
```
|
||||
|
||||
### Авто-восстановление правил ipfw и работа в фоне
|
||||
В `/etc/rc.firewall.my` можно дописывать правила ipfw, чтобы они
|
||||
восстанавливались после перезагрузки. Оттуда же можно запускать и демоны
|
||||
zapret, добавив в параметры `--daemon`. Например так:
|
||||
```sh
|
||||
$ pkill ^dvtws$
|
||||
$ /opt/zapret/nfq/dvtws --port=989 --daemon --dpi-desync=split2
|
||||
```
|
||||
|
||||
Для перезапуска фаервола и демонов достаточно будет сделать:
|
||||
```sh
|
||||
$ /etc/rc.d/ipfw restart
|
||||
```
|
||||
|
||||
### tpws в прозрачном режиме
|
||||
Краткая инструкция по запуску `tpws` в прозрачном режиме.
|
||||
|
||||
> [!NOTE]
|
||||
> Предполагается, что интерфейс LAN называется `em1`, WAN - `em0`.
|
||||
|
||||
#### Весь трафик
|
||||
```sh
|
||||
$ ipfw delete 100
|
||||
$ ipfw add 100 fwd 127.0.0.1,988 tcp from me to any 80,443 proto ip4 xmit em0 not uid daemon
|
||||
$ ipfw add 100 fwd ::1,988 tcp from me to any 80,443 proto ip6 xmit em0 not uid daemon
|
||||
$ ipfw add 100 fwd 127.0.0.1,988 tcp from any to any 80,443 proto ip4 recv em1
|
||||
$ ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1
|
||||
$ /opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
|
||||
```
|
||||
|
||||
#### Трафик только на таблицу zapret, за исключением таблицы nozapret
|
||||
|
||||
```sh
|
||||
$ ipfw delete 100
|
||||
$ ipfw add 100 allow tcp from me to table\(nozapret\) 80,443
|
||||
$ ipfw add 100 fwd 127.0.0.1,988 tcp from me to table\(zapret\) 80,443 proto ip4 xmit em0 not uid daemon
|
||||
$ ipfw add 100 fwd ::1,988 tcp from me to table\(zapret\) 80,443 proto ip6 xmit em0 not uid daemon
|
||||
$ ipfw add 100 allow tcp from any to table\(nozapret\) 80,443 recv em1
|
||||
$ ipfw add 100 fwd 127.0.0.1,988 tcp from any to any 80,443 proto ip4 recv em1
|
||||
$ ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1
|
||||
$ /opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> Таблицы zapret, nozapret, ipban создаются скриптами из ipset по аналогии с
|
||||
> Linux. Обновление скриптов можно забить в cron под root:
|
||||
> ```sh
|
||||
> $ crontab -e
|
||||
> ```
|
||||
>
|
||||
> ```
|
||||
> <...>
|
||||
> 0 12 */2 * * /opt/zapret/ipset/get_config.sh
|
||||
> ```
|
||||
|
||||
> [!CAUTION]
|
||||
> При использовании ipfw `tpws` не требует повышенных привилегий для реализации
|
||||
> прозрачного режима. Однако, без рута невозможен bind на порты `< 1024` и
|
||||
> смена UID/GID. Без смены UID будет рекурсия, поэтому правила ipfw нужно
|
||||
> создавать с учетом UID, под которым работает `tpws`. Переадресация на порты
|
||||
> `>= 1024` может создать угрозу перехвата трафика непривилегированным
|
||||
> процессом, если вдруг `tpws` не запущен.
|
||||
|
||||
|
||||
### Запуск dvtws
|
||||
|
||||
#### Весь трафик
|
||||
```sh
|
||||
$ ipfw delete 100
|
||||
$ ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted xmit em0
|
||||
# required for autottl mode only
|
||||
$ ipfw add 100 divert 989 tcp from any 80,443 to any tcpflags syn,ack in not diverted recv em0
|
||||
$ /opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2
|
||||
```
|
||||
|
||||
#### Трафик только на таблицу zapret, за исключением таблицы nozapret
|
||||
|
||||
```sh
|
||||
$ ipfw delete 100
|
||||
$ ipfw add 100 allow tcp from me to table\(nozapret\) 80,443
|
||||
$ ipfw add 100 divert 989 tcp from any to table\(zapret\) 80,443 out not diverted not sockarg xmit em0
|
||||
# required for autottl mode only
|
||||
$ ipfw add 100 divert 989 tcp from table\(zapret\) 80,443 to any tcpflags syn,ack in not diverted not sockarg recv em0
|
||||
$ /opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2
|
||||
```
|
||||
|
||||
|
||||
### PF в FreeBSD
|
||||
Настройка аналогична **OpenBSD**, но есть важные нюансы.
|
||||
|
||||
- В **FreeBSD** поддержка PF в `tpws` отключена по умолчанию. Чтобы ее
|
||||
включить, нужно использовать параметр `--enable-pf`.
|
||||
- Нельзя сделать ipv6 rdr на `::1`. Нужно делать на link-local адрес входящего
|
||||
интерфейса. Смотрите через `ifconfig` адрес `fe80:...` и добавляете в правило.
|
||||
- Синтаксис `pf.conf` немного отличается. Более новая версия PF.
|
||||
- Лимит на количество элементов таблиц задается так:
|
||||
```sh
|
||||
$ sysctl net.pf.request_maxcount=2000000
|
||||
```
|
||||
- Сломан divert-to. Он работает, но не работает механизм предотвращения
|
||||
зацикливаний. Кто-то уже написал патч, но в `14-RELEASE` проблема все еще
|
||||
есть. Следовательно, на данный момент работа `dvtws` через PF невозможна.
|
||||
|
||||
`/etc/pf.conf`:
|
||||
```
|
||||
rdr pass on em1 inet6 proto tcp to port {80,443} -> fe80::31c:29ff:dee2:1c4d port 988
|
||||
rdr pass on em1 inet proto tcp to port {80,443} -> 127.0.0.1 port 988
|
||||
```
|
||||
|
||||
```sh
|
||||
$ /opt/zapret/tpws/tpws --port=988 --enable-pf --bind-addr=127.0.0.1 --bind-iface6=em1 --bind-linklocal=force
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> В PF не выходит делать rdr-to с той же системы, где работает proxy.
|
||||
> Вариант с route-to не сохраняет мета информацию. Адрес назначения теряется.
|
||||
> Поэтому этот вариант годится для squid, берущего адрес из протокола прикладного уровня, но не годится для tpws, полагающегося на метаданные ОС.
|
||||
> Поддержка rdr-to реализована через `/dev/pf`, поэтому прозрачный режим **требует root**.
|
||||
|
||||
|
||||
### pfsense
|
||||
|
||||
#### Описание
|
||||
pfsense основан на **FreeBSD** и использует фаервол PF, имеющий проблемы с
|
||||
divert. К счастью, модули ipfw и ipdivert присутствуют в поставке последних
|
||||
версий pfsense. Их можно подгрузить через `kldload`.
|
||||
|
||||
В некоторых более старых версиях pfsense требуется изменить порядок фаерволов
|
||||
через `sysctl`, сделав ipfw первым. В более новых эти параметры `sysctl`
|
||||
отсутствуют, но система работает как надо и без них. В некоторых случаях
|
||||
фаервол PF может ограничивать возможности `dvtws`, в частности в области
|
||||
фрагментации ip.
|
||||
|
||||
Присутствуют по умолчанию правила scrub для реассемблинга фрагментов.
|
||||
|
||||
Бинарики из [`binaries/freebsd-x64`](../binaries/freebsd-x64) собраны под
|
||||
**FreeBSD 11**. Они должны работать и на последующих версиях **FreeBSD**,
|
||||
включая pfsense. Можно пользоваться `install_bin.sh`.
|
||||
|
||||
#### Автозапуск
|
||||
Пример скрипта автозапуска лежит в [`init.d/pfsense`](../init.d/pfsense). Его
|
||||
следует поместить в `/usr/local/etc/rc.d` и отредактировать на предмет правил
|
||||
ipfw и запуска демонов. Есть встроенный редактор `edit` как более приемлемая
|
||||
альтернатива `vi`.
|
||||
|
||||
> [!NOTE]
|
||||
> Поскольку `git` отсутствует, копировать файлы удобнее всего через `ssh`.
|
||||
> `curl` присутствует по умолчанию. Можно скопировать zip с файлами zapret и
|
||||
> распаковать в `/opt`, как это делается на других системах. Тогда `dvtws`
|
||||
> нужно запускать как `/opt/zapret/nfq/dvtws`. Либо скопировать только `dvtws`
|
||||
> в `/usr/local/sbin`. Как вам больше нравится.
|
||||
|
||||
> [!NOTE]
|
||||
> Скрипты ipset работают, крон есть. Можно сделать автообновление листов.
|
||||
|
||||
> [!NOTE]
|
||||
> Если вас напрягает бедность имеющегося репозитория, можно включить
|
||||
> репозиторий от **FreeBSD**, который по умолчанию выключен.
|
||||
>
|
||||
> Поменяйте `no` на `yes` в `/usr/local/etc/pkg/repos/FreeBSD.conf`
|
||||
>
|
||||
> Можно установить весь привычный софт, включая `git`, чтобы напрямую скачивать
|
||||
> zapret с github.
|
||||
|
||||
`/usr/local/etc/rc.d/zapret.sh` (chmod `755`):
|
||||
```sh
|
||||
#!/bin/sh
|
||||
|
||||
kldload ipfw
|
||||
kldload ipdivert
|
||||
|
||||
# for older pfsense versions. newer do not have these sysctls
|
||||
sysctl net.inet.ip.pfil.outbound=ipfw,pf
|
||||
sysctl net.inet.ip.pfil.inbound=ipfw,pf
|
||||
sysctl net.inet6.ip6.pfil.outbound=ipfw,pf
|
||||
sysctl net.inet6.ip6.pfil.inbound=ipfw,pf
|
||||
|
||||
ipfw delete 100
|
||||
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted xmit em0
|
||||
pkill ^dvtws$
|
||||
dvtws --daemon --port 989 --dpi-desync=split2
|
||||
|
||||
# required for newer pfsense versions (2.6.0 tested) to return ipfw to functional state
|
||||
pfctl -d ; pfctl -e
|
||||
```
|
||||
|
||||
#### Проблемы tpws
|
||||
Что касается `tpws`, то видимо имеется некоторый конфликт двух фаерволов, и
|
||||
правила fwd в ipfw не работают. Работает перенаправление средствами PF как
|
||||
описано в разделе по **FreeBSD**. В PF можно изменять правила только целыми
|
||||
блоками - якорями (anchors). Нельзя просто так добавить или удалить что-то. Но
|
||||
чтобы какой-то anchor был обработан, на него должна быть ссылка из основного
|
||||
набора правил. Его трогать нельзя, иначе порушится весь фаервол. Поэтому
|
||||
придется править код скриптов pfsense.
|
||||
|
||||
1. Поправьте `/etc/inc/filter.inc` следующим образом:
|
||||
```
|
||||
<...>
|
||||
/* MOD */
|
||||
$natrules .= "# ZAPRET redirection\n";
|
||||
$natrules .= "rdr-anchor \"zapret\"\n";
|
||||
|
||||
$natrules .= "# TFTP proxy\n";
|
||||
$natrules .= "rdr-anchor \"tftp-proxy/*\"\n";
|
||||
<...>
|
||||
```
|
||||
|
||||
2. Напишите файл с содержимым anchor-а (например, `/etc/zapret.anchor`):
|
||||
```
|
||||
rdr pass on em1 inet proto tcp to port {80,443} -> 127.0.0.1 port 988
|
||||
rdr pass on em1 inet6 proto tcp to port {80,443} -> fe80::20c:29ff:5ae3:4821 port 988
|
||||
```
|
||||
|
||||
`fe80::20c:29ff:5ae3:4821` замените на ваш link local адрес LAN интерфейса,
|
||||
либо уберите строчку, если ipv6 не нужен.
|
||||
|
||||
3. Добавьте в автозапуск `/usr/local/etc/rc.d/zapret.sh`:
|
||||
```sh
|
||||
$ pfctl -a zapret -f /etc/zapret.anchor
|
||||
$ pkill ^tpws$
|
||||
$ tpws --daemon --port=988 --enable-pf --bind-addr=127.0.0.1 --bind-iface6=em1 --bind-linklocal=force --split-http-req=method --split-pos=2
|
||||
```
|
||||
|
||||
4. После перезагрузки проверьте, что правила создались:
|
||||
```sh
|
||||
$ pfctl -s nat
|
||||
no nat proto carp all
|
||||
nat-anchor "natearly/*" all
|
||||
nat-anchor "natrules/*" all
|
||||
<...>
|
||||
no rdr proto carp all
|
||||
rdr-anchor "zapret" all
|
||||
rdr-anchor "tftp-proxy/*" all
|
||||
rdr-anchor "miniupnpd" all
|
||||
|
||||
$ pfctl -s nat -a zapret
|
||||
rdr pass on em1 inet proto tcp from any to any port = http -> 127.0.0.1 port 988
|
||||
rdr pass on em1 inet proto tcp from any to any port = https -> 127.0.0.1 port 988
|
||||
rdr pass on em1 inet6 proto tcp from any to any port = http -> fe80::20c:29ff:5ae3:4821 port 988
|
||||
rdr pass on em1 inet6 proto tcp from any to any port = https -> fe80::20c:29ff:5ae3:4821 port 988
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> Так же есть более элегантный способ запуска `tpws` через @reboot в cron и
|
||||
> правило перенаправления в UI. Это позволит не редактировать код pfsense.
|
||||
|
||||
|
||||
## OpenBSD
|
||||
|
||||
### tpws bind на ipv4
|
||||
В `tpws` bind по умолчанию только на ipv6. Для bind на ipv4 нужно указать `--bind-addr=0.0.0.0`.
|
||||
Используйте `--bind-addr=0.0.0.0 --bind-addr=::` для достижения того же результата, как в других ОС по умолчанию.
|
||||
Но лучше все же так не делать, а сажать на определенные внутренние адреса или интерфейсы.
|
||||
|
||||
|
||||
### tpws для проходящего трафика
|
||||
|
||||
`/etc/pf.conf`:
|
||||
```
|
||||
pass in quick on em1 inet proto tcp to port {80,443} rdr-to 127.0.0.1 port 988
|
||||
pass in quick on em1 inet6 proto tcp to port {80,443} rdr-to ::1 port 988
|
||||
```
|
||||
|
||||
```sh
|
||||
$ pfctl -f /etc/pf.conf
|
||||
$ tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> В PF не выходит делать rdr-to с той же системы, где работает proxy.
|
||||
> Вариант с route-to не сохраняет мета информацию. Адрес назначения теряется.
|
||||
> Поэтому этот вариант годится для squid, берущего адрес из протокола прикладного уровня, но не годится для tpws, полагающегося на метаданные ОС.
|
||||
> Поддержка rdr-to реализована через `/dev/pf`, поэтому прозрачный режим **требует root**.
|
||||
|
||||
|
||||
### Запуск dvtws
|
||||
|
||||
#### Весь трафик
|
||||
`/etc/pf.conf`:
|
||||
```
|
||||
pass in quick on em0 proto tcp from port {80,443} flags SA/SA divert-packet port 989 no state
|
||||
pass in quick on em0 proto tcp from port {80,443} no state
|
||||
pass out quick on em0 proto tcp to port {80,443} divert-packet port 989 no state
|
||||
```
|
||||
|
||||
```sh
|
||||
$ pfctl -f /etc/pf.conf
|
||||
$ ./dvtws --port=989 --dpi-desync=split2
|
||||
```
|
||||
|
||||
#### Трафик только на таблицу zapret, за исключением таблицы nozapret
|
||||
|
||||
`/etc/pf.conf`:
|
||||
```
|
||||
set limit table-entries 2000000
|
||||
table <zapret> file "/opt/zapret/ipset/zapret-ip.txt"
|
||||
table <zapret-user> file "/opt/zapret/ipset/zapret-ip-user.txt"
|
||||
table <nozapret> file "/opt/zapret/ipset/zapret-ip-exclude.txt"
|
||||
pass out quick on em0 inet proto tcp to <nozapret> port {80,443}
|
||||
pass in quick on em0 inet proto tcp from <zapret> port {80,443} flags SA/SA divert-packet port 989 no state
|
||||
pass in quick on em0 inet proto tcp from <zapret> port {80,443} no state
|
||||
pass out quick on em0 inet proto tcp to <zapret> port {80,443} divert-packet port 989 no state
|
||||
pass in quick on em0 inet proto tcp from <zapret-user> port {80,443} flags SA/SA divert-packet port 989 no state
|
||||
pass in quick on em0 inet proto tcp from <zapret-user> port {80,443} no state
|
||||
pass out quick on em0 inet proto tcp to <zapret-user> port {80,443} divert-packet port 989 no state
|
||||
table <zapret6> file "/opt/zapret/ipset/zapret-ip6.txt"
|
||||
table <zapret6-user> file "/opt/zapret/ipset/zapret-ip-user6.txt"
|
||||
table <nozapret6> file "/opt/zapret/ipset/zapret-ip-exclude6.txt"
|
||||
pass out quick on em0 inet6 proto tcp to <nozapret6> port {80,443}
|
||||
pass in quick on em0 inet6 proto tcp from <zapret6> port {80,443} flags SA/SA divert-packet port 989 no state
|
||||
pass in quick on em0 inet6 proto tcp from <zapret6> port {80,443} no state
|
||||
pass out quick on em0 inet6 proto tcp to <zapret6> port {80,443} divert-packet port 989 no state
|
||||
pass in quick on em0 inet6 proto tcp from <zapret6-user> port {80,443} flags SA/SA divert-packet port 989 no state
|
||||
pass in quick on em0 inet6 proto tcp from <zapret6-user> port {80,443} no state
|
||||
pass out quick on em0 inet6 proto tcp to <zapret6-user> port {80,443} divert-packet port 989 no state
|
||||
```
|
||||
|
||||
```sh
|
||||
$ pfctl -f /etc/pf.conf
|
||||
$ ./dvtws --port=989 --dpi-desync=split2
|
||||
```
|
||||
|
||||
|
||||
### Проблемы с badsum
|
||||
**OpenBSD** принудительно пересчитывает tcp checksum после divert, поэтому
|
||||
скорее всего `dpi-desync-fooling=badsum` у вас не заработает. При использовании
|
||||
этого параметра `dvtws` предупредит о возможной проблеме.
|
||||
|
||||
|
||||
### Особенность отправки fake пакетов
|
||||
В **OpenBSD** `dvtws` все фейки отсылает через divert socket, поскольку эта
|
||||
возможность через raw sockets заблокирована. Видимо PF автоматически
|
||||
предотвращает повторный заворот diverted фреймов, поэтому проблемы зацикливания
|
||||
нет.
|
||||
|
||||
divert-packet автоматически вносит обратное правило для перенаправления. Трюк с
|
||||
no state и in правилом позволяет обойти эту проблему, чтобы напрасно не гнать
|
||||
массивный трафик через `dvtws`.
|
||||
|
||||
|
||||
### Перезагрузка PF таблиц
|
||||
Скрипты из ipset не перезагружают таблицы в PF по умолчанию.
|
||||
|
||||
Чтобы они это делали, добавьте параметр в `/opt/zapret/config`:
|
||||
```
|
||||
LISTS_RELOAD="pfctl -f /etc/pf.conf"
|
||||
```
|
||||
|
||||
Более новые версии `pfctl` понимают команду перезагрузить только таблицы. Но это не относится к **OpenBSD**. В новых **FreeBSD** есть.
|
||||
```sh
|
||||
$ pfctl -Tl -f /etc/pf.conf
|
||||
```
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Не забудьте выключить сжатие gzip: `GZIP_LISTS=0`
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Если в вашей конфигурации какого-то файла листа нет, то его необходимо
|
||||
> исключить из правил PF. Если вдруг листа нет, и он задан в pf.conf, будет
|
||||
> ошибка перезагрузки фаервола.
|
||||
|
||||
> [!NOTE]
|
||||
> После настройки обновление листов можно поместить в cron:
|
||||
> ```sh
|
||||
> $ crontab -e
|
||||
> ```
|
||||
>
|
||||
> ```
|
||||
> <...>
|
||||
> 0 12 */2 * * /opt/zapret/ipset/get_config.sh
|
||||
> ```
|
||||
|
||||
|
||||
## MacOS
|
||||
|
||||
### Введение
|
||||
Иначально ядро этой ОС "darwin" основывалось на **BSD**, потому в ней много
|
||||
похожего на другие версии **BSD**. Однако, как и в других массовых коммерческих
|
||||
проектах, приоритеты смещаются в сторону от оригинала. Яблочники что хотят, то
|
||||
и творят.
|
||||
|
||||
|
||||
### dvtws бесполезен
|
||||
Раньше был ipfw, потом его убрали, заменили на PF. Есть сомнения, что divert
|
||||
сокеты в ядре остались. Попытка создать divert socket не выдает ошибок, но
|
||||
полученный сокет ведет себя точно так же, как raw, со всеми его унаследованными
|
||||
косяками + еще яблочно специфическими. В PF divert-packet не работает. Простой
|
||||
grep бинарика `pfctl` показывает, что там нет слова "divert", а в других
|
||||
версиях **BSD** оно есть. `dvtws` собирается, но совершенно бесполезен.
|
||||
|
||||
|
||||
### tpws
|
||||
`tpws` удалось адаптировать, он работоспособен. Получение адреса назначения для
|
||||
прозрачного прокси в PF (`DIOCNATLOOK`) убрали из заголовков в новых SDK,
|
||||
сделав фактически недокументированным.
|
||||
|
||||
В `tpws` перенесены некоторые определения из более старых версий яблочных SDK.
|
||||
С ними удалось завести прозрачный режим. Однако, что будет в следующих версиях
|
||||
угадать сложно. Гарантий нет. Еще одной особенностью PF в **MacOS** является
|
||||
проверка на рута в момент обращения к `/dev/pf`, чего нет в остальных **BSD**.
|
||||
`tpws` по умолчанию сбрасывает рутовые привилегии. Необходимо явно указать
|
||||
параметр `--user=root`. В остальном PF себя ведет похоже на **FreeBSD**.
|
||||
Синтаксис `pf.conf` тот же.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> На **MacOS** работает редирект как с проходящего трафика, так и с локальной
|
||||
> системы через route-to. Поскольку `tpws` вынужден работать под root, для
|
||||
> исключения рекурсии приходится пускать исходящий от root трафик напрямую.
|
||||
> Отсюда имеем недостаток - **обход DPI для рута работать НЕ будет**.
|
||||
|
||||
#### Работа в прозрачном режиме только для исходящих запросов
|
||||
`/etc/pf.conf`:
|
||||
```
|
||||
rdr pass on lo0 inet proto tcp from !127.0.0.0/8 to any port {80,443} -> 127.0.0.1 port 988
|
||||
rdr pass on lo0 inet6 proto tcp from !::1 to any port {80,443} -> fe80::1 port 988
|
||||
pass out route-to (lo0 127.0.0.1) inet proto tcp from any to any port {80,443} user { >root }
|
||||
pass out route-to (lo0 fe80::1) inet6 proto tcp from any to any port {80,443} user { >root }
|
||||
```
|
||||
|
||||
```sh
|
||||
$ pfctl -ef /etc/pf.conf
|
||||
$ /opt/zapret/tpws/tpws --user=root --port=988 --bind-addr=127.0.0.1 --bind-iface6=lo0 --bind-linklocal=force
|
||||
```
|
||||
|
||||
#### Работа в прозрачном режиме
|
||||
> [!NOTE]
|
||||
> Предполагается, что имя LAN интерфейса - `en1`
|
||||
|
||||
```sh
|
||||
$ ifconfig en1 | grep fe80
|
||||
inet6 fe80::bbbb:bbbb:bbbb:bbbb%en1 prefixlen 64 scopeid 0x8
|
||||
```
|
||||
|
||||
`/etc/pf.conf`:
|
||||
```
|
||||
rdr pass on en1 inet proto tcp from any to any port {80,443} -> 127.0.0.1 port 988
|
||||
rdr pass on en1 inet6 proto tcp from any to any port {80,443} -> fe80::bbbb:bbbb:bbbb:bbbb port 988
|
||||
rdr pass on lo0 inet proto tcp from !127.0.0.0/8 to any port {80,443} -> 127.0.0.1 port 988
|
||||
rdr pass on lo0 inet6 proto tcp from !::1 to any port {80,443} -> fe80::1 port 988
|
||||
pass out route-to (lo0 127.0.0.1) inet proto tcp from any to any port {80,443} user { >root }
|
||||
pass out route-to (lo0 fe80::1) inet6 proto tcp from any to any port {80,443} user { >root }
|
||||
```
|
||||
|
||||
```sh
|
||||
$ pfctl -ef /etc/pf.conf
|
||||
$ /opt/zapret/tpws/tpws --user=root --port=988 --bind-addr=127.0.0.1 --bind-iface6=lo0 --bind-linklocal=force --bind-iface6=en1 --bind-linklocal=force
|
||||
```
|
||||
|
||||
|
||||
### Проблема link-local адреса
|
||||
Если вы пользуетесь **MaсOS** в качестве ipv6 роутера, то нужно будет
|
||||
решить вопрос с регулярно изменяемым link-local адресом. С некоторых версий
|
||||
**MacOS** использует по умолчанию постоянные "secured" ipv6 адреса вместо
|
||||
генерируемых на базе MAC адреса.
|
||||
|
||||
Все замечательно, но есть одна проблема. Постоянными остаются только global
|
||||
scope адреса. Link locals периодически меняются. Смена завязана на системное
|
||||
время. Перезагрузки адрес не меняют, Но если перевести время на день вперед и
|
||||
перезагрузиться - link local станет другим (по крайней мере в vmware это так).
|
||||
Информации по вопросу крайне мало, но тянет на баг. Не должен меняться link
|
||||
local. Скрывать link local не имеет смысла, а динамический link local нельзя
|
||||
использовать в качестве адреса шлюза. Проще всего отказаться от "secured"
|
||||
адресов. Для этого поместите строчку `net.inet6.send.opmode=0` в
|
||||
`/etc/sysctl.conf` и перезагрузите систему.
|
||||
|
||||
Все равно для исходящих соединений будут использоваться temporary адреса, как и
|
||||
в других системах. Или вам идея не по вкусу, можно прописать дополнительный
|
||||
статический ipv6 из диапазона маски `fc00::/7` - выберите любой с длиной
|
||||
префикса `128`. Это можно сделать в системных настройках, создав дополнительный
|
||||
адаптер на базе того же сетевого интерфейса, отключить в нем ipv4 и вписать
|
||||
статический ipv6. Он добавится к автоматически настраеваемым.
|
||||
|
||||
|
||||
### Сборка
|
||||
```sh
|
||||
$ make -C /opt/zapret mac
|
||||
```
|
||||
|
||||
|
||||
### Простая установка
|
||||
В **MacOS** поддерживается `install_easy.sh`
|
||||
|
||||
В комплекте идут бинарики, собраные под 64-bit с опцией
|
||||
`-mmacosx-version-min=10.8`. Они должны работать на всех поддерживаемых версиях
|
||||
**MacOS**. Если вдруг не работают - можно собрать свои. Developer tools
|
||||
ставятся автоматом при запуске `make`.
|
||||
|
||||
> [!WARNING]
|
||||
> Internet sharing средствами системы **не поддерживается**!
|
||||
>
|
||||
> Поддерживается только роутер, настроенный своими силами через PF. Если вы
|
||||
> вдруг включили шаринг, а потом выключили, то доступ к сайтам может пропасть
|
||||
> совсем.
|
||||
>
|
||||
> Лечение:
|
||||
> ```sh
|
||||
> $ pfctl -f /etc/pf.conf
|
||||
> ```
|
||||
>
|
||||
> Если вам нужен шаринг интернета, лучше отказаться от прозрачного режима и
|
||||
> использовать socks прокси.
|
||||
|
||||
Для автостарта используется launchd (`/Library/LaunchDaemons/zapret.plist`)
|
||||
Управляющий скрипт : `/opt/zapret/init.d/macos/zapret`
|
||||
|
||||
Следующие команды работают с `tpws` и фаерволом одновременно (если
|
||||
`INIT_APPLY_FW=1` в config)
|
||||
|
||||
```sh
|
||||
$ /opt/zapret/init.d/macos/zapret start
|
||||
$ /opt/zapret/init.d/macos/zapret stop
|
||||
$ /opt/zapret/init.d/macos/zapret restart
|
||||
```
|
||||
|
||||
Работа только с tpws:
|
||||
```sh
|
||||
$ /opt/zapret/init.d/macos/zapret start-daemons
|
||||
$ /opt/zapret/init.d/macos/zapret stop-daemons
|
||||
$ /opt/zapret/init.d/macos/zapret restart-daemons
|
||||
```
|
||||
|
||||
Работа только с PF:
|
||||
```sh
|
||||
$ /opt/zapret/init.d/macos/zapret start-fw
|
||||
$ /opt/zapret/init.d/macos/zapret stop-fw
|
||||
$ /opt/zapret/init.d/macos/zapret restart-fw
|
||||
```
|
||||
|
||||
Перезагрузка всех IP таблиц из файлов:
|
||||
```sh
|
||||
$ /opt/zapret/init.d/macos/zapret reload-fw-tables
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> Инсталятор настраивает `LISTS_RELOAD` в config, так что скрипты
|
||||
> [`ipset/*.sh`](../ipset/) автоматически перезагружают IP таблицы в PF.
|
||||
|
||||
> [!NOTE]
|
||||
> Автоматически создается cron job на
|
||||
> [`ipset/get_config.sh`](../ipset/get_config.sh), по аналогии с openwrt.
|
||||
|
||||
При start-fw скрипт автоматически модицифирует `/etc/pf.conf`, вставляя туда
|
||||
anchors "zapret". Модификация расчитана на `pf.conf`, в котором сохранены
|
||||
дефолтные anchors от apple. Если у вас измененный `pf.conf` и модификация не
|
||||
удалась, об этом будет предупреждение. Не игнорируйте его. В этом случае вам
|
||||
нужно вставить в свой `pf.conf` (в соответствии с порядком типов правил):
|
||||
```
|
||||
rdr-anchor "zapret"
|
||||
anchor "zapret"
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> При деинсталяции через `uninstall_easy.sh` модификации `pf.conf` убираются.
|
||||
|
||||
> [!NOTE]
|
||||
> start-fw создает 3 файла anchors в `/etc/pf.anchors`: `zapret`, `zapret-v4`,
|
||||
> `zapret-v6`. Последние 2 подключаются из anchor "zapret".
|
||||
|
||||
> [!NOTE]
|
||||
> Таблицы `nozapret` и `nozapret6` принадлежат anchor "zapret".
|
||||
>
|
||||
> Таблицы `zapret` и `zapret-user` в anchor "zapret-v4".
|
||||
>
|
||||
> Таблицы `zapret6` и `zapret6-user` в anchor "zapret-v6".
|
||||
>
|
||||
> Если какая-то версия протокола отключена - соответствующий anchor пустой и не
|
||||
> упоминается в anchor "zapret". Таблицы и правила создаются только на те
|
||||
> листы, которые фактически есть в директории ipset.
|
||||
|
||||
|
||||
### Вариант Custom
|
||||
Так же как и в других системах, поддерживаемых в простом инсталяторе, можно
|
||||
создавать свои custom скрипты.
|
||||
|
||||
Расположение: `/opt/zapret/init.d/macos/custom`
|
||||
|
||||
`zapret_custom_daemons()` получает в `$1`: `0` или `1`. `0` = stop, `1` = start
|
||||
|
||||
custom firewall отличается от linux варианта. Вместо заполнения `iptables` вам
|
||||
нужно сгенерировать правила для `zapret-v4` и `zapret-v6` anchors и выдать их в
|
||||
stdout. Это делается в функциях `zapret_custom_firewall_v4()` и
|
||||
`zapret_custom_firewall_v6()`. Определения таблиц заполняются основным скриптом
|
||||
\- вам это делать не нужно. Можно ссылаться на таблицы `zapret` и `zapret-user`
|
||||
в v4, `zapret6` и `zapret6-user`.
|
||||
|
||||
Cм. пример [в файле](../init.d/macos/custom.d.examples/50-extra-tpws).
|
476
docs/bsd.txt
476
docs/bsd.txt
@@ -1,476 +0,0 @@
|
||||
Поддерживаемые версии
|
||||
---------------------
|
||||
|
||||
FreeBSD 11.x+ , OpenBSD 6.x+, частично MacOS Sierra+
|
||||
|
||||
На более старых может собираться, может не собираться, может работать или не работать.
|
||||
На FreeBSD 10 собирается и работает dvtws. С tpws есть проблемы из-за слишком старой версии компилятора clang.
|
||||
Вероятно, будет работать, если обновить компилятор.
|
||||
Возможна прикрутка к последним версиям pfsense без веб интерфейса в ручном режиме через консоль.
|
||||
|
||||
|
||||
Особенности BSD систем
|
||||
----------------------
|
||||
|
||||
В BSD нет nfqueue. Похожий механизм - divert sockets.
|
||||
Из каталога "nfq" под BSD собирается dvtws вместо nfqws.
|
||||
Он разделяет с nfqws большую часть кода и почти совпадает по параметрам командной строки.
|
||||
|
||||
FreeBSD содержит 3 фаервола : IPFilter, ipfw и Packet Filter (PF). OpenBSD содержит только PF.
|
||||
|
||||
Под FreeBSD tpws и dvtws собираются через "make", под OpenBSD - "make bsd", под MacOS - "make mac".
|
||||
FreeBSD make распознает BSDmakefile , OpenBSD и MacOS - нет. Поэтому там используется отдельный target в Makefile.
|
||||
Сборка всех исходников : make -C /opt/zapret
|
||||
|
||||
divert сокет - внутренний тип сокета ядра BSD. Он не привязывается ни к какому сетевому адресу, не участвует
|
||||
в обмене данными через сеть и идентифицируется по номеру порта 1..65535. Аналогия с номером очереди NFQUEUE.
|
||||
На divert сокеты заворачивается трафик посредством правил ipfw или PF.
|
||||
Если в фаерволе есть правило divert, но на divert порту никто не слушает, то пакеты дропаются.
|
||||
Это поведение аналогично правилам NFQUEUE без параметра --queue-bypass.
|
||||
На FreeBSD divert сокеты могут быть только ipv4, хотя на них принимаются и ipv4, и ipv6 фреймы.
|
||||
На OpenBSD divert сокеты создаются отдельно для ipv4 и ipv6 и работают только с одной версией ip каждый.
|
||||
На MacOS похоже, что divert сокеты из ядра вырезаны. См подробнее раздел про MacOS.
|
||||
Отсылка в divert сокет работает аналогично отсылке через raw socket на linux. Передается полностью IP фрейм, начиная
|
||||
с ip загловка . Эти особенности учитываются в dvtws.
|
||||
|
||||
Скрипты ipset/*.sh при наличии ipfw работают с ipfw lookup tables.
|
||||
Это прямой аналог ipset. lookup tables не разделены на v4 и v6. Они могут содержать v4 и v6 адреса и подсети одновременно.
|
||||
Если ipfw отсутствует, то действие зависит от переменной LISTS_RELOAD в config.
|
||||
Если она задана, то выполняется команда из LISTS_RELOAD. В противном случае не делается ничего.
|
||||
Если LISTS_RELOAD=-, то заполнение таблиц отключается даже при наличии ipfw.
|
||||
|
||||
PF может загружать ip таблицы из файла. Чтобы использовать эту возможность следует отключить сжатие gzip для листов
|
||||
через параметр файла config "GZIP_LISTS=0".
|
||||
|
||||
BSD не содержит системного вызова splice. tpws работает через переброску данных в user mode в оба конца.
|
||||
Это медленнее, но не критически.
|
||||
Управление асинхронными сокетами в tpws основано на linux-specific механизме epoll.
|
||||
В BSD для его эмуляции используется epoll-shim - прослойка для эмуляции epoll на базе kqueue.
|
||||
|
||||
mdig и ip2net полностью работоспособны в BSD. В них нет ничего системо-зависимого.
|
||||
|
||||
FreeBSD
|
||||
-------
|
||||
|
||||
divert сокеты требуют специального модуля ядра ipdivert.
|
||||
Поместите следующие строки в /boot/loader.conf (создать, если отсутствует) :
|
||||
-----------
|
||||
ipdivert_load="YES"
|
||||
net.inet.ip.fw.default_to_accept=1
|
||||
-----------
|
||||
В /etc/rc.conf :
|
||||
-----------
|
||||
firewall_enable="YES"
|
||||
firewall_script="/etc/rc.firewall.my"
|
||||
-----------
|
||||
/etc/rc.firewall.my :
|
||||
-----------
|
||||
ipfw -q -f flush
|
||||
-----------
|
||||
В /etc/rc.firewall.my можно дописывать правила ipfw, чтобы они восстанавливались после перезагрузки.
|
||||
Оттуда же можно запускать и демоны zapret, добавив в параметры "--daemon". Например так :
|
||||
-----------
|
||||
pkill ^dvtws$
|
||||
/opt/zapret/nfq/dvtws --port=989 --daemon --dpi-desync=split2
|
||||
-----------
|
||||
Для перезапуска фаервола и демонов достаточно будет сделать : /etc/rc.d/ipfw restart
|
||||
|
||||
|
||||
Краткая инструкция по запуску tpws в прозрачном режиме.
|
||||
Предполагается, что интерфейс LAN называется em1, WAN - em0.
|
||||
|
||||
Для всего трафика :
|
||||
ipfw delete 100
|
||||
ipfw add 100 fwd 127.0.0.1,988 tcp from me to any 80,443 proto ip4 xmit em0 not uid daemon
|
||||
ipfw add 100 fwd ::1,988 tcp from me to any 80,443 proto ip6 xmit em0 not uid daemon
|
||||
ipfw add 100 fwd 127.0.0.1,988 tcp from any to any 80,443 proto ip4 recv em1
|
||||
ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1
|
||||
/opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
|
||||
|
||||
Для трафика только на таблицу zapret, за исключением таблицы nozapret :
|
||||
ipfw delete 100
|
||||
ipfw add 100 allow tcp from me to table\(nozapret\) 80,443
|
||||
ipfw add 100 fwd 127.0.0.1,988 tcp from me to table\(zapret\) 80,443 proto ip4 xmit em0 not uid daemon
|
||||
ipfw add 100 fwd ::1,988 tcp from me to table\(zapret\) 80,443 proto ip6 xmit em0 not uid daemon
|
||||
ipfw add 100 allow tcp from any to table\(nozapret\) 80,443 recv em1
|
||||
ipfw add 100 fwd 127.0.0.1,988 tcp from any to any 80,443 proto ip4 recv em1
|
||||
ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1
|
||||
/opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
|
||||
|
||||
Таблицы zapret, nozapret, ipban создаются скриптами из ipset по аналогии с Linux.
|
||||
Обновление скриптов можно забить в cron под root :
|
||||
crontab -e
|
||||
Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh"
|
||||
|
||||
При использовании ipfw tpws не требует повышенных привилегий для реализации прозрачного режима.
|
||||
Однако, без рута невозможен бинд на порты <1024 и смена UID/GID. Без смены UID будет рекурсия,
|
||||
поэтому правила ipfw нужно создавать с учетом UID, под которым работает tpws.
|
||||
Переадресация на порты >=1024 может создать угрозу перехвата трафика непривилегированным
|
||||
процессом, если вдруг tpws не запущен.
|
||||
|
||||
|
||||
Краткая инструкция по запуску dvtws.
|
||||
|
||||
Для всего трафика :
|
||||
ipfw delete 100
|
||||
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted xmit em0
|
||||
# required for autottl mode only
|
||||
ipfw add 100 divert 989 tcp from any 80,443 to any tcpflags syn,ack in not diverted recv em0
|
||||
/opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2
|
||||
|
||||
Для трафика только на таблицу zapret, за исключением таблицы nozapret :
|
||||
ipfw delete 100
|
||||
ipfw add 100 allow tcp from me to table\(nozapret\) 80,443
|
||||
ipfw add 100 divert 989 tcp from any to table\(zapret\) 80,443 out not diverted not sockarg xmit em0
|
||||
# required for autottl mode only
|
||||
ipfw add 100 divert 989 tcp from table\(zapret\) 80,443 to any tcpflags syn,ack in not diverted not sockarg recv em0
|
||||
/opt/zapret/nfq/dvtws --port=989 --dpi-desync=split2
|
||||
|
||||
|
||||
PF в FreeBSD:
|
||||
Настройка аналогична OpenBSD, но есть важные нюансы.
|
||||
1) В FreeBSD поддержка PF в tpws отключена по умолчанию. Чтобы ее включить, нужно использовать параметр --enable-pf.
|
||||
2) Нельзя сделать ipv6 rdr на ::1. Нужно делать на link-local адрес входящего интерфейса.
|
||||
Смотрите через ifconfig адрес fe80:... и добавляете в правило
|
||||
3) Синтаксис pf.conf немного отличается. Более новая версия PF.
|
||||
4) Лимит на количество элементов таблиц задается так : sysctl net.pf.request_maxcount=2000000
|
||||
5) divert-to сломан. Он работает, но не работает механизм предотвращения зацикливаний.
|
||||
Кто-то уже написал патч, но в 14-RELEASE проблема все еще есть.
|
||||
Следовательно, на данный момент работа dvtws через pf невозможна.
|
||||
|
||||
/etc/pf.conf
|
||||
-----------
|
||||
rdr pass on em1 inet6 proto tcp to port {80,443} -> fe80::31c:29ff:dee2:1c4d port 988
|
||||
rdr pass on em1 inet proto tcp to port {80,443} -> 127.0.0.1 port 988
|
||||
-----------
|
||||
/opt/zapret/tpws/tpws --port=988 --enable-pf --bind-addr=127.0.0.1 --bind-iface6=em1 --bind-linklocal=force
|
||||
|
||||
В PF непонятно как делать rdr-to с той же системы, где работает proxy. Вариант с route-to у меня не заработал.
|
||||
|
||||
|
||||
pfsense
|
||||
-------
|
||||
|
||||
pfsense основано на FreeBSD.
|
||||
pfsense использует фаервол pf, а он имеет проблемы с divert.
|
||||
К счастью, модули ipfw и ipdivert присутствуют в поставке последних версий pfsense.
|
||||
Их можно подгрузить через kldload.
|
||||
В некоторых более старых версиях pfsense требуется изменить порядок фаерволов через sysctl, сделав ipfw первым.
|
||||
В более новых эти параметры sysctl отсутствуют, но система работает как надо и без них.
|
||||
В некоторых случаях фаервол pf может ограничивать возможности dvtws, в частности в области фрагментации ip.
|
||||
Присутствуют по умолчанию правила scrub для реассемблинга фрагментов.
|
||||
Бинарики из binaries/freebsd-x64 собраны под FreeBSD 11. Они должны работать и на последующих версиях FreeBSD,
|
||||
включая pfsense. Можно пользоваться install_bin.sh.
|
||||
|
||||
Пример скрипта автозапуска лежит в init.d/pfsense. Его следует поместить в /usr/local/etc/rc.d и отредактировать
|
||||
на предмет правил ipfw и запуска демонов. Есть встроенный редактор edit как более приемлемая альтернатива vi.
|
||||
Поскольку git отсутствует, копировать файлы удобнее всего через ssh. curl присутствует по умолчанию.
|
||||
Можно скопировать zip с файлами zapret и распаковать в /opt, как это делается на других системах.
|
||||
Тогда dvtws нужно запускать как /opt/zapret/nfq/dvtws. Либо скопировать только dvtws в /usr/local/sbin.
|
||||
Как вам больше нравится.
|
||||
ipset скрипты работают, крон есть. Можно сделать автообновление листов.
|
||||
|
||||
Если вас напрягает бедность имеющегося репозитория, можно включить репозиторий от FreeBSD, который по умолчанию выключен.
|
||||
Поменяйте no на yes в /usr/local/etc/pkg/repos/FreeBSD.conf
|
||||
Можно установить весь привычный soft, включая git, чтобы напрямую скачивать zapret с github.
|
||||
|
||||
/usr/local/etc/rc.d/zapret.sh (chmod 755)
|
||||
-----------
|
||||
#!/bin/sh
|
||||
|
||||
kldload ipfw
|
||||
kldload ipdivert
|
||||
|
||||
# for older pfsense versions. newer do not have these sysctls
|
||||
sysctl net.inet.ip.pfil.outbound=ipfw,pf
|
||||
sysctl net.inet.ip.pfil.inbound=ipfw,pf
|
||||
sysctl net.inet6.ip6.pfil.outbound=ipfw,pf
|
||||
sysctl net.inet6.ip6.pfil.inbound=ipfw,pf
|
||||
|
||||
ipfw delete 100
|
||||
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted xmit em0
|
||||
pkill ^dvtws$
|
||||
dvtws --daemon --port 989 --dpi-desync=split2
|
||||
|
||||
# required for newer pfsense versions (2.6.0 tested) to return ipfw to functional state
|
||||
pfctl -d ; pfctl -e
|
||||
-----------
|
||||
|
||||
Что касается tpws, то видимо имеется некоторый конфликт двух фаерволов, и правила fwd в ipfw не работают.
|
||||
Работает перенаправление средствами pf как описано в разделе по FreeBSD.
|
||||
В pf можно изменять правила только целыми блоками - якорями (anchors). Нельзя просто так добавить или удалить что-то.
|
||||
Но чтобы какой-то anchor был обработан, на него должна быть ссылка из основного набора правил.
|
||||
Его трогать нельзя, иначе порушится весь фаервол.
|
||||
Поэтому придется править код скриптов pfsense. Поправьте /etc/inc/filter.inc следующим образом :
|
||||
-----------
|
||||
.................
|
||||
/* MOD */
|
||||
$natrules .= "# ZAPRET redirection\n";
|
||||
$natrules .= "rdr-anchor \"zapret\"\n";
|
||||
|
||||
$natrules .= "# TFTP proxy\n";
|
||||
$natrules .= "rdr-anchor \"tftp-proxy/*\"\n";
|
||||
.................
|
||||
-----------
|
||||
|
||||
Напишите файл с содержимым anchor-а (например, /etc/zapret.anchor):
|
||||
-----------
|
||||
rdr pass on em1 inet proto tcp to port {80,443} -> 127.0.0.1 port 988
|
||||
rdr pass on em1 inet6 proto tcp to port {80,443} -> fe80::20c:29ff:5ae3:4821 port 988
|
||||
-----------
|
||||
fe80::20c:29ff:5ae3:4821 замените на ваш link local адрес LAN интерфейса, либо уберите строчку, если ipv6 не нужен.
|
||||
|
||||
Добавьте в автозапуск /usr/local/etc/rc.d/zapret.sh :
|
||||
-----------
|
||||
pfctl -a zapret -f /etc/zapret.anchor
|
||||
pkill ^tpws$
|
||||
tpws --daemon --port=988 --enable-pf --bind-addr=127.0.0.1 --bind-iface6=em1 --bind-linklocal=force --split-http-req=method --split-pos=2
|
||||
-----------
|
||||
|
||||
После перезагрузки проверьте, что правила создались :
|
||||
-----------
|
||||
[root@pfSense /]# pfctl -s nat
|
||||
no nat proto carp all
|
||||
nat-anchor "natearly/*" all
|
||||
nat-anchor "natrules/*" all
|
||||
...................
|
||||
no rdr proto carp all
|
||||
rdr-anchor "zapret" all
|
||||
rdr-anchor "tftp-proxy/*" all
|
||||
rdr-anchor "miniupnpd" all
|
||||
[root@pfSense /]# pfctl -s nat -a zapret
|
||||
rdr pass on em1 inet proto tcp from any to any port = http -> 127.0.0.1 port 988
|
||||
rdr pass on em1 inet proto tcp from any to any port = https -> 127.0.0.1 port 988
|
||||
rdr pass on em1 inet6 proto tcp from any to any port = http -> fe80::20c:29ff:5ae3:4821 port 988
|
||||
rdr pass on em1 inet6 proto tcp from any to any port = https -> fe80::20c:29ff:5ae3:4821 port 988
|
||||
-----------
|
||||
|
||||
Так же есть более элегантный способ запуска tpws через @reboot в cron и правило перенаправления в UI.
|
||||
Это позволит не редактировать код pfsense.
|
||||
|
||||
|
||||
OpenBSD
|
||||
-------
|
||||
|
||||
В tpws бинд по умолчанию только на ipv6. для бинда на ipv4 указать "--bind-addr=0.0.0.0"
|
||||
Используйте --bind-addr=0.0.0.0 --bind-addr=:: для достижения того же результата, как в других ОС по умолчанию.
|
||||
(лучше все же так не делать, а сажать на определенные внутренние адреса или интерфейсы)
|
||||
|
||||
tpws для проходящего трафика :
|
||||
|
||||
/etc/pf.conf
|
||||
------------
|
||||
pass in quick on em1 inet proto tcp to port {80,443} rdr-to 127.0.0.1 port 988
|
||||
pass in quick on em1 inet6 proto tcp to port {80,443} rdr-to ::1 port 988
|
||||
------------
|
||||
pfctl -f /etc/pf.conf
|
||||
tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
|
||||
|
||||
В PF непонятно как делать rdr-to с той же системы, где работает proxy. Вариант с route-to у меня не заработал.
|
||||
Поддержка rdr-to реализована через /dev/pf, поэтому прозрачный режим требует root.
|
||||
|
||||
dvtws для всего трафика :
|
||||
|
||||
/etc/pf.conf
|
||||
------------
|
||||
pass in quick on em0 proto tcp from port {80,443} flags SA/SA divert-packet port 989 no state
|
||||
pass in quick on em0 proto tcp from port {80,443} no state
|
||||
pass out quick on em0 proto tcp to port {80,443} divert-packet port 989 no state
|
||||
------------
|
||||
pfctl -f /etc/pf.conf
|
||||
./dvtws --port=989 --dpi-desync=split2
|
||||
|
||||
dvtws для трафика только на таблицу zapret, за исключением таблицы nozapret :
|
||||
|
||||
/etc/pf.conf
|
||||
------------
|
||||
set limit table-entries 2000000
|
||||
table <zapret> file "/opt/zapret/ipset/zapret-ip.txt"
|
||||
table <zapret-user> file "/opt/zapret/ipset/zapret-ip-user.txt"
|
||||
table <nozapret> file "/opt/zapret/ipset/zapret-ip-exclude.txt"
|
||||
pass out quick on em0 inet proto tcp to <nozapret> port {80,443}
|
||||
pass in quick on em0 inet proto tcp from <zapret> port {80,443} flags SA/SA divert-packet port 989 no state
|
||||
pass in quick on em0 inet proto tcp from <zapret> port {80,443} no state
|
||||
pass out quick on em0 inet proto tcp to <zapret> port {80,443} divert-packet port 989 no state
|
||||
pass in quick on em0 inet proto tcp from <zapret-user> port {80,443} flags SA/SA divert-packet port 989 no state
|
||||
pass in quick on em0 inet proto tcp from <zapret-user> port {80,443} no state
|
||||
pass out quick on em0 inet proto tcp to <zapret-user> port {80,443} divert-packet port 989 no state
|
||||
table <zapret6> file "/opt/zapret/ipset/zapret-ip6.txt"
|
||||
table <zapret6-user> file "/opt/zapret/ipset/zapret-ip-user6.txt"
|
||||
table <nozapret6> file "/opt/zapret/ipset/zapret-ip-exclude6.txt"
|
||||
pass out quick on em0 inet6 proto tcp to <nozapret6> port {80,443}
|
||||
pass in quick on em0 inet6 proto tcp from <zapret6> port {80,443} flags SA/SA divert-packet port 989 no state
|
||||
pass in quick on em0 inet6 proto tcp from <zapret6> port {80,443} no state
|
||||
pass out quick on em0 inet6 proto tcp to <zapret6> port {80,443} divert-packet port 989 no state
|
||||
pass in quick on em0 inet6 proto tcp from <zapret6-user> port {80,443} flags SA/SA divert-packet port 989 no state
|
||||
pass in quick on em0 inet6 proto tcp from <zapret6-user> port {80,443} no state
|
||||
pass out quick on em0 inet6 proto tcp to <zapret6-user> port {80,443} divert-packet port 989 no state
|
||||
------------
|
||||
pfctl -f /etc/pf.conf
|
||||
./dvtws --port=989 --dpi-desync=split2
|
||||
|
||||
divert-packet автоматически вносит обратное правило для перенаправления.
|
||||
Трюк с no state и in правилом позволяет обойти эту проблему, чтобы напрасно не гнать массивный трафик через dvtws.
|
||||
|
||||
В OpenBSD dvtws все фейки отсылает через divert socket, поскольку эта возможность через raw sockets заблокирована.
|
||||
Видимо pf автоматически предотвращает повторный заворот diverted фреймов, поэтому проблемы зацикливания нет.
|
||||
|
||||
OpenBSD принудительно пересчитывает tcp checksum после divert, поэтому скорее всего
|
||||
dpi-desync-fooling=badsum у вас не заработает. При использовании этого параметра
|
||||
dvtws предупредит о возможной проблеме.
|
||||
|
||||
Скрипты из ipset не перезагружают таблицы в PF по умолчанию.
|
||||
Чтобы они это делали, добавьте параметр в /opt/zapret/config :
|
||||
LISTS_RELOAD="pfctl -f /etc/pf.conf"
|
||||
Более новые версии pfctl понимают команду перезагрузить только таблицы : pfctl -Tl -f /etc/pf.conf
|
||||
Но это не относится к OpenBSD 6.8. В новых FreeBSD есть.
|
||||
Не забудьте выключить сжатие gzip :
|
||||
GZIP_LISTS=0
|
||||
Если в вашей конфигурации какого-то файла листа нет, то его необходимо исключить из правил PF.
|
||||
Если вдруг листа нет, и он задан в pf.conf, будет ошибка перезагрузки фаервола.
|
||||
После настройки обновление листов можно поместить в cron :
|
||||
crontab -e
|
||||
дописать строчку : 0 12 */2 * * /opt/zapret/ipset/get_config.sh
|
||||
|
||||
|
||||
MacOS
|
||||
-----
|
||||
|
||||
Иначально ядро этой ОС "darwin" основывалось на BSD, потому в ней много похожего на другие версии BSD.
|
||||
Однако, как и в других массовых коммерческих проектах, приоритеты смещаются в сторону от оригинала.
|
||||
Яблочники что хотят, то и творят.
|
||||
Раньше был ipfw, потом его убрали, заменили на PF.
|
||||
Есть сомнения, что divert сокеты в ядре остались. Попытка создать divert socket не выдает ошибок,
|
||||
но полученный сокет ведет себя точно так же, как raw, со всеми его унаследованными косяками + еще яблочно специфическими.
|
||||
В PF divert-packet не работает. Простой grep бинарика pfctl показывает, что там нет слова "divert",
|
||||
а в других версиях BSD оно есть. dvtws собирается, но совершенно бесполезен.
|
||||
|
||||
tpws удалось адаптировать, он работоспособен. Получение адреса назначения для прозрачного прокси в PF (DIOCNATLOOK)
|
||||
убрали из заголовков в новых SDK, сделав фактически недокументированным.
|
||||
В tpws перенесены некоторые определения из более старых версий яблочных SDK. С ними удалось завести прозрачный режим.
|
||||
Однако, что будет в следующих версиях угадать сложно. Гарантий нет.
|
||||
Еще одной особенностью PF в MacOS является проверка на рута в момент обращения к /dev/pf, чего нет в остальных BSD.
|
||||
tpws по умолчанию сбрасывает рутовые привилегии. Необходимо явно указать параметр --user=root.
|
||||
В остальном PF себя ведет похоже на FreeBSD. Синтаксис pf.conf тот же.
|
||||
|
||||
На MacOS работает редирект как с проходящего трафика, так и с локальной системы через route-to.
|
||||
Поскольку tpws вынужден работать под root, для исключения рекурсии приходится пускать исходящий от root трафик напрямую.
|
||||
Отсюда имеем недостаток : обход DPI для рута работать не будет.
|
||||
|
||||
Если вы пользуетесь MaсOS в качестве ipv6 роутера, то нужно будет решить вопрос с регулярно изменяемым link-local адресом.
|
||||
С некоторых версий MacOS использует по умолчанию постоянные "secured" ipv6 адреса вместо генерируемых на базе MAC адреса.
|
||||
Все замечательно, но есть одна проблема. Постоянными остаются только global scope адреса.
|
||||
Link locals периодически меняются. Смена завязана на системное время. Перезагрузки адрес не меняют,
|
||||
Но если перевести время на день вперед и перезагрузиться - link local станет другим. (по крайней мере в vmware это так)
|
||||
Информации по вопросу крайне мало, но тянет на баг. Не должен меняться link local. Скрывать link local не имеет смысла,
|
||||
а динамический link local нельзя использовать в качестве адреса шлюза.
|
||||
Проще всего отказаться от "secured" адресов.
|
||||
Поместите строчку "net.inet6.send.opmode=0" в /etc/sysctl.conf. Затем перезагрузите систему.
|
||||
Все равно для исходящих соединений будут использоваться temporary адреса, как и в других системах.
|
||||
Или вам идея не по вкусу, можно прописать дополнительный статический ipv6 из диапазона fc00::/7 -
|
||||
выберите любой с длиной префикса 128. Это можно сделать в системных настройках, создав дополнительный адаптер на базе
|
||||
того же сетевого интерфейса, отключить в нем ipv4 и вписать статический ipv6. Он добавится к автоматически настраеваемым.
|
||||
|
||||
Настройка tpws на macos в прозрачном режиме только для исходящих запросов :
|
||||
|
||||
/etc/pf.conf
|
||||
------------
|
||||
rdr pass on lo0 inet proto tcp from !127.0.0.0/8 to any port {80,443} -> 127.0.0.1 port 988
|
||||
rdr pass on lo0 inet6 proto tcp from !::1 to any port {80,443} -> fe80::1 port 988
|
||||
pass out route-to (lo0 127.0.0.1) inet proto tcp from any to any port {80,443} user { >root }
|
||||
pass out route-to (lo0 fe80::1) inet6 proto tcp from any to any port {80,443} user { >root }
|
||||
------------
|
||||
pfctl -ef /etc/pf.conf
|
||||
/opt/zapret/tpws/tpws --user=root --port=988 --bind-addr=127.0.0.1 --bind-iface6=lo0 --bind-linklocal=force
|
||||
|
||||
|
||||
Настройка tpws на macos роутере в прозрачном режиме, где en1 - LAN.
|
||||
|
||||
ifconfig en1 | grep fe80
|
||||
inet6 fe80::bbbb:bbbb:bbbb:bbbb%en1 prefixlen 64 scopeid 0x8
|
||||
/etc/pf.conf
|
||||
------------
|
||||
rdr pass on en1 inet proto tcp from any to any port {80,443} -> 127.0.0.1 port 988
|
||||
rdr pass on en1 inet6 proto tcp from any to any port {80,443} -> fe80::bbbb:bbbb:bbbb:bbbb port 988
|
||||
rdr pass on lo0 inet proto tcp from !127.0.0.0/8 to any port {80,443} -> 127.0.0.1 port 988
|
||||
rdr pass on lo0 inet6 proto tcp from !::1 to any port {80,443} -> fe80::1 port 988
|
||||
pass out route-to (lo0 127.0.0.1) inet proto tcp from any to any port {80,443} user { >root }
|
||||
pass out route-to (lo0 fe80::1) inet6 proto tcp from any to any port {80,443} user { >root }
|
||||
------------
|
||||
pfctl -ef /etc/pf.conf
|
||||
/opt/zapret/tpws/tpws --user=root --port=988 --bind-addr=127.0.0.1 --bind-iface6=lo0 --bind-linklocal=force --bind-iface6=en1 --bind-linklocal=force
|
||||
|
||||
|
||||
Сборка : make -C /opt/zapret mac
|
||||
|
||||
Скрипты получения листов ipset/*.sh работают.
|
||||
Если будете пользоваться ipset/get_combined.sh, нужно установить gnu grep через brew.
|
||||
Имеющийся очень старый и безумно медленный с оцией -f.
|
||||
|
||||
|
||||
MacOS простая установка
|
||||
-----------------------
|
||||
|
||||
В MacOS поддерживается install_easy.sh
|
||||
|
||||
В комплекте идут бинарики, собраные под 64-bit с опцией -mmacosx-version-min=10.8.
|
||||
Они должны работать на всех поддерживаемых версиях macos.
|
||||
Если вдруг не работают - можно собрать свои. Developer tools ставятся автоматом при запуске make.
|
||||
|
||||
!! Internet sharing средствами системы НЕ ПОДДЕРЖИВАЕТСЯ !!
|
||||
Поддерживается только роутер, настроенный своими силами через PF.
|
||||
Если вы вдруг включили шаринг, а потом выключили, то доступ к сайтам может пропасть совсем.
|
||||
Лечение : pfctl -f /etc/pf.conf
|
||||
Если вам нужен шаринг интернета, лучше отказаться от прозрачного режима и использовать socks.
|
||||
|
||||
Для автостарта используется launchd (/Library/LaunchDaemons/zapret.plist)
|
||||
Управляющий скрипт : /opt/zapret/init.d/macos/zapret
|
||||
Следующие команды работают с tpws и фаерволом одновременно (если INIT_APPLY_FW=1 в config)
|
||||
/opt/zapret/init.d/macos/zapret start
|
||||
/opt/zapret/init.d/macos/zapret stop
|
||||
/opt/zapret/init.d/macos/zapret restart
|
||||
Работа только с tpws :
|
||||
/opt/zapret/init.d/macos/zapret start-daemons
|
||||
/opt/zapret/init.d/macos/zapret stop-daemons
|
||||
/opt/zapret/init.d/macos/zapret restart-daemons
|
||||
Работа только с PF :
|
||||
/opt/zapret/init.d/macos/zapret start-fw
|
||||
/opt/zapret/init.d/macos/zapret stop-fw
|
||||
/opt/zapret/init.d/macos/zapret restart-fw
|
||||
Перезагрузка всех IP таблиц из файлов :
|
||||
/opt/zapret/init.d/macos/zapret reload-fw-tables
|
||||
|
||||
Инсталятор настраивает LISTS_RELOAD в config, так что скрипты ipset/*.sh автоматически перезагружают IP таблицы в PF.
|
||||
Автоматически создается cron job на ipset/get_config.sh, по аналогии с openwrt.
|
||||
|
||||
При start-fw скрипт автоматически модицифирует /etc/pf.conf, вставляя туда anchors "zapret".
|
||||
Модификация расчитана на pf.conf, в котором сохранены дефолтные anchors от apple.
|
||||
Если у вас измененный pf.conf и модификация не удалась, об этом будет предупреждение. Не игнорируйте его.
|
||||
В этом случае вам нужно вставить в свой pf.conf (в соответствии с порядком типов правил) :
|
||||
rdr-anchor "zapret"
|
||||
anchor "zapret"
|
||||
При деинсталяции через uninstall_easy.sh модификации pf.conf убираются.
|
||||
|
||||
start-fw создает 3 файла anchors в /etc/pf.anchors : zapret,zapret-v4,zapret-v6.
|
||||
Последние 2 подключаются из anchor "zapret".
|
||||
Таблицы nozapret,nozapret6 принадлежат anchor "zapret".
|
||||
Таблицы zapret,zapret-user - в anchor "zapret-v4".
|
||||
Таблицы zapret6,zapret6-user - в anchor "zapret-v6".
|
||||
Если какая-то версия протокола отключена - соответствующий anchor пустой и не упоминается в anchor "zapret".
|
||||
Таблицы и правила создаются только на те листы, которые фактически есть в директории ipset.
|
||||
|
||||
|
||||
MacOS вариант custom
|
||||
--------------------
|
||||
|
||||
Так же как и в других системах, поддерживаемых в простом инсталяторе, можно создавать свои custom скрипты.
|
||||
Расположение : /opt/zapret/init.d/macos/custom
|
||||
|
||||
zapret_custom_daemons() получает в $1 "0" или "1". "0" - stop, "1" - start
|
||||
custom firewall отличается от linux варианта.
|
||||
Вместо заполнения iptables вам нужно сгенерировать правила для zapret-v4 и zapret-v6 anchors и выдать их в stdout.
|
||||
Это делается в функциях zapret_custom_firewall_v4() и zapret_custom_firewall_v6().
|
||||
Определения таблиц заполняются основным скриптом - вам это делать не нужно.
|
||||
Можно ссылаться на таблицы zapret и zapret-user в v4, zapret6 и zapret6-user.
|
||||
|
||||
Cм. пример в файле custom-tpws
|
@@ -323,3 +323,43 @@ v64:
|
||||
blockcheck: warn if dpi bypass software is already running
|
||||
blockcheck: TPWS_EXTRA, NFQWS_EXTRA
|
||||
init.d: multiple custom scripts
|
||||
|
||||
v65:
|
||||
|
||||
init.d: dynamic number allocation for dnum,tpws_port,qnum
|
||||
init.d: FW_EXTRA_PRE, FW_EXTRA_POST
|
||||
init.d: zapret_custom_firewall_nft_flush
|
||||
nfqws,tpws: l7proto and client ip:port info in autohostlist debug log
|
||||
nfqws,tpws: user mode ipset filter support
|
||||
nfqws,tpws: l7proto filter support
|
||||
tpws: fixed MSS apply in transparent mode
|
||||
nfqws: fixed autottl apply if desync profile changed
|
||||
tpws,nfqws: fixed 100% cpu hang on gzipped list with comments
|
||||
ipset: get_refilter_ipsum.sh , get_refilter_domain.sh
|
||||
|
||||
v66:
|
||||
|
||||
init.d: rewrite traffic interception and daemon launch parameters in config file. this break compatibility with old versions.
|
||||
init.d: openwrt-minimal : tpws launch for low storage openwrt devices
|
||||
|
||||
v67:
|
||||
|
||||
mdig: --dns-make-query, --dns-parse-query for side-channel resolving (DoH)
|
||||
blockcheck: use DoH resolvers if DNS spoof is detected
|
||||
blockcheck: restring fooling to testing domain's IPs
|
||||
nfqws,tpws: internal hostlist deduplication to save RAM
|
||||
nfqws,tpws: hostlist/ipset auto reload on file change. no more HUP.
|
||||
nfqws,tpws: --filter-tcp, --filter-udp take comma separated port range list
|
||||
nfqws,tpws: @<config_file> - read config from a file
|
||||
config: <HOSTLIST_NOAUTO> marker
|
||||
binaries: remove zapret-winws. add win32.
|
||||
blockcheck, install_easy.sh: preserve user environment variables during elevation
|
||||
blockcheck: do not require root if SKIP_PKTWS=1
|
||||
|
||||
v68:
|
||||
|
||||
docs : move russian version to markdown
|
||||
nfqws,tpws: use alternate $ sign for $<config_file>
|
||||
repo: binaries removed from repo. git actions binaries build in releases.
|
||||
uninstall_easy.sh: offer to remove dependencies in openwrt
|
||||
install_easy.sh: allow to download lists in autohostlist filter mode
|
||||
|
@@ -1,42 +1,21 @@
|
||||
How to compile native programs for use in openwrt
|
||||
-------------------------------------------------
|
||||
|
||||
1) <fetch correct version of openwrt>
|
||||
1) Download latest SDK for your platform from https://downloads.openwrt.org
|
||||
|
||||
cd ~
|
||||
|
||||
<chaos calmer>
|
||||
git clone git://git.openwrt.org/15.05/openwrt.git
|
||||
<barrier breaker>
|
||||
git clone git://git.openwrt.org/14.07/openwrt.git
|
||||
<trunk>
|
||||
git clone git://git.openwrt.org/openwrt.git
|
||||
|
||||
cd openwrt
|
||||
curl -o - https://downloads.openwrt.org/releases/23.05.5/targets/x86/64/openwrt-sdk-23.05.5-x86-64_gcc-12.3.0_musl.Linux-x86_64.tar.xz | tar -Jxvf -
|
||||
cd openwrt-sdk-23.05.5-x86-64_gcc-12.3.0_musl.Linux-x86_64
|
||||
|
||||
2) ./scripts/feeds update -a
|
||||
./scripts/feeds install -a
|
||||
|
||||
3) #add zapret packages to build root
|
||||
#copy package descriptions
|
||||
copy compile/openwrt/* to ~/openwrt
|
||||
#copy source code of tpws
|
||||
copy tpws to ~/openwrt/package/zapret/tpws
|
||||
#copy source code of nfq
|
||||
copy nfq to ~/openwrt/package/zapret/nfq
|
||||
#copy source code of ip2net
|
||||
copy ip2net to ~/openwrt/package/zapret/ip2net
|
||||
3) cp -R /opt/zapret/docs/compile/openwrt/. .
|
||||
cp -R /opt/zapret/tpws package/zapret/tpws
|
||||
cp -R /opt/zapret/nfq package/zapret/nfqws
|
||||
cp -R /opt/zapret/mdig package/zapret/mdig
|
||||
cp -R /opt/zapret/ip2net package/zapret/ip2net
|
||||
|
||||
4) make menuconfig
|
||||
#select your target architecture
|
||||
#select packages Network/Zapret/* as "M"
|
||||
4) make package/{tpws,nfqws,mdig,ip2net}/compile
|
||||
|
||||
5) make toolchain/compile
|
||||
|
||||
6) make package/tpws/compile
|
||||
make package/nfqws/compile
|
||||
make package/ip2net/compile
|
||||
make package/mdig/compile
|
||||
|
||||
7) find bin -name tpws*.ipk
|
||||
5) find bin -name tpws*.ipk
|
||||
#take your tpws*.ipk , nfqws*.ipk , ip2net*.ipk, mdig*.ipk from there
|
||||
|
@@ -1,282 +0,0 @@
|
||||
Пример ручной установки на debian-подобную систему
|
||||
--------------------------------------------------
|
||||
|
||||
На debian основано большое количество дистрибутивов linux, включая ubuntu.
|
||||
Здесь рассматриваются прежде всего Debian 8+ и Ubuntu 16+.
|
||||
Но с большой вероятностью может сработать и на производных от них.
|
||||
Главное условие - наличие systemd, apt и нескольких стандартных пакетов в репозитории.
|
||||
|
||||
Установить пакеты :
|
||||
apt-get update
|
||||
apt-get install ipset curl dnsutils git
|
||||
|
||||
Если хотите использовать nftables, то нужен пакет nftables, а ipset не обязателен.
|
||||
|
||||
Скопировать директорию zapret в /opt или скачать через git :
|
||||
cd /opt
|
||||
git clone --depth 1 https://github.com/bol-van/zapret
|
||||
|
||||
Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики.
|
||||
/opt/zapret/install_bin.sh
|
||||
АЛЬТЕРНАТИВА : make -C /opt/zapret. Получите динамические бинарики под вашу ось.
|
||||
Для сборки требуются dev пакеты : zlib1g-dev libcap-dev libnetfilter-queue-dev
|
||||
|
||||
Создать конфиг по умолчанию :
|
||||
cp /opt/zapret/config.default /opt/zapret/config
|
||||
|
||||
Настроить параметры согласно разделу "Выбор параметров".
|
||||
|
||||
Создать user листы по умолчанию :
|
||||
cp /opt/zapret/ipset/zapret-hosts-user-exclude.txt.default /opt/zapret/ipset/zapret-hosts-user-exclude.txt
|
||||
echo nonexistent.domain >/opt/zapret/ipset/zapret-hosts-user.txt
|
||||
touch /opt/zapret/ipset/zapret-hosts-user-ipban.txt
|
||||
|
||||
Создать ссылку на service unit в systemd :
|
||||
ln -fs /opt/zapret/init.d/systemd/zapret.service /lib/systemd/system
|
||||
|
||||
Удалить старые листы, если они были созданы ранее :
|
||||
/opt/zapret/ipset/clear_lists.sh
|
||||
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
|
||||
Выполнить скрипт обновления листа :
|
||||
/opt/zapret/ipset/get_config.sh
|
||||
Настроить таймер systemd для обновления листа :
|
||||
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.service /lib/systemd/system
|
||||
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.timer /lib/systemd/system
|
||||
|
||||
Принять изменения в systemd :
|
||||
systemctl daemon-reload
|
||||
|
||||
Включить автозапуск службы :
|
||||
systemctl enable zapret
|
||||
|
||||
Включить таймер обновления листа :
|
||||
systemctl enable zapret-list-update.timer
|
||||
|
||||
Запустить службу :
|
||||
systemctl start zapret
|
||||
|
||||
Шпаргалка по управлению службой и таймером :
|
||||
|
||||
enable auto start : systemctl enable zapret
|
||||
disable auto start : systemctl disable zapret
|
||||
start : systemctl start zapret
|
||||
stop : systemctl stop zapret
|
||||
status, output messages : systemctl status zapret
|
||||
timer info : systemctl list-timer
|
||||
delete service : systemctl disable zapret ; rm /lib/systemd/system/zapret.service
|
||||
delete timer : systemctl disable zapret-list-update.timer ; rm /lib/systemd/system/zapret-list-update.*
|
||||
|
||||
Centos 7+, Fedora
|
||||
-----------------
|
||||
|
||||
Centos с 7 версии и более-менее новые федоры построены на systemd.
|
||||
В качестве пакетного менеджера используется yum.
|
||||
|
||||
Установить пакеты :
|
||||
yum install -y curl ipset dnsutils git
|
||||
|
||||
Далее все аналогично debian.
|
||||
|
||||
OpenSUSE
|
||||
--------
|
||||
|
||||
Новые OpenSUSE основаны на systemd и менеджере пакетов zypper.
|
||||
|
||||
Установить пакеты :
|
||||
zypper --non-interactive install curl ipset
|
||||
|
||||
Далее все аналогично debian, кроме расположения systemd.
|
||||
В opensuse он находится не в /lib/systemd, а в /usr/lib/systemd.
|
||||
Правильные команды будут :
|
||||
|
||||
ln -fs /opt/zapret/init.d/systemd/zapret.service /usr/lib/systemd/system
|
||||
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.service /usr/lib/systemd/system
|
||||
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.timer /usr/lib/systemd/system
|
||||
|
||||
Arch linux
|
||||
----------
|
||||
|
||||
Построен на базе systemd.
|
||||
|
||||
Установить пакеты :
|
||||
pacman -Syy
|
||||
pacman --noconfirm -S ipset curl
|
||||
|
||||
Далее все аналогично debian.
|
||||
|
||||
Gentoo
|
||||
------
|
||||
|
||||
Эта система использует OpenRC - улучшенную версию sysvinit.
|
||||
Установка пакетов производится командой : emerge <package_name>
|
||||
Пакеты собираются из исходников.
|
||||
|
||||
Требуются все те же ipset, curl, git для скачивания с github.
|
||||
git и curl по умолчанию могут присутствовать, ipset отсутствует.
|
||||
|
||||
emerge ipset
|
||||
|
||||
Настроить параметры согласно разделу "Выбор параметров".
|
||||
|
||||
Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики.
|
||||
/opt/zapret/install_bin.sh
|
||||
АЛЬТЕРНАТИВА : make -C /opt/zapret. Получите динамические бинарики под вашу ось.
|
||||
|
||||
Удалить старые листы, если они были созданы ранее :
|
||||
/opt/zapret/ipset/clear_lists.sh
|
||||
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
|
||||
Выполнить скрипт обновления листа :
|
||||
/opt/zapret/ipset/get_config.sh
|
||||
Зашедулить обновление листа :
|
||||
crontab -e
|
||||
Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh"
|
||||
|
||||
Подключить init скрипт :
|
||||
|
||||
ln -fs /opt/zapret/init.d/openrc/zapret /etc/init.d
|
||||
rc-update add zapret
|
||||
|
||||
Запустить службу :
|
||||
|
||||
rc-service zapret start
|
||||
|
||||
Шпаргалка по управлению службой :
|
||||
|
||||
enable auto start : rc-update add zapret
|
||||
disable auto start : rc-update del zapret
|
||||
start : rc-service zapret start
|
||||
stop : rc-service zapret stop
|
||||
|
||||
|
||||
|
||||
Ручная установка на openwrt/LEDE 15.xx-21.xx
|
||||
--------------------------------------------
|
||||
|
||||
!!! Данная инструкция написана для систем, основанных на iptables+firewall3
|
||||
!!! В новых версиях openwrt переходит на nftables+firewall4, инструкция неприменима. Пользуйтесь install_easy.sh
|
||||
|
||||
Установить дополнительные пакеты :
|
||||
opkg update
|
||||
opkg install iptables-mod-extra iptables-mod-nfqueue iptables-mod-filter iptables-mod-ipopt iptables-mod-conntrack-extra ipset curl
|
||||
(ipv6) opkg install ip6tables-mod-nat
|
||||
(опционально) opkg install gzip
|
||||
(опционально) opkg install coreutils-sort
|
||||
|
||||
ЭКОНОМИЯ МЕСТА :
|
||||
|
||||
gzip от busybox в разы медленней полноценного варианта. gzip используется скриптами получения листов.
|
||||
sort от busybox медленней полноценного варианта и жрет намного больше памяти. sort используется скриптами получения листов.
|
||||
iptables-mod-nfqueue можно выкинуть, если не будем пользоваться nfqws
|
||||
curl можно выкинуть, если для получения ip листа будет использоваться только get_user.sh
|
||||
|
||||
Самая главная трудность - скомпилировать программы на C. Это можно сделать на linux x64 при помощи SDK, который
|
||||
можно скачать с официального сайта openwrt или LEDE. Но процесс кросс компиляции - это всегда сложности.
|
||||
Недостаточно запустить make как на традиционной linux системе.
|
||||
Поэтому в binaries имеются готовые статические бинарики для всех самых распространенных архитектур.
|
||||
Статическая сборка означает, что бинарик не зависит от типа libc (glibc, uclibc или musl) и наличия установленных so.
|
||||
Его можно использовать сразу. Лишь бы подходил тип CPU. У ARM и MIPS есть несколько версий.
|
||||
Скорее всего найдется рабочий вариант. Если нет - вам придется собирать самостоятельно.
|
||||
Для всех поддерживаемых архитектур бинарики запакованы upx. На текущий момент все, кроме mips64.
|
||||
|
||||
Скопировать директорию "zapret" в /opt на роутер.
|
||||
|
||||
Если места достаточно, самый простой способ :
|
||||
opkg update
|
||||
opkg install git-http
|
||||
mkdir /opt
|
||||
cd /opt
|
||||
git clone --depth 1 https://github.com/bol-van/zapret
|
||||
|
||||
Если места немного :
|
||||
opkg update
|
||||
opkg install openssh-sftp-server unzip
|
||||
ifconfig br-lan
|
||||
Скачать на комп с github zip архив кнопкой "Clone or download"->Download ZIP
|
||||
Скопировать средствами sftp zip архив на роутер в /tmp.
|
||||
mkdir /opt
|
||||
cd /opt
|
||||
unzip /tmp/zapret-master.zip
|
||||
mv zapret-master zapret
|
||||
rm /tmp/zapret-master.zip
|
||||
|
||||
Если места совсем мало :
|
||||
На linux системе скачать и распаковать zapret. Оставить необходимый минимум файлов.
|
||||
Запаковать в архив zapret.tar.gz.
|
||||
nc -l -p 1111 <zapret.tar.gz
|
||||
На роутере
|
||||
cd /tmp
|
||||
nc <linux_system_ip> 1111 >zapret.tar.gz
|
||||
|
||||
Не стоит работать с распакованной версией zapret на windows. Потеряются ссылки и chmod.
|
||||
|
||||
Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики.
|
||||
/opt/zapret/install_bin.sh
|
||||
|
||||
Создать ссылку на скрипт запуска :
|
||||
ln -fs /opt/zapret/init.d/openwrt/zapret /etc/init.d
|
||||
Создать ссылку на скрипт события поднятия интерфейса :
|
||||
ln -fs /opt/zapret/init.d/openwrt/90-zapret /etc/hotplug.d/iface
|
||||
|
||||
Создать конфиг по умолчанию :
|
||||
cp /opt/zapret/config.default /opt/zapret/config
|
||||
|
||||
Настроить параметры согласно разделу "Выбор параметров".
|
||||
|
||||
Создать user листы по умолчанию :
|
||||
cp /opt/zapret/ipset/zapret-hosts-user-exclude.txt.default /opt/zapret/ipset/zapret-hosts-user-exclude.txt
|
||||
echo nonexistent.domain >/opt/zapret/ipset/zapret-hosts-user.txt
|
||||
touch /opt/zapret/ipset/zapret-hosts-user-ipban.txt
|
||||
|
||||
Удалить старые листы, если они были созданы ранее :
|
||||
/opt/zapret/ipset/clear_lists.sh
|
||||
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
|
||||
Выполнить скрипт обновления листа :
|
||||
/opt/zapret/ipset/get_config.sh
|
||||
Зашедулить обновление листа :
|
||||
crontab -e
|
||||
Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh"
|
||||
|
||||
Включить автозапуск службы и запустить ее :
|
||||
/etc/init.d/zapret enable
|
||||
/etc/init.d/zapret start
|
||||
ПРИМЕЧАНИЕ : на этапе старта системы интерфейсы еще не подняты. в некоторых случаях невозможно правильно
|
||||
сформировать параметры запуска демонов, не зная имя физического интерфейса LAN.
|
||||
Cкрипт из /etc/hotplug.d/iface перезапустит демоны по событию поднятия LAN.
|
||||
|
||||
Создать ссылку на firewall include :
|
||||
ln -fs /opt/zapret/init.d/openwrt/firewall.zapret /etc/firewall.zapret
|
||||
Проверить была ли создана ранее запись о firewall include :
|
||||
uci show firewall | grep firewall.zapret
|
||||
Если firewall.zapret нет, значит добавить :
|
||||
uci add firewall include
|
||||
uci set firewall.@include[-1].path="/etc/firewall.zapret"
|
||||
uci set firewall.@include[-1].reload="1"
|
||||
uci commit firewall
|
||||
Проверить не включен ли flow offload :
|
||||
uci show firewall.@defaults[0]
|
||||
Если flow_offloading=1 или flow_offloading_hw=1 ,
|
||||
uci set firewall.@defaults[0].flow_offloading=0
|
||||
uci set firewall.@defaults[0].flow_offloading_hw=0
|
||||
uci commit firewall
|
||||
Перезапустить фаервол :
|
||||
fw3 restart
|
||||
|
||||
Посмотреть через iptables -nL, ip6tables -nL или через luci вкладку "firewall" появились ли нужные правила.
|
||||
|
||||
ЭКОНОМИЯ МЕСТА : если его мало, то можно оставить в директории zapret лишь подкаталоги
|
||||
ipset, common, файл config, init.d/openwrt.
|
||||
Далее нужно создать подкаталоги с реально используемыми бинариками (ip2net, mdig, tpws, nfq)
|
||||
и скопировать туда из binaries рабочие executables.
|
||||
|
||||
ЕСЛИ ВСЕ ПЛОХО С МЕСТОМ : откажитесь от работы со списком РКН. используйте только get_user.sh
|
||||
|
||||
ЕСЛИ СОВСЕМ ВСЕ УЖАСНО С МЕСТОМ : берете tpws и делаете все своими руками. поднятие iptables, автостарт бинарика.
|
||||
С некоторых версий скрипты запуска zapret без ipset не работают (он требуется для ip exclude)
|
||||
|
||||
СОВЕТ : Покупайте только роутеры с USB. В USB можно воткнуть флэшку и вынести на нее корневую файловую систему
|
||||
или использовать ее в качестве оверлея. Не надо мучать себя, запихивая незапихиваемое в 8 мб встроенной флэшки.
|
||||
Для комфортной работы с zapret нужен роутер с 16 Mb встроенной памяти или USB разъемом и 128+ Mb RAM.
|
||||
На 64 Mb без swap будут проблемы с листами РКН. Если у вас только 64 Mb, и вы хотите листы РКН, подключите swap.
|
||||
32 Mb для современных версий openwrt - конфигурация на грани живучести. Возможны хаотические падения процессов в oom.
|
||||
Работа с листами РКН невозможна в принципе.
|
||||
|
@@ -19,13 +19,13 @@ For dpi desync attack :
|
||||
nft delete table inet ztest
|
||||
nft create table inet ztest
|
||||
nft add chain inet ztest post "{type filter hook postrouting priority mangle;}"
|
||||
nft add rule inet ztest post tcp dport "{80,443}" ct original packets 1-12 queue num 200 bypass
|
||||
nft add rule inet ztest post udp dport 443 ct original packets 1-4 queue num 200 bypass
|
||||
nft add rule inet ztest post meta mark and 0x40000000 == 0 tcp dport "{80,443}" ct original packets 1-12 queue num 200 bypass
|
||||
nft add rule inet ztest post meta mark and 0x40000000 == 0 udp dport 443 ct original packets 1-12 queue num 200 bypass
|
||||
|
||||
# auto hostlist with avoiding wrong ACK numbers in RST,ACK packets sent by russian DPI
|
||||
sysctl net.netfilter.nf_conntrack_tcp_be_liberal=1
|
||||
nft add chain inet ztest pre "{type filter hook prerouting priority filter;}"
|
||||
nft add rule inet ztest pre tcp sport "{80,443}" ct reply packets 1-4 queue num 200 bypass
|
||||
nft add rule inet ztest pre tcp sport "{80,443}" ct reply packets 1-3 queue num 200 bypass
|
||||
|
||||
|
||||
show rules : nft list table inet ztest
|
||||
|
251
docs/quick_start.md
Normal file
251
docs/quick_start.md
Normal file
@@ -0,0 +1,251 @@
|
||||
# Быстрая настройка Linux/OpenWrt
|
||||
|
||||
> [!CAUTION]
|
||||
> Не пишите в issue вопросы типа "как скопировать файл", "как скачать", "как
|
||||
> запустить", ... То есть все , что касается базовых навыков обращения с ОС
|
||||
> linux. Эти вопросы будут закрывать сразу. Если у вас подобные вопросы
|
||||
> возникают, рекомендую не использовать данный софт или искать помощь где-то в
|
||||
> другом месте. То же самое могу сказать тем, кто хочет нажать 1 кнопку, чтобы
|
||||
> все заработало, и совсем не хочет читать и изучать. Увы, такое не подвезли и
|
||||
> не подвезут. Ищите другие более простые методы обхода. Этот метод **не для
|
||||
> рядового пользователя**.
|
||||
|
||||
|
||||
## Вступление
|
||||
Специально для тех, кто хочет побыстрее начать, но не хочет слишком углубляться
|
||||
в простыню [readme.md](readme.md).
|
||||
|
||||
Обход DPI является хакерской методикой. Под этим словом понимается метод,
|
||||
которому сопротивляется окружающая среда, которому автоматически не
|
||||
гарантирована работоспособность в любых условиях и на любых ресурсах, требуется
|
||||
настройка под специфические условия у вашего провайдера. Условия могут меняться
|
||||
со временем, и методика может начинать или переставать работать, может
|
||||
потребоваться повторный анализ ситуации. Могут обнаруживаться отдельные
|
||||
ресурсы, которые заблокированы иначе, и которые не работают или перестали
|
||||
работать. Могут и сломаться отдельные не заблокированные ресурсы. Поэтому очень
|
||||
желательно иметь знания в области сетей, чтобы иметь возможность
|
||||
проанализировать техническую ситуацию. Не будет лишним иметь обходные каналы
|
||||
проксирования трафика на случай, если обход DPI не помогает.
|
||||
|
||||
Вариант, когда вы нашли стратегию где-то в интернете и пытаетесь ее приспособить к своему случаю - заведомо проблемный.
|
||||
Нет универсальной таблетки. Везде ситуация разная. В сети гуляют написанные кем-то откровенные глупости, которые тиражируются массово ничего не понимающей публикой.
|
||||
Такие варианты чаще всего работают нестабильно, только на части ресурсов, только на части провайдеров, не работают вообще или ломают другие ресурсы. В худших случаях еще и устраивают флуд в сети.
|
||||
Если даже вариант когда-то и работал неплохо, завтра он может перестать, а в сети останется устаревшая информация.
|
||||
|
||||
Будем считать, что у вас есть система на базе традиционного **linux** или
|
||||
**openwrt**. Если у вас традиционный linux - задача обойти блокировки только на
|
||||
этой системе, если openwrt - обойти блокировки для подключенных устройств. Это
|
||||
наиболее распространенный случай.
|
||||
|
||||
|
||||
## Настройка
|
||||
> [!TIP]
|
||||
> Чтобы процедура установки сработала в штатном режиме на openwrt, нужно
|
||||
> рассчитывать на свободное место около 1-2 Mb для установки самого zapret и
|
||||
> необходимых дополнительных пакетов. Если места мало и нет возможности его
|
||||
> увеличить за счет `extroot`, возможно придется отказаться от варианта простой
|
||||
> установки и прикручивать в ручном режиме без имеющихся скриптов запуска.
|
||||
> Можно использовать [облегченный `tpws` вариант](../init.d/openwrt-minimal),
|
||||
> либо попробовать засунуть требуемые zapret дополнительные пакеты в сжатый
|
||||
> образ `squashfs` с помощью `image builder` и перешить этим вариантом роутер.
|
||||
|
||||
1. Скачайте последний [tar.gz релиз](https://github.com/bol-van/zapret/releases) в /tmp, распакуйте его, затем удалите архив.
|
||||
|
||||
2. Убедитесь, что у вас отключены все средства обхода блокировок, в том числе и
|
||||
сам zapret. Гарантированно уберет zapret скрипт `uninstall_easy.sh`.
|
||||
|
||||
3. Если вы работаете в виртуальной машине, необходимо использовать соединение с
|
||||
сетью в режиме bridge. NAT **не** подходит.
|
||||
|
||||
4. Выполните однократные действия по установке требуемых пакетов в ОС и
|
||||
настройке исполняемых файлов правильной архитектуры:
|
||||
```sh
|
||||
$ install_bin.sh
|
||||
$ install_prereq.sh
|
||||
```
|
||||
|
||||
> Вас могут спросить о типе фаервола (iptables/nftables) и использовании
|
||||
> ipv6. Это нужно для установки правильных пакетов в ОС, чтобы не
|
||||
> устанавливать лишнее.
|
||||
|
||||
5. Запустите `blockcheck.sh`. Скрипт вначале проверяет DNS. Если выводятся
|
||||
сообщения о подмене адресов, то нужно будет решить проблему с DNS.
|
||||
`blockcheck.sh` перейдет в этом случае на DoH и будет пытаться получить и
|
||||
использовать реальные IP адреса. Но если вы не настроите решение этой
|
||||
проблемы, обход будет работать только для тех программ или ОС, которые сами
|
||||
реализуют механизмы SecureDNS. Для других программ обход работать не будет.
|
||||
|
||||
> Решение проблемы DNS выходит за рамки проекта. Обычно она решается либо
|
||||
> заменой DNS серверов от провайдера на публичные (`1.1.1.1`, `8.8.8.8`),
|
||||
> либо в случае перехвата провайдером обращений к сторонним серверам - через
|
||||
> специальные средства шифрования DNS запросов, такие как `dnscrypt`, `DoT`,
|
||||
> `DoH`.
|
||||
>
|
||||
> Еще один эффективный вариант - использовать ресолвер от yandex
|
||||
> (`77.88.8.88`) на нестандартном порту `1253`. Многие провайдеры не
|
||||
> анализируют обращения к DNS на нестандартных портах.
|
||||
>
|
||||
> Проверить работает ли этот вариант можно так:
|
||||
> ```sh
|
||||
> $ dig -p 53 @77.88.8.88 rutracker.org dig -p 1253 @77.88.8.88 rutracker.org
|
||||
> ```
|
||||
>
|
||||
> Если DNS действительно подменяется, и ответ на эти 2 команды разный,
|
||||
> значит метод вероятно работает.
|
||||
>
|
||||
> В openwrt DNS на нестандартном порту можно прописать в `/etc/config/dhcp`
|
||||
> таким способом :
|
||||
>
|
||||
> ```
|
||||
> config dnsmasq
|
||||
> <...>
|
||||
> list server '77.88.8.88#1253'
|
||||
> ```
|
||||
>
|
||||
> Если настройки IP и DNS получаются автоматически от провайдера, в
|
||||
> `/etc/config/network` найдите секцию интерфейса `wan` и сделайте так:
|
||||
>
|
||||
> ```
|
||||
> config interface 'wan'
|
||||
> <...>
|
||||
> option peerdns '0'
|
||||
> ```
|
||||
>
|
||||
> ```sh
|
||||
> $ /etc/init.d/network restart
|
||||
> $ /etc/init.d/dnsmasq restart
|
||||
> ```
|
||||
>
|
||||
> Если это не подходит, можно перенаправлять обращения на UDP и TCP порты
|
||||
> `53` вашего DNS сервера на `77.88.8.88:1253` средствами
|
||||
> `iptables`/`nftables`. В `/etc/resolv.conf` нельзя прописать DNS на
|
||||
> нестандартном порту.
|
||||
|
||||
6. `blockcheck.sh` позволяет выявить рабочую стратегию обхода блокировок. По
|
||||
результатам скрипта нужно понять какой вариант будете использовать : `nfqws`
|
||||
или `tpws` и запомнить найденные стратегии для дальнейшего применения.
|
||||
|
||||
Следует понимать, что скрипт проверяет доступность только конкретного
|
||||
домена, который вы вводите в начале. Вероятно, все остальные домены
|
||||
блокированы подобным образом, **но не факт**. В большинстве случаев можно
|
||||
объединить несколько стратегий в одну универсальную, и это **крайне
|
||||
желательно**. Необходимо понимать как работают стратегии. zapret **не может
|
||||
пробить блокировку по IP адресу**. Для проверки нескольких доменов вводите
|
||||
их через пробел.
|
||||
|
||||
> Сейчас блокираторы ставят на магистральных каналах. В сложных случаях у
|
||||
> вас может быть несколько маршрутов с различной длиной по ХОПам, с DPI на
|
||||
> разных хопах. Приходится преодолевать целый зоопарк DPI, которые еще и
|
||||
> включаются в работу хаотичным образом или образом, зависящим от
|
||||
> направления (IP сервера). скрипт не всегда может выдать вам в итогах
|
||||
> оптимальную стратегию, которую надо просто переписать в настройки. В
|
||||
> некоторых случаях надо реально думать что происходит, анализируя результат
|
||||
> на разных стратегиях. Если вы применяете большой TTL, чтобы достать до
|
||||
> магистрала, то не лишним будет добавить дополнительный ограничитель
|
||||
> `--dpi-desync-fooling`, чтобы не сломать сайты на более коротких
|
||||
> дистанциях. `md5sig` наиболее совместим, но работает **только** на linux
|
||||
> серверах. `badseq` может работать только на https и не работать на http.
|
||||
> Чтобы выяснить какие дополнительные ограничители работают, смотрите
|
||||
> результат теста аналогичных стратегий без TTL с каждым из этих
|
||||
> ограничителей.
|
||||
>
|
||||
> При использовании `autottl` следует протестировать как можно больше разных
|
||||
> доменов. Эта техника может на одних провайдерах работать стабильно, на
|
||||
> других потребуется выяснить при каких параметрах она стабильна, на третьих
|
||||
> полный хаос, и проще отказаться.
|
||||
>
|
||||
> Далее, имея понимание что работает на http, https, quic нужно
|
||||
> сконструировать параметры запуска `tpws` и/или `nfqws` с использованием
|
||||
> мультистратегии. Как работают мультистратегии описано в readme.txt.
|
||||
>
|
||||
> Если кратко, то обычно параметры конструируются так:
|
||||
> ```sh
|
||||
> "--filter-udp=443 'параметры для quic' <HOSTLIST_NOAUTO> --new
|
||||
> --filter-tcp=80,443 'обьединенные параметры для http и https' <HOSTLIST>"
|
||||
> ```
|
||||
>
|
||||
> Или так:
|
||||
> ```sh
|
||||
> "--filter-udp=443 'параметры для quic' <HOSTLIST_NOAUTO> --new
|
||||
> --filter-tcp=80 'параметры для http' <HOSTLIST> --new
|
||||
> --filter-tcp=443 'параметры для https' <HOSTLIST>"
|
||||
> ```
|
||||
>
|
||||
> `<HOSTLIST>` и `<HOSTLIST_NOAUTO>` так и пишутся. Их не надо на что-то
|
||||
> заменять. Это сделают скрипты запуска, если вы выбрали режим фильтрации по
|
||||
> хостлистам, и уберут в противном случае. Если для какого-то протокола надо
|
||||
> дурить все без стандартного хостлиста - просто уберите оттуда `<HOSTLIST>`
|
||||
> и `<HOSTLIST_NOAUTO>`. Можно писать свои параметры `--hostlist` и
|
||||
> `--hostlist-exclude` для дополнительных хостлистов или в профилях
|
||||
> специализаций под конкретный ресурс. В последнем случае стандартный
|
||||
> хостлист там не нужен. Следует избегать указания собственных параметров
|
||||
> `--hostlist` на листы из директории ipset. Эта логика включена в
|
||||
> `<HOSTLIST>` и `<HOSTLIST_NOAUTO>`. Отличие `<HOSTLIST_NOAUTO>` в том, что
|
||||
> стандартный автолист по этому профилю используется как обычный, то есть
|
||||
> без автоматического добавления доменов. Однако, добавления в других
|
||||
> профилях автоматически отражаются во всех остальных.
|
||||
>
|
||||
> Если стратегии отличаются по версии ip протокола, и вы не можете их
|
||||
> обьединить, фильтр пишется так:
|
||||
> ```sh
|
||||
> "--filter-l3=ipv4 --filter-udp=443 lпараметры для quic ipv4' <HOSTLIST_NOAUTO> --new
|
||||
> --filter-l3=ipv4 --filter-tcp=80 'параметры для http ipv4' <HOSTLIST> --new
|
||||
> --filter-l3=ipv4 --filter-tcp=443 'параметры для https ipv4' <HOSTLIST> --new
|
||||
> --filter-l3=ipv6 --filter-udp=443 "параметры для quic ipv6" <HOSTLIST_NOAUTO> --new
|
||||
> --filter-l3=ipv6 --filter-tcp=80 'параметры для http ipv6' <HOSTLIST> --new
|
||||
> --filter-l3=ipv6 --filter-tcp=443 'параметры для https ipv6' <HOSTLIST>"
|
||||
> ```
|
||||
>
|
||||
> Но здесь совсем "копи-пастный" вариант. Чем больше вы объедините стратегий и
|
||||
> сократите их общее количество, тем будет лучше.
|
||||
>
|
||||
> Если вам не нужно дурение отдельных протоколов, лучше всего будет их
|
||||
> убрать из системы перехвата трафика через параметры `TPWS_PORTS`,
|
||||
> `NFQWS_PORTS_TCP`, `NFQWS_PORTS_UDP` и убрать соответствующие им профили
|
||||
> мультистратегии.
|
||||
>
|
||||
> | Протокол | Порт | Примечание |
|
||||
> |---|---|---|
|
||||
> | `tcp` | `80` | `http` соединение |
|
||||
> | `tcp` | `443` | `https` соединение |
|
||||
> | `udp` | `443` | `quic` соединение |
|
||||
>
|
||||
> Если используются методы нулевой фазы десинхронизации (`--mss`,
|
||||
> `--wssize`, `--dpi-desync=syndata`) и режим фильтрации `hostlist`, то все
|
||||
> параметры, относящиеся к этим методам, следует помещать в отдельные
|
||||
> профили мульистратегии, которые получат управление до определения имени
|
||||
> хоста. Необходимо понимать алгоритм работы мультистратегий. Самым надежным
|
||||
> вариантом будет дублирование этих параметров на 2 профиля. Какой-нибудь
|
||||
> сработает в зависимости от параметра `MODE_FILTER`.
|
||||
>
|
||||
> ```sh
|
||||
> "--filter-tcp=80 'параметры для http' <HOSTLIST> --new
|
||||
> --filter-tcp=443 'параметры для https' --wssize 1:6 <HOSTLIST> --new
|
||||
> --filter-tcp=443 --wssize 1:6"
|
||||
> ```
|
||||
>
|
||||
> В этом примере `wssize` будет применяться всегда к порту tcp `443` вне
|
||||
> зависимости от параметра `MODE_FILTER`. Хостлист будет игнорироваться,
|
||||
> если таковой имеется. К http применять `wssize` вредно и бессмысленно.
|
||||
|
||||
7. Запустите скрипт облегченной установки - `install_easy.sh` Выберите `nfqws`
|
||||
и/или `tpws`, затем согласитесь на редактирование параметров. Откроется
|
||||
редактор, куда впишите созданную на предыдущем этапе стратегию.
|
||||
|
||||
8. На все остальные вопросы `install_easy.sh` отвечайте согласно выводимой
|
||||
аннотации.
|
||||
|
||||
|
||||
## Итог
|
||||
Это минимальная инструкция, чтобы быстро сориентироваться с чего начать.
|
||||
Однако, это не гарантированное решение и в некоторых случаях вы не обойдетесь
|
||||
без знаний и основного "талмуда". Подробности и полное техническое описание
|
||||
расписаны в [README](readme.md).
|
||||
|
||||
Если ломаются отдельные **не заблокированные** ресурсы, следует вносить их в
|
||||
исключения, либо пользоваться ограничивающим `ipset` или хост листом. Лучше
|
||||
подбирать такие стратегии, которые вызывают минимальные поломки. Есть стратегии
|
||||
довольно безобидные, а есть сильно ломающие, которые подходят только для
|
||||
точечного пробития отдельных ресурсов, когда ничего лучше нет. Хорошая
|
||||
стратегия может сильно ломать из-за плохо подобранных ограничителей для фейков
|
||||
\- ttl, fooling.
|
@@ -1,141 +0,0 @@
|
||||
Специально для тех, кто хочет побыстрее начать, но не хочет слишком углубляться в простыню readme.txt.
|
||||
|
||||
Предупреждение : не пишите в issue вопросы типа "как скопировать файл", "как скачать", "как запустить", ...
|
||||
То есть все , что касается базовых навыков обращения с ОС linux. Эти вопросы буду закрывать сразу.
|
||||
Если у вас подобные вопросы возникают, рекомендую не использовать данный софт или искать помощь где-то в другом месте.
|
||||
То же самое могу сказать тем, кто хочет нажать 1 кнопку, чтобы все заработало, и совсем не хочет читать и изучать.
|
||||
Увы, такое не подвезли и не подвезут. Ищите другие более простые методы обхода. Этот метод не для рядового пользователя.
|
||||
|
||||
Обход DPI является хакерской методикой. Под этим словом понимается метод, которому сопротивляется окружающая среда,
|
||||
которому автоматически не гарантирована работоспособность в любых условиях и на любых ресурсах,
|
||||
требуется настройка под специфические условия у вашего провайдера. Условия могут меняться со временем,
|
||||
и методика может начинать или переставать работать, может потребоваться повторный анализ ситуации.
|
||||
Могут обнаруживаться отдельные ресурсы, которые заблокированы иначе, и которые не работают или перестали работать.
|
||||
Могут и сломаться отдельные незаблокированные ресурсы.
|
||||
Поэтому очень желательно иметь знания в области сетей, чтобы иметь возможность проанализировать техническую ситуацию.
|
||||
Не будет лишним иметь обходные каналы проксирования трафика на случай, если обход DPI не помогает.
|
||||
|
||||
Будем считать, что у вас есть система на базе традиционного linux или openwrt.
|
||||
Если у вас традиционный linux - задача обойти блокировки только на этой системе, если openwrt - обойти блокировки
|
||||
для подключенных устройств. Это наиболее распространенный случай.
|
||||
|
||||
1) Чтобы процедура установки сработала в штатном режиме на openwrt, нужно раcсчитывать на свободное место около 1-2 Mb
|
||||
для установки самого zapret и необходимых дополнительных пакетов.
|
||||
Если места мало и нет возможности его увеличить за счет extroot, возможно придется отказаться от варианта
|
||||
простой установки и прикручивать в ручном режиме без имеющихся скриптов запуска, либо попробовать засунуть требуемые
|
||||
zapret дополнительные пакеты в сжатый образ squashfs с помощью image builder и перешить этим вариантом роутер.
|
||||
См docs/manual_setup.txt , docs/readme.txt .
|
||||
|
||||
2) Скачайте zip архив проекта с github в /tmp, распакуйте его там,
|
||||
либо клонируйте проект через : git clone --depth 1 https://github.com/bol-van/zapret
|
||||
|
||||
3) Убедитесь, что у вас отключены все средства обхода блокировок, в том числе и сам zapret.
|
||||
Гарантированно уберет zapret скрипт uninstall_easy.sh.
|
||||
|
||||
4) Если вы работаете в виртуальной машине, необходимо использовать соединение с сетью в режиме bridge. nat не подходит
|
||||
|
||||
5) Выполните однократные действия по установке требуемых пакетов в ОС и настройке бинариков правильной архитектуры
|
||||
|
||||
install_bin.sh
|
||||
install_prereq.sh
|
||||
|
||||
Вас могут спросить о типе фаервола (iptables/nftables) и использовании ipv6. Это нужно для установки
|
||||
правильных пакетов в ОС, чтобы не устанавливать лишнее.
|
||||
|
||||
6) Запустите blockcheck.sh. blockcheck.sh в начале проверяет DNS. Если выводятся сообщения о подмене адресов, то
|
||||
первым делом нужно решить эту проблему, иначе ничего не будет работать.
|
||||
Решение проблемы DNS выходит за рамки проекта. Обычно она решается либо заменой DNS серверов
|
||||
от провайдера на публичные (1.1.1.1, 8.8.8.8), либо в случае перехвата провайдером обращений
|
||||
к сторонним серверам - через специальные средства шифрования DNS запросов, такие как dnscrypt, DoT, DoH.
|
||||
|
||||
Еще один эффективный вариант - использовать ресолвер от yandex 77.88.8.88 на нестандартном порту 1253.
|
||||
Многие провайдеры не анализируют обращения к DNS на нестандартных портах.
|
||||
|
||||
Проверить работает ли этот вариант можно так :
|
||||
|
||||
dig -p 53 @77.88.8.88 rutracker.org
|
||||
dig -p 1253 @77.88.8.88 rutracker.org
|
||||
|
||||
Если DNS действительно подменяется, и ответ на эти 2 команды разный, значит метод вероятно работает.
|
||||
|
||||
В openwrt DNS на нестандартном порту можно прописать в /etc/config/dhcp таким способом :
|
||||
|
||||
config dnsmasq
|
||||
.............
|
||||
list server '77.88.8.88#1253'
|
||||
|
||||
Если настройки IP и DNS получаются автоматически от провайдера, в /etc/config/network
|
||||
найдите секцию интерфейса 'wan' и сделайте так :
|
||||
|
||||
config interface 'wan'
|
||||
.............
|
||||
option peerdns '0'
|
||||
|
||||
/etc/init.d/network restart
|
||||
/etc/init.d/dnsmasq restart
|
||||
|
||||
Если это не подходит, можно перенаправлять обращения на udp и tcp порты 53 вашего DNS сервера на 77.88.8.88:1253 средствами
|
||||
iptables/nftables. В /etc/resolv.conf нельзя прописать DNS на нестандартном порту.
|
||||
|
||||
7) blockcheck позволяет выявить рабочую стратегию обхода блокировок
|
||||
По результатам blockcheck нужно понять какой вариант будете использовать : nfqws или tpws
|
||||
И запомнить найденные стратегии.
|
||||
|
||||
Следует понимать, что blockcheck проверяет доступность только конкретного домена, который вы вводите в начале.
|
||||
Вероятно, все остальные домены блокированы подобным образом, но не факт.
|
||||
В большинстве случаев можно обьединить несколько стратегий в одну универсальную, но для этого необходимо понимать
|
||||
"что там за буковки". Если вы в сетях слабо разбираетесь, это не для вас. В противном случае читайте readme.txt.
|
||||
zapret не может пробить блокировку по IP адресу
|
||||
Для проверки нескольких доменов вводите их через пробел.
|
||||
|
||||
Сейчас блокираторы ставят на магистральных каналах. В сложных случаях у вас может быть несколько маршрутов
|
||||
с различной длиной по ХОПам, с DPI на разных хопах. Приходится преодолевать целый зоопарк DPI,
|
||||
которые еще и включаются в работу хаотичным образом или образом, зависящим от направления (IP сервера).
|
||||
blockcheck не всегда может выдать вам в итогах оптимальную стратегию, которую надо просто переписать в настройки.
|
||||
В некоторых случаях надо реально думать что происходит, анализируя результат на разных стратегиях.
|
||||
Если вы применяете большой TTL, чтобы достать до магистрала, то не лишним будет добавить дополнительный ограничитель
|
||||
--dpi-desync-fooling, чтобы не сломать сайты на более коротких дистанциях.
|
||||
md5sig наиболее совместим, но работает только на linux серверах.
|
||||
badseq может работать только на https и не работать на http.
|
||||
Чтобы выяснить какие дополнительные ограничители работают, смотрите результат теста аналогичных стратегий без TTL
|
||||
с каждым из этих ограничителей.
|
||||
|
||||
При использовании autottl следует протестировать как можно больше разных доменов. Эта техника
|
||||
может на одних провайдерах работать стабильно, на других потребуется выяснить при каких параметрах
|
||||
она стабильна, на третьих полный хаос, и проще отказаться.
|
||||
|
||||
Если используются методы нулевой фазы десинхронизации (--mss, --wssize, --dpi-desync=syndata) и режим фильтрации hostlist,
|
||||
то все параметры, относящиеся к этим методам, следует помещать не в основные параметры (например, NFQWS_OPT_DESYNC),
|
||||
а в suffix (NFQWS_OPT_DESYNC_SUFFIX). Чтобы не ошибиться, можно их продублировать и там, и там.
|
||||
Иначе они могут не работать.
|
||||
|
||||
8) Запустите install_easy.sh.
|
||||
Выберите nfqws или tpws, затем согласитесь на редактирование параметров.
|
||||
Откроется редактор, куда впишите найденные стратегии.
|
||||
Для nfqws отдельно настраиваются стратегии на http и https для ipv4 и ipv6.
|
||||
То есть по максимуму 4 разных варианта.
|
||||
NFQWS_OPT_DESYNC - это общая установка, которая применяется, если какой-либо уточняющий параметр не задан
|
||||
NFQWS_OPT_DESYNC_HTTP и NFQWS_OPT_DESYNC_HTTPS заменяют стратегию для http и https.
|
||||
Если у вас включен ipv6, то они так же будут применены и к ipv6. Если для ipv6 нужна другая стратегия,
|
||||
то можно задать уточняющие параметры NFQWS_OPT_DESYNC_HTTP6 и NFQWS_OPT_DESYNC_HTTPS6.
|
||||
Если стратегии для ipv4 и ipv6 отличаются лишь ttl, то в целях экономии ресурсов роутера (меньше процессов nfqws)
|
||||
следует отказаться от использования специфических для ipv6 установок. Вместо них использовать параметры
|
||||
--dpi-desync-ttl и --dpi-desync-ttl6 в общих установках. Таким способом можно заставить один процесс nfqws
|
||||
обрабатывать трафик на ipv4 и на ipv6 с разным ttl.
|
||||
|
||||
Важным вопросом является вопрос о поддержке http keep alive.
|
||||
Отвечайте N. Если вдруг на http сайтах будут хаотические сбои типа то загружается, то заглушка или сброс,
|
||||
попробуйте включить поддержку keep alive. Но просто "на всякий случай" не включайте - это увеличит нагрузку на роутер.
|
||||
|
||||
Если это не помогает, или хаотичное поведение наблюдается и на https, то еще раз прогоните blockcheck
|
||||
с установленным числом попыток проверки не менее 5. Возможно, ваш провайдер использует балансировку нагрузки,
|
||||
где на разных путях установлен разный DPI.
|
||||
|
||||
9) На все остальные вопросы install_easy.sh отвечайте согласно выводимой аннонтации.
|
||||
|
||||
10) Если ломаются отдельные незаблокированные ресурсы, следует вносить их в исключения, либо пользоваться ограничивающим
|
||||
ipset или хост листом. Читайте основной талмуд readme.txt ради подробностей.
|
||||
|
||||
Это минимальная инструкция, чтобы соориентироваться с чего начать. Однако, это - не панацея.
|
||||
В некоторых случаях вы не обойдетесь без знаний и основного "талмуда".
|
||||
Подробности и полное техническое описание расписаны в readme.txt
|
208
docs/quick_start_windows.md
Normal file
208
docs/quick_start_windows.md
Normal file
@@ -0,0 +1,208 @@
|
||||
# Быстрая настройка Windows
|
||||
|
||||
Специально для тех, кто хочет побыстрее начать, но не хочет слишком углубляться в простыню [readme.md](./readme.md).
|
||||
> [!CAUTION]
|
||||
> Как обычно, компьютерная грамотность ложится полностью на вас.
|
||||
> Вы должны уметь работать с консолью windows и иметь минимальные навыки обращения с командными файлами `bat`, `cmd`.
|
||||
> Если грамотность отсутствует и возникает куча _"как?"_ на базовых вещах, значит эта программа не для вас.
|
||||
> Разработчик не будет отвечать на вопросы из серии школы компьютерной грамотности.
|
||||
> Если вы все-таки хотите продолжать, задавайте вопросы в дискуссиях на github или на форумах.
|
||||
> Возможно, кто-то вам поможет. Но не надо писать issue на github. Они будут закрываться сразу.
|
||||
|
||||
## Немного разъяснений
|
||||
|
||||
Обход DPI является хакерской методикой. Под этим словом понимается метод, которому сопротивляется окружающая среда,
|
||||
которому автоматически не гарантирована работоспособность в любых условиях и на любых ресурсах,
|
||||
требуется настройка под специфические условия у вашего провайдера. Условия могут меняться со временем,
|
||||
и методика может начинать или переставать работать, может потребоваться повторный анализ ситуации.
|
||||
Могут обнаруживаться отдельные ресурсы, которые заблокированы иначе, и которые не работают или перестали работать.
|
||||
Могут и сломаться отдельные незаблокированные ресурсы.
|
||||
Поэтому очень желательно иметь знания в области сетей, чтобы иметь возможность проанализировать техническую ситуацию.
|
||||
Не будет лишним иметь обходные каналы проксирования трафика на случай, если обход DPI не помогает.
|
||||
|
||||
Вариант, когда вы нашли стратегию где-то в интернете и пытаетесь ее приспособить к своему случаю - заведомо проблемный.
|
||||
Нет универсальной таблетки. Везде ситуация разная. В сети гуляют написанные кем-то откровенные глупости, которые тиражируются массово ничего не понимающей публикой.
|
||||
Такие варианты чаще всего работают нестабильно, только на части ресурсов, только на части провайдеров, не работают вообще или ломают другие ресурсы. В худших случаях еще и устраивают флуд в сети.
|
||||
Если даже вариант когда-то и работал неплохо, завтра он может перестать, а в сети останется устаревшая информация.
|
||||
|
||||
Особо осторожным нужно быть со сторонними сборками. Там могут быть вирусы. Не в каждой сборке, но уже были замечены скаммеры.
|
||||
Видео на ютубе как просто обойти блокировку, прилагающийся архив, в котором какая-то ерунда, написанная на питоне, скачивающая зловред.
|
||||
|
||||
Будем считать, что у вас есть windows 7 или выше. Задача - обойти блокировки с самой системы.
|
||||
|
||||
> [!NOTE]
|
||||
> Есть решение самое простое, а есть "как положено".
|
||||
|
||||
## САМОЕ ПРОСТОЕ РЕШЕНИЕ
|
||||
|
||||
_"Совсем ничего не могу, все очень сложно, дайте мне таблетку."_ ©Простой пользователь
|
||||
|
||||
1) Скачайте и распакуйте архив https://github.com/bol-van/zapret-win-bundle/archive/refs/heads/master.zip.
|
||||
2) Запустите `zapret-winws/preset_russia.cmd` от имени администратора. Возможно, заведется сразу.
|
||||
|
||||
> То же самое с ограничителем по автоматически создаваемому хост-листу `preset_russia_autohostlist.cmd`.
|
||||
> Что такое `autohostlist` - читайте [readme.md](./readme.md). Проще говоря, мы обходим только то, что долго и упорно не хочет открываться.
|
||||
> Сначала не будет, но надо пытаться много раз, и тогда сработает, а дальше будет всегда срабатывать.
|
||||
> Остальное не будет ломаться. Использовать только, если первый вариант тоже работает.
|
||||
|
||||
Не помогла _"таблетка"_ ? Это вовсе не значит, что ничего не получится. Но придется делать по нормальному.
|
||||
|
||||
## РЕШЕНИЕ "КАК ПОЛОЖЕНО"
|
||||
|
||||
1) Скачайте и распакуйте архив https://github.com/bol-van/zapret-win-bundle/archive/refs/heads/master.zip.
|
||||
|
||||
2) Если у вас Windows 7 x64, читайте [docs/windows.md](./windows.md). Без описанной там подготовки может не работать.
|
||||
|
||||
> [!WARNING]
|
||||
> Для 32-битных систем Windows нет готового полного варианта.
|
||||
|
||||
> На windows 11 arm64 выполните `arm64/install_arm64.cmd` от имени администратора и перезагрузите компьютер.
|
||||
> Читайте [docs/windows.md](./windows.md)
|
||||
>
|
||||
> Имейте в виду, что антивирусы могут плохо реагировать на windivert.
|
||||
> cygwin так же имеет внушительный список несовместимостей с антивирусами, хотя современные антивирусы
|
||||
> более-менее научились с ним дружить.
|
||||
> Если проблема имеет место , используйте исключения. Если не помогает - отключайте антивирус совсем.
|
||||
|
||||
3) Убедитесь, что у вас отключены все средства обхода блокировок, в том числе и сам zapret.
|
||||
|
||||
4) Если вы работаете в виртуальной машине, необходимо использовать соединение с сетью в режиме bridge. nat не подходит
|
||||
|
||||
5) Запустите `blockcheck\blockcheck.cmd`. blockcheck в начале проверяет **DNS**.
|
||||
Если выводятся сообщения о подмене адресов, то нужно будет решить проблему с **DNS**.
|
||||
blockcheck перейдет в этом случае на **DoH** _(DNS over HTTPS)_ и будет пытаться получить и использовать реальные IP адреса.
|
||||
Но если вы не настроите решение этой проблемы, обход будет работать только для тех программ,
|
||||
которые сами реализуют механизмы SecureDNS. Для других программ обход работать не будет.
|
||||
|
||||
> Решение проблемы DNS выходит за рамки проекта. Обычно она решается либо заменой DNS серверов
|
||||
> от провайдера на публичные (`1.1.1.1`, `8.8.8.8`), либо в случае перехвата провайдером обращений
|
||||
> к сторонним серверам - через специальные средства шифрования DNS запросов, такие как [dnscrypt](https://www.dnscrypt.org/), **DoT** _(DNS over TLS)_, **DoH**.
|
||||
> В современных броузерах чаще всего DoH включен по умолчанию, но curl будет использовать обычный системный DNS.
|
||||
> win11 поддерживает системные DoH из коробки. Они не настроены по умолчанию.
|
||||
> В последних билдах win10 существует неофициальный обходной путь для включения DoH.
|
||||
> Для остальных систем нужно стороннее решение, работающие по принципу DNS proxy.
|
||||
>
|
||||
> Тут все разжевано как и где это включается : https://hackware.ru/?p=13707
|
||||
|
||||
6) blockcheck позволяет выявить рабочую стратегию обхода блокировок.
|
||||
Лог скрипта будет сохранен в `blockcheck\blockcheck.log`.
|
||||
Запомните/перепишите найденные стратегии.
|
||||
|
||||
> [!WARNING]
|
||||
> Следует понимать, что blockcheck проверяет доступность только конкретного домена, который вы вводите в начале.
|
||||
> Вероятно, все остальные домены блокированы подобным образом, но не факт.
|
||||
|
||||
> [!TIP]
|
||||
> В большинстве случаев можно обьединить несколько стратегий в одну универсальную, и это крайне желательно.
|
||||
|
||||
> Необходимо понимать [как работают стратегии](./readme.md/#nfqws).
|
||||
> zapret не может пробить блокировку по IP адресу. Для проверки нескольких доменов вводите их через пробел.
|
||||
>
|
||||
> Сейчас блокираторы ставят на магистральных каналах. В сложных случаях у вас может быть несколько маршрутов
|
||||
> с различной длиной по ХОПам, с DPI на разных хопах. Приходится преодолевать целый зоопарк DPI,
|
||||
> которые еще и включаются в работу хаотичным образом или образом, зависящим от направления (IP сервера).
|
||||
> blockcheck не всегда может выдать вам в итогах оптимальную стратегию, которую надо просто переписать в настройки.
|
||||
> В некоторых случаях надо реально думать что происходит, анализируя результат на разных стратегиях.
|
||||
> Если вы применяете большой TTL, чтобы достать до магистрала, то не лишним будет добавить дополнительный ограничитель
|
||||
> `--dpi-desync-fooling`, чтобы не сломать сайты на более коротких дистанциях.
|
||||
> _md5sig_ наиболее совместим, но работатет только на linux серверах.
|
||||
> badseq может работать только на https и не работать на http.
|
||||
> Чтобы выяснить какие дополнительные ограничители работают, смотрите результат теста аналогичных стратегий без TTL
|
||||
> с каждым из этих ограничителей.
|
||||
>
|
||||
> При использовании autottl следует протестировать как можно больше разных доменов. Эта техника
|
||||
> может на одних провайдерах работать стабильно, на других потребуется выяснить при каких параметрах
|
||||
> она стабильна, на третьих полный хаос, и проще отказаться.
|
||||
>
|
||||
> Далее, имея понимание что работает на http, https, quic, нужно сконструировать параметры запуска winws
|
||||
> с использованием мультистратегии. Как работают мультистратегии описано в [readme.md](./readme.md).
|
||||
>
|
||||
> Прежде всего вам нужно собрать фильтр перехватываемого трафика. Это делается через параметры
|
||||
> `--wf-l3`, `--wf-tcp`, `--wf-udp`.
|
||||
> `--wf-l3` относится к версии ip протокола - ipv4 или ipv6.
|
||||
> `--wf-tcp` и `--wf-udp` содержат перечень портов или диапазонов портов через запятую.
|
||||
>
|
||||
> Пример стандартного фильтра для перехвата http, https, quic : `--wf-tcp=80,443` `--wf-udp=443`
|
||||
>
|
||||
> Фильтр должен быть минимально необходимым. Перехват лишнего трафика приведет только к бессмысленному расходованию ресурсов процессора и замедлению интернета.
|
||||
>
|
||||
> Если кратко по мультистратегии, то обычно параметры конструируются так :
|
||||
> ```
|
||||
> --filter-udp=443 'параметры для quic' --new
|
||||
> --filter-tcp=80,443 'обьединенные параметры для http и https'
|
||||
> ```
|
||||
>
|
||||
> Или так :
|
||||
> ```
|
||||
> --filter-udp=443 'параметры для quic' --new
|
||||
> --filter-tcp=80 'параметры для http' --new
|
||||
> --filter-tcp=443 'параметры для https'
|
||||
> ```
|
||||
>
|
||||
> Если стратегии отличаются по версии ip протокола, и вы не можете их обьединить, фильтр пишется так :
|
||||
> ```
|
||||
> --filter-l3=ipv4 --filter-udp=443 "параметры для quic ipv4" --new
|
||||
> --filter-l3=ipv4 --filter-tcp=80 'параметры для http ipv4' --new
|
||||
> --filter-l3=ipv4 --filter-tcp=443 'параметры для https ipv4' --new
|
||||
> --filter-l3=ipv6 --filter-udp=443 "параметры для quic ipv6" --new
|
||||
> --filter-l3=ipv6 --filter-tcp=80 "параметры для http ipv6" --new
|
||||
> --filter-l3=ipv6 --filter-tcp=443 "параметры для https ipv6"
|
||||
> ```
|
||||
>
|
||||
> Но здесь совсем _"копи-пастный"_ вариант.
|
||||
> Чем больше вы обьедините стратегий и сократите их общее количество, тем будет лучше.
|
||||
>
|
||||
> Если вам не нужно дурение отдельных протоколов, лучше всего будет их убрать из системы перехвата трафика через
|
||||
> параметры `--wf-*` и убрать соответствующие им профили мультистратегии.
|
||||
> tcp 80 - http, tcp 443 - https, udp 443 - quic.
|
||||
>
|
||||
> Если используются методы нулевой фазы десинхронизации (`--mss`, `--wssize`, `--dpi-desync=syndata`) и фильтрация hostlist,
|
||||
> то все параметры, относящиеся к этим методам, следует помещать в отдельные профили мультистратегии, которые получат
|
||||
> управление до определения имени хоста. Необходимо понимать алгоритм работы мультистратегий.
|
||||
>
|
||||
> ```
|
||||
> --filter-tcp=80 'параметры для http' --new
|
||||
> --filter-tcp=443 'параметры для https' --hostlist=d:/users/user/temp/list.txt --new
|
||||
> --filter-tcp=443 --wssize 1:6
|
||||
> ```
|
||||
>
|
||||
> autohostlist профиль приоритетен, поэтому wssize нужно писать туда :
|
||||
>
|
||||
> ```
|
||||
> --filter-tcp=80 'параметры для http' --new
|
||||
> --filter-tcp=443 'параметры для https' --wssize 1:6 --hostlist-auto=d:/users/user/temp/autolist.txt
|
||||
> ```
|
||||
>
|
||||
> В этих примерах wssize будет применяться всегда к порту tcp 443, а хостлист будет игнорироваться.
|
||||
> К http применять wssize вредно и бессмысленно.
|
||||
|
||||
7) Протестируйте найденные стратегии на winws. Winws следует брать из zapret-winws.
|
||||
Для этого откройте командную строку windows от имени администратора в директории zapret-winws.
|
||||
Проще всего это сделать через `_CMD_ADMIN.cmd`. Он сам поднимет права и зайдет в нужную директорию.
|
||||
|
||||
8) Обеспечьте удобную загрузку обхода блокировок.
|
||||
|
||||
> Есть 2 варианта. Ручной запуск через ярлык или автоматический при старте системы, вне контекста текущего пользователя.
|
||||
> Последний вариант разделяется на запуск через планировщик задач и через службы windows.
|
||||
>
|
||||
> Если хотите ручной запуск, скопируйте `preset_russia.cmd` в `preset_my.cmd` (`<ваше_название>.cmd`) и адаптируйте его под ваши параметра запуска.
|
||||
> Потом можно создать ярлык на рабочем столе на `preset_my.cmd`. Не забудьте, что требуется запускать от имени администратора.
|
||||
>
|
||||
> Но лучше будет сделать неинтерактивный автоматический запуск вместе с системой.
|
||||
> В zapret-winws есть командные файлы `task_*`, предназначенные для управления задачами планировщика.
|
||||
> Там следует поменять содержимое переменной `WINWS1` на свои параметры запуска winws. Пути с пробелами нужно экранировать кавычками с обратным слэшем : `\"`.
|
||||
> После создания задач запустите их. Проверьте, что обход встает после перезагрузки windows.
|
||||
>
|
||||
> Аналогично настраиваются и службы windows. Смотрите `service_*.cmd`
|
||||
|
||||
9) Если ломаются отдельные незаблокированные ресурсы, нужно пользоваться ограничивающим
|
||||
ipset или хост листом. Читайте основной талмуд [readme.md](./readme.md) ради подробностей.
|
||||
Но еще лучше будет подбирать такие стратегии, которые ломают минимум.
|
||||
Есть стратегии довольно безобидные, а есть сильно ломающие, которые подходят только для точечного пробития отдельных ресурсов,
|
||||
когда ничего лучше нет. Хорошая стратегия может сильно ломать из-за плохо подобранных ограничителей для фейков - ttl, fooling.
|
||||
|
||||
> [!CAUTION]
|
||||
> Это минимальная инструкция, чтобы соориентироваться с чего начать. Однако, это - не панацея.
|
||||
> В некоторых случаях вы не обойдетесь без знаний и основного "талмуда".
|
||||
|
||||
Подробности и полное техническое описание расписаны в [readme.md](./readme.md)
|
@@ -1,122 +0,0 @@
|
||||
Специально для тех, кто хочет побыстрее начать, но не хочет слишком углубляться в простыню readme.txt.
|
||||
|
||||
Как обычно, компьютерная грамотность ложится полностью на вас.
|
||||
Вы должны уметь работать с консолью windows и иметь минимальные навыки обращения с командными файлами bat,cmd.
|
||||
Если грамотность отсутствует и возникает куча "как" на базовых вещах - проходите мимо или ищите помощь в другом месте.
|
||||
|
||||
Обход DPI является хакерской методикой. Под этим словом понимается метод, которому сопротивляется окружающая среда,
|
||||
которому автоматически не гарантирована работоспособность в любых условиях и на любых ресурсах,
|
||||
требуется настройка под специфические условия у вашего провайдера. Условия могут меняться со временем,
|
||||
и методика может начинать или переставать работать, может потребоваться повторный анализ ситуации.
|
||||
Могут обнаруживаться отдельные ресурсы, которые заблокированы иначе, и которые не работают или перестали работать.
|
||||
Могут и сломаться отдельные незаблокированные ресурсы.
|
||||
Поэтому очень желательно иметь знания в области сетей, чтобы иметь возможность проанализировать техническую ситуацию.
|
||||
Не будет лишним иметь обходные каналы проксирования трафика на случай, если обход DPI не помогает.
|
||||
|
||||
Будем считать, что у вас есть windows 7 или выше. Задача - обойти блокировки с самой системы.
|
||||
|
||||
Есть решение самое простое, а есть "как положено".
|
||||
|
||||
САМОЕ ПРОСТОЕ РЕШЕНИЕ
|
||||
|
||||
Совсем ничего не могу, все очень сложно, дайте мне таблетку.
|
||||
|
||||
Скачайте и распакуйте архив https://github.com/bol-van/zapret-win-bundle/archive/refs/heads/master.zip
|
||||
Запустите zapret-winws/preset_russia.cmd от имени администратора.
|
||||
Возможно, заведется сразу. Этот вариант похож на "2_any_country.cmd" из GoodbyeDPI.
|
||||
|
||||
То же самое с ограничителем по автоматически создаваемому хост-листу preset_russia_autohostlist.cmd.
|
||||
Что такое autohostlist - читайте readme.txt. Проще говоря, мы обходим только то, что долго и упорно не хочет открываться.
|
||||
Сначала не будет, но надо пытаться много раз, и тогда сработает, а дальше будет всегда срабатывать.
|
||||
Остальное не будет ломаться. Использовать только, если первый вариант тоже работает.
|
||||
|
||||
Не помогла таблетка ? Это вовсе не значит, что ничего не получится. Но придется делать по-нормальному.
|
||||
|
||||
РЕШЕНИЕ "КАК ПОЛОЖЕНО"
|
||||
|
||||
1) Если у вас windows 7, обновляйте систему. Годами не обновляемая 7-ка может не запускать драйвер windivert.
|
||||
Поддержка 32-битных x86 windows возможна, но в готовом виде отсутствует.
|
||||
На windows 11 arm64 выполните arm64/install_arm64.cmd от имени администратора и перезагрузите компьютер.
|
||||
Читайте docs/windows.txt
|
||||
|
||||
Имейте в виду, что антивирусы могут плохо реагировать на windivert.
|
||||
cygwin имеет внушительный список несовместимостей с антивирусами. Многие антивирусы его ломают.
|
||||
https://www.cygwin.com/faq.html#faq.using.bloda
|
||||
Если это имеет место , используйте исключения. Если это не помогает - отключайте антивирус совсем.
|
||||
|
||||
2) Убедитесь, что у вас отключены все средства обхода блокировок, в том числе и сам zapret.
|
||||
|
||||
3) Если вы работаете в виртуальной машине, необходимо использовать соединение с сетью в режиме bridge. nat не подходит
|
||||
|
||||
4) Скачайте и распакуйте архив https://github.com/bol-van/zapret-win-bundle/archive/refs/heads/master.zip
|
||||
|
||||
5) Запустите blockcheck\blockcheck.cmd. blockcheck в начале проверяет DNS. Если выводятся сообщения о подмене адресов, то
|
||||
первым делом нужно решить эту проблему, иначе ничего не будет работать.
|
||||
Решение проблемы DNS выходит за рамки проекта. Обычно она решается либо заменой DNS серверов
|
||||
от провайдера на публичные (1.1.1.1, 8.8.8.8), либо в случае перехвата провайдером обращений
|
||||
к сторонним серверам - через специальные средства шифрования DNS запросов, такие как dnscrypt, DoT, DoH.
|
||||
В современных броузерах чаще всего DoH включен по умолчанию, но curl будет использовать обычный системный DNS.
|
||||
Новые билды win10 и win11 поддерживают системные DoH из коробки. Они не настроены по умолчанию.
|
||||
|
||||
Тут все разжевано как и где это включается : https://hackware.ru/?p=13707
|
||||
|
||||
6) blockcheck позволяет выявить рабочую стратегию обхода блокировок.
|
||||
Лог скрипта будет сохранен в blockcheck\blockcheck.log.
|
||||
Запомните найденные стратегии.
|
||||
|
||||
Следует понимать, что blockcheck проверяет доступность только конкретного домена, который вы вводите в начале.
|
||||
Вероятно, все остальные домены блокированы подобным образом, но не факт.
|
||||
В большинстве случаев можно обьединить несколько стратегий в одну универсальную, но для этого необходимо понимать
|
||||
"что там за буковки". Если вы в сетях слабо разбираетесь, это не для вас. В противном случае читайте readme.txt.
|
||||
zapret не может пробить блокировку по IP адресу
|
||||
Для проверки нескольких доменов вводите их через пробел.
|
||||
|
||||
Сейчас блокираторы ставят на магистральных каналах. В сложных случаях у вас может быть несколько маршрутов
|
||||
с различной длиной по ХОПам, с DPI на разных хопах. Приходится преодолевать целый зоопарк DPI,
|
||||
которые еще и включаются в работу хаотичным образом или образом, зависящим от направления (IP сервера).
|
||||
blockcheck не всегда может выдать вам в итогах оптимальную стратегию, которую надо просто переписать в настройки.
|
||||
В некоторых случаях надо реально думать что происходит, анализируя результат на разных стратегиях.
|
||||
Если вы применяете большой TTL, чтобы достать до магистрала, то не лишним будет добавить дополнительный ограничитель
|
||||
--dpi-desync-fooling, чтобы не сломать сайты на более коротких дистанциях.
|
||||
md5sig наиболее совместим, но работатет только на linux серверах.
|
||||
badseq может работать только на https и не работать на http.
|
||||
Чтобы выяснить какие дополнительные ограничители работают, смотрите результат теста аналогичных стратегий без TTL
|
||||
с каждым из этих ограничителей.
|
||||
|
||||
При использовании autottl следует протестировать как можно больше разных доменов. Эта техника
|
||||
может на одних провайдерах работать стабильно, на других потребуется выяснить при каких параметрах
|
||||
она стабильна, на третьих полный хаос, и проще отказаться.
|
||||
|
||||
Если используются методы нулевой фазы десинхронизации (--wssize, --dpi-desync=syndata) и фильтр hostlist,
|
||||
то все параметры, относящиеся к этим методам, следует помещать в следующий профиль без хостлиста,
|
||||
к которому перейдет управление, когда имя хоста еще неизвестно.
|
||||
Используйте параметр --debug для отладки вашего сценария.
|
||||
|
||||
7) Протестируйте найденные стратегии на winws. winws следует брать из zapret-winws.
|
||||
Для этого откройте командную строку windows от имени администратора в директории zapret-winws.
|
||||
Проще всего это сделать через _CMD_ADMIN.cmd. Он сам поднимет права и зайдет в нужную директорию.
|
||||
|
||||
8) Обеспечьте удобную загрузку обхода блокировок.
|
||||
|
||||
Есть 2 варианта. Ручной запуск через ярлык или автоматический при старте системы, вне контекста текущего пользователя.
|
||||
Последний вариант разделяется на запуск через планировщик задач и через службы windows.
|
||||
|
||||
Если хотите ручной запуск, скопируйте preset_russia.cmd в preset_my.cmd и адаптируйте его под ваши параметра запуска.
|
||||
Потом можно создать ярлык на рабочем столе на preset_my.cmd. Не забудьте, что требуется запускать от имени администратора.
|
||||
|
||||
Но лучше будет сделать неинтерактивный автоматический запуск вместе с системой.
|
||||
В zapret-winws есть командные файлы task_*, предназначенные для управления задачами планировщика.
|
||||
Там следует поменять содержимое переменной WINWS1 на свою стратегию.
|
||||
Если вы не можете обьединить несколько стратегий для разных протоколов в одну, дублируйте код в каждом из cmd
|
||||
для поддержки нескольких задач : winws1,winws2,winws3.
|
||||
После создания задач запустите их. Проверьте, что обход встает после перезагрузки windows.
|
||||
|
||||
Аналогично настраиваются и службы windows. Смотрите service_*.cmd
|
||||
|
||||
9) Если ломаются отдельные незаблокированные ресурсы, используйте хост-листы.
|
||||
Где они будут находиться - решайте сами.
|
||||
Параметры управления хост-листами точно такие же, как в *nix.
|
||||
|
||||
Это минимальная инструкция, чтобы соориентироваться с чего начать. Однако, это - не панацея.
|
||||
В некоторых случаях вы не обойдетесь без знаний и основного "толмуда".
|
||||
Подробности и полное техническое описание расписаны в readme.txt
|
@@ -1,9 +1,53 @@
|
||||
# zapret v.67
|
||||
|
||||
# Multilanguage/Мультиязычный README
|
||||
___
|
||||
[](https://github.com/bol-van/zapret/tree/master/docs/readme.en.md)
|
||||
[](https://github.com/bol-van/zapret/tree/master/docs/readme.md)
|
||||
|
||||
***
|
||||
|
||||
- [What is it for](#what-is-it-for)
|
||||
- [How it works](#how-it-works)
|
||||
- [How to put this into practice in the linux system](#how-to-put-this-into-practice-in-the-linux-system)
|
||||
- [ip6tables](#ip6tables)
|
||||
- [nftables](#nftables)
|
||||
- [When it will not work](#when-it-will-not-work)
|
||||
- [nfqws](#nfqws)
|
||||
- [DPI desync attack](#dpi-desync-attack)
|
||||
- [DPI desync combos](#dpi-desync-combos)
|
||||
- [SYNACK mode](#synack-mode)
|
||||
- [SYNDATA mode](#syndata-mode)
|
||||
- [Virtual Machines](#virtual-machines)
|
||||
- [CONNTRACK](#conntrack)
|
||||
- [Reassemble](#reassemble)
|
||||
- [UDP support](#udp-support)
|
||||
- [IP fragmentation](#ip-fragmentation)
|
||||
- [multiple strategies](#multiple-strategies)
|
||||
- [tpws](#tpws)
|
||||
- [multiple strategies](#multiple-strategies-1)
|
||||
- [Ways to get a list of blocked IP](#ways-to-get-a-list-of-blocked-ip)
|
||||
- [Domain name filtering](#domain-name-filtering)
|
||||
- [**autohostlist** mode](#autohostlist-mode)
|
||||
- [Choosing parameters](#choosing-parameters)
|
||||
- [Screwing to the firewall control system or your launch system](#screwing-to-the-firewall-control-system-or-your-launch-system)
|
||||
- [Installation](#installation)
|
||||
- [Checking ISP](#checking-isp)
|
||||
- [desktop linux system](#desktop-linux-system)
|
||||
- [OpenWRT](#openwrt)
|
||||
- [Android](#android)
|
||||
- [FreeBSD, OpenBSD, MacOS](#freebsd-openbsd-macos)
|
||||
- [Windows (WSL)](#windows-wsl)
|
||||
- [Other devices](#other-devices)
|
||||
- [Donations](#donations)
|
||||
***
|
||||
|
||||
## What is it for
|
||||
|
||||
A stand-alone (without 3rd party servers) DPI circumvention tool.
|
||||
May allow to bypass http(s) website blocking or speed shaping, resist signature tcp/udp protocol discovery.
|
||||
|
||||
The project is mainly aimed at the Russian audience to fight russian regulator named "Roskomnadzor".
|
||||
The project is mainly aimed at the Russian audience.
|
||||
Some features of the project are russian reality specific (such as getting list of sites
|
||||
blocked by Roskomnadzor), but most others are common.
|
||||
|
||||
@@ -97,7 +141,8 @@ Then we can reduce CPU load, refusing to process unnecessary packets.
|
||||
`iptables -t mangle -I POSTROUTING -o <external_interface> -p tcp --dport 80 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 1:6 -m mark ! --mark 0x40000000/0x40000000 -m set --match-set zapret dst -j NFQUEUE --queue-num 200 --queue-bypass`
|
||||
|
||||
Mark filter does not allow nfqws-generated packets to enter the queue again.
|
||||
Its necessary to use this filter when also using `connbytes 1:6`. Without it packet ordering can be changed breaking the whole idea.
|
||||
Its necessary to use this filter when also using `connbytes`. Without it packet ordering can be changed breaking the whole idea.
|
||||
Also if there's huge packet send from nfqws it may deadlock without mark filter.
|
||||
|
||||
Some attacks require redirection of incoming packets :
|
||||
|
||||
@@ -148,10 +193,12 @@ follows all standards. For example, we are routed to squid. Connection goes thro
|
||||
## nfqws
|
||||
|
||||
This program is a packet modifier and a NFQUEUE queue handler.
|
||||
For BSD systems there is dvtws. Its built from the same source and has almost the same parameters (see bsd.eng.md).
|
||||
For BSD systems there is dvtws. Its built from the same source and has almost the same parameters (see [bsd.en.md](./bsd.en.md)).
|
||||
nfqws takes the following parameters:
|
||||
|
||||
```
|
||||
@<config_file> ; read file for options. must be the only argument. other options are ignored.
|
||||
|
||||
--debug=0|1
|
||||
--qnum=<nfqueue_number>
|
||||
--daemon ; daemonize
|
||||
@@ -208,8 +255,11 @@ nfqws takes the following parameters:
|
||||
--hostlist-auto-debug=<logfile> ; debug auto hostlist positives
|
||||
--new ; begin new strategy
|
||||
--filter-l3=ipv4|ipv6 ; L3 protocol filter. multiple comma separated values allowed.
|
||||
--filter-tcp=[~]port1[-port2] ; TCP port filter. ~ means negation. setting tcp and not setting udp filter denies udp.
|
||||
--filter-udp=[~]port1[-port2] ; UDP port filter. ~ means negation. setting udp and not setting tcp filter denies tcp.
|
||||
--filter-tcp=[~]port1[-port2]|* ; TCP port filter. ~ means negation. setting tcp and not setting udp filter denies udp. comma separated list supported.
|
||||
--filter-udp=[~]port1[-port2]|* ; UDP port filter. ~ means negation. setting udp and not setting tcp filter denies tcp. comma separated list supported.
|
||||
--filter-l7=[http|tls|quic|wireguard|dht|unknown] ; L6-L7 protocol filter. multiple comma separated values allowed.
|
||||
--ipset=<filename> ; ipset include filter (one ip/CIDR per line, ipv4 and ipv6 accepted, gzip supported, multiple ipsets allowed)
|
||||
--ipset-exclude=<filename> ; ipset exclude filter (one ip/CIDR per line, ipv4 and ipv6 accepted, gzip supported, multiple ipsets allowed)
|
||||
```
|
||||
|
||||
The manipulation parameters can be combined in any way.
|
||||
@@ -296,7 +346,7 @@ Split mode is very similar to disorder but without segment reordering :
|
||||
|
||||
Mode `split2` disables sending of fake segments. It can be used as a faster alternative to --wsize.
|
||||
|
||||
In `disorder2` and 'split2` modes no fake packets are sent, so ttl and fooling options are not required.
|
||||
In `disorder2` and `split2` modes no fake packets are sent, so ttl and fooling options are not required.
|
||||
|
||||
`seqovl` adds to the first sent original segment (1st for split, 2nd for disorder) seqovl bytes to the beginning and decreases
|
||||
sequence number.
|
||||
@@ -471,7 +521,7 @@ to extract the host name. But it works with auto hostlist profiles.
|
||||
`--dpi-desync-cutoff` allows you to set the threshold at which it stops applying dpi-desync.
|
||||
Can be prefixed with 'n', 'd', 's' symbol the same way as `--wssize-cutoff`.
|
||||
Useful with `--dpi-desync-any-protocol=1`.
|
||||
If the connection falls out of the conntrack and --dpi-desync-cutoff is set, dpi desync will not be applied.
|
||||
If the connection falls out of the conntrack and `--dpi-desync-cutoff` is set, `dpi desync` will not be applied.
|
||||
|
||||
Set conntrack timeouts appropriately.
|
||||
|
||||
@@ -574,18 +624,18 @@ You need to use nftables instead with hook priority 101 or higher.
|
||||
`nfqws` can apply different strategies to different requests. It's done with multiple desync profiles.
|
||||
Profiles are delimited by the `--new` parameter. First profile is created automatically and does not require `--new`.
|
||||
Each profile has a filter. By default it's empty and profile matches any packet.
|
||||
Filter can have hard parameters : ip version and tcp/udp port range.
|
||||
Hard parameters are always identified unambiguously even on zero-phase when hostname is unknown yet.
|
||||
Hostlist can also act as a filter. They can be combined with hard parameters.
|
||||
Filter can have hard parameters : ip version, ipset and tcp/udp port range.
|
||||
Hard parameters are always identified unambiguously even on zero-phase when hostname and L7 are unknown yet.
|
||||
Hostlists can also act as a filter. They can be combined with hard parameters.
|
||||
When a packet comes profiles are matched from the first to the last until first filter condition match.
|
||||
Hard filter is matched first. If it does not match verification goes to the next profile.
|
||||
If a profile matches hard filter and has autohostlist it's selected immediately.
|
||||
If a profile matches hard filter and has normal hostlist(s) and hostname is unknown yet verification goes to the next profile.
|
||||
If a profile matches hard filter , L7 filter and has autohostlist it's selected immediately.
|
||||
If a profile matches hard filter , L7 filter and has normal hostlist(s) and hostname is unknown yet verification goes to the next profile.
|
||||
Otherwise profile hostlist(s) are checked for the hostname. If it matches profile is selected.
|
||||
Otherwise verification goes to the next profile.
|
||||
|
||||
It's possible that before getting hostname connection is served by one profile and after
|
||||
hostname is revealed it's switched to another profile.
|
||||
It's possible that before knowing L7 and hostname connection is served by one profile and after
|
||||
this information is revealed it's switched to another profile.
|
||||
If you use 0-phase desync methods think carefully what can happen during strategy switch.
|
||||
Use `--debug` logging to understand better what `nfqws` does.
|
||||
|
||||
@@ -596,11 +646,16 @@ IMPORTANT : multiple strategies exist only for the case when it's not possible t
|
||||
Copy-pasting blockcheck results of different websites to multiple strategies lead to the mess.
|
||||
This way you may never unblock all resources and only confuse yourself.
|
||||
|
||||
IMPORTANT : user-mode ipset implementation was not designed as a kernel version replacement. Kernel version is much more effective.
|
||||
It's for the systems that lack ipset support : Windows and Linux without nftables and ipset kernel modules (Android, for example).
|
||||
|
||||
## tpws
|
||||
|
||||
tpws is transparent proxy.
|
||||
|
||||
```
|
||||
@<config_file> ; read file for options. must be the only argument. other options are ignored.
|
||||
|
||||
--debug=0|1|2|syslog|@<filename> ; 1 and 2 means log to console and set debug level. for other targets use --debug-level.
|
||||
--debug-level=0|1|2 ; specify debug level for syslog and @<filename>
|
||||
--bind-addr=<v4_addr>|<v6_addr>; for v6 link locals append %interface_name : fe80::1%br-lan
|
||||
@@ -635,7 +690,10 @@ tpws is transparent proxy.
|
||||
|
||||
--new ; begin new strategy
|
||||
--filter-l3=ipv4|ipv6 ; L3 protocol filter. multiple comma separated values allowed.
|
||||
--filter-tcp=[~]port1[-port2] ; TCP port filter. ~ means negation
|
||||
--filter-tcp=[~]port1[-port2]|* ; TCP port filter. ~ means negation. comma separated list supported.
|
||||
--filter-l7=[http|tls|unknown] ; L6-L7 protocol filter. multiple comma separated values allowed.
|
||||
--ipset=<filename> ; ipset include filter (one ip/CIDR per line, ipv4 and ipv6 accepted, gzip supported, multiple ipsets allowed)
|
||||
--ipset-exclude=<filename> ; ipset exclude filter (one ip/CIDR per line, ipv4 and ipv6 accepted, gzip supported, multiple ipsets allowed)
|
||||
|
||||
--hostlist=<filename> ; only act on hosts in the list (one host per line, subdomains auto apply, gzip supported, multiple hostlists allowed)
|
||||
--hostlist-exclude=<filename> ; do not act on hosts in the list (one host per line, subdomains auto apply, gzip supported, multiple hostlists allowed)
|
||||
@@ -844,7 +902,7 @@ If you need "all except" mode you dont have to delete zapret-hosts-users.txt. Ju
|
||||
|
||||
Subdomains auto apply. For example, "ru" in the list affects "*.ru" .
|
||||
|
||||
tpws and nfqws reread lists on HUP signal.
|
||||
tpws and nfqws automatically reload lists if their modification date is changed.
|
||||
|
||||
When filtering by domain name, daemons should run without filtering by ipset.
|
||||
When using large regulator lists estimate the amount of RAM on the router !
|
||||
@@ -854,7 +912,7 @@ When using large regulator lists estimate the amount of RAM on the router !
|
||||
This mode analyzes both client requests and server replies.
|
||||
If a host is not in any list and a situation similar to block occurs host is automatically added to the special list both in memory and file.
|
||||
Use exclude hostlist to prevent autohostlist triggering.
|
||||
If it did happen - delete the undesired record from the file and restart tpws/nfqws or send them SIGHUP to force lists reload.
|
||||
If it did happen - delete the undesired record from the file.
|
||||
|
||||
In case of nfqws it's required to redirect both incoming and outgoing traffic to the queue.
|
||||
It's strongly recommended to use connbytes filter or nfqws will process gigabytes of incoming traffic.
|
||||
@@ -882,7 +940,7 @@ Otherwise it's nothing to lose.
|
||||
However false positives still can occur in case target website is behaving abnormally
|
||||
(may be due to DDoS attack or server malfunction). If it happens bypass strategy
|
||||
may start to break the website. This situation can only be controlled manually.
|
||||
Remove undesired domain from the autohostlist file, restart nfqws/tpws or send them SIGHUP.
|
||||
Remove undesired domain from the autohostlist file.
|
||||
Use exclude hostlist to prevent further auto additions.
|
||||
|
||||
It's possible to use one auto hostlist with multiple processes. All processes check for file modification time.
|
||||
@@ -905,35 +963,106 @@ On openwrt by default `nftables` is selected on `firewall4` based systems.
|
||||
|
||||
`FWTYPE=iptables`
|
||||
|
||||
Main mode :
|
||||
With `nftables` post-NAT scheme is used by default. It allows more DPI attacks on forwarded traffic.
|
||||
It's possible to use `iptables`-like pre-NAT scheme. `nfqws` will see client source IPs and display them in logs.
|
||||
|
||||
`#POSTNAT=0`
|
||||
|
||||
There'are 3 standard options configured separately and independently : `tpws-socks`, `tpws`, `nfqws`.
|
||||
They can be used alone or combined. Custom scripts in `init.d/{sysv,openwrt,macos}/custom.d` are always applied.
|
||||
|
||||
`tpws-socks` requires daemon parameter configuration but does not require traffic interception.
|
||||
Other standard options require also traffic interception.
|
||||
Each standard option launches single daemon instance. Strategy differiences are managed using multi-profile scheme.
|
||||
Main rule for interception is "intercept required minumum". Everything else only wastes CPU resources and slows down connection.
|
||||
|
||||
`--ipset` option is prohibited intentionally to disallow easy to use but ineffective user-mode filtering.
|
||||
Use kernel ipsets instead. It may require custom scripts.
|
||||
|
||||
To use standard updatable hostlists from the `ipset` dir use `<HOSTLIST>` placeholder. It's automatically replaced
|
||||
with hostlist parameters if `MODE_FILTER` variable enables hostlists and is removed otherwise.
|
||||
Standard hostlists are expected in final (fallback) strategies closing groups of filter parameters.
|
||||
Don't use `<HOSTLIST>` in highly specialized profiles. Use your own filter or hostlist(s).
|
||||
`<HOSTLIST_NOAUTO>` marker uses standard autohostlist as usual hostlist thus disabling auto additions in this profile.
|
||||
If any other profile adds something this profile accepts the change automatically.
|
||||
|
||||
|
||||
`tpws` socks proxy mode switch
|
||||
|
||||
`TPWS_SOCKS_ENABLE=0`
|
||||
|
||||
Listening tcp port for `tpws` proxy mode.
|
||||
|
||||
`TPPORT_SOCKS=987`
|
||||
|
||||
`tpws` socks mode parameters
|
||||
|
||||
```
|
||||
tpws - tpws transparent mode
|
||||
tpws-socks - tpws socks mode
|
||||
binds to localhost and LAN interface (if IFACE_LAN is specified or the system is OpenWRT). port 988
|
||||
nfqws - nfqws
|
||||
filter - only fill ipset or load hostlist
|
||||
custom - use custom script for running daemons and establishing firewall rules
|
||||
TPWS_SOCKS_OPT="
|
||||
--filter-tcp=80 --methodeol <HOSTLIST> --new
|
||||
--filter-tcp=443 --split-tls=sni --disorder <HOSTLIST>
|
||||
"
|
||||
```
|
||||
|
||||
`MODE=tpws`
|
||||
`tpws` transparent mode switch
|
||||
|
||||
Enable http fooling :
|
||||
`TPWS_ENABLE=0`
|
||||
|
||||
`MODE_HTTP=1`
|
||||
`tpws` transparent mode target ports
|
||||
|
||||
Apply fooling to keep alive http sessions. Only applicable to nfqws. Tpws always fool keepalives.
|
||||
Not enabling this can save CPU time.
|
||||
`TPWS_PORTS=80,443`
|
||||
|
||||
`MODE_HTTP_KEEPALIVE=0`
|
||||
`tpws` transparent mode parameters
|
||||
|
||||
Enable https fooling :
|
||||
```
|
||||
TPWS_OPT="
|
||||
--filter-tcp=80 --methodeol <HOSTLIST> --new
|
||||
--filter-tcp=443 --split-tls=sni --disorder <HOSTLIST>
|
||||
"
|
||||
```
|
||||
|
||||
`MODE_HTTPS=1`
|
||||
`nfqws` enable switch
|
||||
|
||||
Enable quic fooling :
|
||||
`NFQWS_ENABLE=0`
|
||||
|
||||
`nfqws` port targets for `connbytes`-limited interception. `connbytes` allows to intercept only starting packets from connections.
|
||||
This is more effective kernel-mode alternative to `nfqws --dpi-desync-cutoff=nX`.
|
||||
|
||||
```
|
||||
NFQWS_PORTS_TCP=80,443
|
||||
NFQWS_PORTS_UDP=443
|
||||
```
|
||||
|
||||
How many starting packets should be intercepted to nfqws in each direction
|
||||
|
||||
```
|
||||
NFQWS_TCP_PKT_OUT=$((6+$AUTOHOSTLIST_RETRANS_THRESHOLD))
|
||||
NFQWS_TCP_PKT_IN=3
|
||||
NFQWS_UDP_PKT_OUT=$((6+$AUTOHOSTLIST_RETRANS_THRESHOLD))
|
||||
NFQWS_UDP_PKT_IN=0
|
||||
```
|
||||
|
||||
There's kind of traffic that requires interception of entire outgoing stream.
|
||||
Typically it's support for plain http keepalives and stateless DPI.
|
||||
This mode of interception significantly increases CPU utilization. Use with care and only if required.
|
||||
Here you specify port numbers for unlimited interception.
|
||||
It's advised also to remove these ports from `connbytes`-limited interception list.
|
||||
|
||||
```
|
||||
#NFQWS_PORTS_TCP_KEEPALIVE=80
|
||||
#NFQWS_PORTS_UDP_KEEPALIVE=
|
||||
```
|
||||
|
||||
`nfqws` parameters
|
||||
|
||||
```
|
||||
NFQWS_OPT="
|
||||
--filter-tcp=80 --dpi-desync=fake,split2 --dpi-desync-fooling=md5sig <HOSTLIST> --new
|
||||
--filter-tcp=443 --dpi-desync=fake,disorder2 --dpi-desync-fooling=md5sig <HOSTLIST> --new
|
||||
--filter-udp=443 --dpi-desync=fake --dpi-desync-repeats=6 <HOSTLIST_NOAUTO>
|
||||
"
|
||||
```
|
||||
|
||||
`MODE_QUIC=1`
|
||||
|
||||
Host filtering mode :
|
||||
```
|
||||
@@ -945,62 +1074,6 @@ autohostlist - hostlist mode + blocks auto detection
|
||||
|
||||
`MODE_FILTER=none`
|
||||
|
||||
Its possible to change manipulation options used by tpws :
|
||||
|
||||
`TPWS_OPT="--hostspell=HOST --split-http-req=method --split-pos=3"`
|
||||
|
||||
Additional low priority desync profile for `MODE_FILTER=hostlist`.
|
||||
With multiple profile support 0-phase desync methods are no more applied with hostlist !
|
||||
To apply them additional profile is required without hostlist filter.
|
||||
|
||||
`TPWS_OPT_SUFFIX="--mss=88"`
|
||||
|
||||
nfqws options for DPI desync attack:
|
||||
|
||||
```
|
||||
DESYNC_MARK=0x40000000
|
||||
DESYNC_MARK_POSTNAT=0x20000000
|
||||
NFQWS_OPT_DESYNC="--dpi-desync=fake --dpi-desync-ttl=0 --dpi-desync-fooling=badsum --dpi-desync-fwmark=$DESYNC_MARK"
|
||||
```
|
||||
|
||||
Separate nfqws options for http and https and ip protocol versions 4,6:
|
||||
|
||||
```
|
||||
NFQWS_OPT_DESYNC_HTTP="--dpi-desync=split --dpi-desync-ttl=0 --dpi-desync-fooling=badsum"
|
||||
NFQWS_OPT_DESYNC_HTTPS="--wssize=1:6 --dpi-desync=split --dpi-desync-ttl=0 --dpi-desync-fooling=badsum"
|
||||
NFQWS_OPT_DESYNC_HTTP6="--dpi-desync=split --dpi-desync-ttl=5 --dpi-desync-fooling=none"
|
||||
NFQWS_OPT_DESYNC_HTTPS6="--wssize=1:6 --dpi-desync=split --dpi-desync-ttl=5 --dpi-desync-fooling=none"
|
||||
```
|
||||
|
||||
If one of `NFQWS_OPT_DESYNC_HTTP`/`NFQWS_OPT_DESYNC_HTTPS` is not defined it takes value of NFQWS_OPT_DESYNC.
|
||||
If one of `NFQWS_OPT_DESYNC_HTTP6`/`NFQWS_OPT_DESYNC_HTTPS6` is not defined it takes value from
|
||||
`NFQWS_OPT_DESYNC_HTTP`/`NFQWS_OPT_DESYNC_HTTPS`.
|
||||
It means if only `NFQWS_OPT_DESYNC` is defined all four take its value.
|
||||
|
||||
If a variable is not defined, the value `NFQWS_OPT_DESYNC` is taken.
|
||||
|
||||
Additional low priority desync profile for `MODE_FILTER=hostlist`.
|
||||
With multiple profile support 0-phase desync methods are no more applied with hostlist !
|
||||
To apply them additional profile is required without hostlist filter.
|
||||
```
|
||||
#NFQWS_OPT_DESYNC_SUFFIX="--dpi-desync=syndata"
|
||||
#NFQWS_OPT_DESYNC_HTTP_SUFFIX="--dpi-desync=syndata"
|
||||
#NFQWS_OPT_DESYNC_HTTPS_SUFFIX="--wssize 1:6"
|
||||
#NFQWS_OPT_DESYNC_HTTP6_SUFFIX="--dpi-desync=syndata"
|
||||
#NFQWS_OPT_DESYNC_HTTPS6_SUFFIX="--wssize 1:6"
|
||||
```
|
||||
|
||||
Defaults are filled the same ways as with NFQWS_OPT_*.
|
||||
|
||||
Separate QUIC options for ip protocol versions :
|
||||
|
||||
```
|
||||
NFQWS_OPT_DESYNC_QUIC="--dpi-desync=fake"
|
||||
NFQWS_OPT_DESYNC_QUIC6="--dpi-desync=hopbyhop"
|
||||
```
|
||||
|
||||
If `NFQWS_OPT_DESYNC_QUIC6` is not specified `NFQWS_OPT_DESYNC_QUIC` is taken.
|
||||
|
||||
|
||||
flow offloading control (if supported)
|
||||
|
||||
@@ -1176,7 +1249,8 @@ Note that DNS check is mostly Russia targeted. It checks several pre-defined blo
|
||||
verifies system DNS answers with public DNS answers. Because ISP can block public DNS or redirect any DNS queries
|
||||
to their servers `blockcheck.sh` also checks that all returned answers are unique. Usually if DNS is blocked
|
||||
ISP returns single ip for all blocked domains to redirect you to their "access denied" page.
|
||||
`blockcheck.sh` works in Linux and FreeBSD.
|
||||
DoH servers are used automatically for checks if DNS spoof is detected.
|
||||
`blockcheck.sh` works on all systems supported by `zapret`.
|
||||
|
||||
### desktop linux system
|
||||
|
||||
@@ -1198,6 +1272,8 @@ After installation remove `/tmp/zapret` to free RAM.
|
||||
|
||||
The absolute minimum for openwrt is 64/8 system, 64/16 is comfortable, 128/extroot is recommended.
|
||||
|
||||
For low storage openwrt see `init.d/openwrt-minimal`.
|
||||
|
||||
### Android
|
||||
|
||||
Its not possible to use nfqws and tpws in transparent proxy mode without root privileges.
|
||||
@@ -1242,11 +1318,11 @@ Now its possible to run `/data/local/tmp/zapret/tpws` from any app such as taske
|
||||
|
||||
### FreeBSD, OpenBSD, MacOS
|
||||
|
||||
see docs/bsd.eng.md
|
||||
see [BSD documentation](./bsd.en.md)
|
||||
|
||||
### Windows (WSL)
|
||||
|
||||
see docs/windows.eng.md
|
||||
see [Windows documentation](./windows.en.md)
|
||||
|
||||
### Other devices
|
||||
|
||||
@@ -1270,3 +1346,17 @@ Dont ask me how to do it. Its different for all firmwares and requires studying.
|
||||
Find manual or reverse engineer yourself.
|
||||
Check for race conditions. Firmware can clear or modify iptables after your startup script.
|
||||
If this is the case then run another script in background and add some delay there.
|
||||
|
||||
## Donations
|
||||
|
||||
Are welcome here :
|
||||
|
||||
<img src=https://cdn-icons-png.flaticon.com/16/14446/14446252.png alt="USDT" style="vertical-align: middle;"/> USDT
|
||||
```
|
||||
0x3d52Ce15B7Be734c53fc9526ECbAB8267b63d66E
|
||||
```
|
||||
|
||||
<img src=https://cdn-icons-png.flaticon.com/16/5968/5968260.png alt="USDT" style="vertical-align: middle;"/> BTC
|
||||
```
|
||||
bc1qhqew3mrvp47uk2vevt5sctp7p2x9m7m5kkchve
|
||||
```
|
2189
docs/readme.md
Normal file
2189
docs/readme.md
Normal file
File diff suppressed because it is too large
Load Diff
1937
docs/readme.txt
1937
docs/readme.txt
File diff suppressed because it is too large
Load Diff
@@ -15,7 +15,7 @@ Tor поддерживает "из коробки" режим transparent proxy.
|
||||
4) Завернуть через iptables или nftables трафик с порта назначения 443 и на ip адреса из ipset/nfset 'zapret' на соксификатор
|
||||
Тоже самое сделать с ipset/nfset 'ipban' для всех tcp портов.
|
||||
Буду рассматривать систему на базе openwrt, где уже установлена система обхода dpi "zapret".
|
||||
Если вам не нужны функции обхода DPI, можно выбрать режим MODE=filter.
|
||||
Если вам не нужны функции обхода DPI, его можно не включать. Обновление фильтра от этого не зависит.
|
||||
|
||||
|
||||
* Сделать так, чтобы все время при загрузке системы на некотором порту возникал socks
|
||||
|
@@ -71,7 +71,7 @@ NLM networks are adapter independent. Usually MAC address of the default router
|
||||
That's why NLM is more universal than `ssid-filter`.
|
||||
|
||||
`Cygwin` shell does not run binaries if their directory has it's own copy of `cygwin1.dll`.
|
||||
That's why exists separate standalone version in `binaries/win64/zapret-tpws`.
|
||||
If you want to run `winws` from `cygwin` delete, rename or move `cygwin1.dll`.
|
||||
`Cygwin` is required for `blockcheck.sh` support but `winws` itself can be run standalone without cygwin.
|
||||
|
||||
How to get `windows 7` and `winws` compatible `cygwin` :
|
||||
@@ -80,11 +80,11 @@ curl -O https://www.cygwin.com/setup-x86_64.exe
|
||||
setup-x86_64.exe --allow-unsupported-windows --no-verify --site http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/64bit/2024/01/30/231215
|
||||
```
|
||||
You must choose to install `curl`. To compile from sources install `gcc-core`,`make`,`zlib-devel`.
|
||||
Make from directory `nfq` using `make cygwin64` or `make cygwin32` for 64 and 32 bit versions.
|
||||
|
||||
`winws` requires `cygwin1.dll`, `windivert.dll`, `windivert64.sys`. You can take them from `binaries/win64/zapret-winws`.
|
||||
`winws` requires `cygwin1.dll`, `windivert.dll`, `windivert64.sys` or `windivert32.sys`.
|
||||
You can take them from `binaries/win64` or `binaries/win32`.
|
||||
|
||||
It's possible to build x86 32-bit version but this version is not shipped. You have to build it yourself.
|
||||
32-bit `windivert` can be downloaded from it's developer github. Required version is 2.2.2.
|
||||
There's no `arm64` signed `windivert` driver and no `cygwin`.
|
||||
But it's possible to use unsigned driver version in test mode and user mode components with x64 emulation.
|
||||
x64 emulation requires `windows 11` and not supported in `windows 10`.
|
||||
@@ -120,8 +120,12 @@ cd "C:\\Users\\vasya"
|
||||
cd "C:/Users/vasya"
|
||||
cd "/cygdrive/c/Users/vasya"
|
||||
```
|
||||
`Cygwin` shell does not run binaries if their directory has it's own copy of `cygwin1.dll`.
|
||||
If you want to run `winws` from `cygwin` delete, rename or move `cygwin1.dll`.
|
||||
|
||||
`Cygwin` is required only for `blockcheck.sh`. Standalone `winws` can be run without it.
|
||||
|
||||
To simplify things it's advised to use `zapret-win-bundle`.
|
||||
|
||||
### auto start
|
||||
|
||||
@@ -159,3 +163,5 @@ unix2dos winws.log
|
||||
```
|
||||
|
||||
`winws.log` will be in `cygwin/home/<username>`. `unix2dos` helps with `windows 7` notepad. It's not necessary in `Windows 10` and later.
|
||||
|
||||
Because 32-bit systems are rare nowadays `zapret-win-bundle` exists only for `Windows x64/arm64`.
|
@@ -1,55 +1,68 @@
|
||||
tpws
|
||||
----
|
||||
# Windows
|
||||
|
||||
Запуск tpws возможен только в Linux варианте под WSL.
|
||||
## tpws
|
||||
|
||||
Запуск tpws возможен только в Linux варианте под **WSL** _(Windows Subsystem for Linux)_.
|
||||
Нативного варианта под Windows нет, поскольку он использует epoll, которого под windows не существует.
|
||||
|
||||
tpws в режиме socks можно запускать под более-менее современными билдами windows 10 и windows server
|
||||
с установленным WSL. Совсем не обязательно устанавливать дистрибутив убунту, как вам напишут почти в каждой
|
||||
статье про WSL, которую вы найдете в сети. tpws - статический бинарик, ему дистрибутив не нужен.
|
||||
|
||||
Установить WSL : dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all
|
||||
Скопировать на целевую систему binaries/x86_64/tpws_wsl.tgz.
|
||||
Выполнить : wsl --import tpws "%USERPROFILE%\tpws" tpws_wsl.tgz
|
||||
Запустить : wsl -d tpws --exec /tpws --uid=1 --no-resolve --socks --bind-addr=127.0.0.1 --port=1080 <параметры_дурения>
|
||||
Прописать socks 127.0.0.1:1080 в броузер или другую программу.
|
||||
Установить WSL :
|
||||
`dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all`
|
||||
|
||||
Удаление : wsl --unregister tpws
|
||||
Скопировать на целевую систему `binaries/x86_64/tpws_wsl.tgz`.
|
||||
|
||||
Проверено на windows 10 build 19041 (20.04).
|
||||
Выполнить :
|
||||
`wsl --import tpws "%USERPROFILE%\tpws" tpws_wsl.tgz`
|
||||
|
||||
Не работают функции --oob и --mss из-за ограничений реализации WSL.
|
||||
--disorder не работает из-за особенностей tcp/ip стека windows.
|
||||
Может не срабатывать детект RST в autohostlist.
|
||||
WSL может глючить со splice, приводя к зацикливанию процесса. Может потребоваться --nosplice.
|
||||
Не поддерживается tcp user timeout.
|
||||
Чтобы избавиться от исообщений об ошибке добавляйте "--local-tcp-user-timeout=0 --remote-tcp-user-timeout=0".
|
||||
Запустить :
|
||||
`wsl -d tpws --exec /tpws --uid=1 --no-resolve --socks --bind-addr=127.0.0.1 --port=1080 <параметры_дурения>`
|
||||
|
||||
Прописать socks `127.0.0.1:1080` в браузер или другую программу.
|
||||
|
||||
Удаление : `wsl --unregister tpws`
|
||||
|
||||
> [!NOTE]
|
||||
> Проверено на windows 10 build 19041 (20.04).
|
||||
|
||||
Возможные проблемы:
|
||||
- Не работают функции `--oob` и `--mss` из-за ограничений реализации WSL.
|
||||
`--disorder` не работает из-за особенностей tcp/ip стека windows.
|
||||
|
||||
- Может не срабатывать детект RST в autohostlist.
|
||||
|
||||
- WSL может глючить со splice, приводя к зацикливанию процесса. Может потребоваться `--nosplice`.
|
||||
|
||||
- Не поддерживается tcp user timeout.
|
||||
Чтобы избавиться от сообщений об ошибке добавляйте :
|
||||
`--local-tcp-user-timeout=0 --remote-tcp-user-timeout=0`.
|
||||
Эти сообщения только информативные, на работу они не влияют.
|
||||
|
||||
|
||||
winws
|
||||
-----
|
||||
## winws
|
||||
|
||||
Это вариант пакетного фильтра nfqws для Windows, построенный на базе windivert.
|
||||
Все функции работоспособны, однако функционал ipset отсутствует. Фильтры по большому количеству IP адресов невозможны.
|
||||
Все функции работоспособны, однако функционал ipset в ядре отсутствует. Он реализован в user mode. Фильтры по большому количеству IP адресов невозможны.
|
||||
Работа с проходящим трафиком, например в случае "расшаривания" соединения, не проверялась и не гарантируется.
|
||||
Для работы с windivert требуются права администратора.
|
||||
Специфические для unix параметры, такие как --uid, --user и тд, исключены. Все остальные параметры аналогичны nfqws и dvtws.
|
||||
Специфические для unix параметры, такие как `--uid`, `--user` и тд, исключены. Все остальные параметры аналогичны nfqws и dvtws.
|
||||
|
||||
Работа с пакетным фильтром основана на двух действиях.
|
||||
Первое - выделение перенаправляемого трафика в режиме ядра и передача его пакетному фильтру в user mode.
|
||||
Второе - собственно обработка перенаправленных пакетов в пакетном фильтре.
|
||||
Работа с пакетным фильтром основана на двух действиях :
|
||||
1) Выделение перенаправляемого трафика в режиме ядра и передача его пакетному фильтру в user mode.
|
||||
2) Собственно обработка перенаправленных пакетов в пакетном фильтре.
|
||||
|
||||
В windows отсутствуют встроенные средства для перенаправления трафика, такие как iptables, nftables, pf или ipfw.
|
||||
В windows отсутствуют встроенные средства для перенаправления трафика, такие как _iptables_, _nftables_, _pf_ или _ipfw_.
|
||||
Поэтому используется сторонний драйвер ядра windivert. Он работает, начиная с windows 7. На системах с включенным
|
||||
secure boot могут быть проблемы из-за подписи драйвера. В этом случае отключите secureboot или включите режим testsigning.
|
||||
На windows 7 вероятно будут проблемы с загрузкой windivert. Читайте ниже соответствующий раздел.
|
||||
secure boot могут быть проблемы из-за подписи драйвера. В этом случае отключите `secureboot` или включите режим `testsigning`.
|
||||
На windows 7, вероятно, будут проблемы с загрузкой windivert. Читайте ниже соответствующий раздел.
|
||||
|
||||
Задача iptables в winws решается внутренними средствами через фильтры windivert.
|
||||
Задача _iptables_ в **winws** решается внутренними средствами через фильтры windivert.
|
||||
У windivert существует собственный язык фильтров, похожий на язык фильтров wireshark.
|
||||
Документация по фильтрам windivert : https://reqrypt.org/windivert-doc.html#filter_language
|
||||
[Документация по фильтрам windivert.](https://reqrypt.org/windivert-doc.html#filter_language)
|
||||
Чтобы не писать сложные фильтры вручную, предусмотрены различные упрощенные варианты автоматического построения фильтров.
|
||||
|
||||
```
|
||||
--wf-iface=<int>[.<int>] ; числовые индексы интерфейса и суб-интерфейса
|
||||
--wf-l3=ipv4|ipv6 ; фильтр L3 протоколов. по умолчанию включены ipv4 и ipv6.
|
||||
--wf-tcp=[~]port1[-port2] ; фильтр портов для tcp. ~ означает отрицание
|
||||
@@ -59,164 +72,187 @@ secure boot могут быть проблемы из-за подписи дра
|
||||
--ssid-filter=ssid1[,ssid2,ssid3,...] ; включать winws только когда подключена любая из указанных wifi сетей
|
||||
--nlm-filter=net1[,net2,net3,...] ; включать winws только когда подключена любая из указанных сетей NLM
|
||||
--nlm-list[=all] ; вывести список сетей NLM. по умолчанию только подключенных, all - всех.
|
||||
Параметры --wf-l3, --wf-tcp, --wf-udp могут брать несколько значений через запятую.
|
||||
```
|
||||
|
||||
Номера интерфейсов можно узнать так : netsh int ip show int.
|
||||
Некоторых типы соединений там не увидеть. В этом случае запускайте winws с параметром --debug и смотрите IfIdx там.
|
||||
SubInterface используется windivert, но практически всегда 0, его можно не указывать. Вероятно он нужен в редких случаях.
|
||||
Параметры `--wf-l3`, `--wf-tcp`, `--wf-udp` могут брать несколько значений через запятую.
|
||||
|
||||
Номера интерфейсов можно узнать так : `netsh int ip show int`.
|
||||
Некоторых типы соединений там не увидеть. В этом случае запускайте **winws** с параметром `--debug` и смотрите IfIdx там.
|
||||
SubInterface используется windivert, но практически всегда **0**, его можно не указывать. Вероятно, он нужен в редких случаях.
|
||||
|
||||
Конструктор фильтров автоматически включает входящие tcp пакеты с tcp synack и tcp rst для корректной работы функций
|
||||
autottl и autohostlist. При включении autohostlist так же перенаправляются пакеты данных с http redirect с кодами 302 и 307.
|
||||
Всегда добавляется фильтр на исключение не-интернет адресов ipv4 и ipv6.
|
||||
Для сложных нестандартных сценариев могут потребоваться свои фильтры. Логично будет начать со стандартного шаблона,
|
||||
сохраненного через --wf-save. Нужно править файл и подсовывать его в параметре --wf-raw. Максимальный размер фильтра - 8 Kb.
|
||||
сохраненного через `--wf-save`. Нужно править файл и подсовывать его в параметре `--wf-raw`. Максимальный размер фильтра - **8 Kb**.
|
||||
|
||||
Можно запускать несколько процессов winws с разными стратегиями. Однако, не следует делать пересекающиеся фильтры.
|
||||
Можно запускать несколько процессов **winws** с разными стратегиями. Однако, не следует делать пересекающиеся фильтры.
|
||||
|
||||
В --ssid-filter можно через запятую задать неограниченное количество имен wifi сетей (SSID). Если задана хотя бы одна сеть,
|
||||
то winws включается только, если подключен указанный SSID. Если SSID исчезает, winws отключается. Если SSID появляется снова,
|
||||
В `--ssid-filter` можно через запятую задать неограниченное количество имен wifi сетей (**SSID**). Если задана хотя бы одна сеть,
|
||||
то winws включается только, если подключен указанный **SSID**. Если **SSID** исчезает, winws отключается. Если **SSID** появляется снова,
|
||||
winws включается. Это нужно, чтобы можно было применять раздельное дурение к каждой отдельной wifi сети.
|
||||
Названия сетей должны быть написаны в том регистре, в котором их видит система. Сравнение идет с учетом регистра !
|
||||
Названия сетей должны быть написаны в том регистре, в котором их видит система. Сравнение идет с учетом регистра!
|
||||
При этом нет никаких проверок куда реально идет трафик. Если одновременно подключен, допустим, ethernet,
|
||||
и трафик идет туда, то дурение включается и выключается просто по факту наличия wifi сети, на которую трафик может и не идти.
|
||||
И это может сломать дурение на ethernet. Поэтому полезно так же будет добавить фильтр --wf-iface на индекс интерфейса wifi адаптера,
|
||||
И это может сломать дурение на ethernet. Поэтому полезно так же будет добавить фильтр `--wf-iface` на индекс интерфейса wifi адаптера,
|
||||
чтобы не трогать другой трафик.
|
||||
|
||||
--nlm-filter аналогичен --ssid-filter, но работает с именами или GUIDами сетей Network List Manager (NLM).
|
||||
`--nlm-filter` аналогичен `--ssid-filter`, но работает с именами или GUIDами сетей Network List Manager (NLM).
|
||||
Это те сети, которые вы видите в панели управления в разделе "Центр управления сетями и общим доступом".
|
||||
Под сетью подразумевается не конкретный адаптер, а именно сетевое окружение конкретного подключения.
|
||||
Обычно проверяется mac адрес шлюза. К сети можно подключиться через любой адаптер, и она останется той же самой.
|
||||
Если подключиться, допустим, к разными роутерам по кабелю, то будут разные сети.
|
||||
А если к одному роутеру через 2 разных сетевых карточки на том же компе - будет одна сеть.
|
||||
NLM абстрагирует типы сетевых адаптеров. Он работает как с wifi, так и с ethernet и любыми другими.
|
||||
Поэтому это более универсальный метод, чем ssid фильтр.
|
||||
Поэтому это более универсальный метод, чем **SSID** фильтр.
|
||||
Однако, есть и неприятная сторона. В windows 7 вы легко могли ткнуть на иконку сети и выбрать тип : private или public.
|
||||
Там же вы могли посмотреть список сетей и обьединить их. Чтобы, допустим, вы могли подключаться по кабелю и wifi
|
||||
к одному роутеру, и система эти подключения воспринимала как одну сеть.
|
||||
В следующих версиях windows они эти возможности сильно порезали. Похоже нет встроенных средств полноценно управлять
|
||||
network locations в win10/11. Кое-что есть в powershell.
|
||||
Можно поковыряться напрямую в реестре здесь : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList
|
||||
Нужно менять ProfileGUID в Signatures\Unmanaged. Имена можно поменять в Profiles.
|
||||
network locations в win10/11. Кое-что есть в **powershell**.
|
||||
Можно поковыряться напрямую в реестре здесь :
|
||||
`HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList`
|
||||
Нужно менять ProfileGUID в `Signatures\Unmanaged`. Имена можно поменять в Profiles.
|
||||
Есть кое-какие сторонние утилиты. Кое-что находится, позволяющее посмотреть и удалить network profiles, но не обьединить.
|
||||
Факт, что в ms они это сильно испортили. Движок network list все тот же, и он способен на все то, что было в win7.
|
||||
Можно не бороться с этой проблемой, а просто указывать через запятую те названия сетей или GUIDы, которые выбрала система.
|
||||
Или если у вас только wifi, то использовать --ssid-filter. Там хотя бы есть гарантия, что SSID соответствуют реальности,
|
||||
Или если у вас только wifi, то использовать `--ssid-filter`. Там хотя бы есть гарантия, что **SSID** соответствуют реальности,
|
||||
а система их не назвала как-то по-своему.
|
||||
|
||||
Если в путях присутствуют национальные символы, то при вызове winws из cmd или bat кодировку нужно использовать OEM.
|
||||
Если в путях присутствуют национальные символы, то при вызове winws из `cmd` или `bat` кодировку нужно использовать **OEM**.
|
||||
Для русского языка это 866. Пути с пробелами нужно брать в кавычки.
|
||||
При использовании опции @<config_file> кодировка в файле должна быть **UTF-8** без **BOM mark**.
|
||||
|
||||
Существует неочевидный момент, каcаемый запуска winws из cygwin шелла. Если в директории, где находится nfqws, находится
|
||||
копия cygwin1.dll, winws не запустится. Поэтому в binaries/win64 существует директория zapret-winws, содержащая полный
|
||||
комплект для запуска без cygwin. Его вы и берете для повседневного использования.
|
||||
Если нужен запуск под cygwin, то следует запускать из binaries/win64. Это нужно для работы blockcheck.
|
||||
Из cygwin шелла можно посылать winws сигналы через kill точно так же, как в *nix.
|
||||
Существует неочевидный момент, каcаемый запуска **winws** из cygwin shell\`а. Если в директории, где находится winws, находится
|
||||
копия `cygwin1.dll`, **winws** не запустится.
|
||||
Если нужен запуск под cygwin, то следует удалить или переместить `cygwin1.dll` из `binaries/win64`. Это нужно для работы blockcheck.
|
||||
Из cygwin шелла можно посылать winws сигналы через `kill` точно так же, как в `*nix`.
|
||||
|
||||
Как получить совместимый с windows 7 и winws cygwin :
|
||||
curl -O https://www.cygwin.com/setup-x86_64.exe
|
||||
setup-x86_64.exe --allow-unsupported-windows --no-verify --site http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/64bit/2024/01/30/231215
|
||||
Следует выбрать установку curl.
|
||||
|
||||
Для сборки из исходников требуется gcc-core,make,zlib-devel.
|
||||
Собирать из директории nfq командой "make cygwin".
|
||||
winws требует cygwin1.dll, windivert.dll, windivert64.sys. Их можно взять из binaries/win64/zapret-winws.
|
||||
Версию для 32-битных x86 windows собрать можно, но такие системы уже уходят в прошлое, поэтому если надо - собирайте сами.
|
||||
32-битный windivert можно взять с сайта разработчика. Требуется версия 2.2.2.
|
||||
`curl -O https://www.cygwin.com/setup-x86_64.exe`
|
||||
|
||||
Для arm64 windows нет подписанного драйвера windivert и нет cygwin.
|
||||
`setup-x86_64.exe --allow-unsupported-windows --no-verify --site http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/64bit/2024/01/30/231215`
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Следует выбрать установку curl.
|
||||
|
||||
Для сборки из исходников требуется _gcc-core_,_make_,_zlib-devel_.
|
||||
Собирать из директории nfq командой `make cygwin64` или `make cygwin32` для 64 и 32 битных версий соответственно.
|
||||
**winws** требует `cygwin1.dll`, `windivert.dll`, `windivert64.sys` или `windivert32.sys`.
|
||||
Их можно взять из `binaries/win64` и `binaries/win32`.
|
||||
|
||||
Для _arm64_ windows нет подписанного драйвера windivert и нет cygwin.
|
||||
Однако, эмуляция x64 windows 11 позволяет использовать все, кроме WinDivert64.sys без изменений.
|
||||
Но при этом надо заменить WinDivert64.sys на неподписанную arm64 версию и установить режим testsigning.
|
||||
Но при этом надо заменить WinDivert64.sys на неподписанную _arm64_ версию и установить режим testsigning.
|
||||
|
||||
Windows 7 и windivert
|
||||
---------------------
|
||||
## Windows 7 и windivert
|
||||
|
||||
Требования к подписи драйверов windows изменились в 2021 году.
|
||||
Официальные бесплатные обновления windows 7 закончились в 2020.
|
||||
После этого несколько лет продолжали идти платные обновления по программе ESU.
|
||||
Именно в этих ESU обновлениях находится обновление ядра windows 7, позволяющиее загрузить драйвер
|
||||
windivert 2.2.2-A, который идет в поставке zapret.
|
||||
После этого несколько лет продолжали идти платные обновления по программе **ESU**.
|
||||
Именно в этих **ESU** обновлениях находится обновление ядра windows 7, позволяющиее загрузить драйвер
|
||||
_windivert 2.2.2-A_, который идет в поставке zapret.
|
||||
Поэтому варианты следующие :
|
||||
|
||||
1) Взять windivert64.sys и windivert.dll версии 2.2.0-C или 2.2.0-D отсюда : https://reqrypt.org/download
|
||||
1) Взять `windivert64.sys` и `windivert.dll` версии _2.2.0-C_ или _2.2.0-D_ отсюда : https://reqrypt.org/download
|
||||
и заменить эти 2 файла.
|
||||
В zapret-win-bundle есть отдельных 2 места, где находится winws : zapret-winws и blockcheck/zapret/nfq.
|
||||
В [zapret-win-bundle](https://github.com/bol-van/zapret-win-bundle) есть отдельных 2 места, где находится **winws** : [_zapret-winws_](https://github.com/bol-van/zapret-win-bundle/tree/master/zapret-winws) и [_blockcheck/zapret/nfq_](https://github.com/bol-van/zapret-win-bundle/tree/master/blockcheck).
|
||||
Надо менять в обоих местах.
|
||||
Этот вариант проверен и должен работать. Тем не менее патч 10 летней давности, который включает SHA256
|
||||
сигнатуры, все еще необходим.
|
||||
|
||||
2) Взломать ESU :
|
||||
> [!NOTE]
|
||||
> Этот вариант проверен и должен работать. Тем не менее патч 10 летней давности, который включает SHA256 сигнатуры, все еще необходим.
|
||||
|
||||
2) Взломать **ESU** :
|
||||
https://hackandpwn.com/windows-7-esu-patching/
|
||||
http://www.bifido.net/tweaks-and-scripts/8-extended-security-updates-installer.html
|
||||
и обновить систему
|
||||
|
||||
3) Использовать UpdatePack7R2 от simplix : https://blog.simplix.info
|
||||
Но с этим паком есть проблема. Автор из Украины, он очень обиделся на русских.
|
||||
Если в панели управления стоит регион RU или BY, появляется неприятный диалог.
|
||||
Чтобы эту проблему обойти, можно поставить временно любой другой регион, потом вернуть.
|
||||
Так же нет никаких гарантий, что автор не насовал туда какой-то зловредный код.
|
||||
Использовать на свой страх и риск.
|
||||
> [!WARNING]
|
||||
> Но с этим паком есть проблема. Автор из Украины, он очень обиделся на русских.
|
||||
> Если в панели управления стоит регион RU или BY, появляется неприятный диалог.
|
||||
> Чтобы эту проблему обойти, можно поставить временно любой другой регион, потом вернуть.
|
||||
> Так же нет никаких гарантий, что автор не насовал туда какой-то зловредный код.
|
||||
> Использовать на свой страх и риск.
|
||||
|
||||
Более безопасный вариант - скачать последнюю нормальную довоенную версию : 22.2.10
|
||||
https://nnmclub.to/forum/viewtopic.php?t=1530323
|
||||
Ее достаточно, чтобы windivert 2.2.2-A заработал на windows 7.
|
||||
Ее достаточно, чтобы _windivert 2.2.2-A_ заработал на windows 7.
|
||||
|
||||
blockcheck
|
||||
----------
|
||||
## blockcheck
|
||||
|
||||
blockcheck.sh написан на posix shell и требует некоторых стандартных утилит posix. В windows, естественно, этого нет.
|
||||
Потому просто так запустить blockcheck.sh невозможно.
|
||||
Для этого требуется скачать и установить cygwin так , как описано в предыдущем разделе.
|
||||
Следует запустить от имени администратора cygwin shell через cygwin.bat.
|
||||
`blockcheck.sh` написан на _posix shell_ и требует некоторых стандартных утилит _posix_. В windows, естественно, этого нет.
|
||||
Потому просто так запустить `blockcheck.sh` невозможно.
|
||||
Для этого требуется скачать и установить _cygwin_ так , как описано в предыдущем разделе.
|
||||
Следует запустить от имени администратора _cygwin shell_ через `cygwin.bat`.
|
||||
В нем нужно пройти в директорию с zapret.
|
||||
Обратные слэши путей windows нужно удваивать, менять на прямые слэши, либо использовать отображение на unix path.
|
||||
Корректный вариант 1 : cd "C:\\Users\\vasya"
|
||||
Корректный вариант 2 : cd "C:/Users/vasya"
|
||||
Корректный вариант 3 : cd "/cygdrive/c/Users/vasya"
|
||||
Далее все как в *nix : 1 раз ./install_bin.sh , затем ./blockcheck.sh.
|
||||
Корректные варианты :
|
||||
- `cd C:\\Users\\vasya`
|
||||
- `cd C:/Users/vasya`
|
||||
- `cd /cygdrive/c/Users/vasya`
|
||||
|
||||
Существует неочевидный момент, каcаемый запуска **winws** из _cygwin_ шелла. Если в директории, где находится **winws**, есть копия `cygwin1.dll`, **winws** не запустится. Нужно переименовать файл `cygwin1.dll`.
|
||||
Далее все как в _*nix_ : 1 раз `./install_bin.sh` , затем `./blockcheck.sh`.
|
||||
WSL использовать нельзя, это не то же самое.
|
||||
|
||||
cygwin для обычной работы winws не нужен. Разве что вы хотите посылать winws SIGHUP для перечитки листов без перезапуска.
|
||||
_cygwin_ для обычной работы **winws** не нужен.
|
||||
|
||||
автозапуск winws
|
||||
----------------
|
||||
Однако, хотя такой способ и работает, использование **winws** сильно облегчает [zapret-win-bundle](https://github.com/bol-van/zapret-win-bundle).
|
||||
Там нет проблемы с `cygwin.dll`.
|
||||
|
||||
Для запуска winws вместе с windows есть 2 варианта. Планировщик задач или службы windows.
|
||||
## Автозапуск winws
|
||||
|
||||
Для запуска **winws** вместе с windows есть 2 варианта. Планировщик задач или службы windows.
|
||||
|
||||
Можно создавать задачи и управлять ими через консольную программу schtasks.
|
||||
В директории binaries/win64/winws подготовлены файлы task_*.cmd .
|
||||
В них реализовано создание, удаление, старт и стоп одной копии процесса winws с параметрами из переменной %WINWS1%.
|
||||
В директории `binaries/win64/winws` подготовлены файлы `task_*.cmd` .
|
||||
В них реализовано создание, удаление, старт и стоп одной копии процесса winws с параметрами из переменной `%WINWS1%`.
|
||||
Исправьте параметры на нужную вам стратегию. Если для разных фильтров применяется разная стратегия, размножьте код
|
||||
для задач winws1,winws2,winws3,...
|
||||
для задач _winws1_,_winws2_,_winws3_,_..._
|
||||
|
||||
Аналогично настраивается вариант запуска через службы windows. Смотрите service_*.cmd.
|
||||
Аналогично настраивается вариант запуска через службы windows. Смотрите `service_*.cmd`.
|
||||
|
||||
Все батники требуется запускать от имени администратора.
|
||||
|
||||
Управлять задачами можно так же из графической программы управления планировщиком taskschd.msc
|
||||
Управлять задачами можно так же из графической программы управления планировщиком `taskschd.msc`
|
||||
|
||||
zapret-win-bundle
|
||||
-----------------
|
||||
## Zapret-win-bundle
|
||||
|
||||
Можно не возиться с cygwin, а взять готовый пакет, включающий в себя cygwin и blockcheck : https://github.com/bol-van/zapret-win-bundle
|
||||
Там сделан максимум удобств для сосредоточения на самом zapret, исключая возню с установкой cygwin,
|
||||
Можно не возиться с _cygwin_, а взять готовый пакет, включающий в себя _cygwin_ и _blockcheck_ : https://github.com/bol-van/zapret-win-bundle
|
||||
Там сделан максимум удобств для сосредоточения на самом zapret, исключая возню с установкой _cygwin_,
|
||||
заходами в директории, запусками под администратором и прочими сугубо техническими моментами, в которых могут быть
|
||||
ошибки и непонимания, а новичок без базиса знаний может и вовсе запутаться.
|
||||
|
||||
/zapret-winws - здесь все, что нужно для запуска winws в повседневном рабочем режиме. остальное не нужно.
|
||||
/zapret-winws/_CMD_ADMIN.cmd - получить командную строку cmd в этой директории от имени администратора для тестирования winws
|
||||
с параметрами, вводимыми вручную
|
||||
/blockcheck/blockcheck.cmd - достаточно кликнуть по нему, чтобы пошел blockcheck с записью лога в blockcheck/blockcheck.log
|
||||
/cygwin/cygwin.cmd - запуск среды cygwin bash под текущим пользователем
|
||||
/cygwin/cygwin-admin.cmd - запуск среды cygwin bash под администратором
|
||||
`/zapret-winws` - здесь все, что нужно для запуска winws в повседневном рабочем режиме. остальное не нужно.\
|
||||
`/zapret-winws/_CMD_ADMIN.cmd` - получить командную строку cmd в этой директории от имени администратора для тестирования **winws**
|
||||
с параметрами, вводимыми вручную\
|
||||
`/blockcheck/blockcheck.cmd` - достаточно кликнуть по нему, чтобы пошел _blockcheck_ с записью лога в `blockcheck/blockcheck.log`\
|
||||
`/cygwin/cygwin.cmd` - запуск среды _cygwin bash_ под текущим пользователем\
|
||||
`/cygwin/cygwin-admin.cmd` - запуск среды _cygwin bash_ под администратором
|
||||
|
||||
В среде cygwin уже настроены alias-ы на winws,blockcheck,ip2net,mdig. С путями возиться не нужно !
|
||||
Из cygwin можно не только тестировать winws, но и посылать сигналы.
|
||||
Доступны команды pidof,kill,killall,pgrep,pkill.
|
||||
Но важно понимать, что таким образом не выйдет посылать сигналы winws, запущенному из zapret-winws,
|
||||
поскольку там свой cygwin1.dll, и они не разделяют общее пространство процессов unix.
|
||||
zapret-winws - это отдельный комплект для повседневного использования, не требующий что-то еще, но и не связанный со средой cygwin.
|
||||
В среде _cygwin_ уже настроены alias-ы на winws,blockcheck,ip2net,mdig. С путями возиться не нужно!
|
||||
|
||||
> [!TIP]
|
||||
> Из cygwin можно не только тестировать winws, но и посылать сигналы.
|
||||
> Доступны команды:
|
||||
>- `pidof`
|
||||
>- `kill`
|
||||
>- `killall`
|
||||
>- `pgrep`
|
||||
>- `pkill`
|
||||
|
||||
Но важно понимать, что таким образом не выйдет посылать сигналы **winws**, запущенному из _zapret-winws_,
|
||||
поскольку там свой `cygwin1.dll`, и они не разделяют общее пространство процессов unix.
|
||||
_zapret-winws_ - это отдельный комплект для повседневного использования, не требующий что-то еще, но и не связанный со _средой cygwin_.
|
||||
Специально для посылки сигналов winws в _zapret-winws_ присутствует killall.exe.
|
||||
|
||||
Среду cygwin можно использовать для записи в файл дебаг-лога winws. Для этого пользуйтесь командой tee.
|
||||
winws --debug --wf-tcp=80,443 | tee winws.log
|
||||
winws.log будет в cygwin/home/<имя_пользователя>
|
||||
`winws --debug --wf-tcp=80,443 | tee winws.log`
|
||||
`winws.log` будет в `cygwin/home/<имя_пользователя>`
|
||||
Если у вас windows 7, то блокнот не поймет переводы строк в стиле unix. Воспользуйтесь командой
|
||||
unix2dos winws.log
|
||||
`unix2dos winws.log`
|
||||
|
||||
> [!CAUTION]
|
||||
> Поскольку 32-битные windows мало востребованы, _zapret-win-bundle_ существует только в варианте для windows _x64/arm64_.
|
@@ -282,6 +282,14 @@ ipt PREROUTING -t mangle -i $DEVICE -m set --match-set ipban dst -m set ! --matc
|
||||
|
||||
# /etc/init.d/firewall restart
|
||||
|
||||
Чтобы правила обновлялись в процессе поднятия интерфейсов в системе, нужно внести параметр "reload" в указанное место :
|
||||
--- /etc/config/firewall ---
|
||||
config include
|
||||
option path '/etc/firewall.user'
|
||||
option reload '1'
|
||||
----------------------------
|
||||
|
||||
|
||||
--- Маркировка трафика nftables ---
|
||||
|
||||
В новых openwrt по умолчанию установлен nftables, iptables отсутствует.
|
||||
|
@@ -1,18 +0,0 @@
|
||||
# this custom script applies tpws mode as it would be with MODE=tpws
|
||||
|
||||
OVERRIDE=tpws
|
||||
|
||||
zapret_custom_daemons()
|
||||
{
|
||||
# $1 - 1 - run, 0 - stop
|
||||
|
||||
MODE_OVERRIDE=$OVERRIDE zapret_do_daemons $1
|
||||
}
|
||||
zapret_custom_firewall_v4()
|
||||
{
|
||||
MODE_OVERRIDE=$OVERRIDE pf_anchor_zapret_v4
|
||||
}
|
||||
zapret_custom_firewall_v6()
|
||||
{
|
||||
MODE_OVERRIDE=$OVERRIDE pf_anchor_zapret_v6
|
||||
}
|
@@ -1,18 +0,0 @@
|
||||
# this custom script applies tpws-socks mode as it would be with MODE=tpws-socks
|
||||
|
||||
OVERRIDE=tpws-socks
|
||||
|
||||
zapret_custom_daemons()
|
||||
{
|
||||
# $1 - 1 - run, 0 - stop
|
||||
|
||||
MODE_OVERRIDE=$OVERRIDE zapret_do_daemons $1
|
||||
}
|
||||
zapret_custom_firewall_v4()
|
||||
{
|
||||
MODE_OVERRIDE=$OVERRIDE pf_anchor_zapret_v4
|
||||
}
|
||||
zapret_custom_firewall_v6()
|
||||
{
|
||||
MODE_OVERRIDE=$OVERRIDE pf_anchor_zapret_v6
|
||||
}
|
@@ -1,20 +1,19 @@
|
||||
# this script is an example describing how to run tpws on a custom port
|
||||
|
||||
DNUM=100
|
||||
TPPORT_MY=${TPPORT_MY:-987}
|
||||
TPWS_OPT_MY=${TPWS_OPT_MY:-987}
|
||||
TPWS_OPT_SUFFIX_MY="${TPWS_OPT_SUFFIX_MY:-}"
|
||||
DPORTS_MY=${DPORTS_MY:-20443,20444,30000-30009}
|
||||
TPWS_OPT_EXTRA=${TPWS_OPT_EXTRA:---split-pos=2}
|
||||
DPORTS_EXTRA=${DPORTS_EXTRA:-20443,20444,30000-30009}
|
||||
|
||||
alloc_dnum DNUM_EXTRA_TPWS
|
||||
alloc_tpws_port TPPORT_EXTRA_TPWS
|
||||
|
||||
zapret_custom_daemons()
|
||||
{
|
||||
# $1 - 1 - run, 0 - stop
|
||||
local opt="--user=root --port=$TPPORT_MY"
|
||||
local opt="--user=root --port=$TPPORT_EXTRA_TPWS"
|
||||
tpws_apply_binds opt
|
||||
opt="$opt $TPWS_OPT_MY"
|
||||
opt="$opt $TPWS_OPT_EXTRA"
|
||||
filter_apply_hostlist_target opt
|
||||
filter_apply_suffix opt "$TPWS_OPT_SUFFIX_MY"
|
||||
do_daemon $1 $DNUM "$TPWS" "$opt"
|
||||
do_daemon $1 $DNUM_EXTRA_TPWS "$TPWS" "$opt"
|
||||
}
|
||||
|
||||
# custom firewall functions echo rules for zapret-v4 and zapret-v6 anchors
|
||||
@@ -22,9 +21,9 @@ zapret_custom_daemons()
|
||||
|
||||
zapret_custom_firewall_v4()
|
||||
{
|
||||
pf_anchor_zapret_v4_tpws $TPPORT_MY $(replace_char - : $DPORTS_MY)
|
||||
pf_anchor_zapret_v4_tpws $TPPORT_EXTRA_TPWS $(replace_char - : $DPORTS_EXTRA)
|
||||
}
|
||||
zapret_custom_firewall_v6()
|
||||
{
|
||||
pf_anchor_zapret_v6_tpws $TPPORT_MY $(replace_char - : $DPORTS_MY)
|
||||
pf_anchor_zapret_v6_tpws $TPPORT_EXTRA_TPWS $(replace_char - : $DPORTS_EXTRA)
|
||||
}
|
||||
|
@@ -15,6 +15,7 @@ IPSET_DIR=$ZAPRET_BASE/ipset
|
||||
|
||||
PIDDIR=/var/run
|
||||
[ -n "$TPPORT" ] || TPPORT=988
|
||||
[ -n "$TPPORT_SOCKS" ] || TPPORT=987
|
||||
[ -n "$WS_USER" ] || WS_USER=daemon
|
||||
TPWS_WAIT="--bind-wait-ifup=30 --bind-wait-ip=30"
|
||||
TPWS_WAIT_SOCKS6="$TPWS_WAIT --bind-wait-ip-linklocal=30"
|
||||
@@ -117,8 +118,6 @@ zapret_do_firewall()
|
||||
[ "$1" = 1 -a -n "$INIT_FW_PRE_UP_HOOK" ] && $INIT_FW_PRE_UP_HOOK
|
||||
[ "$1" = 0 -a -n "$INIT_FW_PRE_DOWN_HOOK" ] && $INIT_FW_PRE_DOWN_HOOK
|
||||
|
||||
case "${MODE_OVERRIDE:-$MODE}" in
|
||||
tpws|filter|custom)
|
||||
if [ "$1" = "1" ] ; then
|
||||
pf_anchor_root || return 1
|
||||
pf_anchors_create
|
||||
@@ -127,8 +126,6 @@ zapret_do_firewall()
|
||||
else
|
||||
pf_anchors_clear
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
[ "$1" = 1 -a -n "$INIT_FW_POST_UP_HOOK" ] && $INIT_FW_POST_UP_HOOK
|
||||
[ "$1" = 0 -a -n "$INIT_FW_POST_DOWN_HOOK" ] && $INIT_FW_POST_DOWN_HOOK
|
||||
@@ -150,49 +147,36 @@ zapret_restart_firewall()
|
||||
}
|
||||
|
||||
|
||||
standard_mode_daemons()
|
||||
{
|
||||
local opt
|
||||
|
||||
if [ "$1" = "1" ] && [ "$DISABLE_IPV4" = "1" ] && [ "$DISABLE_IPV6" = "1" ] ; then
|
||||
echo "both ipv4 and ipv6 are disabled. nothing to do"
|
||||
else
|
||||
[ "$TPWS_ENABLE" = 1 ] && check_bad_ws_options $1 "$TPWS_OPT" && {
|
||||
opt="--user=root --port=$TPPORT"
|
||||
tpws_apply_binds opt
|
||||
opt="$opt $TPWS_OPT"
|
||||
filter_apply_hostlist_target opt
|
||||
do_daemon $1 1 "$TPWS" "$opt"
|
||||
}
|
||||
[ "$TPWS_SOCKS_ENABLE" = 1 ] && {
|
||||
opt="--socks --user=$WS_USER --port=$TPPORT_SOCKS"
|
||||
tpws_apply_socks_binds opt
|
||||
opt="$opt $TPWS_SOCKS_OPT"
|
||||
filter_apply_hostlist_target opt
|
||||
do_daemon $1 2 "$TPWS" "$opt"
|
||||
}
|
||||
fi
|
||||
}
|
||||
|
||||
zapret_do_daemons()
|
||||
{
|
||||
# $1 - 1 - run, 0 - stop
|
||||
|
||||
local opt
|
||||
|
||||
case "${MODE_OVERRIDE:-$MODE}" in
|
||||
tpws)
|
||||
[ "$1" = "1" ] && [ "$DISABLE_IPV4" = "1" ] && [ "$DISABLE_IPV6" = "1" ] && {
|
||||
echo "both ipv4 and ipv6 are disabled. nothing to do"
|
||||
return 0
|
||||
}
|
||||
# MacOS requires root. kernel hardcoded requirement for /dev/pf ioctls
|
||||
opt="--user=root --port=$TPPORT"
|
||||
tpws_apply_binds opt
|
||||
opt="$opt $TPWS_OPT"
|
||||
filter_apply_hostlist_target opt
|
||||
filter_apply_suffix opt "$TPWS_OPT_SUFFIX"
|
||||
do_daemon $1 1 "$TPWS" "$opt"
|
||||
;;
|
||||
tpws-socks)
|
||||
[ "$1" = "1" ] && [ "$DISABLE_IPV4" = "1" ] && [ "$DISABLE_IPV6" = "1" ] && {
|
||||
echo "both ipv4 and ipv6 are disabled. nothing to do"
|
||||
return 0
|
||||
}
|
||||
opt="--socks --user=$WS_USER --port=$TPPORT"
|
||||
tpws_apply_socks_binds opt
|
||||
opt="$opt $TPWS_OPT"
|
||||
filter_apply_hostlist_target opt
|
||||
filter_apply_suffix opt "$TPWS_OPT_SUFFIX"
|
||||
do_daemon $1 1 "$TPWS" "$opt"
|
||||
;;
|
||||
filter)
|
||||
;;
|
||||
custom)
|
||||
standard_mode_daemons $1
|
||||
custom_runner zapret_custom_daemons $1
|
||||
;;
|
||||
*)
|
||||
echo "unsupported MODE=$MODE"
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
|
||||
return 0
|
||||
}
|
||||
|
54
init.d/openwrt-minimal/readme.txt
Normal file
54
init.d/openwrt-minimal/readme.txt
Normal file
@@ -0,0 +1,54 @@
|
||||
Minimal tpws startup script for low storage openwrt.
|
||||
|
||||
--- openwrt with NFTABLES (22+)
|
||||
|
||||
Make sure you are running openwrt with nftables, not iptables.
|
||||
No opkg dependencies required !
|
||||
|
||||
* install :
|
||||
|
||||
Copy everything from tpws directory to the root of the router.
|
||||
Copy tpws binary for your architecture to /usr/bin/tpws
|
||||
Set proper access rights : chmod 755 /etc/init.d/tpws /usr/bin/tpws
|
||||
EDIT /etc/config/tpws
|
||||
If you don't want ipv6 : edit /etc/nftables.d and comment lines with ipv6 redirect
|
||||
/etc/init.d/tpws enable
|
||||
/etc/init.d/tpws start
|
||||
fw4 restart
|
||||
|
||||
* full uninstall :
|
||||
|
||||
/etc/init.d/tpws disable
|
||||
/etc/init.d/tpws stop
|
||||
rm -f /etc/nftables.d/90-tpws.nft /etc/firewall.user /etc/init.d/tpws
|
||||
fw4 restart
|
||||
|
||||
--- openwrt with IPTABLES (21-)
|
||||
|
||||
Make sure you are running openwrt with iptables, not nftables.
|
||||
Make sure you do not have anything valuable in /etc/firewall.user.
|
||||
If you have - do not blindly follow instruction in firewall.user part.
|
||||
Merge the code instead or setup your own firewall include in /etc/config/firewall.
|
||||
|
||||
opkg update
|
||||
opkg install iptables-mod-extra
|
||||
IPV6 ONLY : opkg install ip6tables-mod-nat
|
||||
|
||||
* install :
|
||||
|
||||
Copy everything from tpws directory to the root of the router.
|
||||
Copy tpws binary for your architecture to /usr/bin/tpws
|
||||
Set proper access rights : chmod 755 /etc/init.d/tpws /usr/bin/tpws
|
||||
EDIT /etc/config/tpws
|
||||
If you don't want ipv6 : edit /etc/firewall.user and set DISABLE_IPV6=1
|
||||
/etc/init.d/tpws enable
|
||||
/etc/init.d/tpws start
|
||||
fw3 restart
|
||||
|
||||
* full uninstall :
|
||||
|
||||
/etc/init.d/tpws disable
|
||||
/etc/init.d/tpws stop
|
||||
rm -f /etc/nftables.d/90-tpws.nft /etc/firewall.user /etc/init.d/tpws
|
||||
touch /etc/firewall.user
|
||||
fw3 restart
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user