mirror of
https://github.com/bol-van/zapret.git
synced 2026-09-17 14:02:00 +09:00
Compare commits
101 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 87e058624c | |||
| 906665d9a5 | |||
| f97c22e96f | |||
| 9fb1f24808 | |||
| 1a1fc38c8e | |||
| 42a9b8e330 | |||
| 363fbe6943 | |||
| 5cc46a9815 | |||
| ef637c482c | |||
| acccfc75e9 | |||
| a92b4a543e | |||
| 24e3b53165 | |||
| 63e6215be0 | |||
| cb382036f4 | |||
| 928134ca36 | |||
| e5c3e4c706 | |||
| 378411443f | |||
| 74c5b58a1b | |||
| 934903dfdf | |||
| 6cb394de4d | |||
| 003c540f24 | |||
| 0870120cce | |||
| f0b0d89f02 | |||
| a08a358342 | |||
| 61edd29b7e | |||
| 7eb195e533 | |||
| 3d567b0ac4 | |||
| 53eba046ce | |||
| 5ef01d14a9 | |||
| 0f0e748adb | |||
| e0a2116880 | |||
| 3d12e32ee9 | |||
| be57475eee | |||
| e59efa39db | |||
| aa8b96d601 | |||
| 2d1858ebae | |||
| 119e243b36 | |||
| c849e55ef0 | |||
| ec55c6f551 | |||
| 6ca597c89c | |||
| 6ac51a4300 | |||
| 76764ad6b0 | |||
| 75d2f1195d | |||
| c8cb9faf27 | |||
| a3ba4baa02 | |||
| 2d19ab82d8 | |||
| a775aa7aaa | |||
| 0cdbf089cd | |||
| 91c747b4e1 | |||
| 16ac0587a4 | |||
| cfddd55a6f | |||
| 82697e6ebf | |||
| 409579512c | |||
| 6ac8ed4c3f | |||
| 3e35fb9025 | |||
| b17da98fc4 | |||
| 1f46e91342 | |||
| d6f929ee5c | |||
| 6bdec3f87c | |||
| 1a6a2b702e | |||
| e95a06c7ee | |||
| afce40981c | |||
| 33720dee60 | |||
| 994e9c3488 | |||
| d4cfb6800f | |||
| a36e6ee60e | |||
| 813fe416f8 | |||
| 8e766744b6 | |||
| 0bc0997191 | |||
| b056ba95a1 | |||
| bae45abfbf | |||
| 21fc356476 | |||
| 88b6b791e9 | |||
| 48185174cf | |||
| aa8d903bb1 | |||
| cb653bedd6 | |||
| 534c88c96a | |||
| 7be9790839 | |||
| 14d7f27b6a | |||
| 97cefbace9 | |||
| 43cea80619 | |||
| ce7d91a7ca | |||
| 105ac57655 | |||
| 06f5305617 | |||
| 45c3f00539 | |||
| 0c0c2547db | |||
| 60d182b97e | |||
| 907b530068 | |||
| 8763768180 | |||
| 793cd76621 | |||
| 9b47b21918 | |||
| caa364e0ed | |||
| 76992dc3d9 | |||
| 0b8e0dc97d | |||
| 1408c38522 | |||
| cea968d259 | |||
| f91bca170a | |||
| 9d5c9191be | |||
| f4ce79a97c | |||
| 845b9edf85 | |||
| 5ec5ce8246 |
@@ -2,3 +2,4 @@
|
|||||||
*.cmd eol=crlf
|
*.cmd eol=crlf
|
||||||
*.bat eol=crlf
|
*.bat eol=crlf
|
||||||
init.d/windivert.filter.examples/** eol=crlf
|
init.d/windivert.filter.examples/** eol=crlf
|
||||||
|
files/** binary
|
||||||
|
|||||||
@@ -9,14 +9,14 @@ assignees: ''
|
|||||||
|
|
||||||
Issues - это место для обращений к разработчику.
|
Issues - это место для обращений к разработчику.
|
||||||
Discussions - место для обсуждения вопросов между пользователями.
|
Discussions - место для обсуждения вопросов между пользователями.
|
||||||
Не тратье время разработчика на ерунду. Вам не будут здесь обьяснять как скопировать, что "писать в", почему сразу же закрывается окно, почему не открывается сайт или госуслуги. Здесь не место обсуждению любых шаманств , т.е. манипуляций без понимания, в стиле 4pda.
|
Не тратьте время разработчика на ерунду. Вам не будут здесь объяснять как скопировать, что "писать в", почему сразу же закрывается окно, почему не открывается сайт или госуслуги. Здесь не место обсуждению любых шаманств, т.е. манипуляций без понимания, в стиле 4pda.
|
||||||
Пишите только конкретные проблемы на техническом уровне в оригинальном zapret (не в сборках), которые вы заметили, и которые являются или могут являться багами в софте.
|
Пишите только конкретные проблемы на техническом уровне в оригинальном zapret (не в сборках), которые вы заметили, и которые являются или могут являться багами в софте.
|
||||||
Или если вы считаете, что ваше обращение обосновано, технически грамотно и по адресу.
|
Или если вы считаете, что ваше обращение обосновано, технически грамотно и по адресу.
|
||||||
Все, что будет нарушать эти критерии, может быть молча удалено, закрыто или перенесено в дискуссии на усмотрение разработчика.
|
Все, что будет нарушать эти критерии, может быть молча удалено, закрыто или перенесено в дискуссии на усмотрение разработчика.
|
||||||
Если сомневаетесь - пишите лучше сразу в дискуссии.
|
Если сомневаетесь - пишите лучше сразу в дискуссии.
|
||||||
|
|
||||||
Прочитайте для начала docs/quick_start.md или docs/quick_start_windows.md.
|
Прочитайте для начала docs/quick_start.md или docs/quick_start_windows.md.
|
||||||
Там обьясняется для кого этот софт, какие требуются знания, почему это не простая волшебная таблетка.
|
Там объясняется для кого этот софт, какие требуются знания, почему это не простая волшебная таблетка.
|
||||||
|
|
||||||
Вирусов здесь нет. У вас либо чья-то сборка, либо ваш антивирус давно пора отправить на покой. Антивирусы в основном жалуются на upx и windivert, которые убраны НЕ будут. upx - это паковщик для сокращения требуемого места на openwrt, windivert - замена iptables для windows, потенциальный инструмент хакера или компонент зловредной программы, но сам по себе вирусом не является. Не согласны - удаляйте софт. За агрессивные наезды "почему автор распространяет вирусы" молча схватите бан.
|
Вирусов здесь нет. У вас либо чья-то сборка, либо ваш антивирус давно пора отправить на покой. Антивирусы в основном жалуются на upx и windivert, которые убраны НЕ будут. upx - это паковщик для сокращения требуемого места на openwrt, windivert - замена iptables для windows, потенциальный инструмент хакера или компонент зловредной программы, но сам по себе вирусом не является. Не согласны - удаляйте софт. За агрессивные наезды "почему автор распространяет вирусы" молча схватите бан.
|
||||||
|
|
||||||
|
|||||||
+27
-23
@@ -25,27 +25,13 @@ jobs:
|
|||||||
- arch: arm64
|
- arch: arm64
|
||||||
tool: aarch64-unknown-linux-musl
|
tool: aarch64-unknown-linux-musl
|
||||||
- arch: arm
|
- arch: arm
|
||||||
tool: arm-unknown-linux-musleabi
|
tool: armv6-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
|
- arch: mips64
|
||||||
tool: mips64-unknown-linux-musl
|
tool: mips64-unknown-linux-musl
|
||||||
# - arch: mipsel
|
|
||||||
# tool: mipsel-unknown-linux-musl
|
|
||||||
- arch: mipselsf
|
- arch: mipselsf
|
||||||
tool: mipsel-unknown-linux-muslsf
|
tool: mipsel-unknown-linux-muslsf
|
||||||
# - arch: mips
|
|
||||||
# tool: mips-unknown-linux-musl
|
|
||||||
- arch: mipssf
|
- arch: mipssf
|
||||||
tool: mips-unknown-linux-muslsf
|
tool: mips-unknown-linux-muslsf
|
||||||
# - arch: ppc64
|
|
||||||
# tool: powerpc64-unknown-linux-musl
|
|
||||||
- arch: ppc
|
- arch: ppc
|
||||||
tool: powerpc-unknown-linux-musl
|
tool: powerpc-unknown-linux-musl
|
||||||
- arch: x86
|
- arch: x86
|
||||||
@@ -69,7 +55,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
ARCH: ${{ matrix.arch }}
|
ARCH: ${{ matrix.arch }}
|
||||||
TOOL: ${{ matrix.tool }}
|
TOOL: ${{ matrix.tool }}
|
||||||
REPO: ${{ matrix.arch == 'lexra' && matrix.repo || 'spvkgn/musl-cross' }}
|
REPO: ${{ matrix.arch == 'lexra' && matrix.repo || 'bol-van/musl-cross' }}
|
||||||
DIR: ${{ matrix.arch == 'lexra' && matrix.dir || matrix.tool }}
|
DIR: ${{ matrix.arch == 'lexra' && matrix.dir || matrix.tool }}
|
||||||
run: |
|
run: |
|
||||||
if [[ "$ARCH" == lexra ]]; then
|
if [[ "$ARCH" == lexra ]]; then
|
||||||
@@ -102,6 +88,15 @@ jobs:
|
|||||||
export STRIP=$TARGET-strip
|
export STRIP=$TARGET-strip
|
||||||
export PKG_CONFIG_PATH=$DEPS_DIR/lib/pkgconfig
|
export PKG_CONFIG_PATH=$DEPS_DIR/lib/pkgconfig
|
||||||
export STAGING_DIR=$RUNNER_TEMP
|
export STAGING_DIR=$RUNNER_TEMP
|
||||||
|
OPTIMIZE=-Oz
|
||||||
|
case "$ARCH" in
|
||||||
|
lexra)
|
||||||
|
OPTIMIZE=-Os
|
||||||
|
;;
|
||||||
|
arm)
|
||||||
|
CPU="-mcpu=arm1176jzf-s -mthumb"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
# netfilter libs
|
# netfilter libs
|
||||||
wget -qO- https://www.netfilter.org/pub/libnfnetlink/libnfnetlink-1.0.2.tar.bz2 | tar -xj
|
wget -qO- https://www.netfilter.org/pub/libnfnetlink/libnfnetlink-1.0.2.tar.bz2 | tar -xj
|
||||||
@@ -111,7 +106,7 @@ jobs:
|
|||||||
for i in libmnl libnfnetlink libnetfilter_queue ; do
|
for i in libmnl libnfnetlink libnetfilter_queue ; do
|
||||||
(
|
(
|
||||||
cd $i-*
|
cd $i-*
|
||||||
CFLAGS="-Os -flto=auto $CFLAGS" \
|
CFLAGS="$OPTIMIZE $CPU -flto=auto $CFLAGS" \
|
||||||
./configure --prefix= --host=$TARGET --enable-static --disable-shared --disable-dependency-tracking
|
./configure --prefix= --host=$TARGET --enable-static --disable-shared --disable-dependency-tracking
|
||||||
make install -j$(nproc) DESTDIR=$DEPS_DIR
|
make install -j$(nproc) DESTDIR=$DEPS_DIR
|
||||||
)
|
)
|
||||||
@@ -123,7 +118,7 @@ jobs:
|
|||||||
xargs -I{} wget -qO- https://github.com/madler/zlib/archive/refs/tags/{}.tar.gz | tar -xz
|
xargs -I{} wget -qO- https://github.com/madler/zlib/archive/refs/tags/{}.tar.gz | tar -xz
|
||||||
(
|
(
|
||||||
cd zlib-*
|
cd zlib-*
|
||||||
CFLAGS="-Os -flto=auto $CFLAGS" \
|
CFLAGS="$OPTIMIZE $CPU -flto=auto $CFLAGS" \
|
||||||
./configure --prefix= --static
|
./configure --prefix= --static
|
||||||
make install -j$(nproc) DESTDIR=$DEPS_DIR
|
make install -j$(nproc) DESTDIR=$DEPS_DIR
|
||||||
)
|
)
|
||||||
@@ -134,7 +129,8 @@ jobs:
|
|||||||
install -Dm644 -t $DEPS_DIR/include/sys /usr/include/x86_64-linux-gnu/sys/queue.h /usr/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
|
# zapret
|
||||||
CFLAGS="-DZAPRET_GH_VER=${{ github.ref_name }} -DZAPRET_GH_HASH=${{ github.sha }} -static-libgcc -static -I$DEPS_DIR/include $CFLAGS" \
|
OPTIMIZE=$OPTIMIZE \
|
||||||
|
CFLAGS="-DZAPRET_GH_VER=${{ github.ref_name }} -DZAPRET_GH_HASH=${{ github.sha }} -static-libgcc -static $CPU -I$DEPS_DIR/include $CFLAGS" \
|
||||||
LDFLAGS="-L$DEPS_DIR/lib $LDFLAGS" \
|
LDFLAGS="-L$DEPS_DIR/lib $LDFLAGS" \
|
||||||
make -C zapret -j$(nproc)
|
make -C zapret -j$(nproc)
|
||||||
tar -C zapret/binaries/my -cJf zapret-linux-$ARCH.tar.xz .
|
tar -C zapret/binaries/my -cJf zapret-linux-$ARCH.tar.xz .
|
||||||
@@ -340,6 +336,14 @@ jobs:
|
|||||||
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
|
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
|
||||||
export STRIP=$TOOLCHAIN/bin/llvm-strip
|
export STRIP=$TOOLCHAIN/bin/llvm-strip
|
||||||
export PKG_CONFIG_PATH=$DEPS_DIR/lib/pkgconfig
|
export PKG_CONFIG_PATH=$DEPS_DIR/lib/pkgconfig
|
||||||
|
case "$ABI" in
|
||||||
|
armeabi-v7a)
|
||||||
|
CPU="-mthumb"
|
||||||
|
;;
|
||||||
|
arm64-v8a)
|
||||||
|
PAGESIZE="-Wl,-z,max-page-size=16384"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
# netfilter libs
|
# netfilter libs
|
||||||
wget -qO- https://www.netfilter.org/pub/libnfnetlink/libnfnetlink-1.0.2.tar.bz2 | tar -xj
|
wget -qO- https://www.netfilter.org/pub/libnfnetlink/libnfnetlink-1.0.2.tar.bz2 | tar -xj
|
||||||
@@ -350,7 +354,7 @@ jobs:
|
|||||||
for i in libmnl libnfnetlink libnetfilter_queue ; do
|
for i in libmnl libnfnetlink libnetfilter_queue ; do
|
||||||
(
|
(
|
||||||
cd $i-*
|
cd $i-*
|
||||||
CFLAGS="-Os -flto=auto -Wno-implicit-function-declaration" \
|
CFLAGS="$CPU -Os -flto=auto -Wno-implicit-function-declaration" \
|
||||||
./configure --prefix= --host=$TARGET --enable-static --disable-shared --disable-dependency-tracking
|
./configure --prefix= --host=$TARGET --enable-static --disable-shared --disable-dependency-tracking
|
||||||
make install -j$(nproc) DESTDIR=$DEPS_DIR
|
make install -j$(nproc) DESTDIR=$DEPS_DIR
|
||||||
)
|
)
|
||||||
@@ -358,8 +362,8 @@ jobs:
|
|||||||
done
|
done
|
||||||
|
|
||||||
# zapret
|
# zapret
|
||||||
CFLAGS="-DZAPRET_GH_VER=${{ github.ref_name }} -DZAPRET_GH_HASH=${{ github.sha }} -I$DEPS_DIR/include" \
|
CFLAGS="$CPU -DZAPRET_GH_VER=${{ github.ref_name }} -DZAPRET_GH_HASH=${{ github.sha }} -I$DEPS_DIR/include" \
|
||||||
LDFLAGS="-L$DEPS_DIR/lib" \
|
LDFLAGS="-L$DEPS_DIR/lib $PAGESIZE" \
|
||||||
make -C zapret android -j$(nproc)
|
make -C zapret android -j$(nproc)
|
||||||
|
|
||||||
# strip unwanted ELF sections to prevent warnings on old Android versions
|
# strip unwanted ELF sections to prevent warnings on old Android versions
|
||||||
@@ -468,7 +472,7 @@ jobs:
|
|||||||
(
|
(
|
||||||
cd ${{ env.repo_dir }}
|
cd ${{ env.repo_dir }}
|
||||||
rm -rf binaries/{android*,freebsd*,mac*,win*,x86_64/tpws_wsl.tgz} \
|
rm -rf binaries/{android*,freebsd*,mac*,win*,x86_64/tpws_wsl.tgz} \
|
||||||
init.d/{openrc,macos,pfsense,runit,s6,systemd} \
|
init.d/{openrc,macos,pfsense,runit,s6,systemd,windivert.filter.examples} \
|
||||||
tpws nfq ip2net mdig docs files/huawei Makefile
|
tpws nfq ip2net mdig docs files/huawei Makefile
|
||||||
)
|
)
|
||||||
tar --owner=0 --group=0 -czf ${{ env.repo_dir }}-openwrt-embedded.tar.gz ${{ env.repo_dir }}
|
tar --owner=0 --group=0 -czf ${{ env.repo_dir }}-openwrt-embedded.tar.gz ${{ env.repo_dir }}
|
||||||
|
|||||||
+77
-61
@@ -56,7 +56,7 @@ HDRTEMP=/tmp/zapret-hdr
|
|||||||
NFT_TABLE=blockcheck
|
NFT_TABLE=blockcheck
|
||||||
|
|
||||||
DNSCHECK_DNS=${DNSCHECK_DNS:-8.8.8.8 1.1.1.1 77.88.8.1}
|
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}
|
DNSCHECK_DOM=${DNSCHECK_DOM:-pornhub.com ej.ru 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"}
|
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_DIG1=/tmp/dig1.txt
|
||||||
DNSCHECK_DIG2=/tmp/dig2.txt
|
DNSCHECK_DIG2=/tmp/dig2.txt
|
||||||
@@ -219,7 +219,7 @@ doh_resolve()
|
|||||||
# $1 - ip version 4/6
|
# $1 - ip version 4/6
|
||||||
# $2 - hostname
|
# $2 - hostname
|
||||||
# $3 - doh server URL. use $DOH_SERVER if empty
|
# $3 - doh server URL. use $DOH_SERVER if empty
|
||||||
$MDIG --family=$1 --dns-make-query=$2 | $CURL --max-time $CURL_MAX_TIME_DOH -s --data-binary @- -H "Content-Type: application/dns-message" "${3:-$DOH_SERVER}" | $MDIG --dns-parse-query
|
"$MDIG" --family=$1 --dns-make-query=$2 | "$CURL" --max-time $CURL_MAX_TIME_DOH -s --data-binary @- -H "Content-Type: application/dns-message" "${3:-$DOH_SERVER}" | "$MDIG" --dns-parse-query
|
||||||
}
|
}
|
||||||
doh_find_working()
|
doh_find_working()
|
||||||
{
|
{
|
||||||
@@ -247,7 +247,7 @@ mdig_vars()
|
|||||||
# $1 - ip version 4/6
|
# $1 - ip version 4/6
|
||||||
# $2 - hostname
|
# $2 - hostname
|
||||||
|
|
||||||
hostvar=$(echo $2 | sed -e 's/[\.-]/_/g')
|
hostvar=$(echo $2 | sed -e 's/[\./?&#@%*$^:~=!()+-]/_/g')
|
||||||
cachevar=DNSCACHE_${hostvar}_$1
|
cachevar=DNSCACHE_${hostvar}_$1
|
||||||
countvar=${cachevar}_COUNT
|
countvar=${cachevar}_COUNT
|
||||||
eval count=\$${countvar}
|
eval count=\$${countvar}
|
||||||
@@ -278,41 +278,45 @@ mdig_cache()
|
|||||||
mdig_resolve()
|
mdig_resolve()
|
||||||
{
|
{
|
||||||
# $1 - ip version 4/6
|
# $1 - ip version 4/6
|
||||||
# $2 - hostname
|
# $2 - var to receive result
|
||||||
|
# $3 - hostname, possibly with uri : rutracker.org/xxx/xxxx
|
||||||
|
local hostvar cachevar countvar count n sdom
|
||||||
|
|
||||||
local hostvar cachevar countvar count ip n
|
split_by_separator "$3" / sdom
|
||||||
mdig_vars "$@"
|
mdig_vars "$1" "$sdom"
|
||||||
if [ -n "$count" ]; then
|
if [ -n "$count" ]; then
|
||||||
n=$(random 0 $(($count-1)))
|
n=$(random 0 $(($count-1)))
|
||||||
eval ip=\$${cachevar}_$n
|
eval $2=\$${cachevar}_$n
|
||||||
echo $ip
|
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
mdig_cache "$@" && mdig_resolve "$@"
|
mdig_cache "$1" "$sdom" && mdig_resolve "$1" "$2" "$sdom"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
mdig_resolve_all()
|
mdig_resolve_all()
|
||||||
{
|
{
|
||||||
# $1 - ip version 4/6
|
# $1 - ip version 4/6
|
||||||
# $2 - hostname
|
# $2 - var to receive result
|
||||||
|
# $3 - hostname
|
||||||
|
|
||||||
local hostvar cachevar countvar count ip ips n
|
local hostvar cachevar countvar count ip__ ips__ n sdom
|
||||||
mdig_vars "$@"
|
|
||||||
|
split_by_separator "$3" / sdom
|
||||||
|
mdig_vars "$1" "$sdom"
|
||||||
if [ -n "$count" ]; then
|
if [ -n "$count" ]; then
|
||||||
n=0
|
n=0
|
||||||
while [ "$n" -le $count ]; do
|
while [ "$n" -le $count ]; do
|
||||||
eval ip=\$${cachevar}_$n
|
eval ip__=\$${cachevar}_$n
|
||||||
if [ -n "$ips" ]; then
|
if [ -n "$ips__" ]; then
|
||||||
ips="$ips $ip"
|
ips__="$ips__ $ip__"
|
||||||
else
|
else
|
||||||
ips="$ip"
|
ips__="$ip__"
|
||||||
fi
|
fi
|
||||||
n=$(($n + 1))
|
n=$(($n + 1))
|
||||||
done
|
done
|
||||||
echo "$ips"
|
eval $2="\$ips__"
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
mdig_cache "$@" && mdig_resolve_all "$@"
|
mdig_cache "$1" "$sdom" && mdig_resolve_all "$1" "$2" "$sdom"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -423,7 +427,7 @@ check_system()
|
|||||||
}
|
}
|
||||||
echo firewall type is $FWTYPE
|
echo firewall type is $FWTYPE
|
||||||
echo CURL=$CURL
|
echo CURL=$CURL
|
||||||
$CURL --version
|
"$CURL" --version
|
||||||
}
|
}
|
||||||
|
|
||||||
zp_already_running()
|
zp_already_running()
|
||||||
@@ -479,7 +483,7 @@ check_prerequisites()
|
|||||||
exitp 6
|
exitp 6
|
||||||
}
|
}
|
||||||
|
|
||||||
local prog progs='curl'
|
local prog progs="$CURL"
|
||||||
[ "$SKIP_PKTWS" = 1 ] || {
|
[ "$SKIP_PKTWS" = 1 ] || {
|
||||||
case "$UNAME" in
|
case "$UNAME" in
|
||||||
Linux)
|
Linux)
|
||||||
@@ -595,12 +599,12 @@ curl_translate_code()
|
|||||||
curl_supports_tls13()
|
curl_supports_tls13()
|
||||||
{
|
{
|
||||||
local r
|
local r
|
||||||
$CURL --tlsv1.3 -Is -o /dev/null --max-time 1 http://127.0.0.1:65535 2>/dev/null
|
"$CURL" --tlsv1.3 -Is -o /dev/null --max-time 1 http://127.0.0.1:65535 2>/dev/null
|
||||||
# return code 2 = init failed. likely bad command line options
|
# return code 2 = init failed. likely bad command line options
|
||||||
[ $? = 2 ] && return 1
|
[ $? = 2 ] && return 1
|
||||||
# curl can have tlsv1.3 key present but ssl library without TLS 1.3 support
|
# 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
|
# this is online test because there's no other way to trigger library incompatibility case
|
||||||
$CURL --tlsv1.3 --max-time 1 -Is -o /dev/null https://iana.org 2>/dev/null
|
"$CURL" --tlsv1.3 --max-time 1 -Is -o /dev/null https://iana.org 2>/dev/null
|
||||||
r=$?
|
r=$?
|
||||||
[ $r != 4 -a $r != 35 ]
|
[ $r != 4 -a $r != 35 ]
|
||||||
}
|
}
|
||||||
@@ -608,16 +612,16 @@ curl_supports_tls13()
|
|||||||
curl_supports_tlsmax()
|
curl_supports_tlsmax()
|
||||||
{
|
{
|
||||||
# supported only in OpenSSL and LibreSSL
|
# supported only in OpenSSL and LibreSSL
|
||||||
$CURL --version | grep -Fq -e OpenSSL -e LibreSSL -e BoringSSL -e GnuTLS -e quictls || return 1
|
"$CURL" --version | grep -Fq -e OpenSSL -e LibreSSL -e BoringSSL -e GnuTLS -e quictls || return 1
|
||||||
# supported since curl 7.54
|
# supported since curl 7.54
|
||||||
$CURL --tls-max 1.2 -Is -o /dev/null --max-time 1 http://127.0.0.1:65535 2>/dev/null
|
"$CURL" --tls-max 1.2 -Is -o /dev/null --max-time 1 http://127.0.0.1:65535 2>/dev/null
|
||||||
# return code 2 = init failed. likely bad command line options
|
# return code 2 = init failed. likely bad command line options
|
||||||
[ $? != 2 ]
|
[ $? != 2 ]
|
||||||
}
|
}
|
||||||
|
|
||||||
curl_supports_connect_to()
|
curl_supports_connect_to()
|
||||||
{
|
{
|
||||||
$CURL --connect-to 127.0.0.1:: -o /dev/null --max-time 1 http://127.0.0.1:65535 2>/dev/null
|
"$CURL" --connect-to 127.0.0.1:: -o /dev/null --max-time 1 http://127.0.0.1:65535 2>/dev/null
|
||||||
[ "$?" != 2 ]
|
[ "$?" != 2 ]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -625,7 +629,7 @@ curl_supports_http3()
|
|||||||
{
|
{
|
||||||
# if it has http3 : curl: (3) HTTP/3 requested for non-HTTPS URL
|
# if it has http3 : curl: (3) HTTP/3 requested for non-HTTPS URL
|
||||||
# otherwise : curl: (2) option --http3-only: is unknown
|
# otherwise : curl: (2) option --http3-only: is unknown
|
||||||
$CURL --connect-to 127.0.0.1:: -o /dev/null --max-time 1 --http3-only http://127.0.0.1:65535 2>/dev/null
|
"$CURL" --connect-to 127.0.0.1:: -o /dev/null --max-time 1 --http3-only http://127.0.0.1:65535 2>/dev/null
|
||||||
[ "$?" != 2 ]
|
[ "$?" != 2 ]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -653,10 +657,10 @@ curl_with_subst_ip()
|
|||||||
*:*) ip="[$ip]" ;;
|
*:*) ip="[$ip]" ;;
|
||||||
esac
|
esac
|
||||||
local connect_to="--connect-to $1::$ip${2:+:$2}" arg
|
local connect_to="--connect-to $1::$ip${2:+:$2}" arg
|
||||||
shift ; shift ; shift
|
shift ; shift ; shift;
|
||||||
[ "$CURL_VERBOSE" = 1 ] && arg="-v"
|
[ "$CURL_VERBOSE" = 1 ] && arg="-v"
|
||||||
[ "$CURL_CMD" = 1 ] && echo $CURL ${arg:+$arg }$connect_to "$@"
|
[ "$CURL_CMD" = 1 ] && echo $CURL ${arg:+$arg }$connect_to "$@"
|
||||||
ALL_PROXY="$ALL_PROXY" $CURL ${arg:+$arg }$connect_to "$@"
|
ALL_PROXY="$ALL_PROXY" "$CURL" ${arg:+$arg }$connect_to "$@"
|
||||||
}
|
}
|
||||||
curl_with_dig()
|
curl_with_dig()
|
||||||
{
|
{
|
||||||
@@ -664,11 +668,14 @@ curl_with_dig()
|
|||||||
# $2 - domain name
|
# $2 - domain name
|
||||||
# $3 - port
|
# $3 - port
|
||||||
# $4+ - curl params
|
# $4+ - curl params
|
||||||
local dom=$2 port=$3
|
local dom="$2" port=$3
|
||||||
local ip=$(mdig_resolve $1 $dom)
|
local sdom suri ip
|
||||||
|
|
||||||
|
split_by_separator "$dom" / sdom suri
|
||||||
|
mdig_resolve $1 ip $sdom
|
||||||
shift ; shift ; shift
|
shift ; shift ; shift
|
||||||
if [ -n "$ip" ]; then
|
if [ -n "$ip" ]; then
|
||||||
curl_with_subst_ip $dom $port $ip "$@"
|
curl_with_subst_ip "$sdom" "$port" "$ip" "$@"
|
||||||
else
|
else
|
||||||
return 6
|
return 6
|
||||||
fi
|
fi
|
||||||
@@ -680,12 +687,12 @@ curl_probe()
|
|||||||
# $3 - port
|
# $3 - port
|
||||||
# $4 - subst ip
|
# $4 - subst ip
|
||||||
# $5+ - curl params
|
# $5+ - curl params
|
||||||
local ipv=$1 dom=$2 port=$3 subst=$4
|
local ipv=$1 dom="$2" port=$3 subst=$4
|
||||||
shift; shift; shift; shift
|
shift; shift; shift; shift
|
||||||
if [ -n "$subst" ]; then
|
if [ -n "$subst" ]; then
|
||||||
curl_with_subst_ip $dom $port $subst "$@"
|
curl_with_subst_ip "$dom" $port $subst "$@"
|
||||||
else
|
else
|
||||||
curl_with_dig $ipv $dom $port "$@"
|
curl_with_dig $ipv "$dom" $port "$@"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
curl_test_http()
|
curl_test_http()
|
||||||
@@ -695,8 +702,8 @@ curl_test_http()
|
|||||||
# $3 - subst ip
|
# $3 - subst ip
|
||||||
# $4 - "detail" - detail info
|
# $4 - "detail" - detail info
|
||||||
|
|
||||||
local code loc hdrt="${HDRTEMP}_${!:-$$}.txt"
|
local code loc hdrt="${HDRTEMP}_${!:-$$}.txt" dom="$(tolower "$2")"
|
||||||
curl_probe $1 $2 $HTTP_PORT "$3" -SsD "$hdrt" -A "$USER_AGENT" --max-time $CURL_MAX_TIME $CURL_OPT "http://$2" -o /dev/null 2>&1 || {
|
curl_probe $1 "$2" $HTTP_PORT "$3" -SsD "$hdrt" -A "$USER_AGENT" --max-time $CURL_MAX_TIME $CURL_OPT "http://$2" -o /dev/null 2>&1 || {
|
||||||
code=$?
|
code=$?
|
||||||
rm -f "$hdrt"
|
rm -f "$hdrt"
|
||||||
return $code
|
return $code
|
||||||
@@ -708,8 +715,9 @@ curl_test_http()
|
|||||||
code=$(hdrfile_http_code "$hdrt")
|
code=$(hdrfile_http_code "$hdrt")
|
||||||
[ "$code" = 301 -o "$code" = 302 -o "$code" = 307 -o "$code" = 308 ] && {
|
[ "$code" = 301 -o "$code" = 302 -o "$code" = 307 -o "$code" = 308 ] && {
|
||||||
loc=$(hdrfile_location "$hdrt")
|
loc=$(hdrfile_location "$hdrt")
|
||||||
echo "$loc" | grep -qE "^https?://.*$2(/|$)" ||
|
split_by_separator "$dom" / dom
|
||||||
echo "$loc" | grep -vqE '^https?://' || {
|
tolower "$loc" | grep -qE "^https?://.*$dom(/|$)" ||
|
||||||
|
tolower "$loc" | grep -vqE '^https?://' || {
|
||||||
echo suspicious redirection $code to : $loc
|
echo suspicious redirection $code to : $loc
|
||||||
rm -f "$hdrt"
|
rm -f "$hdrt"
|
||||||
return 254
|
return 254
|
||||||
@@ -731,7 +739,7 @@ curl_test_https_tls12()
|
|||||||
# $3 - subst ip
|
# $3 - subst ip
|
||||||
|
|
||||||
# do not use tls 1.3 to make sure server certificate is not encrypted
|
# do not use tls 1.3 to make sure server certificate is not encrypted
|
||||||
curl_probe $1 $2 $HTTPS_PORT "$3" -ISs -A "$USER_AGENT" --max-time $CURL_MAX_TIME $CURL_OPT --tlsv1.2 $TLSMAX12 "https://$2" -o /dev/null 2>&1
|
curl_probe $1 $2 $HTTPS_PORT "$3" $HTTPS_HEAD -Ss -A "$USER_AGENT" --max-time $CURL_MAX_TIME $CURL_OPT --tlsv1.2 $TLSMAX12 "https://$2" -o /dev/null 2>&1
|
||||||
}
|
}
|
||||||
curl_test_https_tls13()
|
curl_test_https_tls13()
|
||||||
{
|
{
|
||||||
@@ -740,7 +748,7 @@ curl_test_https_tls13()
|
|||||||
# $3 - subst ip
|
# $3 - subst ip
|
||||||
|
|
||||||
# force TLS1.3 mode
|
# force TLS1.3 mode
|
||||||
curl_probe $1 $2 $HTTPS_PORT "$3" -ISs -A "$USER_AGENT" --max-time $CURL_MAX_TIME $CURL_OPT --tlsv1.3 $TLSMAX13 "https://$2" -o /dev/null 2>&1
|
curl_probe $1 $2 $HTTPS_PORT "$3" $HTTPS_HEAD -Ss -A "$USER_AGENT" --max-time $CURL_MAX_TIME $CURL_OPT --tlsv1.3 $TLSMAX13 "https://$2" -o /dev/null 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
curl_test_http3()
|
curl_test_http3()
|
||||||
@@ -749,7 +757,7 @@ curl_test_http3()
|
|||||||
# $2 - domain name
|
# $2 - domain name
|
||||||
|
|
||||||
# force QUIC only mode without tcp
|
# force QUIC only mode without tcp
|
||||||
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
|
curl_with_dig $1 $2 $QUIC_PORT $HTTPS_HEAD -Ss -A "$USER_AGENT" --max-time $CURL_MAX_TIME_QUIC --http3-only $CURL_OPT "https://$2" -o /dev/null 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
ipt_aux_scheme()
|
ipt_aux_scheme()
|
||||||
@@ -999,7 +1007,7 @@ check_domain_port_block()
|
|||||||
echo
|
echo
|
||||||
echo \* port block tests ipv$IPV $1:$2
|
echo \* port block tests ipv$IPV $1:$2
|
||||||
if netcat_setup; then
|
if netcat_setup; then
|
||||||
ips=$(mdig_resolve_all $IPV $1)
|
mdig_resolve_all $IPV ips $1
|
||||||
if [ -n "$ips" ]; then
|
if [ -n "$ips" ]; then
|
||||||
for ip in $ips; do
|
for ip in $ips; do
|
||||||
if netcat_test $ip $2; then
|
if netcat_test $ip $2; then
|
||||||
@@ -1072,7 +1080,7 @@ ws_curl_test()
|
|||||||
# $2 - test function
|
# $2 - test function
|
||||||
# $3 - domain
|
# $3 - domain
|
||||||
# $4,$5,$6, ... - ws params
|
# $4,$5,$6, ... - ws params
|
||||||
local code ws_start=$1 testf=$2 dom=$3
|
local code ws_start=$1 testf=$2 dom="$3"
|
||||||
|
|
||||||
[ "$SIMULATE" = 1 ] && {
|
[ "$SIMULATE" = 1 ] && {
|
||||||
n=$(random 0 99)
|
n=$(random 0 99)
|
||||||
@@ -1088,7 +1096,7 @@ ws_curl_test()
|
|||||||
shift
|
shift
|
||||||
shift
|
shift
|
||||||
$ws_start "$@"
|
$ws_start "$@"
|
||||||
curl_test $testf $dom
|
curl_test $testf "$dom"
|
||||||
code=$?
|
code=$?
|
||||||
ws_kill
|
ws_kill
|
||||||
return $code
|
return $code
|
||||||
@@ -1101,7 +1109,7 @@ tpws_curl_test()
|
|||||||
echo - $1 ipv$IPV $2 : 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"}
|
echo - $1 ipv$IPV $2 : 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"
|
local ALL_PROXY="socks5://127.0.0.1:$SOCKS_PORT"
|
||||||
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"}
|
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"}
|
||||||
local testf=$1 dom=$2 strategy code=$?
|
local testf=$1 dom="$2" strategy code=$?
|
||||||
[ "$code" = 0 ] && {
|
[ "$code" = 0 ] && {
|
||||||
shift; shift;
|
shift; shift;
|
||||||
strategy="$@"
|
strategy="$@"
|
||||||
@@ -1115,11 +1123,11 @@ pktws_curl_test()
|
|||||||
# $1 - test function
|
# $1 - test function
|
||||||
# $2 - domain
|
# $2 - domain
|
||||||
# $3,$4,$5, ... - nfqws/dvtws params
|
# $3,$4,$5, ... - nfqws/dvtws params
|
||||||
local testf=$1 dom=$2 strategy code
|
local testf=$1 dom="$2" strategy code
|
||||||
|
|
||||||
shift; shift;
|
shift; shift;
|
||||||
echo - $testf ipv$IPV $dom : $PKTWSD ${WF:+$WF }${PKTWS_EXTRA_PRE:+$PKTWS_EXTRA_PRE }${PKTWS_EXTRA_PRE_1:+"$PKTWS_EXTRA_PRE_1" }${PKTWS_EXTRA_PRE_2:+"$PKTWS_EXTRA_PRE_2" }${PKTWS_EXTRA_PRE_3:+"$PKTWS_EXTRA_PRE_3" }${PKTWS_EXTRA_PRE_4:+"$PKTWS_EXTRA_PRE_4" }${PKTWS_EXTRA_PRE_5:+"$PKTWS_EXTRA_PRE_5" }${PKTWS_EXTRA_PRE_6:+"$PKTWS_EXTRA_PRE_6" }${PKTWS_EXTRA_PRE_7:+"$PKTWS_EXTRA_PRE_7" }${PKTWS_EXTRA_PRE_8:+"$PKTWS_EXTRA_PRE_8" }${PKTWS_EXTRA_PRE_9:+"$PKTWS_EXTRA_PRE_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"}
|
echo - $testf ipv$IPV $dom : $PKTWSD ${WF:+$WF }${PKTWS_EXTRA_PRE:+$PKTWS_EXTRA_PRE }${PKTWS_EXTRA_PRE_1:+"$PKTWS_EXTRA_PRE_1" }${PKTWS_EXTRA_PRE_2:+"$PKTWS_EXTRA_PRE_2" }${PKTWS_EXTRA_PRE_3:+"$PKTWS_EXTRA_PRE_3" }${PKTWS_EXTRA_PRE_4:+"$PKTWS_EXTRA_PRE_4" }${PKTWS_EXTRA_PRE_5:+"$PKTWS_EXTRA_PRE_5" }${PKTWS_EXTRA_PRE_6:+"$PKTWS_EXTRA_PRE_6" }${PKTWS_EXTRA_PRE_7:+"$PKTWS_EXTRA_PRE_7" }${PKTWS_EXTRA_PRE_8:+"$PKTWS_EXTRA_PRE_8" }${PKTWS_EXTRA_PRE_9:+"$PKTWS_EXTRA_PRE_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 $testf $dom ${PKTWS_EXTRA_PRE:+$PKTWS_EXTRA_PRE }${PKTWS_EXTRA_PRE_1:+"$PKTWS_EXTRA_PRE_1" }${PKTWS_EXTRA_PRE_2:+"$PKTWS_EXTRA_PRE_2" }${PKTWS_EXTRA_PRE_3:+"$PKTWS_EXTRA_PRE_3" }${PKTWS_EXTRA_PRE_4:+"$PKTWS_EXTRA_PRE_4" }${PKTWS_EXTRA_PRE_5:+"$PKTWS_EXTRA_PRE_5" }${PKTWS_EXTRA_PRE_6:+"$PKTWS_EXTRA_PRE_6" }${PKTWS_EXTRA_PRE_7:+"$PKTWS_EXTRA_PRE_7" }${PKTWS_EXTRA_PRE_8:+"$PKTWS_EXTRA_PRE_8" }${PKTWS_EXTRA_PRE_9:+"$PKTWS_EXTRA_PRE_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 $testf "$dom" ${PKTWS_EXTRA_PRE:+$PKTWS_EXTRA_PRE }${PKTWS_EXTRA_PRE_1:+"$PKTWS_EXTRA_PRE_1" }${PKTWS_EXTRA_PRE_2:+"$PKTWS_EXTRA_PRE_2" }${PKTWS_EXTRA_PRE_3:+"$PKTWS_EXTRA_PRE_3" }${PKTWS_EXTRA_PRE_4:+"$PKTWS_EXTRA_PRE_4" }${PKTWS_EXTRA_PRE_5:+"$PKTWS_EXTRA_PRE_5" }${PKTWS_EXTRA_PRE_6:+"$PKTWS_EXTRA_PRE_6" }${PKTWS_EXTRA_PRE_7:+"$PKTWS_EXTRA_PRE_7" }${PKTWS_EXTRA_PRE_8:+"$PKTWS_EXTRA_PRE_8" }${PKTWS_EXTRA_PRE_9:+"$PKTWS_EXTRA_PRE_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"}
|
||||||
|
|
||||||
code=$?
|
code=$?
|
||||||
[ "$code" = 0 ] && {
|
[ "$code" = 0 ] && {
|
||||||
@@ -1145,11 +1153,11 @@ xxxws_curl_test_update()
|
|||||||
# $2 - test function
|
# $2 - test function
|
||||||
# $3 - domain
|
# $3 - domain
|
||||||
# $4,$5,$6, ... - nfqws/dvtws params
|
# $4,$5,$6, ... - nfqws/dvtws params
|
||||||
local code xxxf=$1 testf=$2 dom=$3
|
local code xxxf=$1 testf=$2 dom="$3"
|
||||||
shift
|
shift
|
||||||
shift
|
shift
|
||||||
shift
|
shift
|
||||||
$xxxf $testf $dom "$@"
|
$xxxf $testf "$dom" "$@"
|
||||||
code=$?
|
code=$?
|
||||||
[ $code = 0 ] && strategy="${strategy:-$@}"
|
[ $code = 0 ] && strategy="${strategy:-$@}"
|
||||||
return $code
|
return $code
|
||||||
@@ -1310,13 +1318,13 @@ pktws_curl_test_update_vary()
|
|||||||
[ "$fake" = "-" ] && continue
|
[ "$fake" = "-" ] && continue
|
||||||
if [ -n "$splits" ]; then
|
if [ -n "$splits" ]; then
|
||||||
for pos in $splits ; do
|
for pos in $splits ; do
|
||||||
pktws_curl_test_update $testf $domain --dpi-desync=$desync "$@" --dpi-desync-split-pos=$pos $fake && {
|
pktws_curl_test_update $testf "$domain" --dpi-desync=$desync "$@" --dpi-desync-split-pos=$pos $fake && {
|
||||||
[ "$SCANLEVEL" = force ] || return 0
|
[ "$SCANLEVEL" = force ] || return 0
|
||||||
ret=0
|
ret=0
|
||||||
}
|
}
|
||||||
done
|
done
|
||||||
else
|
else
|
||||||
pktws_curl_test_update $testf $domain --dpi-desync=$desync "$@" $fake && {
|
pktws_curl_test_update $testf "$domain" --dpi-desync=$desync "$@" $fake && {
|
||||||
[ "$SCANLEVEL" = force ] || return 0
|
[ "$SCANLEVEL" = force ] || return 0
|
||||||
ret=0
|
ret=0
|
||||||
}
|
}
|
||||||
@@ -1565,7 +1573,7 @@ pktws_check_domain_http3_bypass_()
|
|||||||
|
|
||||||
for fake in '' "--dpi-desync-fake-quic=$ZAPRET_BASE/files/fake/quic_initial_www_google_com.bin"; do
|
for fake in '' "--dpi-desync-fake-quic=$ZAPRET_BASE/files/fake/quic_initial_www_google_com.bin"; do
|
||||||
for rep in '' 2 5 10 20; do
|
for rep in '' 2 5 10 20; do
|
||||||
pktws_curl_test_update $1 $2 --dpi-desync=fake ${fake:+$fake }${rep:+--dpi-desync-repeats=$rep} && [ "$SCANLEVEL" != force ] && {
|
pktws_curl_test_update $1 $2 --dpi-desync=fake ${fake:+"$fake" }${rep:+--dpi-desync-repeats=$rep} && [ "$SCANLEVEL" != force ] && {
|
||||||
[ "$SCANLEVEL" = quick ] && return
|
[ "$SCANLEVEL" = quick ] && return
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@@ -1691,7 +1699,7 @@ check_dpi_ip_block()
|
|||||||
# $1 - test function
|
# $1 - test function
|
||||||
# $2 - domain
|
# $2 - domain
|
||||||
|
|
||||||
local blocked_dom=$2
|
local blocked_dom="$2"
|
||||||
local blocked_ip blocked_ips unblocked_ip
|
local blocked_ip blocked_ips unblocked_ip
|
||||||
|
|
||||||
echo
|
echo
|
||||||
@@ -1699,7 +1707,7 @@ check_dpi_ip_block()
|
|||||||
|
|
||||||
echo "> testing $UNBLOCKED_DOM on it's original ip"
|
echo "> testing $UNBLOCKED_DOM on it's original ip"
|
||||||
if curl_test $1 $UNBLOCKED_DOM; then
|
if curl_test $1 $UNBLOCKED_DOM; then
|
||||||
unblocked_ip=$(mdig_resolve $IPV $UNBLOCKED_DOM)
|
mdig_resolve $IPV unblocked_ip $UNBLOCKED_DOM
|
||||||
[ -n "$unblocked_ip" ] || {
|
[ -n "$unblocked_ip" ] || {
|
||||||
echo $UNBLOCKED_DOM does not resolve. tests not possible.
|
echo $UNBLOCKED_DOM does not resolve. tests not possible.
|
||||||
return 1
|
return 1
|
||||||
@@ -1708,7 +1716,7 @@ check_dpi_ip_block()
|
|||||||
echo "> testing $blocked_dom on $unblocked_ip ($UNBLOCKED_DOM)"
|
echo "> testing $blocked_dom on $unblocked_ip ($UNBLOCKED_DOM)"
|
||||||
curl_test $1 $blocked_dom $unblocked_ip detail
|
curl_test $1 $blocked_dom $unblocked_ip detail
|
||||||
|
|
||||||
blocked_ips=$(mdig_resolve_all $IPV $blocked_dom)
|
mdig_resolve_all $IPV blocked_ips $blocked_dom
|
||||||
for blocked_ip in $blocked_ips; do
|
for blocked_ip in $blocked_ips; do
|
||||||
echo "> testing $UNBLOCKED_DOM on $blocked_ip ($blocked_dom)"
|
echo "> testing $UNBLOCKED_DOM on $blocked_ip ($blocked_dom)"
|
||||||
curl_test $1 $UNBLOCKED_DOM $blocked_ip detail
|
curl_test $1 $UNBLOCKED_DOM $blocked_ip detail
|
||||||
@@ -1759,6 +1767,8 @@ check_domain_http_tcp()
|
|||||||
# $3 - encrypted test : 0 = plain, 1 - encrypted with server reply risk, 2 - encrypted without server reply risk
|
# $3 - encrypted test : 0 = plain, 1 - encrypted with server reply risk, 2 - encrypted without server reply risk
|
||||||
# $4 - domain
|
# $4 - domain
|
||||||
|
|
||||||
|
local ips
|
||||||
|
|
||||||
# in case was interrupted before
|
# in case was interrupted before
|
||||||
pktws_ipt_unprepare_tcp $2
|
pktws_ipt_unprepare_tcp $2
|
||||||
ws_kill
|
ws_kill
|
||||||
@@ -1775,7 +1785,8 @@ check_domain_http_tcp()
|
|||||||
[ "$SKIP_PKTWS" = 1 ] || {
|
[ "$SKIP_PKTWS" = 1 ] || {
|
||||||
echo
|
echo
|
||||||
echo preparing $PKTWSD redirection
|
echo preparing $PKTWSD redirection
|
||||||
pktws_ipt_prepare_tcp $2 "$(mdig_resolve_all $IPV $4)"
|
mdig_resolve_all $IPV ips $4
|
||||||
|
pktws_ipt_prepare_tcp $2 "$ips"
|
||||||
|
|
||||||
pktws_check_domain_http_bypass $1 $3 $4
|
pktws_check_domain_http_bypass $1 $3 $4
|
||||||
|
|
||||||
@@ -1789,6 +1800,8 @@ check_domain_http_udp()
|
|||||||
# $2 - port
|
# $2 - port
|
||||||
# $3 - domain
|
# $3 - domain
|
||||||
|
|
||||||
|
local ips
|
||||||
|
|
||||||
# in case was interrupted before
|
# in case was interrupted before
|
||||||
pktws_ipt_unprepare_udp $2
|
pktws_ipt_unprepare_udp $2
|
||||||
ws_kill
|
ws_kill
|
||||||
@@ -1798,7 +1811,8 @@ check_domain_http_udp()
|
|||||||
[ "$SKIP_PKTWS" = 1 ] || {
|
[ "$SKIP_PKTWS" = 1 ] || {
|
||||||
echo
|
echo
|
||||||
echo preparing $PKTWSD redirection
|
echo preparing $PKTWSD redirection
|
||||||
pktws_ipt_prepare_udp $2 "$(mdig_resolve_all $IPV $3)"
|
mdig_resolve_all $IPV ips $3
|
||||||
|
pktws_ipt_prepare_udp $2 "$ips"
|
||||||
|
|
||||||
pktws_check_domain_http3_bypass $1 $3
|
pktws_check_domain_http3_bypass $1 $3
|
||||||
|
|
||||||
@@ -1857,6 +1871,9 @@ configure_curl_opt()
|
|||||||
curl_supports_tls13 && TLS13=1
|
curl_supports_tls13 && TLS13=1
|
||||||
HTTP3=
|
HTTP3=
|
||||||
curl_supports_http3 && HTTP3=1
|
curl_supports_http3 && HTTP3=1
|
||||||
|
|
||||||
|
HTTPS_HEAD=-I
|
||||||
|
[ "$CURL_HTTPS_GET" = 1 ] && HTTPS_HEAD=
|
||||||
}
|
}
|
||||||
|
|
||||||
linux_ipv6_defrag_can_be_disabled()
|
linux_ipv6_defrag_can_be_disabled()
|
||||||
@@ -1917,7 +1934,7 @@ ask_params()
|
|||||||
curl_supports_connect_to || {
|
curl_supports_connect_to || {
|
||||||
echo "installed curl does not support --connect-to option. pls install at least curl 7.49"
|
echo "installed curl does not support --connect-to option. pls install at least curl 7.49"
|
||||||
echo "current curl version:"
|
echo "current curl version:"
|
||||||
$CURL --version
|
"$CURL" --version
|
||||||
exitp 1
|
exitp 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1925,7 +1942,7 @@ ask_params()
|
|||||||
[ -n "$DOMAINS" ] || {
|
[ -n "$DOMAINS" ] || {
|
||||||
DOMAINS="$DOMAINS_DEFAULT"
|
DOMAINS="$DOMAINS_DEFAULT"
|
||||||
[ "$BATCH" = 1 ] || {
|
[ "$BATCH" = 1 ] || {
|
||||||
echo "specify domain(s) to test. multiple domains are space separated."
|
echo "specify domain(s) to test. multiple domains are space separated. URIs are supported (rutracker.org/forum/index.php)"
|
||||||
printf "domain(s) (default: $DOMAINS) : "
|
printf "domain(s) (default: $DOMAINS) : "
|
||||||
read dom
|
read dom
|
||||||
[ -n "$dom" ] && DOMAINS="$dom"
|
[ -n "$dom" ] && DOMAINS="$dom"
|
||||||
@@ -2172,7 +2189,7 @@ check_dns_()
|
|||||||
if find_working_public_dns ; then
|
if find_working_public_dns ; then
|
||||||
echo comparing system resolver to public DNS : $PUBDNS
|
echo comparing system resolver to public DNS : $PUBDNS
|
||||||
for dom in $DNSCHECK_DOM; do
|
for dom in $DNSCHECK_DOM; do
|
||||||
if check_dns_spoof $dom $PUBDNS ; then
|
if check_dns_spoof "$dom" $PUBDNS ; then
|
||||||
echo $dom : MISMATCH
|
echo $dom : MISMATCH
|
||||||
echo -- system resolver :
|
echo -- system resolver :
|
||||||
cat "$DNSCHECK_DIG1"
|
cat "$DNSCHECK_DIG1"
|
||||||
@@ -2268,7 +2285,6 @@ sigsilent()
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fsleep_setup
|
fsleep_setup
|
||||||
fix_sbin_path
|
fix_sbin_path
|
||||||
check_system
|
check_system
|
||||||
|
|||||||
@@ -4,6 +4,10 @@ which()
|
|||||||
# 'command -v' replacement does not work exactly the same way. it outputs shell aliases if present
|
# 'command -v' replacement does not work exactly the same way. it outputs shell aliases if present
|
||||||
# $1 - executable name
|
# $1 - executable name
|
||||||
local IFS=:
|
local IFS=:
|
||||||
|
[ "$1" != "${1#/}" ] && [ -x "$1" ] && {
|
||||||
|
echo "$1"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
for p in $PATH; do
|
for p in $PATH; do
|
||||||
[ -x "$p/$1" ] && {
|
[ -x "$p/$1" ] && {
|
||||||
echo "$p/$1"
|
echo "$p/$1"
|
||||||
@@ -93,6 +97,22 @@ trim()
|
|||||||
{
|
{
|
||||||
awk '{gsub(/^ +| +$/,"")}1'
|
awk '{gsub(/^ +| +$/,"")}1'
|
||||||
}
|
}
|
||||||
|
split_by_separator()
|
||||||
|
{
|
||||||
|
# $1 - string
|
||||||
|
# $2 - separator
|
||||||
|
# $3 - var name to get "before" part
|
||||||
|
# $4 - var name to get "after" part
|
||||||
|
local before="${1%%$2*}"
|
||||||
|
local after="${1#*$2}"
|
||||||
|
[ "$after" = "$1" ] && after=
|
||||||
|
[ -n "$3" ] && eval $3="\$before"
|
||||||
|
[ -n "$4" ] && eval $4="\$after"
|
||||||
|
}
|
||||||
|
tolower()
|
||||||
|
{
|
||||||
|
echo "$@" | tr 'A-Z' 'a-z'
|
||||||
|
}
|
||||||
|
|
||||||
dir_is_not_empty()
|
dir_is_not_empty()
|
||||||
{
|
{
|
||||||
|
|||||||
+6
-7
@@ -36,12 +36,11 @@ ask_list()
|
|||||||
# $3 - (optional) default value
|
# $3 - (optional) default value
|
||||||
local M_DEFAULT
|
local M_DEFAULT
|
||||||
eval M_DEFAULT="\$$1"
|
eval M_DEFAULT="\$$1"
|
||||||
local M_ALL=$M_DEFAULT
|
local M_DEFAULT_VAR="$M_DEFAULT"
|
||||||
local M=""
|
local M="" m
|
||||||
local m
|
|
||||||
|
|
||||||
[ -n "$3" ] && { find_str_in_list "$M_DEFAULT" "$2" || M_DEFAULT="$3" ;}
|
[ -n "$3" ] && { find_str_in_list "$M_DEFAULT" "$2" || M_DEFAULT="$3" ;}
|
||||||
|
|
||||||
n=1
|
n=1
|
||||||
for m in $2; do
|
for m in $2; do
|
||||||
echo $n : $m
|
echo $n : $m
|
||||||
@@ -53,6 +52,6 @@ ask_list()
|
|||||||
[ -z "$M" ] && M="$M_DEFAULT"
|
[ -z "$M" ] && M="$M_DEFAULT"
|
||||||
echo selected : $M
|
echo selected : $M
|
||||||
eval $1="\"$M\""
|
eval $1="\"$M\""
|
||||||
|
|
||||||
[ "$M" != "$M_OLD" ]
|
[ "$M" != "$M_DEFAULT_VAR" ]
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-7
@@ -256,7 +256,7 @@ check_system()
|
|||||||
|
|
||||||
get_free_space_mb()
|
get_free_space_mb()
|
||||||
{
|
{
|
||||||
df -m $PWD | awk '/[0-9]%/{print $(NF-2)}'
|
df -m "$1" | awk '/[0-9]%/{print $(NF-2)}'
|
||||||
}
|
}
|
||||||
get_ram_kb()
|
get_ram_kb()
|
||||||
{
|
{
|
||||||
@@ -522,11 +522,6 @@ install_openwrt_firewall()
|
|||||||
{
|
{
|
||||||
echo \* installing firewall script $1
|
echo \* installing firewall script $1
|
||||||
|
|
||||||
[ -n "MODE" ] || {
|
|
||||||
echo should specify MODE in $ZAPRET_CONFIG
|
|
||||||
exitp 7
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "linking : $FW_SCRIPT_SRC => $OPENWRT_FW_INCLUDE"
|
echo "linking : $FW_SCRIPT_SRC => $OPENWRT_FW_INCLUDE"
|
||||||
ln -fs "$FW_SCRIPT_SRC" "$OPENWRT_FW_INCLUDE"
|
ln -fs "$FW_SCRIPT_SRC" "$OPENWRT_FW_INCLUDE"
|
||||||
|
|
||||||
@@ -832,7 +827,9 @@ select_fwtype()
|
|||||||
echo WARNING ! if you need large lists it may be necessary to fall back to iptables+ipset firewall
|
echo WARNING ! if you need large lists it may be necessary to fall back to iptables+ipset firewall
|
||||||
}
|
}
|
||||||
echo select firewall type :
|
echo select firewall type :
|
||||||
ask_list FWTYPE "iptables nftables" "$FWTYPE" && write_config_var FWTYPE
|
ask_list FWTYPE "iptables nftables" "$FWTYPE"
|
||||||
|
# always write config var to prevent auto discovery every time
|
||||||
|
write_config_var FWTYPE
|
||||||
}
|
}
|
||||||
|
|
||||||
dry_run_tpws_()
|
dry_run_tpws_()
|
||||||
|
|||||||
+1
-1
@@ -43,7 +43,7 @@ ipt6_add_del()
|
|||||||
}
|
}
|
||||||
ipt6a_add_del()
|
ipt6a_add_del()
|
||||||
{
|
{
|
||||||
on_off_function ipt6 ipt6a_del "$@"
|
on_off_function ipt6a ipt6_del "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
is_ipt_flow_offload_avail()
|
is_ipt_flow_offload_avail()
|
||||||
|
|||||||
@@ -1,85 +0,0 @@
|
|||||||
apply_unspecified_desync_modes()
|
|
||||||
{
|
|
||||||
NFQWS_OPT_DESYNC_HTTP="${NFQWS_OPT_DESYNC_HTTP:-$NFQWS_OPT_DESYNC}"
|
|
||||||
NFQWS_OPT_DESYNC_HTTP_SUFFIX="${NFQWS_OPT_DESYNC_HTTP_SUFFIX:-$NFQWS_OPT_DESYNC_SUFFIX}"
|
|
||||||
NFQWS_OPT_DESYNC_HTTPS="${NFQWS_OPT_DESYNC_HTTPS:-$NFQWS_OPT_DESYNC}"
|
|
||||||
NFQWS_OPT_DESYNC_HTTPS_SUFFIX="${NFQWS_OPT_DESYNC_HTTPS_SUFFIX:-$NFQWS_OPT_DESYNC_SUFFIX}"
|
|
||||||
NFQWS_OPT_DESYNC_HTTP6="${NFQWS_OPT_DESYNC_HTTP6:-$NFQWS_OPT_DESYNC_HTTP}"
|
|
||||||
NFQWS_OPT_DESYNC_HTTP6_SUFFIX="${NFQWS_OPT_DESYNC_HTTP6_SUFFIX:-$NFQWS_OPT_DESYNC_HTTP_SUFFIX}"
|
|
||||||
NFQWS_OPT_DESYNC_HTTPS6="${NFQWS_OPT_DESYNC_HTTPS6:-$NFQWS_OPT_DESYNC_HTTPS}"
|
|
||||||
NFQWS_OPT_DESYNC_HTTPS6_SUFFIX="${NFQWS_OPT_DESYNC_HTTPS6_SUFFIX:-$NFQWS_OPT_DESYNC_HTTPS_SUFFIX}"
|
|
||||||
NFQWS_OPT_DESYNC_QUIC6="${NFQWS_OPT_DESYNC_QUIC6:-$NFQWS_OPT_DESYNC_QUIC}"
|
|
||||||
NFQWS_OPT_DESYNC_QUIC6_SUFFIX="${NFQWS_OPT_DESYNC_QUIC6_SUFFIX:-$NFQWS_OPT_DESYNC_QUIC_SUFFIX}"
|
|
||||||
}
|
|
||||||
|
|
||||||
get_nfqws_qnums()
|
|
||||||
{
|
|
||||||
# $1 - var name for ipv4 http
|
|
||||||
# $2 - var name for ipv4 https
|
|
||||||
# $3 - var name for ipv6 http
|
|
||||||
# $4 - var name for ipv6 https
|
|
||||||
local _qn _qns _qn6 _qns6
|
|
||||||
|
|
||||||
[ "$DISABLE_IPV4" = "1" ] || {
|
|
||||||
_qn=$QNUM
|
|
||||||
_qns=$_qn
|
|
||||||
[ "$NFQWS_OPT_DESYNC_HTTP $NFQWS_OPT_DESYNC_HTTP_SUFFIX" = "$NFQWS_OPT_DESYNC_HTTPS $NFQWS_OPT_DESYNC_HTTPS_SUFFIX" ] || _qns=$(($QNUM+1))
|
|
||||||
}
|
|
||||||
[ "$DISABLE_IPV6" = "1" ] || {
|
|
||||||
_qn6=$(($QNUM+2))
|
|
||||||
_qns6=$(($QNUM+3))
|
|
||||||
[ "$DISABLE_IPV4" = "1" ] || {
|
|
||||||
if [ "$NFQWS_OPT_DESYNC_HTTP6 $NFQWS_OPT_DESYNC_HTTP6_SUFFIX" = "$NFQWS_OPT_DESYNC_HTTP $NFQWS_OPT_DESYNC_HTTP_SUFFIX" ]; then
|
|
||||||
_qn6=$_qn;
|
|
||||||
elif [ "$NFQWS_OPT_DESYNC_HTTP6 $NFQWS_OPT_DESYNC_HTTP6_SUFFIX" = "$NFQWS_OPT_DESYNC_HTTPS $NFQWS_OPT_DESYNC_HTTPS_SUFFIX" ]; then
|
|
||||||
_qn6=$_qns;
|
|
||||||
fi
|
|
||||||
if [ "$NFQWS_OPT_DESYNC_HTTPS6 $NFQWS_OPT_DESYNC_HTTPS6_SUFFIX" = "$NFQWS_OPT_DESYNC_HTTP $NFQWS_OPT_DESYNC_HTTP_SUFFIX" ]; then
|
|
||||||
_qns6=$_qn;
|
|
||||||
elif [ "$NFQWS_OPT_DESYNC_HTTPS6 $NFQWS_OPT_DESYNC_HTTPS6_SUFFIX" = "$NFQWS_OPT_DESYNC_HTTPS $NFQWS_OPT_DESYNC_HTTPS_SUFFIX" ]; then
|
|
||||||
_qns6=$_qns;
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
[ "$NFQWS_OPT_DESYNC_HTTPS6 $NFQWS_OPT_DESYNC_HTTPS6_SUFFIX" = "$NFQWS_OPT_DESYNC_HTTP6 $NFQWS_OPT_DESYNC_HTTP6_SUFFIX" ] && _qns6=$_qn6;
|
|
||||||
}
|
|
||||||
if [ "$MODE_HTTP" = 1 ]; then
|
|
||||||
eval $1=$_qn
|
|
||||||
eval $3=$_qn6
|
|
||||||
else
|
|
||||||
eval $1=
|
|
||||||
eval $3=
|
|
||||||
fi
|
|
||||||
if [ "$MODE_HTTPS" = 1 ]; then
|
|
||||||
eval $2=$_qns
|
|
||||||
eval $4=$_qns6
|
|
||||||
else
|
|
||||||
eval $2=
|
|
||||||
eval $4=
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
get_nfqws_qnums_quic()
|
|
||||||
{
|
|
||||||
# $1 - var name for ipv4 quic
|
|
||||||
# $2 - var name for ipv6 quic
|
|
||||||
local _qn _qn6
|
|
||||||
|
|
||||||
[ "$DISABLE_IPV4" = "1" ] || {
|
|
||||||
_qn=$(($QNUM+10))
|
|
||||||
}
|
|
||||||
[ "$DISABLE_IPV6" = "1" ] || {
|
|
||||||
_qn6=$(($QNUM+11))
|
|
||||||
[ "$DISABLE_IPV4" = "1" ] || {
|
|
||||||
if [ "$NFQWS_OPT_DESYNC_QUIC $NFQWS_OPT_DESYNC_QUIC_SUFFIX" = "$NFQWS_OPT_DESYNC_QUIC6 $NFQWS_OPT_DESYNC_QUIC6_SUFFIX" ]; then
|
|
||||||
_qn6=$_qn;
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if [ "$MODE_QUIC" = 1 ]; then
|
|
||||||
eval $1=$_qn
|
|
||||||
eval $2=$_qn6
|
|
||||||
else
|
|
||||||
eval $1=
|
|
||||||
eval $2=
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
+1
-1
@@ -88,7 +88,7 @@ PF. Если в фаерволе есть правило divert, но на diver
|
|||||||
отдельно для ipv4 и ipv6 и работают только с одной версией `ip` каждый. На
|
отдельно для ipv4 и ipv6 и работают только с одной версией `ip` каждый. На
|
||||||
**MacOS** похоже, что divert сокеты из ядра вырезаны. См подробнее раздел про
|
**MacOS** похоже, что divert сокеты из ядра вырезаны. См подробнее раздел про
|
||||||
**MacOS**. Отсылка в divert сокет работает аналогично отсылке через raw socket
|
**MacOS**. Отсылка в divert сокет работает аналогично отсылке через raw socket
|
||||||
на linux. Передается полностью IP фрейм, начиная с ip загловка. Эти особенности
|
на linux. Передается полностью IP фрейм, начиная с ip заголовка. Эти особенности
|
||||||
учитываются в `dvtws`.
|
учитываются в `dvtws`.
|
||||||
|
|
||||||
### Lookup Tables
|
### Lookup Tables
|
||||||
|
|||||||
@@ -568,3 +568,53 @@ nfqws: --wssize-forced-cutoff
|
|||||||
nfqws: --orig-tcp-flags, --dup-tcp-flags, --dpi-desync-tcp-flags
|
nfqws: --orig-tcp-flags, --dup-tcp-flags, --dpi-desync-tcp-flags
|
||||||
nfqws: --dup-ip-id
|
nfqws: --dup-ip-id
|
||||||
|
|
||||||
|
72.3
|
||||||
|
|
||||||
|
blockcheck: support URIs
|
||||||
|
blockcheck: CURL_HTTPS_GET=1 suppresses -I curl option for https (HEAD -> GET)
|
||||||
|
|
||||||
|
72.4
|
||||||
|
|
||||||
|
blockcheck: fix broken dns cache
|
||||||
|
|
||||||
|
72.5
|
||||||
|
|
||||||
|
nfqws: fix broken l7proto profile rediscovery
|
||||||
|
nfqws: backport from nfqws2 nl80211 ssid discovery fix for newer kernels
|
||||||
|
|
||||||
|
72.6
|
||||||
|
|
||||||
|
ipset: remove zapret-info based scripts because it's gone
|
||||||
|
blockcheck: fix tpws test regression
|
||||||
|
|
||||||
|
72.7
|
||||||
|
|
||||||
|
nfqws,tpws: memleak fix
|
||||||
|
mdig: --eagain, --eagain-delay
|
||||||
|
|
||||||
|
72.8
|
||||||
|
|
||||||
|
nfqws: fix breaking tcp if ts fooling is enabled but no timestamps present
|
||||||
|
|
||||||
|
72.9
|
||||||
|
|
||||||
|
blockcheck: fix detection of http redirection if domain/URI specified
|
||||||
|
install_easy: fix writing of ask_list variables
|
||||||
|
|
||||||
|
72.10
|
||||||
|
|
||||||
|
* nfqws2: fix broken wifi ssid update
|
||||||
|
* minor AI fixes
|
||||||
|
|
||||||
|
72.12
|
||||||
|
|
||||||
|
* github: reduce binaries size
|
||||||
|
* github: use 16K page size for android arm64 build
|
||||||
|
* nfqws: join fragments in quic CRYPTO reconstruction. allow intersections.
|
||||||
|
|
||||||
|
72.13
|
||||||
|
|
||||||
|
* github: compile armv6. fix idiv illegal instruction on early armv7
|
||||||
|
* init.d: add port range for discord media
|
||||||
|
* init.d: remove KillMode=none in systemd unit
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ Swap позволяет немного сгладить проблему, но
|
|||||||
Например, есть 1 большой set на 100000 элементов и 1 маленький на 2 элемента.
|
Например, есть 1 большой set на 100000 элементов и 1 маленький на 2 элемента.
|
||||||
Чтобы просто пролистать мелкий set или добавить туда еще что-то nft будет мусолить несколько секунд.
|
Чтобы просто пролистать мелкий set или добавить туда еще что-то nft будет мусолить несколько секунд.
|
||||||
Что он делает за это время ? Тащит из ядра огромный блоб, в котором все в куче, и разбирает его, чтобы выделить искомую мелочь ?
|
Что он делает за это время ? Тащит из ядра огромный блоб, в котором все в куче, и разбирает его, чтобы выделить искомую мелочь ?
|
||||||
В какой-то мере удается это сгладить, обьединяя несколько команд в единый скрипт.
|
В какой-то мере удается это сгладить, объединяя несколько команд в единый скрипт.
|
||||||
|
|
||||||
Боль N3
|
Боль N3
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@ zapret может работать в другой таблице и не тро
|
|||||||
Плюс N5
|
Плюс N5
|
||||||
|
|
||||||
Пишут, что nftables работают быстрее. Но это не точно и зависит от много чего.
|
Пишут, что nftables работают быстрее. Но это не точно и зависит от много чего.
|
||||||
В целом - чем меньше правил, тем выше скорость. Но в nftables правил можно писать меньше, значит скрость тоже может быть выше.
|
В целом - чем меньше правил, тем выше скорость. Но в nftables правил можно писать меньше, значит скорость тоже может быть выше.
|
||||||
У разработчиков есть идея перевести backend nftables на BPF, а это наверняка будет существенно быстрее.
|
У разработчиков есть идея перевести backend nftables на BPF, а это наверняка будет существенно быстрее.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -193,9 +193,9 @@
|
|||||||
> профилях автоматически отражаются во всех остальных.
|
> профилях автоматически отражаются во всех остальных.
|
||||||
>
|
>
|
||||||
> Если стратегии отличаются по версии ip протокола, и вы не можете их
|
> Если стратегии отличаются по версии ip протокола, и вы не можете их
|
||||||
> обьединить, фильтр пишется так:
|
> объединить, фильтр пишется так:
|
||||||
> ```sh
|
> ```sh
|
||||||
> "--filter-l3=ipv4 --filter-udp=443 lпараметры для quic ipv4' <HOSTLIST_NOAUTO> --new
|
> "--filter-l3=ipv4 --filter-udp=443 'параметры для quic ipv4' <HOSTLIST_NOAUTO> --new
|
||||||
> --filter-l3=ipv4 --filter-tcp=80 'параметры для http ipv4' <HOSTLIST> --new
|
> --filter-l3=ipv4 --filter-tcp=80 'параметры для http ipv4' <HOSTLIST> --new
|
||||||
> --filter-l3=ipv4 --filter-tcp=443 'параметры для https 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-udp=443 'параметры для quic ipv6' <HOSTLIST_NOAUTO> --new
|
||||||
|
|||||||
@@ -117,7 +117,7 @@
|
|||||||
> Если кратко по мультистратегии, то обычно параметры конструируются так :
|
> Если кратко по мультистратегии, то обычно параметры конструируются так :
|
||||||
> ```
|
> ```
|
||||||
> --filter-udp=443 'параметры для quic' --new
|
> --filter-udp=443 'параметры для quic' --new
|
||||||
> --filter-tcp=80,443 'обьединенные параметры для http и https'
|
> --filter-tcp=80,443 'объединенные параметры для http и https'
|
||||||
> ```
|
> ```
|
||||||
>
|
>
|
||||||
> Или так :
|
> Или так :
|
||||||
@@ -127,7 +127,7 @@
|
|||||||
> --filter-tcp=443 'параметры для https'
|
> --filter-tcp=443 'параметры для https'
|
||||||
> ```
|
> ```
|
||||||
>
|
>
|
||||||
> Если стратегии отличаются по версии ip протокола, и вы не можете их обьединить, фильтр пишется так :
|
> Если стратегии отличаются по версии ip протокола, и вы не можете их объединить, фильтр пишется так :
|
||||||
> ```
|
> ```
|
||||||
> --filter-l3=ipv4 --filter-udp=443 "параметры для quic ipv4" --new
|
> --filter-l3=ipv4 --filter-udp=443 "параметры для quic ipv4" --new
|
||||||
> --filter-l3=ipv4 --filter-tcp=80 'параметры для http ipv4' --new
|
> --filter-l3=ipv4 --filter-tcp=80 'параметры для http ipv4' --new
|
||||||
@@ -199,7 +199,7 @@
|
|||||||
когда ничего лучше нет. Хорошая стратегия может сильно ломать из-за плохо подобранных ограничителей для фейков - ttl, fooling.
|
когда ничего лучше нет. Хорошая стратегия может сильно ломать из-за плохо подобранных ограничителей для фейков - ttl, fooling.
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> Это минимальная инструкция, чтобы соориентироваться с чего начать. Однако, это - не панацея.
|
> Это минимальная инструкция, чтобы сориентироваться с чего начать. Однако, это - не панацея.
|
||||||
> В некоторых случаях вы не обойдетесь без знаний и основного "талмуда".
|
> В некоторых случаях вы не обойдетесь без знаний и основного "талмуда".
|
||||||
|
|
||||||
Подробности и полное техническое описание расписаны в [readme.md](./readme.md)
|
Подробности и полное техническое описание расписаны в [readme.md](./readme.md)
|
||||||
|
|||||||
+11
-6
@@ -1,11 +1,14 @@
|
|||||||
# zapret v72.2
|
|
||||||
|
|
||||||
# SCAMMER WARNING
|
# SCAMMER WARNING
|
||||||
|
|
||||||
This software is free and open source under [MIT license](./LICENSE.txt).
|
This software is free and open source under [MIT license](./LICENSE.txt).
|
||||||
If anyone demands you to download this software only from their webpage, telegram channel, forces you to delete links, videos, makes copyright claims, you are dealing with scammers.
|
If anyone demands you to download this software only from their webpage, telegram channel, forces you to delete links, videos, makes copyright claims, you are dealing with scammers.
|
||||||
However, [donations](#donations) are welcome.
|
However, [donations](#donations) are welcome.
|
||||||
|
|
||||||
|
# zapret2
|
||||||
|
|
||||||
|
zapret 1 is EOL (End-Of-Life). Will be no more new features, no PR will be accepted.
|
||||||
|
Current version is [zapret2](https://github.com/bol-van/zapret2).
|
||||||
|
|
||||||
# Multilanguage/Мультиязычный README
|
# Multilanguage/Мультиязычный README
|
||||||
___
|
___
|
||||||
[](https://github.com/bol-van/zapret/tree/master/docs/readme.en.md)
|
[](https://github.com/bol-van/zapret/tree/master/docs/readme.en.md)
|
||||||
@@ -209,8 +212,8 @@ nfqws takes the following parameters:
|
|||||||
--dpi-desync-fakedsplit-mod=mod[,mod] ; mods can be none,altorder=0|1|2|3 + 0|8|16
|
--dpi-desync-fakedsplit-mod=mod[,mod] ; mods can be none,altorder=0|1|2|3 + 0|8|16
|
||||||
--dpi-desync-hostfakesplit-midhost=marker+N|marker-N ; additionally split real hostname at specified marker. must be within host..endhost or won't be splitted.
|
--dpi-desync-hostfakesplit-midhost=marker+N|marker-N ; additionally split real hostname at specified marker. must be within host..endhost or won't be splitted.
|
||||||
--dpi-desync-hostfakesplit-mod=mod[,mod] ; can be none, host=<hostname>, altorder=0|1
|
--dpi-desync-hostfakesplit-mod=mod[,mod] ; can be none, host=<hostname>, altorder=0|1
|
||||||
--dpi-desync-ipfrag-pos-tcp=<8..9216> ; ip frag position starting from the transport header. multiple of 8, default 8.
|
--dpi-desync-ipfrag-pos-tcp=<8..9216> ; ip frag position starting from the transport header. multiple of 8, default 32.
|
||||||
--dpi-desync-ipfrag-pos-udp=<8..9216> ; ip frag position starting from the transport header. multiple of 8, default 32.
|
--dpi-desync-ipfrag-pos-udp=<8..9216> ; ip frag position starting from the transport header. multiple of 8, default 8.
|
||||||
--dpi-desync-ts-increment=<int|0xHEX> ; ts fooling TSval signed increment. default -600000
|
--dpi-desync-ts-increment=<int|0xHEX> ; ts fooling TSval signed increment. default -600000
|
||||||
--dpi-desync-badseq-increment=<int|0xHEX> ; badseq fooling seq signed increment. default -10000
|
--dpi-desync-badseq-increment=<int|0xHEX> ; badseq fooling seq signed increment. default -10000
|
||||||
--dpi-desync-badack-increment=<int|0xHEX> ; badseq fooling ackseq signed increment. default -66000
|
--dpi-desync-badack-increment=<int|0xHEX> ; badseq fooling ackseq signed increment. default -66000
|
||||||
@@ -275,7 +278,7 @@ Fakes are separate generated by nfqws packets carrying false information for DPI
|
|||||||
`nfqws` cannot redistribute data between original TCP segments. The error displayed is 'message too long'.
|
`nfqws` cannot redistribute data between original TCP segments. The error displayed is 'message too long'.
|
||||||
* **badsum** doesn't work if your device is behind NAT which does not pass invalid packets.
|
* **badsum** doesn't work if your device is behind NAT which does not pass invalid packets.
|
||||||
The most common Linux NAT router configuration does not pass them. Most home routers are Linux based.
|
The most common Linux NAT router configuration does not pass them. Most home routers are Linux based.
|
||||||
The default sysctl configuration `net.netfilter.nf_conntrack_checksum=1` causes contrack to verify tcp and udp checksums
|
The default sysctl configuration `net.netfilter.nf_conntrack_checksum=1` causes conntrack to verify tcp and udp checksums
|
||||||
and set INVALID state for packets with invalid checksum.
|
and set INVALID state for packets with invalid checksum.
|
||||||
Typically, iptables rules include a rule for dropping packets with INVALID state in the FORWARD chain.
|
Typically, iptables rules include a rule for dropping packets with INVALID state in the FORWARD chain.
|
||||||
The combination of these factors does not allow badsum packets to pass through the router.
|
The combination of these factors does not allow badsum packets to pass through the router.
|
||||||
@@ -1704,7 +1707,9 @@ If this is the case then run another script in background and add some delay the
|
|||||||
|
|
||||||
Are welcome here :
|
Are welcome here :
|
||||||
|
|
||||||
USDT `0x3d52Ce15B7Be734c53fc9526ECbAB8267b63d66E`
|
USDT ERC `0x3d52Ce15B7Be734c53fc9526ECbAB8267b63d66E`
|
||||||
|
|
||||||
|
USDT TRC `TEzAAtn4VhndqEaAyuCM78xh5W2gCjwWEo`
|
||||||
|
|
||||||
BTC `bc1qhqew3mrvp47uk2vevt5sctp7p2x9m7m5kkchve`
|
BTC `bc1qhqew3mrvp47uk2vevt5sctp7p2x9m7m5kkchve`
|
||||||
|
|
||||||
|
|||||||
+17
-15
@@ -1,11 +1,15 @@
|
|||||||
# zapret v72.2
|
|
||||||
|
|
||||||
# ВНИМАНИЕ, остерегайтесь мошенников
|
# ВНИМАНИЕ, остерегайтесь мошенников
|
||||||
|
|
||||||
zapret является свободным и open source.
|
zapret является свободным и open source.
|
||||||
Всякий, кто понуждает вас скачивать zapret только с его ресурса, требует удалить ссылки, видео, файлы, обосновывая эти требования авторскими правами, сам нарушает [лицензию](./LICENSE.txt).
|
Всякий, кто понуждает вас скачивать zapret только с его ресурса, требует удалить ссылки, видео, файлы, обосновывая эти требования авторскими правами, сам нарушает [лицензию](./LICENSE.txt).
|
||||||
Однако, это не исключает [добровольные пожертвования](#поддержать-разработчика).
|
Однако, это не исключает [добровольные пожертвования](#поддержать-разработчика).
|
||||||
|
|
||||||
|
# zapret2
|
||||||
|
|
||||||
|
Эта версия zapret более не развивается и находится в режиме EOL (End-Of-Life). Никаких новых функций больше не будет. Только багфиксы. Pull реквесты с новыми фичами не принимаются.
|
||||||
|
|
||||||
|
[Актуальная версия - zapret 2](https://github.com/bol-van/zapret2)
|
||||||
|
|
||||||
# Multilanguage README
|
# Multilanguage README
|
||||||
|
|
||||||
[](./readme.en.md)
|
[](./readme.en.md)
|
||||||
@@ -155,7 +159,7 @@ DPI. Все больше становится внереестровых бло
|
|||||||
* Если блокировка осуществляется по IP.
|
* Если блокировка осуществляется по IP.
|
||||||
* Если соединение проходит через фильтр, способный реконструировать TCP соединение, и который следует всем стандартам.
|
* Если соединение проходит через фильтр, способный реконструировать TCP соединение, и который следует всем стандартам.
|
||||||
Например, нас заворачивают на squid. Соединение идет через полноценный стек tcpip операционной системы.
|
Например, нас заворачивают на squid. Соединение идет через полноценный стек tcpip операционной системы.
|
||||||
Проект нацелен на обман DPI, который всилу ограниченности ресурсов и большого трафика вынужден интерпретировать его лишь ограниченно.
|
Проект нацелен на обман DPI, который в силу ограниченности ресурсов и большого трафика вынужден интерпретировать его лишь ограниченно.
|
||||||
Обмануть полноценный стек ОС и полноценные серверные приложения не получится.
|
Обмануть полноценный стек ОС и полноценные серверные приложения не получится.
|
||||||
|
|
||||||
## nfqws
|
## nfqws
|
||||||
@@ -178,7 +182,7 @@ dvtws, собираемый из тех же исходников (см. [док
|
|||||||
--bind-fix4 ; пытаться решить проблему неверного выбора исходящего интерфейса для сгенерированных ipv4 пакетов
|
--bind-fix4 ; пытаться решить проблему неверного выбора исходящего интерфейса для сгенерированных ipv4 пакетов
|
||||||
--bind-fix6 ; пытаться решить проблему неверного выбора исходящего интерфейса для сгенерированных ipv6 пакетов
|
--bind-fix6 ; пытаться решить проблему неверного выбора исходящего интерфейса для сгенерированных ipv6 пакетов
|
||||||
--ctrack-timeouts=S:E:F[:U] ; таймауты внутреннего conntrack в состояниях SYN, ESTABLISHED, FIN, таймаут udp. по умолчанию 60:300:60:60
|
--ctrack-timeouts=S:E:F[:U] ; таймауты внутреннего conntrack в состояниях SYN, ESTABLISHED, FIN, таймаут udp. по умолчанию 60:300:60:60
|
||||||
--ctrack-disable=[0|1] ; 1 или остутствие аргумента отключает conntrack
|
--ctrack-disable=[0|1] ; 1 или отсутствие аргумента отключает conntrack
|
||||||
--ipcache-lifetime=<int> ; время жизни записей кэша IP в секундах. 0 - без ограничений.
|
--ipcache-lifetime=<int> ; время жизни записей кэша IP в секундах. 0 - без ограничений.
|
||||||
--ipcache-hostname=[0|1] ; 1 или отсутствие аргумента включают кэширование имен хостов для применения в стратегиях нулевой фазы
|
--ipcache-hostname=[0|1] ; 1 или отсутствие аргумента включают кэширование имен хостов для применения в стратегиях нулевой фазы
|
||||||
--wsize=<winsize>[:<scale_factor>] ; менять tcp window size на указанный размер в SYN,ACK. если не задан scale_factor, то он не меняется (устарело !)
|
--wsize=<winsize>[:<scale_factor>] ; менять tcp window size на указанный размер в SYN,ACK. если не задан scale_factor, то он не меняется (устарело !)
|
||||||
@@ -233,6 +237,8 @@ dvtws, собираемый из тех же исходников (см. [док
|
|||||||
--dpi-desync-fakedsplit-mod=mod[,mod] ; может быть none, altorder=0|1|2|3 + 0|8|16
|
--dpi-desync-fakedsplit-mod=mod[,mod] ; может быть none, altorder=0|1|2|3 + 0|8|16
|
||||||
--dpi-desync-hostfakesplit-midhost=marker+N|marker-N ; маркер дополнительного разреза сегмента с оригинальным хостом. должен попадать в пределы хоста.
|
--dpi-desync-hostfakesplit-midhost=marker+N|marker-N ; маркер дополнительного разреза сегмента с оригинальным хостом. должен попадать в пределы хоста.
|
||||||
--dpi-desync-hostfakesplit-mod=mod[,mod] ; может быть none, host=<hostname>, altorder=0|1
|
--dpi-desync-hostfakesplit-mod=mod[,mod] ; может быть none, host=<hostname>, altorder=0|1
|
||||||
|
--dpi-desync-ipfrag-pos-tcp=<8..9216> ; позиция ip фрагментации tcp, начиная с транспортного заголовка. должно быть кратно 8, по умолчанию - 32.
|
||||||
|
--dpi-desync-ipfrag-pos-udp=<8..9216> ; позиция ip фрагментации udp, начиная с транспортного заголовка. должно быть кратно 8, по умолчанию - 8.
|
||||||
--dpi-desync-ts-increment=<int|0xHEX> ; инкремент TSval для ts. по умолчанию -600000
|
--dpi-desync-ts-increment=<int|0xHEX> ; инкремент TSval для ts. по умолчанию -600000
|
||||||
--dpi-desync-badseq-increment=<int|0xHEX> ; инкремент sequence number для badseq. по умолчанию -10000
|
--dpi-desync-badseq-increment=<int|0xHEX> ; инкремент sequence number для badseq. по умолчанию -10000
|
||||||
--dpi-desync-badack-increment=<int|0xHEX> ; инкремент ack sequence number для badseq. по умолчанию -66000
|
--dpi-desync-badack-increment=<int|0xHEX> ; инкремент ack sequence number для badseq. по умолчанию -66000
|
||||||
@@ -390,7 +396,7 @@ hex строка начинается с "0x". Имя файла можно пи
|
|||||||
|
|
||||||
Режимы дурения могут сочетаться в любых комбинациях. `--dpi-desync-fooling` берет множество значений через запятую.
|
Режимы дурения могут сочетаться в любых комбинациях. `--dpi-desync-fooling` берет множество значений через запятую.
|
||||||
|
|
||||||
Возможно задание множества фейков через повторение парамеров `--dpi-desync-fake-???`, кроме `--dpi-desync-fake-syndata`.
|
Возможно задание множества фейков через повторение параметров `--dpi-desync-fake-???`, кроме `--dpi-desync-fake-syndata`.
|
||||||
Фейки будут отосланы в указанном порядке. `--dpi-desync-repeats` повторяет каждый отосланный фейк.
|
Фейки будут отосланы в указанном порядке. `--dpi-desync-repeats` повторяет каждый отосланный фейк.
|
||||||
Итоговый порядок будет такой : `fake1 fake1 fake1 fake2 fake2 fake2 fake3 fake3 fake3 .....`
|
Итоговый порядок будет такой : `fake1 fake1 fake1 fake2 fake2 fake2 fake3 fake3 fake3 .....`
|
||||||
|
|
||||||
@@ -481,7 +487,7 @@ hex строка начинается с "0x". Имя файла можно пи
|
|||||||
`altorder=1` шлет фрагменты в таком порядке, чтобы при последовательной сборке сегментов на DPI он получил полностью собранный оригинал запроса с подмененным хостом.
|
`altorder=1` шлет фрагменты в таком порядке, чтобы при последовательной сборке сегментов на DPI он получил полностью собранный оригинал запроса с подмененным хостом.
|
||||||
Реальный хост идет отдельным сегментом уже после. То есть в этом варианте применяется разновидность disorder. Сервер принимает фрагменты с нарушенным порядком sequence.
|
Реальный хост идет отдельным сегментом уже после. То есть в этом варианте применяется разновидность disorder. Сервер принимает фрагменты с нарушенным порядком sequence.
|
||||||
|
|
||||||
Опционально можно разрезать оригинальный фейк. Например, `--dpi-desync-hostfakesplit-midhost=midsld`. Позиция нарезки должна попадать внутрь хоста.
|
Опционально можно разрезать оригинальный хост. Например, `--dpi-desync-hostfakesplit-midhost=midsld`. Позиция нарезки должна попадать внутрь хоста.
|
||||||
Многопакетные запросы поддерживаются только, если исходная нарезка пакетов не включает позиции имени хоста. В последнем случае дурение отменяется.
|
Многопакетные запросы поддерживаются только, если исходная нарезка пакетов не включает позиции имени хоста. В последнем случае дурение отменяется.
|
||||||
|
|
||||||
Вариант `fakedsplit` имеет несколько альтернативных порядков нарезки - от 0 до 3. Режим задается в параметре `--dpi-desync-fakedsplit-mod=altorder=N`.
|
Вариант `fakedsplit` имеет несколько альтернативных порядков нарезки - от 0 до 3. Режим задается в параметре `--dpi-desync-fakedsplit-mod=altorder=N`.
|
||||||
@@ -901,13 +907,6 @@ L7 протокол становится известен обычно посл
|
|||||||
При выборе профиля имеет значение куда идет конкретный обрабатываемый пакет. На какой интерфейс. Или с какого интерфейса пакет пришел, если он считается входящим.
|
При выборе профиля имеет значение куда идет конкретный обрабатываемый пакет. На какой интерфейс. Или с какого интерфейса пакет пришел, если он считается входящим.
|
||||||
Поэтому даже если у вас часть трафика идет на одну сеть, часть на другую, а часть вообще не идет по wifi, то все это можно настроить.
|
Поэтому даже если у вас часть трафика идет на одну сеть, часть на другую, а часть вообще не идет по wifi, то все это можно настроить.
|
||||||
|
|
||||||
Информация о подключенных сетях берется способом, используемым командой `iw dev <ifname> info` (nl80211).
|
|
||||||
К сожалению, на ядрах с 5.19 до самых последних (6.14 не работает) этот способ сломан.
|
|
||||||
В этом случае используется способ iwgetid (wireless extensions).
|
|
||||||
wireless extensions считаются deprecated и на новых ядрах реализованы как прослойка совместимости.
|
|
||||||
Некоторые ядра могут быть собраны без wireless extensions.
|
|
||||||
Перед использованием `--filter-ssid` удостоверьтесь, что любая из этих команд возвращает SSID.
|
|
||||||
|
|
||||||
Сканируются все wifi интерфейсы, составляется список interface->SSID. Он обновляется по мере поступления
|
Сканируются все wifi интерфейсы, составляется список interface->SSID. Он обновляется по мере поступления
|
||||||
пакетов, но не чаще 1 раза в секунду.
|
пакетов, но не чаще 1 раза в секунду.
|
||||||
|
|
||||||
@@ -1665,7 +1664,7 @@ LISTS_RELOAD=- отключает перезагрузку листов.
|
|||||||
|
|
||||||
В системе запуска это обыграно следующим образом.
|
В системе запуска это обыграно следующим образом.
|
||||||
Присутствуют 2 include списка :
|
Присутствуют 2 include списка :
|
||||||
`ipset/zapret-hosts-users.txt.gz` или `ipset/zapret-hosts-users.txt`,
|
`ipset/zapret-hosts-user.txt.gz` или `ipset/zapret-hosts-user.txt`,
|
||||||
`ipset/zapret-hosts.txt.gz` или `ipset/zapret-hosts.txt`
|
`ipset/zapret-hosts.txt.gz` или `ipset/zapret-hosts.txt`
|
||||||
и 1 exclude список
|
и 1 exclude список
|
||||||
`ipset/zapret-hosts-user-exclude.txt.gz` или `ipset/zapret-hosts-user-exclude.txt`
|
`ipset/zapret-hosts-user-exclude.txt.gz` или `ipset/zapret-hosts-user-exclude.txt`
|
||||||
@@ -1816,6 +1815,7 @@ CURL_MAX_TIME_QUIC - время таймаута curl для quic. если не
|
|||||||
CURL_MAX_TIME_DOH - время таймаута curl для DoH серверов
|
CURL_MAX_TIME_DOH - время таймаута curl для DoH серверов
|
||||||
CURL_CMD=1 - показывать команды curl
|
CURL_CMD=1 - показывать команды curl
|
||||||
CURL_OPT - дополнительные параметры curl. `-k` - игнор сертификатов. `-v` - подробный вывод протокола
|
CURL_OPT - дополнительные параметры curl. `-k` - игнор сертификатов. `-v` - подробный вывод протокола
|
||||||
|
CURL_HTTPS_GET=1 - использовать метод GET вместо HEAD для https
|
||||||
DOMAINS - список тестируемых доменов через пробел
|
DOMAINS - список тестируемых доменов через пробел
|
||||||
IPVS=4|6|46 - тестируемые версии ip протокола
|
IPVS=4|6|46 - тестируемые версии ip протокола
|
||||||
ENABLE_HTTP=0|1 - включить тест plain http
|
ENABLE_HTTP=0|1 - включить тест plain http
|
||||||
@@ -2724,7 +2724,9 @@ VPS можно приобрести в множестве мест. Сущест
|
|||||||
|
|
||||||
## Поддержать разработчика
|
## Поддержать разработчика
|
||||||
|
|
||||||
USDT `0x3d52Ce15B7Be734c53fc9526ECbAB8267b63d66E`
|
USDT ERC `0x3d52Ce15B7Be734c53fc9526ECbAB8267b63d66E`
|
||||||
|
|
||||||
|
USDT TRC `TEzAAtn4VhndqEaAyuCM78xh5W2gCjwWEo`
|
||||||
|
|
||||||
BTC `bc1qhqew3mrvp47uk2vevt5sctp7p2x9m7m5kkchve`
|
BTC `bc1qhqew3mrvp47uk2vevt5sctp7p2x9m7m5kkchve`
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
Данный мануал пишется не как копипастная инструкция, а как помощь уже соображающему.
|
Данный мануал пишется не как копипастная инструкция, а как помощь уже соображающему.
|
||||||
Если вы не знаете основ сетей, linux, openwrt, а пытаетесь что-то скопипастить отсюда без малейшего
|
Если вы не знаете основ сетей, linux, openwrt, а пытаетесь что-то скопипастить отсюда без малейшего
|
||||||
понимания смысла, то маловероятно, что у вас что-то заработает. Не тратье свое время напрасно.
|
понимания смысла, то маловероятно, что у вас что-то заработает. Не тратьте свое время напрасно.
|
||||||
Цель - донести принципы как это настраивается вообще, а не указать какую буковку где вписать.
|
Цель - донести принципы как это настраивается вообще, а не указать какую буковку где вписать.
|
||||||
|
|
||||||
|
|
||||||
@@ -147,7 +147,7 @@ nfset является частью таблицы nftable и принадлеж
|
|||||||
Чтобы использовать эти nfset-ы в своих правилах, необходимо синхронизироваться с их созданием и вносить свои цепочки в nftable "zapret".
|
Чтобы использовать эти nfset-ы в своих правилах, необходимо синхронизироваться с их созданием и вносить свои цепочки в nftable "zapret".
|
||||||
Для этого существуют хуки - скрипты, вызываемые из zapret на определенных стадиях инициализации фаервола.
|
Для этого существуют хуки - скрипты, вызываемые из zapret на определенных стадиях инициализации фаервола.
|
||||||
|
|
||||||
Раскоментируейте в /opt/zapret/config строчку
|
Раскомментируйте в /opt/zapret/config строчку
|
||||||
INIT_FW_POST_UP_HOOK="/etc/firewall.zapret.hook.post_up"
|
INIT_FW_POST_UP_HOOK="/etc/firewall.zapret.hook.post_up"
|
||||||
|
|
||||||
Создайте файл /etc/firewall.zapret.hook.post_up и присвойте ему chmod 755.
|
Создайте файл /etc/firewall.zapret.hook.post_up и присвойте ему chmod 755.
|
||||||
|
|||||||
+2
-2
@@ -7,7 +7,7 @@ tpws is static binary. It doesn't need a distribution.
|
|||||||
|
|
||||||
Install `WSL` : `dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all`
|
Install `WSL` : `dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all`
|
||||||
|
|
||||||
Copy `binaries/x86_64/tpws_wsl.tgz` to the target system.
|
From release copy `binaries/linux-x86_64/tpws_wsl.tgz` to the target system.
|
||||||
Run : `wsl --import tpws "%USERPROFILE%\tpws" tpws_wsl.tgz`
|
Run : `wsl --import tpws "%USERPROFILE%\tpws" tpws_wsl.tgz`
|
||||||
|
|
||||||
Run tpws : `wsl -d tpws --exec /tpws --uid=1 --no-resolve --socks --bind-addr=127.0.0.1 --port=1080 <fooling_options>`
|
Run tpws : `wsl -d tpws --exec /tpws --uid=1 --no-resolve --socks --bind-addr=127.0.0.1 --port=1080 <fooling_options>`
|
||||||
@@ -16,7 +16,7 @@ Configure socks as `127.0.0.1:1080` in a browser or another program.
|
|||||||
|
|
||||||
Cleanup : `wsl --unregister tpws`
|
Cleanup : `wsl --unregister tpws`
|
||||||
|
|
||||||
Tested in windows 10 build 19041 (20.04).
|
Tested in windows 10 build 19041 (20.04) with WSL1.
|
||||||
|
|
||||||
`--oob` , `--mss` and `--disorder` do not work.
|
`--oob` , `--mss` and `--disorder` do not work.
|
||||||
RST detection in autohostlist scheme may not work.
|
RST detection in autohostlist scheme may not work.
|
||||||
|
|||||||
+14
-8
@@ -12,7 +12,7 @@ tpws в режиме socks можно запускать под более-ме
|
|||||||
Установить WSL :
|
Установить WSL :
|
||||||
`dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all`
|
`dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all`
|
||||||
|
|
||||||
Скопировать на целевую систему `binaries/x86_64/tpws_wsl.tgz`.
|
Из релиза скопировать на целевую систему `binaries/linux-x86_64/tpws_wsl.tgz`.
|
||||||
|
|
||||||
Выполнить :
|
Выполнить :
|
||||||
`wsl --import tpws "%USERPROFILE%\tpws" tpws_wsl.tgz`
|
`wsl --import tpws "%USERPROFILE%\tpws" tpws_wsl.tgz`
|
||||||
@@ -24,8 +24,12 @@ tpws в режиме socks можно запускать под более-ме
|
|||||||
|
|
||||||
Удаление : `wsl --unregister tpws`
|
Удаление : `wsl --unregister tpws`
|
||||||
|
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> Проверено на windows 10 build 19041 (20.04).
|
> Проверено на windows 10 build 19041 (20.04) под WSL1. На WSL2 эти команды могут не сработать.
|
||||||
|
Если у вас есть WSL2, значит у вас есть работающая виртуалка с linux.
|
||||||
|
Если вы умеете с ней обращаться, tpws на ней запустить возможно без всяких проблем.
|
||||||
|
|
||||||
|
|
||||||
Возможные проблемы:
|
Возможные проблемы:
|
||||||
- Не работают функции `--oob` и `--mss` из-за ограничений реализации WSL.
|
- Не работают функции `--oob` и `--mss` из-за ограничений реализации WSL.
|
||||||
@@ -93,7 +97,7 @@ autottl и autohostlist. При включении autohostlist так же пе
|
|||||||
Фильтрация windivert производится в ядре. Это несравнимо легче по ресурсам, чем перенаправлять пакеты в пространство user mode,
|
Фильтрация windivert производится в ядре. Это несравнимо легче по ресурсам, чем перенаправлять пакеты в пространство user mode,
|
||||||
чтобы winws принимал решение. Поэтому пользуйтесь по максимуму возможностями windivert.
|
чтобы winws принимал решение. Поэтому пользуйтесь по максимуму возможностями windivert.
|
||||||
Например, если вам нужно дурить wireguard на все порты, вам придется перенаправить все порты на winws. Или же написать windivert фильтр, который отсечет wireguard по содержимому пакета.
|
Например, если вам нужно дурить wireguard на все порты, вам придется перенаправить все порты на winws. Или же написать windivert фильтр, который отсечет wireguard по содержимому пакета.
|
||||||
Разница в нагрузке на процессор колоссальна. В первом случае - до 100% одного ядра cpu в зависимости от обьема исходящего udp трафика (привет, торрент и uTP), во втором - близко к 0.
|
Разница в нагрузке на процессор колоссальна. В первом случае - до 100% одного ядра cpu в зависимости от объема исходящего udp трафика (привет, торрент и uTP), во втором - близко к 0.
|
||||||
Кроме нагрузки на процессор еще можете порезать себе скорость, тк одно ядро не будет справляться с обработкой вашего гигабитного интернета. А на старых ноутах еще и получите самолетный вой системы охлаждения, приводящий к ее износу.
|
Кроме нагрузки на процессор еще можете порезать себе скорость, тк одно ядро не будет справляться с обработкой вашего гигабитного интернета. А на старых ноутах еще и получите самолетный вой системы охлаждения, приводящий к ее износу.
|
||||||
|
|
||||||
Можно запускать несколько процессов **winws** с разными стратегиями. Однако, не следует делать пересекающиеся фильтры.
|
Можно запускать несколько процессов **winws** с разными стратегиями. Однако, не следует делать пересекающиеся фильтры.
|
||||||
@@ -116,14 +120,14 @@ winws включается. Это нужно, чтобы можно было п
|
|||||||
NLM абстрагирует типы сетевых адаптеров. Он работает как с wifi, так и с ethernet и любыми другими.
|
NLM абстрагирует типы сетевых адаптеров. Он работает как с wifi, так и с ethernet и любыми другими.
|
||||||
Поэтому это более универсальный метод, чем **SSID** фильтр.
|
Поэтому это более универсальный метод, чем **SSID** фильтр.
|
||||||
Однако, есть и неприятная сторона. В windows 7 вы легко могли ткнуть на иконку сети и выбрать тип : private или public.
|
Однако, есть и неприятная сторона. В windows 7 вы легко могли ткнуть на иконку сети и выбрать тип : private или public.
|
||||||
Там же вы могли посмотреть список сетей и обьединить их. Чтобы, допустим, вы могли подключаться по кабелю и wifi
|
Там же вы могли посмотреть список сетей и объединить их. Чтобы, допустим, вы могли подключаться по кабелю и wifi
|
||||||
к одному роутеру, и система эти подключения воспринимала как одну сеть.
|
к одному роутеру, и система эти подключения воспринимала как одну сеть.
|
||||||
В следующих версиях windows они эти возможности сильно порезали. Похоже нет встроенных средств полноценно управлять
|
В следующих версиях windows они эти возможности сильно порезали. Похоже нет встроенных средств полноценно управлять
|
||||||
network locations в win10/11. Кое-что есть в **powershell**.
|
network locations в win10/11. Кое-что есть в **powershell**.
|
||||||
Можно поковыряться напрямую в реестре здесь :
|
Можно поковыряться напрямую в реестре здесь :
|
||||||
`HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList`
|
`HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList`
|
||||||
Нужно менять ProfileGUID в `Signatures\Unmanaged`. Имена можно поменять в Profiles.
|
Нужно менять ProfileGUID в `Signatures\Unmanaged`. Имена можно поменять в Profiles.
|
||||||
Есть кое-какие сторонние утилиты. Кое-что находится, позволяющее посмотреть и удалить network profiles, но не обьединить.
|
Есть кое-какие сторонние утилиты. Кое-что находится, позволяющее посмотреть и удалить network profiles, но не объединить.
|
||||||
Факт, что в ms они это сильно испортили. Движок network list все тот же, и он способен на все то, что было в win7.
|
Факт, что в ms они это сильно испортили. Движок network list все тот же, и он способен на все то, что было в win7.
|
||||||
Можно не бороться с этой проблемой, а просто указывать через запятую те названия сетей или GUIDы, которые выбрала система.
|
Можно не бороться с этой проблемой, а просто указывать через запятую те названия сетей или GUIDы, которые выбрала система.
|
||||||
Или если у вас только wifi, то использовать `--ssid-filter`. Там хотя бы есть гарантия, что **SSID** соответствуют реальности,
|
Или если у вас только wifi, то использовать `--ssid-filter`. Там хотя бы есть гарантия, что **SSID** соответствуют реальности,
|
||||||
@@ -133,7 +137,7 @@ network locations в win10/11. Кое-что есть в **powershell**.
|
|||||||
Для русского языка это 866. Пути с пробелами нужно брать в кавычки.
|
Для русского языка это 866. Пути с пробелами нужно брать в кавычки.
|
||||||
При использовании опции @<config_file> кодировка в файле должна быть **UTF-8** без **BOM mark**.
|
При использовании опции @<config_file> кодировка в файле должна быть **UTF-8** без **BOM mark**.
|
||||||
|
|
||||||
Существует неочевидный момент, каcаемый запуска **winws** из cygwin shell\`а. Если в директории, где находится winws, находится
|
Существует неочевидный момент, касаемый запуска **winws** из cygwin shell\`а. Если в директории, где находится winws, находится
|
||||||
копия `cygwin1.dll`, **winws** не запустится.
|
копия `cygwin1.dll`, **winws** не запустится.
|
||||||
Если нужен запуск под cygwin, то следует удалить или переместить `cygwin1.dll` из `binaries/windows-x86_64`. Это нужно для работы blockcheck.
|
Если нужен запуск под cygwin, то следует удалить или переместить `cygwin1.dll` из `binaries/windows-x86_64`. Это нужно для работы blockcheck.
|
||||||
Из cygwin шелла можно посылать winws сигналы через `kill` точно так же, как в `*nix`.
|
Из cygwin шелла можно посылать winws сигналы через `kill` точно так же, как в `*nix`.
|
||||||
@@ -161,7 +165,7 @@ network locations в win10/11. Кое-что есть в **powershell**.
|
|||||||
Требования к подписи драйверов windows изменились в 2021 году.
|
Требования к подписи драйверов windows изменились в 2021 году.
|
||||||
Официальные бесплатные обновления windows 7 закончились в 2020.
|
Официальные бесплатные обновления windows 7 закончились в 2020.
|
||||||
После этого несколько лет продолжали идти платные обновления по программе **ESU**.
|
После этого несколько лет продолжали идти платные обновления по программе **ESU**.
|
||||||
Именно в этих **ESU** обновлениях находится обновление ядра windows 7, позволяющиее загрузить драйвер
|
Именно в этих **ESU** обновлениях находится обновление ядра windows 7, позволяющее загрузить драйвер
|
||||||
_windivert 2.2.2-A_, который идет в поставке zapret.
|
_windivert 2.2.2-A_, который идет в поставке zapret.
|
||||||
Поэтому варианты следующие :
|
Поэтому варианты следующие :
|
||||||
|
|
||||||
@@ -179,7 +183,9 @@ https://hackandpwn.com/windows-7-esu-patching/
|
|||||||
http://www.bifido.net/tweaks-and-scripts/8-extended-security-updates-installer.html
|
http://www.bifido.net/tweaks-and-scripts/8-extended-security-updates-installer.html
|
||||||
и обновить систему
|
и обновить систему
|
||||||
|
|
||||||
3) Использовать UpdatePack7R2 от simplix : https://blog.simplix.info
|
3) Использовать готовый патчер-взламыватель ESU - "BypassESU". Его надо искать по названию.
|
||||||
|
|
||||||
|
4) Использовать UpdatePack7R2 от simplix : https://blog.simplix.info
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> Но с этим паком есть проблема. Автор из Украины, он очень обиделся на русских.
|
> Но с этим паком есть проблема. Автор из Украины, он очень обиделся на русских.
|
||||||
> Если в панели управления стоит регион RU или BY, появляется неприятный диалог.
|
> Если в панели управления стоит регион RU или BY, появляется неприятный диалог.
|
||||||
|
|||||||
@@ -104,11 +104,11 @@ Endpoint должен быть прописан хотя бы на одном п
|
|||||||
менять ip и быть за nat. Endpoint пира настраивается динамически после успешной фазы
|
менять ip и быть за nat. Endpoint пира настраивается динамически после успешной фазы
|
||||||
проверки ключа.
|
проверки ключа.
|
||||||
|
|
||||||
Включаем маршрутизцию :
|
Включаем маршрутизацию :
|
||||||
# echo net.ipv4.ip_forward = 1 >>/etc/sysctl.conf
|
# echo net.ipv4.ip_forward = 1 >>/etc/sysctl.conf
|
||||||
# sysctl -p
|
# sysctl -p
|
||||||
|
|
||||||
Интерфейс конфигурится стандартно для дебианоподобных систем :
|
Интерфейс конфигурируется стандартно для дебианоподобных систем :
|
||||||
|
|
||||||
--/etc/network/interfaces.d/wgvps-------------
|
--/etc/network/interfaces.d/wgvps-------------
|
||||||
auto wgvps
|
auto wgvps
|
||||||
@@ -203,7 +203,7 @@ config rule
|
|||||||
|
|
||||||
Что тут было сделано :
|
Что тут было сделано :
|
||||||
*) Настроен интерфейс wireguard. Указан собственный приватный ключ.
|
*) Настроен интерфейс wireguard. Указан собственный приватный ключ.
|
||||||
*) Настроен пир-партнер с указанием его публичнго ключа и endpoint (ip:port нашего сервера)
|
*) Настроен пир-партнер с указанием его публичного ключа и endpoint (ip:port нашего сервера)
|
||||||
такая настройка заставит периодически долбиться на сервер по указанному ip
|
такая настройка заставит периодически долбиться на сервер по указанному ip
|
||||||
route_allowed_ip '0' запрещает автоматическое создание маршрута
|
route_allowed_ip '0' запрещает автоматическое создание маршрута
|
||||||
allowed_ips '0.0.0.0/0' разрешает пакеты с любым адресом источника.
|
allowed_ips '0.0.0.0/0' разрешает пакеты с любым адресом источника.
|
||||||
@@ -275,7 +275,7 @@ for ext_iface in $wan_iface; do
|
|||||||
ipt OUTPUT -t mangle -o $DEVICE -m set --match-set ipban dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800
|
ipt OUTPUT -t mangle -o $DEVICE -m set --match-set ipban dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800
|
||||||
done
|
done
|
||||||
|
|
||||||
network_get_device DEVICE lan
|
network_get_device DEVICE lan
|
||||||
ipt PREROUTING -t mangle -i $DEVICE -p tcp --dport 443 -m set --match-set zapret dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800
|
ipt PREROUTING -t mangle -i $DEVICE -p tcp --dport 443 -m set --match-set zapret dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800
|
||||||
ipt PREROUTING -t mangle -i $DEVICE -m set --match-set ipban dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800
|
ipt PREROUTING -t mangle -i $DEVICE -m set --match-set ipban dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800
|
||||||
------------------------------------------------
|
------------------------------------------------
|
||||||
@@ -429,8 +429,8 @@ for ext_iface in $wan_iface; do
|
|||||||
ipt OUTPUT -t mangle -o $DEVICE -m set --match-set ipban dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800
|
ipt OUTPUT -t mangle -o $DEVICE -m set --match-set ipban dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800
|
||||||
ipt OUTPUT -t mangle -o $DEVICE -j MARK --set-mark 0x1000/0x1000
|
ipt OUTPUT -t mangle -o $DEVICE -j MARK --set-mark 0x1000/0x1000
|
||||||
done
|
done
|
||||||
|
|
||||||
network_get_device DEVICE lan
|
network_get_device DEVICE lan
|
||||||
ipt PREROUTING -t mangle -i $DEVICE -p tcp --dport 443 -m set --match-set zapret dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800
|
ipt PREROUTING -t mangle -i $DEVICE -p tcp --dport 443 -m set --match-set zapret dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800
|
||||||
ipt PREROUTING -t mangle -i $DEVICE -m set --match-set ipban dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800
|
ipt PREROUTING -t mangle -i $DEVICE -m set --match-set ipban dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# this custom script runs desync to DHT packets with udp payload length 101..399 , without ipset/hostlist filtering
|
# this custom script runs desync to DHT packets with udp payload length >=5 , without ipset/hostlist filtering
|
||||||
# NOTE: @ih requires nft 1.0.1+ and updated kernel version. it's confirmed to work on 5.15 (openwrt 23) and not work on 5.10 (openwrt 22)
|
# NOTE: @ih requires nft 1.0.1+ and updated kernel version. it's confirmed to work on 5.15 (openwrt 23) and not work on 5.10 (openwrt 22)
|
||||||
|
|
||||||
# can override in config :
|
# can override in config :
|
||||||
@@ -16,23 +16,23 @@ zapret_custom_daemons()
|
|||||||
}
|
}
|
||||||
zapret_custom_firewall()
|
zapret_custom_firewall()
|
||||||
{
|
{
|
||||||
# $1 - 1 - run, 0 - stop
|
# $1 - 1 - run, 0 - stop
|
||||||
|
|
||||||
local f uf4 uf6
|
local f uf4 uf6
|
||||||
local first_packet_only="$ipt_connbytes 1:1"
|
local first_packet_only="$ipt_connbytes 1:1"
|
||||||
|
|
||||||
f='-p udp -m length --length 109:407 -m u32 --u32'
|
f='-p udp -m u32 --u32'
|
||||||
uf4='0>>22&0x3C@8>>16=0x6431'
|
uf4='0>>22&0x3C@4>>16=13:0xFFFF&&0>>22&0x3C@8>>16=0x6431:0x6432'
|
||||||
uf6='48>>16=0x6431'
|
uf6='44>>16=13:0xFFFF&&48>>16=0x6431:0x6432'
|
||||||
fw_nfqws_post $1 "$f $uf4 $first_packet_only" "$f $uf6 $first_packet_only" $QNUM_DHT4ALL
|
fw_nfqws_post $1 "$f $uf4 $first_packet_only" "$f $uf6 $first_packet_only" $QNUM_DHT4ALL
|
||||||
}
|
}
|
||||||
zapret_custom_firewall_nft()
|
zapret_custom_firewall_nft()
|
||||||
{
|
{
|
||||||
# stop logic is not required
|
# stop logic is not required
|
||||||
|
|
||||||
local f
|
local f
|
||||||
local first_packet_only="$nft_connbytes 1"
|
local first_packet_only="$nft_connbytes 1"
|
||||||
|
|
||||||
f="meta length 109-407 meta l4proto udp @ih,0,16 0x6431"
|
f="udp length ge 13 meta l4proto udp @ih,0,16 0x6431-0x6432"
|
||||||
nft_fw_nfqws_post "$f $first_packet_only" "$f $first_packet_only" $QNUM_DHT4ALL
|
nft_fw_nfqws_post "$f $first_packet_only" "$f $first_packet_only" $QNUM_DHT4ALL
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
# can override in config :
|
# can override in config :
|
||||||
NFQWS_OPT_DESYNC_DISCORD_MEDIA="${NFQWS_OPT_DESYNC_DISCORD_MEDIA:---dpi-desync=fake --dpi-desync-repeats=2}"
|
NFQWS_OPT_DESYNC_DISCORD_MEDIA="${NFQWS_OPT_DESYNC_DISCORD_MEDIA:---dpi-desync=fake --dpi-desync-repeats=2}"
|
||||||
DISCORD_MEDIA_PORT_RANGE="${DISCORD_MEDIA_PORT_RANGE:-50000-50099}"
|
DISCORD_MEDIA_PORT_RANGE="${DISCORD_MEDIA_PORT_RANGE:-50000-50099,19294-19344}"
|
||||||
|
|
||||||
alloc_dnum DNUM_DISCORD_MEDIA
|
alloc_dnum DNUM_DISCORD_MEDIA
|
||||||
alloc_qnum QNUM_DISCORD_MEDIA
|
alloc_qnum QNUM_DISCORD_MEDIA
|
||||||
@@ -21,7 +21,7 @@ zapret_custom_firewall()
|
|||||||
|
|
||||||
local DISABLE_IPV6=1
|
local DISABLE_IPV6=1
|
||||||
local port_range=$(replace_char - : $DISCORD_MEDIA_PORT_RANGE)
|
local port_range=$(replace_char - : $DISCORD_MEDIA_PORT_RANGE)
|
||||||
local f="-p udp --dport $port_range -m u32 --u32"
|
local f="-p udp -m multiport --dports $port_range -m u32 --u32"
|
||||||
# this is simplified test to skip writing monstrous rule. instead of checking 64 bytes for zeroes only check 2 dwords for zero
|
# this is simplified test to skip writing monstrous rule. instead of checking 64 bytes for zeroes only check 2 dwords for zero
|
||||||
fw_nfqws_post $1 "$f 0>>22&0x3C@4>>16=0x52&&0>>22&0x3C@8=0x00010046&&0>>22&0x3C@16=0&&0>>22&0x3C@76=0" '' $QNUM_DISCORD_MEDIA
|
fw_nfqws_post $1 "$f 0>>22&0x3C@4>>16=0x52&&0>>22&0x3C@8=0x00010046&&0>>22&0x3C@16=0&&0>>22&0x3C@76=0" '' $QNUM_DISCORD_MEDIA
|
||||||
}
|
}
|
||||||
@@ -30,6 +30,7 @@ zapret_custom_firewall_nft()
|
|||||||
# stop logic is not required
|
# stop logic is not required
|
||||||
|
|
||||||
local DISABLE_IPV6=1
|
local DISABLE_IPV6=1
|
||||||
local f="udp dport $DISCORD_MEDIA_PORT_RANGE udp length == 82 @ih,0,32 0x00010046 @ih,64,128 0x00000000000000000000000000000000 @ih,192,128 0x00000000000000000000000000000000 @ih,320,128 0x00000000000000000000000000000000 @ih,448,128 0x00000000000000000000000000000000"
|
local f="udp dport {$DISCORD_MEDIA_PORT_RANGE} udp length == 82 @ih,0,32 0x00010046 @ih,64,128 0x00000000000000000000000000000000 @ih,192,128 0x00000000000000000000000000000000 @ih,320,128 0x00000000000000000000000000000000 @ih,448,128 0x00000000000000000000000000000000"
|
||||||
|
|
||||||
nft_fw_nfqws_post "$f" '' $QNUM_DISCORD_MEDIA
|
nft_fw_nfqws_post "$f" '' $QNUM_DISCORD_MEDIA
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ Type=forking
|
|||||||
Restart=no
|
Restart=no
|
||||||
TimeoutSec=30sec
|
TimeoutSec=30sec
|
||||||
IgnoreSIGPIPE=no
|
IgnoreSIGPIPE=no
|
||||||
KillMode=none
|
|
||||||
GuessMainPID=no
|
GuessMainPID=no
|
||||||
RemainAfterExit=no
|
RemainAfterExit=no
|
||||||
ExecStart=/opt/zapret/init.d/sysv/zapret start
|
ExecStart=/opt/zapret/init.d/sysv/zapret start
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
outbound and ip and
|
outbound and ip and
|
||||||
udp.DstPort>=50000 and udp.DstPort<=50099 and
|
(udp.DstPort>=50000 and udp.DstPort<=50099 or udp.DstPort>=19294 and udp.DstPort<=19344) and
|
||||||
udp.PayloadLength=74 and
|
udp.PayloadLength=74 and
|
||||||
udp.Payload32[0]=0x00010046 and
|
udp.Payload32[0]=0x00010046 and
|
||||||
udp.Payload32[2]=0 and
|
udp.Payload32[2]=0 and
|
||||||
|
|||||||
+1
-1
@@ -31,7 +31,7 @@ select_test_method()
|
|||||||
elif exists zsh && [ "$UNAME" != CYGWIN ] ; then
|
elif exists zsh && [ "$UNAME" != CYGWIN ] ; then
|
||||||
TEST=zsh
|
TEST=zsh
|
||||||
elif [ "$UNAME" != Darwin -a "$UNAME" != CYGWIN ]; then
|
elif [ "$UNAME" != Darwin -a "$UNAME" != CYGWIN ]; then
|
||||||
if exists hexdump and exists dd; then
|
if exists hexdump && exists dd; then
|
||||||
# macos does not use ELF
|
# macos does not use ELF
|
||||||
TEST=elf
|
TEST=elf
|
||||||
ELF=
|
ELF=
|
||||||
|
|||||||
+3
-3
@@ -268,10 +268,10 @@ select_getlist()
|
|||||||
echo
|
echo
|
||||||
if ask_yes_no $D "do you want to auto download ip/host list"; then
|
if ask_yes_no $D "do you want to auto download ip/host list"; then
|
||||||
if [ "$MODE_FILTER" = "hostlist" -o "$MODE_FILTER" = "autohostlist" ] ; then
|
if [ "$MODE_FILTER" = "hostlist" -o "$MODE_FILTER" = "autohostlist" ] ; then
|
||||||
GETLISTS="get_refilter_domains.sh get_antizapret_domains.sh get_reestr_resolvable_domains.sh get_reestr_hostlist.sh"
|
GETLISTS="get_refilter_domains.sh get_antizapret_domains.sh get_reestr_resolvable_domains.sh"
|
||||||
GETLIST_DEF="get_antizapret_domains.sh"
|
GETLIST_DEF="get_antizapret_domains.sh"
|
||||||
else
|
else
|
||||||
GETLISTS="get_user.sh get_refilter_ipsum.sh get_antifilter_ip.sh get_antifilter_ipsmart.sh get_antifilter_ipsum.sh get_antifilter_ipresolve.sh get_antifilter_allyouneed.sh get_reestr_resolve.sh get_reestr_preresolved.sh get_reestr_preresolved_smart.sh"
|
GETLISTS="get_user.sh get_refilter_ipsum.sh get_antifilter_ip.sh get_antifilter_ipsmart.sh get_antifilter_ipsum.sh get_antifilter_ipresolve.sh get_antifilter_allyouneed.sh get_reestr_preresolved.sh get_reestr_preresolved_smart.sh"
|
||||||
GETLIST_DEF="get_antifilter_allyouneed.sh"
|
GETLIST_DEF="get_antifilter_allyouneed.sh"
|
||||||
fi
|
fi
|
||||||
ask_list GETLIST "$GETLISTS" "$GETLIST_DEF" && write_config_var GETLIST
|
ask_list GETLIST "$GETLISTS" "$GETLIST_DEF" && write_config_var GETLIST
|
||||||
@@ -323,7 +323,7 @@ ask_config_tmpdir()
|
|||||||
echo /tmp in openwrt is tmpfs. on low RAM systems there may be not enough RAM to store downloaded files
|
echo /tmp in openwrt is tmpfs. on low RAM systems there may be not enough RAM to store downloaded files
|
||||||
echo default tmpfs has size of 50% RAM
|
echo default tmpfs has size of 50% RAM
|
||||||
echo "RAM : $(get_ram_mb) Mb"
|
echo "RAM : $(get_ram_mb) Mb"
|
||||||
echo "DISK : $(get_free_space_mb) Mb"
|
echo "DISK : $(get_free_space_mb "$EXEDIR/tmp") Mb"
|
||||||
echo select temp file location
|
echo select temp file location
|
||||||
[ -z "$TMPDIR" ] && TMPDIR=/tmp
|
[ -z "$TMPDIR" ] && TMPDIR=/tmp
|
||||||
ask_list TMPDIR "/tmp $EXEDIR/tmp" && {
|
ask_list TMPDIR "/tmp $EXEDIR/tmp" && {
|
||||||
|
|||||||
+2
-2
@@ -49,7 +49,7 @@ static int ucmp(const void * a, const void * b, void *arg)
|
|||||||
}
|
}
|
||||||
static uint32_t mask_from_bitcount(uint32_t zct)
|
static uint32_t mask_from_bitcount(uint32_t zct)
|
||||||
{
|
{
|
||||||
return zct<32 ? ~((1 << zct) - 1) : 0;
|
return zct<32 ? ~((1u << zct) - 1) : 0;
|
||||||
}
|
}
|
||||||
// make presorted array unique. return number of unique items.
|
// make presorted array unique. return number of unique items.
|
||||||
// 1,1,2,3,3,0,0,0 (ct=8) => 1,2,3,0 (ct=4)
|
// 1,1,2,3,3,0,0,0 (ct=8) => 1,2,3,0 (ct=4)
|
||||||
@@ -138,7 +138,7 @@ static void mask_from_bitcount6_make(uint32_t zct, struct in6_addr *a)
|
|||||||
int32_t n = (127 - zct) >> 3;
|
int32_t n = (127 - zct) >> 3;
|
||||||
memset(a->s6_addr,0xFF,n);
|
memset(a->s6_addr,0xFF,n);
|
||||||
memset(a->s6_addr+n,0x00,16-n);
|
memset(a->s6_addr+n,0x00,16-n);
|
||||||
a->s6_addr[n] = ~((1 << (zct & 7)) - 1);
|
a->s6_addr[n] = ~((1u << (zct & 7)) - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static struct in6_addr ip6_mask[129];
|
static struct in6_addr ip6_mask[129];
|
||||||
|
|||||||
@@ -1,65 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
IPSET_DIR="$(dirname "$0")"
|
|
||||||
IPSET_DIR="$(cd "$IPSET_DIR"; pwd)"
|
|
||||||
|
|
||||||
. "$IPSET_DIR/def.sh"
|
|
||||||
|
|
||||||
ZREESTR="$TMPDIR/zapret.txt.gz"
|
|
||||||
IPB="$TMPDIR/ipb.txt"
|
|
||||||
ZURL_REESTR=https://raw.githubusercontent.com/zapret-info/z-i/master/dump.csv.gz
|
|
||||||
|
|
||||||
dl_checked()
|
|
||||||
{
|
|
||||||
# $1 - url
|
|
||||||
# $2 - file
|
|
||||||
# $3 - minsize
|
|
||||||
# $4 - maxsize
|
|
||||||
# $5 - maxtime
|
|
||||||
curl -k --fail --max-time $5 --connect-timeout 10 --retry 4 --max-filesize $4 -o "$2" "$1" ||
|
|
||||||
{
|
|
||||||
echo list download failed : $1
|
|
||||||
return 2
|
|
||||||
}
|
|
||||||
dlsize=$(LC_ALL=C LANG=C wc -c "$2" | xargs | cut -f 1 -d ' ')
|
|
||||||
if test $dlsize -lt $3; then
|
|
||||||
echo list is too small : $dlsize bytes. can be bad.
|
|
||||||
return 2
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
reestr_list()
|
|
||||||
{
|
|
||||||
LC_ALL=C LANG=C gunzip -c "$ZREESTR" | cut -s -f2 -d';' | LC_ALL=C LANG=C nice -n 5 sed -Ee 's/^\*\.(.+)$/\1/' -ne 's/^[a-z0-9A-Z._-]+$/&/p' | $AWK '{ print tolower($0) }'
|
|
||||||
}
|
|
||||||
reestr_extract_ip()
|
|
||||||
{
|
|
||||||
LC_ALL=C LANG=C gunzip -c | nice -n 5 $AWK -F ';' '($1 ~ /^([0-9]{1,3}\.){3}[0-9]{1,3}/) && (($2 == "" && $3 == "") || ($1 == $2)) {gsub(/ \| /, RS); print $1}' | LC_ALL=C LANG=C $AWK '{split($1, a, /\|/); for (i in a) {print a[i]}}'
|
|
||||||
}
|
|
||||||
|
|
||||||
ipban_fin()
|
|
||||||
{
|
|
||||||
getipban
|
|
||||||
"$IPSET_DIR/create_ipset.sh"
|
|
||||||
}
|
|
||||||
|
|
||||||
dl_checked "$ZURL_REESTR" "$ZREESTR" 204800 251658240 600 || {
|
|
||||||
ipban_fin
|
|
||||||
exit 2
|
|
||||||
}
|
|
||||||
|
|
||||||
reestr_list | sort -u | zz "$ZHOSTLIST"
|
|
||||||
|
|
||||||
reestr_extract_ip <"$ZREESTR" >"$IPB"
|
|
||||||
|
|
||||||
rm -f "$ZREESTR"
|
|
||||||
[ "$DISABLE_IPV4" != "1" ] && $AWK '/^([0-9]{1,3}\.){3}[0-9]{1,3}($|(\/[0-9]{2}$))/' "$IPB" | cut_local | ip2net4 | zz "$ZIPLIST_IPBAN"
|
|
||||||
[ "$DISABLE_IPV6" != "1" ] && $AWK '/^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}($|(\/[0-9]{2,3}$))/' "$IPB" | cut_local6 | ip2net6 | zz "$ZIPLIST_IPBAN6"
|
|
||||||
rm -f "$IPB"
|
|
||||||
|
|
||||||
hup_zapret_daemons
|
|
||||||
|
|
||||||
ipban_fin
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -10,8 +10,8 @@ TMPLIST="$TMPDIR/list.txt"
|
|||||||
BASEURL="https://raw.githubusercontent.com/bol-van/rulist/main"
|
BASEURL="https://raw.githubusercontent.com/bol-van/rulist/main"
|
||||||
URL4="$BASEURL/reestr_resolved4.txt"
|
URL4="$BASEURL/reestr_resolved4.txt"
|
||||||
URL6="$BASEURL/reestr_resolved6.txt"
|
URL6="$BASEURL/reestr_resolved6.txt"
|
||||||
IPB4="$BASEURL/reestr_ipban4.txt"
|
#IPB4="$BASEURL/reestr_ipban4.txt"
|
||||||
IPB6="$BASEURL/reestr_ipban6.txt"
|
#IPB6="$BASEURL/reestr_ipban6.txt"
|
||||||
|
|
||||||
dl()
|
dl()
|
||||||
{
|
{
|
||||||
@@ -35,12 +35,12 @@ dl()
|
|||||||
|
|
||||||
getuser && {
|
getuser && {
|
||||||
[ "$DISABLE_IPV4" != "1" ] && {
|
[ "$DISABLE_IPV4" != "1" ] && {
|
||||||
dl "$URL4" "$ZIPLIST" 32768 4194304
|
dl "$URL4" "$ZIPLIST" 4096 4194304
|
||||||
dl "$IPB4" "$ZIPLIST_IPBAN" 8192 1048576
|
# dl "$IPB4" "$ZIPLIST_IPBAN" 8192 1048576
|
||||||
}
|
}
|
||||||
[ "$DISABLE_IPV6" != "1" ] && {
|
[ "$DISABLE_IPV6" != "1" ] && {
|
||||||
dl "$URL6" "$ZIPLIST6" 8192 4194304
|
dl "$URL6" "$ZIPLIST6" 2048 4194304
|
||||||
dl "$IPB6" "$ZIPLIST_IPBAN6" 128 1048576
|
# dl "$IPB6" "$ZIPLIST_IPBAN6" 128 1048576
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ TMPLIST="$TMPDIR/list.txt"
|
|||||||
BASEURL="https://raw.githubusercontent.com/bol-van/rulist/main"
|
BASEURL="https://raw.githubusercontent.com/bol-van/rulist/main"
|
||||||
URL4="$BASEURL/reestr_smart4.txt"
|
URL4="$BASEURL/reestr_smart4.txt"
|
||||||
URL6="$BASEURL/reestr_smart6.txt"
|
URL6="$BASEURL/reestr_smart6.txt"
|
||||||
IPB4="$BASEURL/reestr_ipban4.txt"
|
#IPB4="$BASEURL/reestr_ipban4.txt"
|
||||||
IPB6="$BASEURL/reestr_ipban6.txt"
|
#IPB6="$BASEURL/reestr_ipban6.txt"
|
||||||
|
|
||||||
dl()
|
dl()
|
||||||
{
|
{
|
||||||
@@ -35,12 +35,12 @@ dl()
|
|||||||
|
|
||||||
getuser && {
|
getuser && {
|
||||||
[ "$DISABLE_IPV4" != "1" ] && {
|
[ "$DISABLE_IPV4" != "1" ] && {
|
||||||
dl "$URL4" "$ZIPLIST" 32768 4194304
|
dl "$URL4" "$ZIPLIST" 4096 4194304
|
||||||
dl "$IPB4" "$ZIPLIST_IPBAN" 8192 1048576
|
# dl "$IPB4" "$ZIPLIST_IPBAN" 8192 1048576
|
||||||
}
|
}
|
||||||
[ "$DISABLE_IPV6" != "1" ] && {
|
[ "$DISABLE_IPV6" != "1" ] && {
|
||||||
dl "$URL6" "$ZIPLIST6" 8192 4194304
|
dl "$URL6" "$ZIPLIST6" 2048 4194304
|
||||||
dl "$IPB6" "$ZIPLIST_IPBAN6" 128 1048576
|
# dl "$IPB6" "$ZIPLIST_IPBAN6" 128 1048576
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ TMPLIST="$TMPDIR/list_nethub.txt"
|
|||||||
|
|
||||||
BASEURL="https://raw.githubusercontent.com/bol-van/rulist/main"
|
BASEURL="https://raw.githubusercontent.com/bol-van/rulist/main"
|
||||||
URL="$BASEURL/reestr_hostname_resolvable.txt"
|
URL="$BASEURL/reestr_hostname_resolvable.txt"
|
||||||
IPB4="$BASEURL/reestr_ipban4.txt"
|
#IPB4="$BASEURL/reestr_ipban4.txt"
|
||||||
IPB6="$BASEURL/reestr_ipban6.txt"
|
#IPB6="$BASEURL/reestr_ipban6.txt"
|
||||||
|
|
||||||
dl()
|
dl()
|
||||||
{
|
{
|
||||||
@@ -36,8 +36,8 @@ dl "$URL" "$ZHOSTLIST" 65536 67108864
|
|||||||
|
|
||||||
hup_zapret_daemons
|
hup_zapret_daemons
|
||||||
|
|
||||||
[ "$DISABLE_IPV4" != "1" ] && dl "$IPB4" "$ZIPLIST_IPBAN" 8192 1048576
|
#[ "$DISABLE_IPV4" != "1" ] && dl "$IPB4" "$ZIPLIST_IPBAN" 8192 1048576
|
||||||
[ "$DISABLE_IPV6" != "1" ] && dl "$IPB6" "$ZIPLIST_IPBAN6" 128 1048576
|
#[ "$DISABLE_IPV6" != "1" ] && dl "$IPB6" "$ZIPLIST_IPBAN6" 128 1048576
|
||||||
|
|
||||||
getipban
|
getipban
|
||||||
"$IPSET_DIR/create_ipset.sh"
|
"$IPSET_DIR/create_ipset.sh"
|
||||||
|
|||||||
@@ -1,83 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
IPSET_DIR="$(dirname "$0")"
|
|
||||||
IPSET_DIR="$(cd "$IPSET_DIR"; pwd)"
|
|
||||||
|
|
||||||
. "$IPSET_DIR/def.sh"
|
|
||||||
|
|
||||||
ZREESTR="$TMPDIR/zapret.txt.gz"
|
|
||||||
ZDIG="$TMPDIR/zapret-dig.txt"
|
|
||||||
IPB="$TMPDIR/ipb.txt"
|
|
||||||
ZIPLISTTMP="$TMPDIR/zapret-ip.txt"
|
|
||||||
#ZURL=https://reestr.rublacklist.net/api/current
|
|
||||||
ZURL_REESTR=https://raw.githubusercontent.com/zapret-info/z-i/master/dump.csv.gz
|
|
||||||
|
|
||||||
dl_checked()
|
|
||||||
{
|
|
||||||
# $1 - url
|
|
||||||
# $2 - file
|
|
||||||
# $3 - minsize
|
|
||||||
# $4 - maxsize
|
|
||||||
# $5 - maxtime
|
|
||||||
curl -k --fail --max-time $5 --connect-timeout 10 --retry 4 --max-filesize $4 -o "$2" "$1" ||
|
|
||||||
{
|
|
||||||
echo list download failed : $1
|
|
||||||
return 2
|
|
||||||
}
|
|
||||||
dlsize=$(LC_ALL=C LANG=C wc -c "$2" | xargs | cut -f 1 -d ' ')
|
|
||||||
if test $dlsize -lt $3; then
|
|
||||||
echo list is too small : $dlsize bytes. can be bad.
|
|
||||||
return 2
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
reestr_list()
|
|
||||||
{
|
|
||||||
LC_ALL=C LANG=C gunzip -c "$ZREESTR" | cut -s -f2 -d';' | LC_ALL=C LANG=C nice -n 5 sed -Ee 's/^\*\.(.+)$/\1/' -ne 's/^[a-z0-9A-Z._-]+$/&/p' | $AWK '{ print tolower($0) }'
|
|
||||||
}
|
|
||||||
reestr_extract_ip()
|
|
||||||
{
|
|
||||||
LC_ALL=C LANG=C gunzip -c | nice -n 5 $AWK -F ';' '($1 ~ /^([0-9]{1,3}\.){3}[0-9]{1,3}/) && (($2 == "" && $3 == "") || ($1 == $2)) {gsub(/ \| /, RS); print $1}' | LC_ALL=C LANG=C $AWK '{split($1, a, /\|/); for (i in a) {print a[i]}}'
|
|
||||||
}
|
|
||||||
|
|
||||||
getuser && {
|
|
||||||
# both disabled
|
|
||||||
[ "$DISABLE_IPV4" = "1" ] && [ "$DISABLE_IPV6" = "1" ] && exit 0
|
|
||||||
|
|
||||||
dl_checked "$ZURL_REESTR" "$ZREESTR" 204800 251658240 600 || exit 2
|
|
||||||
|
|
||||||
echo preparing ipban list ..
|
|
||||||
|
|
||||||
reestr_extract_ip <"$ZREESTR" >"$IPB"
|
|
||||||
[ "$DISABLE_IPV4" != "1" ] && $AWK '/^([0-9]{1,3}\.){3}[0-9]{1,3}($|(\/[0-9]{2}$))/' "$IPB" | cut_local | ip2net4 | zz "$ZIPLIST_IPBAN"
|
|
||||||
[ "$DISABLE_IPV6" != "1" ] && $AWK '/^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}($|(\/[0-9]{2,3}$))/' "$IPB" | cut_local6 | ip2net6 | zz "$ZIPLIST_IPBAN6"
|
|
||||||
rm -f "$IPB"
|
|
||||||
|
|
||||||
echo preparing dig list ..
|
|
||||||
reestr_list | sort -u >"$ZDIG"
|
|
||||||
|
|
||||||
rm -f "$ZREESTR"
|
|
||||||
|
|
||||||
echo digging started. this can take long ...
|
|
||||||
|
|
||||||
[ "$DISABLE_IPV4" != "1" ] && {
|
|
||||||
filedigger "$ZDIG" 4 | cut_local >"$ZIPLISTTMP" || {
|
|
||||||
rm -f "$ZDIG"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
ip2net4 <"$ZIPLISTTMP" | zz "$ZIPLIST"
|
|
||||||
rm -f "$ZIPLISTTMP"
|
|
||||||
}
|
|
||||||
[ "$DISABLE_IPV6" != "1" ] && {
|
|
||||||
filedigger "$ZDIG" 6 | cut_local6 >"$ZIPLISTTMP" || {
|
|
||||||
rm -f "$ZDIG"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
ip2net6 <"$ZIPLISTTMP" | zz "$ZIPLIST6"
|
|
||||||
rm -f "$ZIPLISTTMP"
|
|
||||||
}
|
|
||||||
rm -f "$ZDIG"
|
|
||||||
}
|
|
||||||
|
|
||||||
"$IPSET_DIR/create_ipset.sh"
|
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
172.16.0.0/12
|
172.16.0.0/12
|
||||||
192.168.0.0/16
|
192.168.0.0/16
|
||||||
169.254.0.0/16
|
169.254.0.0/16
|
||||||
|
100.64.0.0/10
|
||||||
::1
|
::1
|
||||||
fc00::/7
|
fc00::/7
|
||||||
fe80::/10
|
fe80::/10
|
||||||
|
|||||||
+46
-14
@@ -30,7 +30,8 @@
|
|||||||
#endif
|
#endif
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#define RESOLVER_EAGAIN_ATTEMPTS 2
|
#define RESOLVER_EAGAIN_ATTEMPTS 10
|
||||||
|
#define RESOLVER_EAGAIN_DELAY 500
|
||||||
|
|
||||||
static void trimstr(char *s)
|
static void trimstr(char *s)
|
||||||
{
|
{
|
||||||
@@ -79,15 +80,15 @@ static bool dom_valid(char *dom)
|
|||||||
{
|
{
|
||||||
if (!dom || *dom=='.') return false;
|
if (!dom || *dom=='.') return false;
|
||||||
for (; *dom; dom++)
|
for (; *dom; dom++)
|
||||||
if (*dom < 0x20 || (*dom & 0x80) || !(*dom == '.' || *dom == '-' || *dom == '_' || (*dom >= '0' && *dom <= '9') || (*dom >= 'a' && *dom <= 'z') || (*dom >= 'A' && *dom <= 'Z')))
|
if (!(*dom == '.' || *dom == '-' || *dom == '_' || (*dom >= '0' && *dom <= '9') || (*dom >= 'a' && *dom <= 'z') || (*dom >= 'A' && *dom <= 'Z')))
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void invalid_domain_beautify(char *dom)
|
static void invalid_domain_beautify(char *dom)
|
||||||
{
|
{
|
||||||
for (int i = 0; *dom && i < 64; i++, dom++)
|
for (int i = 0; *dom && i < 64; i++, dom++)
|
||||||
if (*dom < 0x20 || *dom>0x7F) *dom = '?';
|
if (*dom < 0x20 || (*dom & 0x80)) *dom = '?';
|
||||||
if (*dom) *dom = 0;
|
if (*dom) *dom = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,7 +98,7 @@ static struct
|
|||||||
{
|
{
|
||||||
char verbose;
|
char verbose;
|
||||||
char family;
|
char family;
|
||||||
int threads;
|
int threads, eagain, eagain_delay;
|
||||||
time_t start_time;
|
time_t start_time;
|
||||||
pthread_mutex_t flock;
|
pthread_mutex_t flock;
|
||||||
pthread_mutex_t slock; // stats lock
|
pthread_mutex_t slock; // stats lock
|
||||||
@@ -193,11 +194,12 @@ static void *t_resolver(void *arg)
|
|||||||
int i, r;
|
int i, r;
|
||||||
char dom[256];
|
char dom[256];
|
||||||
bool is_ok;
|
bool is_ok;
|
||||||
struct addrinfo hints;
|
struct addrinfo hints, *result;
|
||||||
struct addrinfo *result;
|
struct timespec ts_eagain = { .tv_sec = glob.eagain_delay/1000, .tv_nsec=glob.eagain_delay%1000*1000000 };
|
||||||
|
|
||||||
VLOG("started");
|
VLOG("started");
|
||||||
|
|
||||||
|
|
||||||
memset(&hints, 0, sizeof(struct addrinfo));
|
memset(&hints, 0, sizeof(struct addrinfo));
|
||||||
hints.ai_family = (glob.family == FAMILY4) ? AF_INET : (glob.family == FAMILY6) ? AF_INET6 : AF_UNSPEC;
|
hints.ai_family = (glob.family == FAMILY4) ? AF_INET : (glob.family == FAMILY6) ? AF_INET6 : AF_UNSPEC;
|
||||||
hints.ai_socktype = SOCK_DGRAM;
|
hints.ai_socktype = SOCK_DGRAM;
|
||||||
@@ -218,7 +220,7 @@ static void *t_resolver(void *arg)
|
|||||||
{
|
{
|
||||||
if ((family == AF_INET && (glob.family & FAMILY4)) || (family == AF_INET6 && (glob.family & FAMILY6)))
|
if ((family == AF_INET && (glob.family & FAMILY4)) || (family == AF_INET6 && (glob.family & FAMILY6)))
|
||||||
{
|
{
|
||||||
unsigned int mask;
|
unsigned int mask=0;
|
||||||
bool mask_needed = false;
|
bool mask_needed = false;
|
||||||
if (s_mask)
|
if (s_mask)
|
||||||
{
|
{
|
||||||
@@ -244,12 +246,16 @@ static void *t_resolver(void *arg)
|
|||||||
else if (dom_valid(dom))
|
else if (dom_valid(dom))
|
||||||
{
|
{
|
||||||
VLOG("resolving %s", dom);
|
VLOG("resolving %s", dom);
|
||||||
for (i = 0; i < RESOLVER_EAGAIN_ATTEMPTS; i++)
|
for (i = 0; i < glob.eagain; i++)
|
||||||
{
|
{
|
||||||
if ((r = getaddrinfo(dom, NULL, &hints, &result)))
|
if ((r = getaddrinfo(dom, NULL, &hints, &result)))
|
||||||
{
|
{
|
||||||
VLOG("failed to resolve %s : result %d (%s)", dom, r, eai_str(r));
|
VLOG("failed to resolve %s : result %d (%s)", dom, r, eai_str(r));
|
||||||
if (r == EAI_AGAIN) continue; // temporary failure. should retry
|
if (r == EAI_AGAIN)
|
||||||
|
{
|
||||||
|
nanosleep(&ts_eagain, NULL);
|
||||||
|
continue; // temporary failure. should retry
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -430,7 +436,7 @@ int dns_parse_query()
|
|||||||
_setmode(_fileno(stdin), _O_BINARY);
|
_setmode(_fileno(stdin), _O_BINARY);
|
||||||
#endif
|
#endif
|
||||||
l = fread(a,1,sizeof(a),stdin);
|
l = fread(a,1,sizeof(a),stdin);
|
||||||
if (!l || !feof(stdin))
|
if (!l || ferror(stdin))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "could not read DNS reply blob from stdin\n");
|
fprintf(stderr, "could not read DNS reply blob from stdin\n");
|
||||||
return 10;
|
return 10;
|
||||||
@@ -447,14 +453,18 @@ int dns_parse_query()
|
|||||||
static void exithelp(void)
|
static void exithelp(void)
|
||||||
{
|
{
|
||||||
printf(
|
printf(
|
||||||
" --threads=<threads_number>\n"
|
|
||||||
" --family=<4|6|46>\t\t; ipv4, ipv6, ipv4+ipv6\n"
|
" --family=<4|6|46>\t\t; ipv4, ipv6, ipv4+ipv6\n"
|
||||||
|
" --threads=<threads_number>\n"
|
||||||
|
" --eagain=<eagain_retries>\t; how many times to retry if EAI_AGAIN received. default %u\n"
|
||||||
|
" --eagain-delay=<ms>\t\t; time in msec to wait between EAI_AGAIN attempts. default %u\n"
|
||||||
" --verbose\t\t\t; print query progress to stderr\n"
|
" --verbose\t\t\t; print query progress to stderr\n"
|
||||||
" --stats=N\t\t\t; print resolve stats to stderr every N domains\n"
|
" --stats=N\t\t\t; print resolve stats to stderr every N domains\n"
|
||||||
" --log-resolved=<file>\t\t; log successfully resolved domains to a file\n"
|
" --log-resolved=<file>\t\t; log successfully resolved domains to a file\n"
|
||||||
" --log-failed=<file>\t\t; log failed domains to a file\n"
|
" --log-failed=<file>\t\t; log failed domains to a file\n"
|
||||||
" --dns-make-query=<domain>\t; output to stdout binary blob with DNS query. use --family to specify ip version.\n"
|
" --dns-make-query=<domain>\t; output to stdout binary blob with DNS query. use --family to specify ip version.\n"
|
||||||
" --dns-parse-query\t\t; read from stdin binary DNS answer blob and parse it to ipv4/ipv6 addresses\n"
|
" --dns-parse-query\t\t; read from stdin binary DNS answer blob and parse it to ipv4/ipv6 addresses\n",
|
||||||
|
RESOLVER_EAGAIN_ATTEMPTS,
|
||||||
|
RESOLVER_EAGAIN_DELAY
|
||||||
);
|
);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
@@ -469,6 +479,8 @@ static void exithelp(void)
|
|||||||
|
|
||||||
enum opt_indices {
|
enum opt_indices {
|
||||||
IDX_HELP,
|
IDX_HELP,
|
||||||
|
IDX_EAGAIN,
|
||||||
|
IDX_EAGAIN_DELAY,
|
||||||
IDX_THREADS,
|
IDX_THREADS,
|
||||||
IDX_FAMILY,
|
IDX_FAMILY,
|
||||||
IDX_VERBOSE,
|
IDX_VERBOSE,
|
||||||
@@ -483,6 +495,8 @@ enum opt_indices {
|
|||||||
static const struct option long_options[] = {
|
static const struct option long_options[] = {
|
||||||
[IDX_HELP] = {"help", no_argument, 0, 0},
|
[IDX_HELP] = {"help", no_argument, 0, 0},
|
||||||
[IDX_THREADS] = {"threads", required_argument, 0, 0},
|
[IDX_THREADS] = {"threads", required_argument, 0, 0},
|
||||||
|
[IDX_EAGAIN] = {"eagain", required_argument, 0, 0},
|
||||||
|
[IDX_EAGAIN_DELAY] = {"eagain-delay", required_argument, 0, 0},
|
||||||
[IDX_FAMILY] = {"family", required_argument, 0, 0},
|
[IDX_FAMILY] = {"family", required_argument, 0, 0},
|
||||||
[IDX_VERBOSE] = {"verbose", no_argument, 0, 0},
|
[IDX_VERBOSE] = {"verbose", no_argument, 0, 0},
|
||||||
[IDX_STATS] = {"stats", required_argument, 0, 0},
|
[IDX_STATS] = {"stats", required_argument, 0, 0},
|
||||||
@@ -503,6 +517,8 @@ int main(int argc, char **argv)
|
|||||||
*fn1 = *fn2 = *dom = 0;
|
*fn1 = *fn2 = *dom = 0;
|
||||||
glob.family = FAMILY4;
|
glob.family = FAMILY4;
|
||||||
glob.threads = 1;
|
glob.threads = 1;
|
||||||
|
glob.eagain = RESOLVER_EAGAIN_ATTEMPTS;
|
||||||
|
glob.eagain_delay = RESOLVER_EAGAIN_DELAY;
|
||||||
while ((v = getopt_long_only(argc, argv, "", long_options, &option_index)) != -1)
|
while ((v = getopt_long_only(argc, argv, "", long_options, &option_index)) != -1)
|
||||||
{
|
{
|
||||||
if (v) exithelp();
|
if (v) exithelp();
|
||||||
@@ -513,13 +529,29 @@ int main(int argc, char **argv)
|
|||||||
exithelp();
|
exithelp();
|
||||||
break;
|
break;
|
||||||
case IDX_THREADS:
|
case IDX_THREADS:
|
||||||
glob.threads = optarg ? atoi(optarg) : 0;
|
glob.threads = atoi(optarg);
|
||||||
if (glob.threads <= 0 || glob.threads > 100)
|
if (glob.threads <= 0 || glob.threads > 100)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "thread number must be within 1..100\n");
|
fprintf(stderr, "thread number must be within 1..100\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case IDX_EAGAIN:
|
||||||
|
glob.eagain = atoi(optarg);
|
||||||
|
if (glob.eagain <= 0 || glob.eagain > 1000)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "eagain must be within 1..1000\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IDX_EAGAIN_DELAY:
|
||||||
|
glob.eagain_delay = atoi(optarg);
|
||||||
|
if (glob.eagain_delay < 0 || glob.eagain_delay > 100000)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "eagain-delay must be within 0..100000\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case IDX_FAMILY:
|
case IDX_FAMILY:
|
||||||
if (!strcmp(optarg, "4"))
|
if (!strcmp(optarg, "4"))
|
||||||
glob.family = FAMILY4;
|
glob.family = FAMILY4;
|
||||||
|
|||||||
+14
-9
@@ -1,10 +1,15 @@
|
|||||||
CC ?= cc
|
CC ?= cc
|
||||||
OPTIMIZE ?= -Os
|
OPTIMIZE ?= -Os
|
||||||
CFLAGS += -std=gnu99 $(OPTIMIZE) -flto=auto
|
CFLAGS += -std=gnu99 $(OPTIMIZE) -flto=auto -ffunction-sections -fdata-sections
|
||||||
CFLAGS_SYSTEMD = -DUSE_SYSTEMD
|
CFLAGS_SYSTEMD = -DUSE_SYSTEMD
|
||||||
CFLAGS_BSD = -Wno-address-of-packed-member
|
CFLAGS_BSD = -Wno-address-of-packed-member
|
||||||
CFLAGS_CYGWIN = -Wno-address-of-packed-member -static
|
CFLAGS_CYGWIN = -Wno-address-of-packed-member -static
|
||||||
LDFLAGS_ANDROID = -llog
|
LDFLAGS += -flto=auto
|
||||||
|
LDFLAGS_ANDROID = -Wl,--gc-sections -llog
|
||||||
|
LDFLAGS_BSD = -Wl,--gc-sections
|
||||||
|
LDFLAGS_LINUX = -Wl,--gc-sections
|
||||||
|
LDFLAGS_MAC = -Wl,-dead_strip
|
||||||
|
LDFLAGS_WIN = -Wl,--gc-sections
|
||||||
LIBS_LINUX = -lz -lnetfilter_queue -lnfnetlink -lmnl
|
LIBS_LINUX = -lz -lnetfilter_queue -lnfnetlink -lmnl
|
||||||
LIBS_SYSTEMD = -lsystemd
|
LIBS_SYSTEMD = -lsystemd
|
||||||
LIBS_BSD = -lz
|
LIBS_BSD = -lz
|
||||||
@@ -18,28 +23,28 @@ SRC_FILES = *.c crypto/*.c
|
|||||||
all: nfqws
|
all: nfqws
|
||||||
|
|
||||||
nfqws: $(SRC_FILES)
|
nfqws: $(SRC_FILES)
|
||||||
$(CC) -s $(CFLAGS) -o nfqws $(SRC_FILES) $(LIBS_LINUX) $(LDFLAGS)
|
$(CC) -s $(CFLAGS) -o nfqws $(SRC_FILES) $(LIBS_LINUX) $(LDFLAGS) $(LDFLAGS_LINUX)
|
||||||
|
|
||||||
systemd: $(SRC_FILES)
|
systemd: $(SRC_FILES)
|
||||||
$(CC) -s $(CFLAGS) $(CFLAGS_SYSTEMD) -o nfqws $(SRC_FILES) $(LIBS_LINUX) $(LIBS_SYSTEMD) $(LDFLAGS)
|
$(CC) -s $(CFLAGS) $(CFLAGS_SYSTEMD) -o nfqws $(SRC_FILES) $(LIBS_LINUX) $(LIBS_SYSTEMD) $(LDFLAGS) $(LDFLAGS_LINUX)
|
||||||
|
|
||||||
android: $(SRC_FILES)
|
android: $(SRC_FILES)
|
||||||
$(CC) -s $(CFLAGS) -o nfqws $(SRC_FILES) $(LIBS_LINUX) $(LDFLAGS) $(LDFLAGS_ANDROID)
|
$(CC) -s $(CFLAGS) -o nfqws $(SRC_FILES) $(LIBS_LINUX) $(LDFLAGS) $(LDFLAGS_ANDROID)
|
||||||
|
|
||||||
bsd: $(SRC_FILES)
|
bsd: $(SRC_FILES)
|
||||||
$(CC) -s $(CFLAGS) $(CFLAGS_BSD) -o dvtws $(SRC_FILES) $(LIBS_BSD) $(LDFLAGS)
|
$(CC) -s $(CFLAGS) $(CFLAGS_BSD) -o dvtws $(SRC_FILES) $(LIBS_BSD) $(LDFLAGS) $(LDFLAGS_BSD)
|
||||||
|
|
||||||
mac: $(SRC_FILES)
|
mac: $(SRC_FILES)
|
||||||
$(CC) $(CFLAGS) $(CFLAGS_BSD) -o dvtwsa $(SRC_FILES) -target arm64-apple-macos10.8 $(LIBS_BSD) $(LDFLAGS)
|
$(CC) $(CFLAGS) $(CFLAGS_BSD) -o dvtwsa $(SRC_FILES) -target arm64-apple-macos10.8 $(LIBS_BSD) $(LDFLAGS) $(LDFLAGS_MAC)
|
||||||
$(CC) $(CFLAGS) $(CFLAGS_BSD) -o dvtwsx $(SRC_FILES) -target x86_64-apple-macos10.8 $(LIBS_BSD) $(LDFLAGS)
|
$(CC) $(CFLAGS) $(CFLAGS_BSD) -o dvtwsx $(SRC_FILES) -target x86_64-apple-macos10.8 $(LIBS_BSD) $(LDFLAGS) $(LDFLAGS_MAC)
|
||||||
strip dvtwsa dvtwsx
|
strip dvtwsa dvtwsx
|
||||||
lipo -create -output dvtws dvtwsx dvtwsa
|
lipo -create -output dvtws dvtwsx dvtwsa
|
||||||
rm -f dvtwsx dvtwsa
|
rm -f dvtwsx dvtwsa
|
||||||
|
|
||||||
cygwin64:
|
cygwin64:
|
||||||
$(CC) -s $(CFLAGS) $(CFLAGS_CYGWIN) -o winws $(SRC_FILES) $(LIBS_CYGWIN) $(LIBS_CYGWIN64) $(RES_CYGWIN64) $(LDFLAGS)
|
$(CC) -s $(CFLAGS) $(CFLAGS_CYGWIN) -o winws $(SRC_FILES) $(LIBS_CYGWIN) $(LIBS_CYGWIN64) $(RES_CYGWIN64) $(LDFLAGS) $(LDFLAGS_WIN)
|
||||||
cygwin32:
|
cygwin32:
|
||||||
$(CC) -s $(CFLAGS) $(CFLAGS_CYGWIN) -o winws $(SRC_FILES) $(LIBS_CYGWIN) $(LIBS_CYGWIN32) $(RES_CYGWIN32) $(LDFLAGS)
|
$(CC) -s $(CFLAGS) $(CFLAGS_CYGWIN) -o winws $(SRC_FILES) $(LIBS_CYGWIN) $(LIBS_CYGWIN32) $(RES_CYGWIN32) $(LDFLAGS) $(LDFLAGS_WIN)
|
||||||
cygwin: cygwin64
|
cygwin: cygwin64
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
|||||||
@@ -5,9 +5,13 @@ int aes_gcm_crypt(int mode, uint8_t *output, const uint8_t *input, size_t input_
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
gcm_context ctx;
|
gcm_context ctx;
|
||||||
|
|
||||||
gcm_setkey(&ctx, key, (const uint)key_len);
|
gcm_initialize();
|
||||||
ret = gcm_crypt_and_tag(&ctx, mode, iv, iv_len, adata, adata_len, input, output, input_length, atag, atag_len);
|
|
||||||
gcm_zero_ctx(&ctx);
|
if (!(ret = gcm_setkey(&ctx, key, (const uint)key_len)))
|
||||||
|
{
|
||||||
|
ret = gcm_crypt_and_tag(&ctx, mode, iv, iv_len, adata, adata_len, input, output, input_length, atag, atag_len);
|
||||||
|
gcm_zero_ctx(&ctx);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -367,7 +367,7 @@ int aes_setkey(aes_context *ctx, // AES context provided by our caller
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if AES_DECRYPTION
|
#if AES_DECRYPTION
|
||||||
if (mode == DECRYPT) // expand our key for encryption or decryption
|
if (mode == AES_DECRYPT) // expand our key for encryption or decryption
|
||||||
return(aes_set_decryption_key(ctx, key, keysize));
|
return(aes_set_decryption_key(ctx, key, keysize));
|
||||||
else /* ENCRYPT */
|
else /* ENCRYPT */
|
||||||
#endif /* AES_DECRYPTION */
|
#endif /* AES_DECRYPTION */
|
||||||
@@ -399,7 +399,7 @@ int aes_cipher(aes_context *ctx,
|
|||||||
|
|
||||||
#if AES_DECRYPTION // whether AES decryption is supported
|
#if AES_DECRYPTION // whether AES decryption is supported
|
||||||
|
|
||||||
if (ctx->mode == DECRYPT)
|
if (ctx->mode == AES_DECRYPT)
|
||||||
{
|
{
|
||||||
for (i = (ctx->rounds >> 1) - 1; i > 0; i--)
|
for (i = (ctx->rounds >> 1) - 1; i > 0; i--)
|
||||||
{
|
{
|
||||||
|
|||||||
+21
-11
@@ -246,7 +246,7 @@ int gcm_setkey(gcm_context *ctx, // pointer to caller-provided gcm context
|
|||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
int gcm_start(gcm_context *ctx, // pointer to user-provided GCM context
|
int gcm_start(gcm_context *ctx, // pointer to user-provided GCM context
|
||||||
int mode, // GCM_ENCRYPT or GCM_DECRYPT
|
int mode, // AES_ENCRYPT or AES_DECRYPT
|
||||||
const uchar *iv, // pointer to initialization vector
|
const uchar *iv, // pointer to initialization vector
|
||||||
size_t iv_len, // IV length in bytes (should == 12)
|
size_t iv_len, // IV length in bytes (should == 12)
|
||||||
const uchar *add, // ptr to additional AEAD data (NULL if none)
|
const uchar *add, // ptr to additional AEAD data (NULL if none)
|
||||||
@@ -288,6 +288,7 @@ int gcm_start(gcm_context *ctx, // pointer to user-provided GCM context
|
|||||||
for (i = 0; i < 16; i++) ctx->y[i] ^= work_buf[i];
|
for (i = 0; i < 16; i++) ctx->y[i] ^= work_buf[i];
|
||||||
gcm_mult(ctx, ctx->y, ctx->y);
|
gcm_mult(ctx, ctx->y, ctx->y);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ret = aes_cipher(&ctx->aes_ctx, ctx->y, ctx->base_ectr)) != 0)
|
if ((ret = aes_cipher(&ctx->aes_ctx, ctx->y, ctx->base_ectr)) != 0)
|
||||||
return(ret);
|
return(ret);
|
||||||
|
|
||||||
@@ -390,7 +391,9 @@ int gcm_finish(gcm_context *ctx, // pointer to user-provided GCM context
|
|||||||
uint64_t orig_add_len = ctx->add_len * 8;
|
uint64_t orig_add_len = ctx->add_len * 8;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
if (tag_len != 0) memcpy(tag, ctx->base_ectr, tag_len);
|
if (tag_len>16) return -1;
|
||||||
|
|
||||||
|
if (tag_len) memcpy(tag, ctx->base_ectr, tag_len);
|
||||||
|
|
||||||
if (orig_len || orig_add_len) {
|
if (orig_len || orig_add_len) {
|
||||||
memset(work_buf, 0x00, 16);
|
memset(work_buf, 0x00, 16);
|
||||||
@@ -427,7 +430,7 @@ int gcm_finish(gcm_context *ctx, // pointer to user-provided GCM context
|
|||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
int gcm_crypt_and_tag(
|
int gcm_crypt_and_tag(
|
||||||
gcm_context *ctx, // gcm context with key already setup
|
gcm_context *ctx, // gcm context with key already setup
|
||||||
int mode, // cipher direction: GCM_ENCRYPT or GCM_DECRYPT
|
int mode, // cipher direction: AES_ENCRYPT or AES_DECRYPT
|
||||||
const uchar *iv, // pointer to the 12-byte initialization vector
|
const uchar *iv, // pointer to the 12-byte initialization vector
|
||||||
size_t iv_len, // byte length if the IV. should always be 12
|
size_t iv_len, // byte length if the IV. should always be 12
|
||||||
const uchar *add, // pointer to the non-ciphered additional data
|
const uchar *add, // pointer to the non-ciphered additional data
|
||||||
@@ -442,10 +445,12 @@ int gcm_crypt_and_tag(
|
|||||||
prepare the gcm context with the keying material, we simply
|
prepare the gcm context with the keying material, we simply
|
||||||
invoke each of the three GCM sub-functions in turn...
|
invoke each of the three GCM sub-functions in turn...
|
||||||
*/
|
*/
|
||||||
gcm_start(ctx, mode, iv, iv_len, add, add_len);
|
if (tag_len>16) return -1;
|
||||||
gcm_update(ctx, length, input, output);
|
|
||||||
gcm_finish(ctx, tag, tag_len);
|
int ret;
|
||||||
return(0);
|
if ((ret=gcm_start(ctx, mode, iv, iv_len, add, add_len))) return ret;
|
||||||
|
if ((ret=gcm_update(ctx, length, input, output))) return ret;
|
||||||
|
return gcm_finish(ctx, tag, tag_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -476,23 +481,28 @@ int gcm_auth_decrypt(
|
|||||||
uchar check_tag[16]; // the tag generated and returned by decryption
|
uchar check_tag[16]; // the tag generated and returned by decryption
|
||||||
int diff; // an ORed flag to detect authentication errors
|
int diff; // an ORed flag to detect authentication errors
|
||||||
size_t i; // our local iterator
|
size_t i; // our local iterator
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (tag_len>16) return -1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
we use GCM_DECRYPT_AND_TAG (above) to perform our decryption
|
we use GCM_DECRYPT_AND_TAG (above) to perform our decryption
|
||||||
(which is an identical XORing to reverse the previous one)
|
(which is an identical XORing to reverse the previous one)
|
||||||
and also to re-generate the matching authentication tag
|
and also to re-generate the matching authentication tag
|
||||||
*/
|
*/
|
||||||
gcm_crypt_and_tag(ctx, AES_DECRYPT, iv, iv_len, add, add_len,
|
if ((ret = gcm_crypt_and_tag(ctx, AES_DECRYPT, iv, iv_len, add, add_len, input, output, length, check_tag, tag_len))) return ret;
|
||||||
input, output, length, check_tag, tag_len);
|
|
||||||
|
|
||||||
// now we verify the authentication tag in 'constant time'
|
// now we verify the authentication tag in 'constant time'
|
||||||
for (diff = 0, i = 0; i < tag_len; i++)
|
for (diff = 0, i = 0; i < tag_len; i++)
|
||||||
diff |= tag[i] ^ check_tag[i];
|
diff |= tag[i] ^ check_tag[i];
|
||||||
|
|
||||||
if (diff != 0) { // see whether any bits differed?
|
if (diff)
|
||||||
|
{
|
||||||
|
// see whether any bits differed?
|
||||||
memset(output, 0, length); // if so... wipe the output data
|
memset(output, 0, length); // if so... wipe the output data
|
||||||
return(GCM_AUTH_FAILURE); // return GCM_AUTH_FAILURE
|
return(GCM_AUTH_FAILURE); // return GCM_AUTH_FAILURE
|
||||||
}
|
}
|
||||||
return(0);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
|
|||||||
@@ -29,7 +29,6 @@
|
|||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
#include <basetsd.h>
|
#include <basetsd.h>
|
||||||
typedef unsigned int size_t;// use the right type for length declarations
|
|
||||||
typedef UINT32 uint32_t;
|
typedef UINT32 uint32_t;
|
||||||
typedef UINT64 uint64_t;
|
typedef UINT64 uint64_t;
|
||||||
#else
|
#else
|
||||||
|
|||||||
+12
-20
@@ -60,9 +60,9 @@ int hkdf(SHAversion whichSha,
|
|||||||
uint8_t okm[], size_t okm_len)
|
uint8_t okm[], size_t okm_len)
|
||||||
{
|
{
|
||||||
uint8_t prk[USHAMaxHashSize];
|
uint8_t prk[USHAMaxHashSize];
|
||||||
return hkdfExtract(whichSha, salt, salt_len, ikm, ikm_len, prk) ||
|
int ret;
|
||||||
hkdfExpand(whichSha, prk, USHAHashSize(whichSha), info,
|
if ((ret=hkdfExtract(whichSha, salt, salt_len, ikm, ikm_len, prk))) return ret;
|
||||||
info_len, okm, okm_len);
|
return hkdfExpand(whichSha, prk, USHAHashSize(whichSha), info, info_len, okm, okm_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -103,9 +103,6 @@ int hkdfExtract(SHAversion whichSha,
|
|||||||
salt_len = USHAHashSize(whichSha);
|
salt_len = USHAHashSize(whichSha);
|
||||||
memset(nullSalt, '\0', salt_len);
|
memset(nullSalt, '\0', salt_len);
|
||||||
}
|
}
|
||||||
else if (salt_len < 0) {
|
|
||||||
return shaBadParam;
|
|
||||||
}
|
|
||||||
return hmac(whichSha, ikm, ikm_len, salt, salt_len, prk);
|
return hmac(whichSha, ikm, ikm_len, salt, salt_len, prk);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,16 +146,13 @@ int hkdfExpand(SHAversion whichSha, const uint8_t prk[], size_t prk_len,
|
|||||||
size_t hash_len, N;
|
size_t hash_len, N;
|
||||||
unsigned char T[USHAMaxHashSize];
|
unsigned char T[USHAMaxHashSize];
|
||||||
size_t Tlen, where, i;
|
size_t Tlen, where, i;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (info == 0) {
|
if (info == 0) {
|
||||||
info = (const unsigned char *)"";
|
info = (const unsigned char *)"";
|
||||||
info_len = 0;
|
info_len = 0;
|
||||||
}
|
}
|
||||||
else if (info_len < 0) {
|
if (!okm || !okm_len) return shaBadParam;
|
||||||
return shaBadParam;
|
|
||||||
}
|
|
||||||
if (okm_len <= 0) return shaBadParam;
|
|
||||||
if (!okm) return shaBadParam;
|
|
||||||
|
|
||||||
hash_len = USHAHashSize(whichSha);
|
hash_len = USHAHashSize(whichSha);
|
||||||
if (prk_len < hash_len) return shaBadParam;
|
if (prk_len < hash_len) return shaBadParam;
|
||||||
@@ -171,12 +165,11 @@ int hkdfExpand(SHAversion whichSha, const uint8_t prk[], size_t prk_len,
|
|||||||
for (i = 1; i <= N; i++) {
|
for (i = 1; i <= N; i++) {
|
||||||
HMACContext context;
|
HMACContext context;
|
||||||
unsigned char c = i;
|
unsigned char c = i;
|
||||||
int ret = hmacReset(&context, whichSha, prk, prk_len) ||
|
if ((ret=hmacReset(&context, whichSha, prk, prk_len))) return ret;
|
||||||
hmacInput(&context, T, Tlen) ||
|
if ((ret=hmacInput(&context, T, Tlen))) return ret;
|
||||||
hmacInput(&context, info, info_len) ||
|
if ((ret=hmacInput(&context, info, info_len))) return ret;
|
||||||
hmacInput(&context, &c, 1) ||
|
if ((ret=hmacInput(&context, &c, 1))) return ret;
|
||||||
hmacResult(&context, T);
|
if ((ret=hmacResult(&context, T))) return ret;
|
||||||
if (ret != shaSuccess) return ret;
|
|
||||||
memcpy(okm + where, T,
|
memcpy(okm + where, T,
|
||||||
(i != N) ? hash_len : (okm_len - where));
|
(i != N) ? hash_len : (okm_len - where));
|
||||||
where += hash_len;
|
where += hash_len;
|
||||||
@@ -328,9 +321,8 @@ int hkdfResult(HKDFContext *context,
|
|||||||
if (!okm) return context->Corrupted = shaBadParam;
|
if (!okm) return context->Corrupted = shaBadParam;
|
||||||
if (!prk) prk = prkbuf;
|
if (!prk) prk = prkbuf;
|
||||||
|
|
||||||
ret = hmacResult(&context->hmacContext, prk) ||
|
if (!(ret = hmacResult(&context->hmacContext, prk)))
|
||||||
hkdfExpand(context->whichSha, prk, context->hashSize, info,
|
ret = hkdfExpand(context->whichSha, prk, context->hashSize, info, info_len, okm, okm_len);
|
||||||
info_len, okm, okm_len);
|
|
||||||
context->Computed = 1;
|
context->Computed = 1;
|
||||||
return context->Corrupted = ret;
|
return context->Corrupted = ret;
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-21
@@ -49,9 +49,10 @@ int hmac(SHAversion whichSha,
|
|||||||
uint8_t digest[USHAMaxHashSize])
|
uint8_t digest[USHAMaxHashSize])
|
||||||
{
|
{
|
||||||
HMACContext context;
|
HMACContext context;
|
||||||
return hmacReset(&context, whichSha, key, key_len) ||
|
int ret;
|
||||||
hmacInput(&context, message_array, length) ||
|
if ((ret=hmacReset(&context, whichSha, key, key_len))) return ret;
|
||||||
hmacResult(&context, digest);
|
if ((ret=hmacInput(&context, message_array, length))) return ret;
|
||||||
|
return hmacResult(&context, digest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -101,10 +102,8 @@ int hmacReset(HMACContext *context, enum SHAversion whichSha,
|
|||||||
*/
|
*/
|
||||||
if (key_len > blocksize) {
|
if (key_len > blocksize) {
|
||||||
USHAContext tcontext;
|
USHAContext tcontext;
|
||||||
int err = USHAReset(&tcontext, whichSha) ||
|
if ((ret=USHAReset(&tcontext, whichSha)) || (ret=USHAInput(&tcontext, key, key_len)) || (ret=USHAResult(&tcontext, tempkey)))
|
||||||
USHAInput(&tcontext, key, key_len) ||
|
return ret;
|
||||||
USHAResult(&tcontext, tempkey);
|
|
||||||
if (err != shaSuccess) return err;
|
|
||||||
|
|
||||||
key = tempkey;
|
key = tempkey;
|
||||||
key_len = hashsize;
|
key_len = hashsize;
|
||||||
@@ -134,9 +133,9 @@ int hmacReset(HMACContext *context, enum SHAversion whichSha,
|
|||||||
|
|
||||||
/* perform inner hash */
|
/* perform inner hash */
|
||||||
/* init context for 1st pass */
|
/* init context for 1st pass */
|
||||||
ret = USHAReset(&context->shaContext, whichSha) ||
|
if (!(ret = USHAReset(&context->shaContext, whichSha)))
|
||||||
/* and start with inner pad */
|
/* and start with inner pad */
|
||||||
USHAInput(&context->shaContext, k_ipad, blocksize);
|
ret = USHAInput(&context->shaContext, k_ipad, blocksize);
|
||||||
return context->Corrupted = ret;
|
return context->Corrupted = ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -197,8 +196,7 @@ int hmacFinalBits(HMACContext *context,
|
|||||||
if (context->Corrupted) return context->Corrupted;
|
if (context->Corrupted) return context->Corrupted;
|
||||||
if (context->Computed) return context->Corrupted = shaStateError;
|
if (context->Computed) return context->Corrupted = shaStateError;
|
||||||
/* then final bits of datagram */
|
/* then final bits of datagram */
|
||||||
return context->Corrupted =
|
return context->Corrupted = USHAFinalBits(&context->shaContext, bits, bit_count);
|
||||||
USHAFinalBits(&context->shaContext, bits, bit_count);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -229,21 +227,16 @@ int hmacResult(HMACContext *context, uint8_t *digest)
|
|||||||
|
|
||||||
/* finish up 1st pass */
|
/* finish up 1st pass */
|
||||||
/* (Use digest here as a temporary buffer.) */
|
/* (Use digest here as a temporary buffer.) */
|
||||||
ret =
|
if (!(ret=USHAResult(&context->shaContext, digest)) &&
|
||||||
USHAResult(&context->shaContext, digest) ||
|
|
||||||
|
|
||||||
/* perform outer SHA */
|
/* perform outer SHA */
|
||||||
/* init context for 2nd pass */
|
/* init context for 2nd pass */
|
||||||
USHAReset(&context->shaContext, context->whichSha) ||
|
!(ret=USHAReset(&context->shaContext, context->whichSha)) &&
|
||||||
|
|
||||||
/* start with outer pad */
|
/* start with outer pad */
|
||||||
USHAInput(&context->shaContext, context->k_opad,
|
!(ret=USHAInput(&context->shaContext, context->k_opad, context->blockSize)) &&
|
||||||
context->blockSize) ||
|
|
||||||
|
|
||||||
/* then results of 1st hash */
|
/* then results of 1st hash */
|
||||||
USHAInput(&context->shaContext, digest, context->hashSize) ||
|
!(ret=USHAInput(&context->shaContext, digest, context->hashSize)))
|
||||||
/* finish up 2nd pass */
|
/* finish up 2nd pass */
|
||||||
USHAResult(&context->shaContext, digest);
|
ret=USHAResult(&context->shaContext, digest);
|
||||||
|
|
||||||
context->Computed = 1;
|
context->Computed = 1;
|
||||||
return context->Corrupted = ret;
|
return context->Corrupted = ret;
|
||||||
|
|||||||
@@ -64,12 +64,12 @@
|
|||||||
* Add "length" to the length.
|
* Add "length" to the length.
|
||||||
* Set Corrupted when overflow has occurred.
|
* Set Corrupted when overflow has occurred.
|
||||||
*/
|
*/
|
||||||
static uint32_t addTemp;
|
static int SHA224_256AddLength(SHA256Context *context, uint32_t length)
|
||||||
#define SHA224_256AddLength(context, length) \
|
{
|
||||||
(addTemp = (context)->Length_Low, (context)->Corrupted = \
|
uint32_t addTemp = context->Length_Low;
|
||||||
(((context)->Length_Low += (length)) < addTemp) && \
|
if (((context->Length_Low += length) < addTemp) && (++(context)->Length_High == 0)) context->Corrupted = shaInputTooLong;
|
||||||
(++(context)->Length_High == 0) ? shaInputTooLong : \
|
return context->Corrupted;
|
||||||
(context)->Corrupted )
|
}
|
||||||
|
|
||||||
/* Local Function Prototypes */
|
/* Local Function Prototypes */
|
||||||
static int SHA224_256Reset(SHA256Context *context, uint32_t *H0);
|
static int SHA224_256Reset(SHA256Context *context, uint32_t *H0);
|
||||||
|
|||||||
+127
-37
@@ -192,7 +192,7 @@ static uint16_t tcpopt_len(bool sack, bool mss, uint32_t fooling, const uint32_t
|
|||||||
if (sack) t+=2;
|
if (sack) t+=2;
|
||||||
if (mss) t+=4;
|
if (mss) t+=4;
|
||||||
if (fooling & FOOL_MD5SIG) t+=18;
|
if (fooling & FOOL_MD5SIG) t+=18;
|
||||||
if ((fooling & FOOL_TS) || timestamps) t+=10;
|
if (timestamps) t+=10;
|
||||||
if (scale_factor!=SCALE_NONE) t+=3;
|
if (scale_factor!=SCALE_NONE) t+=3;
|
||||||
return (t+3)&~3;
|
return (t+3)&~3;
|
||||||
}
|
}
|
||||||
@@ -928,6 +928,7 @@ void proto_skip_ipv6(uint8_t **data, size_t *len, uint8_t *proto_type, uint8_t *
|
|||||||
if (proto_type) *proto_type = 0; // put error in advance
|
if (proto_type) *proto_type = 0; // put error in advance
|
||||||
|
|
||||||
HeaderType = (*data)[6]; // NextHeader field
|
HeaderType = (*data)[6]; // NextHeader field
|
||||||
|
if (proto_type) *proto_type = HeaderType;
|
||||||
if (last_header_type) *last_header_type = (*data)+6;
|
if (last_header_type) *last_header_type = (*data)+6;
|
||||||
*data += 40; *len -= 40; // skip ipv6 base header
|
*data += 40; *len -= 40; // skip ipv6 base header
|
||||||
while (*len > 0) // need at least one byte for NextHeader field
|
while (*len > 0) // need at least one byte for NextHeader field
|
||||||
@@ -936,7 +937,6 @@ void proto_skip_ipv6(uint8_t **data, size_t *len, uint8_t *proto_type, uint8_t *
|
|||||||
{
|
{
|
||||||
case 0: // Hop-by-Hop Options
|
case 0: // Hop-by-Hop Options
|
||||||
case 43: // routing
|
case 43: // routing
|
||||||
case 51: // authentication
|
|
||||||
case 60: // Destination Options
|
case 60: // Destination Options
|
||||||
case 135: // mobility
|
case 135: // mobility
|
||||||
case 139: // Host Identity Protocol Version v2
|
case 139: // Host Identity Protocol Version v2
|
||||||
@@ -947,6 +947,11 @@ void proto_skip_ipv6(uint8_t **data, size_t *len, uint8_t *proto_type, uint8_t *
|
|||||||
case 44: // fragment. length fixed to 8, hdrlen field defined as reserved
|
case 44: // fragment. length fixed to 8, hdrlen field defined as reserved
|
||||||
hdrlen = 8;
|
hdrlen = 8;
|
||||||
break;
|
break;
|
||||||
|
case 51: // authentication
|
||||||
|
// special case. length in ah header is in 32-bit words minus 2
|
||||||
|
if (*len < 2) return; // error
|
||||||
|
hdrlen = 8 + ((*data)[1] << 2);
|
||||||
|
break;
|
||||||
case 59: // no next header
|
case 59: // no next header
|
||||||
return; // error
|
return; // error
|
||||||
default:
|
default:
|
||||||
@@ -1866,9 +1871,9 @@ bool rawsend_queue(struct rawpacket_tailhead *q)
|
|||||||
|
|
||||||
// linux-specific wlan retrieval implementation
|
// linux-specific wlan retrieval implementation
|
||||||
|
|
||||||
typedef void netlink_prepare_nlh_cb_t(struct nlmsghdr *nlh);
|
typedef void netlink_prepare_nlh_cb_t(struct nlmsghdr *nlh, void *param);
|
||||||
|
|
||||||
static bool netlink_genl_simple_transact(struct mnl_socket* nl, uint16_t type, uint16_t flags, uint8_t cmd, uint8_t version, netlink_prepare_nlh_cb_t cb_prepare_nlh, mnl_cb_t cb_data, void *data)
|
static bool netlink_genl_simple_transact(struct mnl_socket* nl, uint16_t type, uint16_t flags, uint8_t cmd, uint8_t version, netlink_prepare_nlh_cb_t cb_prepare_nlh, void *prepare_data, mnl_cb_t cb_data, void *data)
|
||||||
{
|
{
|
||||||
char buf[MNL_SOCKET_BUFFER_SIZE];
|
char buf[MNL_SOCKET_BUFFER_SIZE];
|
||||||
struct nlmsghdr *nlh;
|
struct nlmsghdr *nlh;
|
||||||
@@ -1883,7 +1888,7 @@ static bool netlink_genl_simple_transact(struct mnl_socket* nl, uint16_t type, u
|
|||||||
genl->cmd = cmd;
|
genl->cmd = cmd;
|
||||||
genl->version = version;
|
genl->version = version;
|
||||||
|
|
||||||
if (cb_prepare_nlh) cb_prepare_nlh(nlh);
|
if (cb_prepare_nlh) cb_prepare_nlh(nlh, prepare_data);
|
||||||
|
|
||||||
if (mnl_socket_sendto(nl, nlh, nlh->nlmsg_len) < 0)
|
if (mnl_socket_sendto(nl, nlh, nlh->nlmsg_len) < 0)
|
||||||
{
|
{
|
||||||
@@ -1907,7 +1912,7 @@ static bool netlink_genl_simple_transact(struct mnl_socket* nl, uint16_t type, u
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wlan_id_prepare(struct nlmsghdr *nlh)
|
static void wlan_id_prepare(struct nlmsghdr *nlh, void *param)
|
||||||
{
|
{
|
||||||
mnl_attr_put_strz(nlh, CTRL_ATTR_FAMILY_NAME, "nl80211");
|
mnl_attr_put_strz(nlh, CTRL_ATTR_FAMILY_NAME, "nl80211");
|
||||||
}
|
}
|
||||||
@@ -1939,7 +1944,7 @@ static int wlan_id_cb(const struct nlmsghdr *nlh, void *data)
|
|||||||
static uint16_t wlan_get_family_id(struct mnl_socket* nl)
|
static uint16_t wlan_get_family_id(struct mnl_socket* nl)
|
||||||
{
|
{
|
||||||
uint16_t id;
|
uint16_t id;
|
||||||
return netlink_genl_simple_transact(nl, GENL_ID_CTRL, NLM_F_REQUEST | NLM_F_ACK, CTRL_CMD_GETFAMILY, 1, wlan_id_prepare, wlan_id_cb, &id) ? id : 0;
|
return netlink_genl_simple_transact(nl, GENL_ID_CTRL, NLM_F_REQUEST | NLM_F_ACK, CTRL_CMD_GETFAMILY, 1, wlan_id_prepare, NULL, wlan_id_cb, &id) ? id : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int wlan_info_attr_cb(const struct nlattr *attr, void *data)
|
static int wlan_info_attr_cb(const struct nlattr *attr, void *data)
|
||||||
@@ -1974,42 +1979,131 @@ static int wlan_info_attr_cb(const struct nlattr *attr, void *data)
|
|||||||
}
|
}
|
||||||
return MNL_CB_OK;
|
return MNL_CB_OK;
|
||||||
}
|
}
|
||||||
|
struct wlan_info_req
|
||||||
|
{
|
||||||
|
struct wlan_interface_collection *wc;
|
||||||
|
bool bReqSSID;
|
||||||
|
};
|
||||||
static int wlan_info_cb(const struct nlmsghdr *nlh, void *data)
|
static int wlan_info_cb(const struct nlmsghdr *nlh, void *data)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
struct wlan_info_req *wr = (struct wlan_info_req*)data;
|
||||||
|
if (wr->wc->count>=WLAN_INTERFACE_MAX) return MNL_CB_OK;
|
||||||
|
memset(wr->wc->wlan + wr->wc->count,0,sizeof(struct wlan_interface));
|
||||||
|
ret = mnl_attr_parse(nlh, sizeof(struct genlmsghdr), wlan_info_attr_cb, wr->wc->wlan + wr->wc->count);
|
||||||
|
if (ret>=0 && (!wr->bReqSSID || *wr->wc->wlan[wr->wc->count].ssid) && *wr->wc->wlan[wr->wc->count].ifname && wr->wc->wlan[wr->wc->count].ifindex)
|
||||||
|
wr->wc->count++;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
static bool wlan_info(struct mnl_socket* nl, uint16_t wlan_family_id, struct wlan_interface_collection* w, bool bReqSSID)
|
||||||
|
{
|
||||||
|
struct wlan_info_req req = { .bReqSSID = bReqSSID, .wc = w };
|
||||||
|
return netlink_genl_simple_transact(nl, wlan_family_id, NLM_F_REQUEST | NLM_F_ACK | NLM_F_DUMP, NL80211_CMD_GET_INTERFACE, 0, NULL, NULL, wlan_info_cb, &req);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void scan_prepare(struct nlmsghdr *nlh, void *param)
|
||||||
|
{
|
||||||
|
mnl_attr_put_u32(nlh, NL80211_ATTR_IFINDEX, *(int*)param);
|
||||||
|
}
|
||||||
|
static uint8_t *find_ie(uint8_t *buf, size_t len, uint8_t ie)
|
||||||
|
{
|
||||||
|
while (len>=2)
|
||||||
|
{
|
||||||
|
if (len<(2+buf[1])) break;
|
||||||
|
if (buf[0]==ie) return buf;
|
||||||
|
buf+=buf[1]+2;
|
||||||
|
len-=buf[1]+2;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
static int scan_info_attr_cb(const struct nlattr *attr, void *data)
|
||||||
|
{
|
||||||
|
struct wlan_interface *wlan = (struct wlan_interface *)data;
|
||||||
|
const struct nlattr *nested;
|
||||||
|
uint8_t *payload, *ie;
|
||||||
|
uint16_t payload_len;
|
||||||
|
bool ok;
|
||||||
|
|
||||||
|
switch(mnl_attr_get_type(attr))
|
||||||
|
{
|
||||||
|
case NL80211_ATTR_IFINDEX:
|
||||||
|
if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
|
||||||
|
{
|
||||||
|
DLOG_PERROR("mnl_attr_validate");
|
||||||
|
return MNL_CB_ERROR;
|
||||||
|
}
|
||||||
|
wlan->ifindex = mnl_attr_get_u32(attr);
|
||||||
|
if (!if_indextoname(wlan->ifindex, wlan->ifname))
|
||||||
|
DLOG_PERROR("if_indextoname");
|
||||||
|
break;
|
||||||
|
case NL80211_ATTR_BSS:
|
||||||
|
if (mnl_attr_validate(attr, MNL_TYPE_NESTED) < 0)
|
||||||
|
{
|
||||||
|
DLOG_PERROR("mnl_attr_validate");
|
||||||
|
return MNL_CB_ERROR;
|
||||||
|
}
|
||||||
|
ok = false;
|
||||||
|
mnl_attr_for_each_nested(nested, attr)
|
||||||
|
{
|
||||||
|
if (mnl_attr_get_type(nested)==NL80211_BSS_STATUS)
|
||||||
|
{
|
||||||
|
uint32_t status = mnl_attr_get_u32(nested);
|
||||||
|
if (status==NL80211_BSS_STATUS_ASSOCIATED || status==NL80211_BSS_STATUS_AUTHENTICATED || status==NL80211_BSS_STATUS_IBSS_JOINED)
|
||||||
|
{
|
||||||
|
ok=1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!ok) break;
|
||||||
|
mnl_attr_for_each_nested(nested, attr)
|
||||||
|
{
|
||||||
|
switch(mnl_attr_get_type(nested))
|
||||||
|
{
|
||||||
|
case NL80211_BSS_INFORMATION_ELEMENTS:
|
||||||
|
payload_len = mnl_attr_get_payload_len(nested);
|
||||||
|
payload = mnl_attr_get_payload(nested);
|
||||||
|
ie = find_ie(payload,payload_len,0);
|
||||||
|
if (ie)
|
||||||
|
{
|
||||||
|
uint8_t l = ie[1];
|
||||||
|
if (l>=(sizeof(wlan->ssid))) l=sizeof(wlan->ssid)-1;
|
||||||
|
memcpy(wlan->ssid,ie+2,l);
|
||||||
|
wlan->ssid[l]=0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return MNL_CB_OK;
|
||||||
|
}
|
||||||
|
static int scan_info_cb(const struct nlmsghdr *nlh, void *data)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct wlan_interface_collection *wc = (struct wlan_interface_collection*)data;
|
struct wlan_interface_collection *wc = (struct wlan_interface_collection*)data;
|
||||||
if (wc->count>=WLAN_INTERFACE_MAX) return MNL_CB_OK;
|
if (wc->count>=WLAN_INTERFACE_MAX) return MNL_CB_OK;
|
||||||
memset(wc->wlan+wc->count,0,sizeof(wc->wlan[0]));
|
memset(wc->wlan+wc->count,0,sizeof(wc->wlan[0]));
|
||||||
ret = mnl_attr_parse(nlh, sizeof(struct genlmsghdr), wlan_info_attr_cb, wc->wlan+wc->count);
|
ret = mnl_attr_parse(nlh, sizeof(struct genlmsghdr), scan_info_attr_cb, wc->wlan+wc->count);
|
||||||
if (ret>=0 && *wc->wlan[wc->count].ifname && wc->wlan[wc->count].ifindex)
|
if (ret>=0 && *wc->wlan[wc->count].ssid && *wc->wlan[wc->count].ifname && wc->wlan[wc->count].ifindex)
|
||||||
{
|
wc->count++;
|
||||||
if (*wc->wlan[wc->count].ssid)
|
|
||||||
wc->count++;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// sometimes nl80211 does not return SSID but wireless ext does
|
|
||||||
int wext_fd = socket(AF_INET, SOCK_DGRAM, 0);
|
|
||||||
if (wext_fd!=-1)
|
|
||||||
{
|
|
||||||
struct iwreq req;
|
|
||||||
snprintf(req.ifr_ifrn.ifrn_name,sizeof(req.ifr_ifrn.ifrn_name),"%s",wc->wlan[wc->count].ifname);
|
|
||||||
req.u.essid.pointer = wc->wlan[wc->count].ssid;
|
|
||||||
req.u.essid.length = sizeof(wc->wlan[wc->count].ssid);
|
|
||||||
req.u.essid.flags = 0;
|
|
||||||
if (ioctl(wext_fd, SIOCGIWESSID, &req)!=-1)
|
|
||||||
if (*wc->wlan[wc->count].ssid)
|
|
||||||
wc->count++;
|
|
||||||
close(wext_fd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
static bool wlan_info(struct mnl_socket* nl, uint16_t wlan_family_id, struct wlan_interface_collection* w)
|
static bool scan_info(struct mnl_socket* nl, uint16_t wlan_family_id, struct wlan_interface_collection* w)
|
||||||
{
|
{
|
||||||
return netlink_genl_simple_transact(nl, wlan_family_id, NLM_F_REQUEST | NLM_F_ACK | NLM_F_DUMP, NL80211_CMD_GET_INTERFACE, 0, NULL, wlan_info_cb, w);
|
struct wlan_interface_collection wc_all = { .count = 0 };
|
||||||
|
// wlan_info does not return ssid since kernel 5.19
|
||||||
|
// it's used to enumerate all wifi interfaces then call scan_info on each
|
||||||
|
if (!wlan_info(nl, wlan_family_id, &wc_all, false)) return false;
|
||||||
|
w->count=0;
|
||||||
|
for(int i=0;i<wc_all.count;i++)
|
||||||
|
if (!netlink_genl_simple_transact(nl, wlan_family_id, NLM_F_REQUEST | NLM_F_ACK | NLM_F_DUMP, NL80211_CMD_GET_SCAN, 0, scan_prepare, (void*)&wc_all.wlan[i].ifindex, scan_info_cb, w))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool wlan_init80211(struct mnl_socket** nl)
|
static bool wlan_init80211(struct mnl_socket** nl)
|
||||||
{
|
{
|
||||||
if (!(*nl = mnl_socket_open(NETLINK_GENERIC)))
|
if (!(*nl = mnl_socket_open(NETLINK_GENERIC)))
|
||||||
@@ -2043,7 +2137,7 @@ static bool wlan_info_rate_limited(struct mnl_socket* nl, uint16_t wlan_family_i
|
|||||||
// do not purge too often to save resources
|
// do not purge too often to save resources
|
||||||
if (wlan_info_last != now)
|
if (wlan_info_last != now)
|
||||||
{
|
{
|
||||||
bres = wlan_info(nl,wlan_family_id,w);
|
bres = scan_info(nl,wlan_family_id,w);
|
||||||
wlan_info_last = now;
|
wlan_info_last = now;
|
||||||
}
|
}
|
||||||
return bres;
|
return bres;
|
||||||
@@ -2069,10 +2163,6 @@ bool wlan_info_init(void)
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool wlan_info_get(void)
|
|
||||||
{
|
|
||||||
return wlan_info(nl_wifi, id_nl80211, &wlans);
|
|
||||||
}
|
|
||||||
bool wlan_info_get_rate_limited(void)
|
bool wlan_info_get_rate_limited(void)
|
||||||
{
|
{
|
||||||
return wlan_info_rate_limited(nl_wifi, id_nl80211, &wlans);
|
return wlan_info_rate_limited(nl_wifi, id_nl80211, &wlans);
|
||||||
|
|||||||
@@ -298,7 +298,6 @@ extern struct wlan_interface_collection wlans;
|
|||||||
|
|
||||||
void wlan_info_deinit(void);
|
void wlan_info_deinit(void);
|
||||||
bool wlan_info_init(void);
|
bool wlan_info_init(void);
|
||||||
bool wlan_info_get(void);
|
|
||||||
bool wlan_info_get_rate_limited(void);
|
bool wlan_info_get_rate_limited(void);
|
||||||
const char *wlan_ssid_search_ifname(const char *ifname);
|
const char *wlan_ssid_search_ifname(const char *ifname);
|
||||||
const char *wlan_ssid_search_ifidx(int ifidx);
|
const char *wlan_ssid_search_ifidx(int ifidx);
|
||||||
|
|||||||
+5
-17
@@ -1205,12 +1205,6 @@ static uint8_t dpi_desync_tcp_packet_play(bool replay, size_t reasm_offset, uint
|
|||||||
DLOG("using cached desync profile %d\n", dp->n);
|
DLOG("using cached desync profile %d\n", dp->n);
|
||||||
else if (!ctrack_replay->dp_search_complete)
|
else if (!ctrack_replay->dp_search_complete)
|
||||||
{
|
{
|
||||||
if (!ctrack_replay->hostname && !bReverse)
|
|
||||||
{
|
|
||||||
if (ipcache_get_hostname(dis->ip ? &dis->ip->ip_dst : NULL, dis->ip6 ? &dis->ip6->ip6_dst : NULL, host, sizeof(host), &ctrack_replay->hostname_is_ip) && *host)
|
|
||||||
if (!(ctrack_replay->hostname = strdup(host)))
|
|
||||||
DLOG_ERR("strdup(host): out of memory\n");
|
|
||||||
}
|
|
||||||
dp = ctrack_replay->dp = dp_find(¶ms.desync_profiles, IPPROTO_TCP, (struct sockaddr *)&dst, ctrack_replay->hostname, ctrack_replay->hostname_is_ip, ctrack_replay->l7proto, ssid, NULL, NULL, NULL);
|
dp = ctrack_replay->dp = dp_find(¶ms.desync_profiles, IPPROTO_TCP, (struct sockaddr *)&dst, ctrack_replay->hostname, ctrack_replay->hostname_is_ip, ctrack_replay->l7proto, ssid, NULL, NULL, NULL);
|
||||||
ctrack_replay->dp_search_complete = true;
|
ctrack_replay->dp_search_complete = true;
|
||||||
}
|
}
|
||||||
@@ -1630,8 +1624,8 @@ static uint8_t dpi_desync_tcp_packet_play(bool replay, size_t reasm_offset, uint
|
|||||||
bool bDiscoveredL7;
|
bool bDiscoveredL7;
|
||||||
if (ctrack_replay)
|
if (ctrack_replay)
|
||||||
{
|
{
|
||||||
bDiscoveredL7 = !ctrack_replay->l7proto_discovered && ctrack_replay->l7proto != UNKNOWN;
|
if ((bDiscoveredL7 = !ctrack_replay->l7proto_discovered && ctrack_replay->l7proto != UNKNOWN))
|
||||||
ctrack_replay->l7proto_discovered = true;
|
ctrack_replay->l7proto_discovered = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
bDiscoveredL7 = !ctrack_replay && l7proto != UNKNOWN;
|
bDiscoveredL7 = !ctrack_replay && l7proto != UNKNOWN;
|
||||||
@@ -2811,12 +2805,6 @@ static uint8_t dpi_desync_udp_packet_play(bool replay, size_t reasm_offset, uint
|
|||||||
DLOG("using cached desync profile %d\n", dp->n);
|
DLOG("using cached desync profile %d\n", dp->n);
|
||||||
else if (!ctrack_replay->dp_search_complete)
|
else if (!ctrack_replay->dp_search_complete)
|
||||||
{
|
{
|
||||||
if (!ctrack_replay->hostname && !bReverse)
|
|
||||||
{
|
|
||||||
if (ipcache_get_hostname(dis->ip ? &dis->ip->ip_dst : NULL, dis->ip6 ? &dis->ip6->ip6_dst : NULL, host, sizeof(host), &ctrack_replay->hostname_is_ip) && *host)
|
|
||||||
if (!(ctrack_replay->hostname = strdup(host)))
|
|
||||||
DLOG_ERR("strdup(host): out of memory\n");
|
|
||||||
}
|
|
||||||
dp = ctrack_replay->dp = dp_find(¶ms.desync_profiles, IPPROTO_UDP, (struct sockaddr *)&dst, ctrack_replay->hostname, ctrack_replay->hostname_is_ip, ctrack_replay->l7proto, ssid, NULL, NULL, NULL);
|
dp = ctrack_replay->dp = dp_find(¶ms.desync_profiles, IPPROTO_UDP, (struct sockaddr *)&dst, ctrack_replay->hostname, ctrack_replay->hostname_is_ip, ctrack_replay->l7proto, ssid, NULL, NULL, NULL);
|
||||||
ctrack_replay->dp_search_complete = true;
|
ctrack_replay->dp_search_complete = true;
|
||||||
}
|
}
|
||||||
@@ -3107,8 +3095,8 @@ static uint8_t dpi_desync_udp_packet_play(bool replay, size_t reasm_offset, uint
|
|||||||
bool bDiscoveredL7;
|
bool bDiscoveredL7;
|
||||||
if (ctrack_replay)
|
if (ctrack_replay)
|
||||||
{
|
{
|
||||||
bDiscoveredL7 = !ctrack_replay->l7proto_discovered && ctrack_replay->l7proto != UNKNOWN;
|
if ((bDiscoveredL7 = !ctrack_replay->l7proto_discovered && ctrack_replay->l7proto != UNKNOWN))
|
||||||
ctrack_replay->l7proto_discovered = true;
|
ctrack_replay->l7proto_discovered = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
bDiscoveredL7 = !ctrack_replay && l7proto != UNKNOWN;
|
bDiscoveredL7 = !ctrack_replay && l7proto != UNKNOWN;
|
||||||
@@ -3198,7 +3186,7 @@ static uint8_t dpi_desync_udp_packet_play(bool replay, size_t reasm_offset, uint
|
|||||||
if (ctrack_replay->hostname_ah_check)
|
if (ctrack_replay->hostname_ah_check)
|
||||||
{
|
{
|
||||||
// first request is not retrans
|
// first request is not retrans
|
||||||
if (!bDiscoveredHostname)
|
if (!bDiscoveredHostname && !reasm_offset)
|
||||||
process_retrans_fail(ctrack_replay, IPPROTO_UDP, (struct sockaddr*)&src);
|
process_retrans_fail(ctrack_replay, IPPROTO_UDP, (struct sockaddr*)&src);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-34
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
int unique_size_t(size_t *pu, int ct)
|
int unique_size_t(size_t *pu, int ct)
|
||||||
{
|
{
|
||||||
int i, j, u;
|
size_t i, j, u;
|
||||||
for (i = j = 0; j < ct; i++)
|
for (i = j = 0; j < ct; i++)
|
||||||
{
|
{
|
||||||
u = pu[j++];
|
u = pu[j++];
|
||||||
@@ -221,7 +221,8 @@ void print_sockaddr(const struct sockaddr *sa)
|
|||||||
|
|
||||||
bool pton4_port(const char *s, struct sockaddr_in *sa)
|
bool pton4_port(const char *s, struct sockaddr_in *sa)
|
||||||
{
|
{
|
||||||
char ip[16],*p;
|
char ip[16];
|
||||||
|
const char *p;
|
||||||
size_t l;
|
size_t l;
|
||||||
unsigned int u;
|
unsigned int u;
|
||||||
|
|
||||||
@@ -241,7 +242,8 @@ bool pton4_port(const char *s, struct sockaddr_in *sa)
|
|||||||
}
|
}
|
||||||
bool pton6_port(const char *s, struct sockaddr_in6 *sa)
|
bool pton6_port(const char *s, struct sockaddr_in6 *sa)
|
||||||
{
|
{
|
||||||
char ip[40],*p;
|
char ip[40];
|
||||||
|
const char *p;
|
||||||
size_t l;
|
size_t l;
|
||||||
unsigned int u;
|
unsigned int u;
|
||||||
|
|
||||||
@@ -477,43 +479,13 @@ bool set_env_exedir(const char *argv0)
|
|||||||
if ((s = strdup(argv0)))
|
if ((s = strdup(argv0)))
|
||||||
{
|
{
|
||||||
if ((d = dirname(s)))
|
if ((d = dirname(s)))
|
||||||
setenv("EXEDIR",s,1);
|
bOK = !setenv("EXEDIR",d,1);
|
||||||
free(s);
|
free(s);
|
||||||
}
|
}
|
||||||
return bOK;
|
return bOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void mask_from_preflen6_make(uint8_t plen, struct in6_addr *a)
|
|
||||||
{
|
|
||||||
if (plen >= 128)
|
|
||||||
memset(a->s6_addr,0xFF,16);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
uint8_t n = plen >> 3;
|
|
||||||
memset(a->s6_addr,0xFF,n);
|
|
||||||
memset(a->s6_addr+n,0x00,16-n);
|
|
||||||
a->s6_addr[n] = (uint8_t)(0xFF00 >> (plen & 7));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
struct in6_addr ip6_mask[129];
|
|
||||||
void mask_from_preflen6_prepare(void)
|
|
||||||
{
|
|
||||||
for (int plen=0;plen<=128;plen++) mask_from_preflen6_make(plen, ip6_mask+plen);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__GNUC__) && !defined(__llvm__)
|
|
||||||
__attribute__((optimize ("no-strict-aliasing")))
|
|
||||||
#endif
|
|
||||||
void ip6_and(const struct in6_addr * restrict a, const struct in6_addr * restrict b, struct in6_addr * restrict result)
|
|
||||||
{
|
|
||||||
// int128 requires 16-bit alignment. in struct sockaddr_in6.sin6_addr is 8-byte aligned.
|
|
||||||
// it causes segfault on x64 arch with latest compiler. it can cause misalign slowdown on other archs
|
|
||||||
// use 64-bit AND
|
|
||||||
((uint64_t*)result->s6_addr)[0] = ((uint64_t*)a->s6_addr)[0] & ((uint64_t*)b->s6_addr)[0];
|
|
||||||
((uint64_t*)result->s6_addr)[1] = ((uint64_t*)a->s6_addr)[1] & ((uint64_t*)b->s6_addr)[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
void str_cidr4(char *s, size_t s_len, const struct cidr4 *cidr)
|
void str_cidr4(char *s, size_t s_len, const struct cidr4 *cidr)
|
||||||
{
|
{
|
||||||
char s_ip[16];
|
char s_ip[16];
|
||||||
|
|||||||
@@ -118,15 +118,3 @@ void str_cidr6(char *s, size_t s_len, const struct cidr6 *cidr);
|
|||||||
void print_cidr6(const struct cidr6 *cidr);
|
void print_cidr6(const struct cidr6 *cidr);
|
||||||
bool parse_cidr4(char *s, struct cidr4 *cidr);
|
bool parse_cidr4(char *s, struct cidr4 *cidr);
|
||||||
bool parse_cidr6(char *s, struct cidr6 *cidr);
|
bool parse_cidr6(char *s, struct cidr6 *cidr);
|
||||||
|
|
||||||
static inline uint32_t mask_from_preflen(uint32_t preflen)
|
|
||||||
{
|
|
||||||
return preflen ? preflen<32 ? ~((1 << (32-preflen)) - 1) : 0xFFFFFFFF : 0;
|
|
||||||
}
|
|
||||||
void ip6_and(const struct in6_addr * restrict a, const struct in6_addr * restrict b, struct in6_addr * restrict result);
|
|
||||||
extern struct in6_addr ip6_mask[129];
|
|
||||||
void mask_from_preflen6_prepare(void);
|
|
||||||
static inline const struct in6_addr *mask_from_preflen6(uint8_t preflen)
|
|
||||||
{
|
|
||||||
return ip6_mask+preflen;
|
|
||||||
}
|
|
||||||
|
|||||||
+9
-6
@@ -256,6 +256,8 @@ static bool nfq_init(struct nfq_handle **h, struct nfq_q_handle **qh)
|
|||||||
// dot not fail. not supported on old linuxes <3.6
|
// dot not fail. not supported on old linuxes <3.6
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nfnl_rcvbufsiz(nfq_nfnlh(*h), Q_RCVBUF);
|
||||||
|
|
||||||
DLOG_CONDUP("initializing raw sockets bind-fix4=%u bind-fix6=%u\n", params.bind_fix4, params.bind_fix6);
|
DLOG_CONDUP("initializing raw sockets bind-fix4=%u bind-fix6=%u\n", params.bind_fix4, params.bind_fix6);
|
||||||
if (!rawsend_preinit(params.bind_fix4, params.bind_fix6))
|
if (!rawsend_preinit(params.bind_fix4, params.bind_fix6))
|
||||||
goto exiterr;
|
goto exiterr;
|
||||||
@@ -350,7 +352,7 @@ static int nfq_main(void)
|
|||||||
if (rd)
|
if (rd)
|
||||||
{
|
{
|
||||||
int r = nfq_handle_packet(h, (char *)buf, (int)rd);
|
int r = nfq_handle_packet(h, (char *)buf, (int)rd);
|
||||||
if (r) DLOG_ERR("nfq_handle_packet error %d\n", r);
|
if (r<0) DLOG_ERR("nfq_handle_packet result %d, errno %d : %s\n", r, errno, strerror(errno));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
DLOG("recv from nfq returned 0 !\n");
|
DLOG("recv from nfq returned 0 !\n");
|
||||||
@@ -1883,8 +1885,8 @@ static void exithelp(void)
|
|||||||
" --dpi-desync-fakedsplit-mod=mod[,mod]\t\t\t; mods can be none,altorder=0|1|2|3 + 0|8|16\n"
|
" --dpi-desync-fakedsplit-mod=mod[,mod]\t\t\t; mods can be none,altorder=0|1|2|3 + 0|8|16\n"
|
||||||
" --dpi-desync-hostfakesplit-midhost=marker+N|marker-N\t; additionally split real hostname at specified marker. must be within host..endhost or won't be splitted.\n"
|
" --dpi-desync-hostfakesplit-midhost=marker+N|marker-N\t; additionally split real hostname at specified marker. must be within host..endhost or won't be splitted.\n"
|
||||||
" --dpi-desync-hostfakesplit-mod=mod[,mod]\t\t; mods can be none,host=<hostname>,altorder=0|1\n"
|
" --dpi-desync-hostfakesplit-mod=mod[,mod]\t\t; mods can be none,host=<hostname>,altorder=0|1\n"
|
||||||
" --dpi-desync-ipfrag-pos-tcp=<8..%u>\t\t\t; ip frag position starting from the transport header. multiple of 8, default %u.\n"
|
|
||||||
" --dpi-desync-ipfrag-pos-udp=<8..%u>\t\t\t; ip frag position starting from the transport header. multiple of 8, default %u.\n"
|
" --dpi-desync-ipfrag-pos-udp=<8..%u>\t\t\t; ip frag position starting from the transport header. multiple of 8, default %u.\n"
|
||||||
|
" --dpi-desync-ipfrag-pos-tcp=<8..%u>\t\t\t; ip frag position starting from the transport header. multiple of 8, default %u.\n"
|
||||||
" --dpi-desync-ts-increment=<int|0xHEX>\t\t\t; ts fooling TSval signed increment. default %d\n"
|
" --dpi-desync-ts-increment=<int|0xHEX>\t\t\t; ts fooling TSval signed increment. default %d\n"
|
||||||
" --dpi-desync-badseq-increment=<int|0xHEX>\t\t; badseq fooling seq signed increment. default %d\n"
|
" --dpi-desync-badseq-increment=<int|0xHEX>\t\t; badseq fooling seq signed increment. default %d\n"
|
||||||
" --dpi-desync-badack-increment=<int|0xHEX>\t\t; badseq fooling ackseq signed increment. default %d\n"
|
" --dpi-desync-badack-increment=<int|0xHEX>\t\t; badseq fooling ackseq signed increment. default %d\n"
|
||||||
@@ -2304,7 +2306,7 @@ int main(int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
srandom(time(NULL));
|
srandom(time(NULL));
|
||||||
mask_from_preflen6_prepare();
|
aes_init_keygen_tables(); // required for aes
|
||||||
|
|
||||||
PRINT_VER;
|
PRINT_VER;
|
||||||
|
|
||||||
@@ -2384,6 +2386,7 @@ int main(int argc, char **argv)
|
|||||||
fprintf(stderr, "cannot create %s\n", params.debug_logfile);
|
fprintf(stderr, "cannot create %s\n", params.debug_logfile);
|
||||||
exit_clean(1);
|
exit_clean(1);
|
||||||
}
|
}
|
||||||
|
fclose(F);
|
||||||
params.debug = true;
|
params.debug = true;
|
||||||
params.debug_target = LOG_TARGET_FILE;
|
params.debug_target = LOG_TARGET_FILE;
|
||||||
}
|
}
|
||||||
@@ -3166,7 +3169,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case IDX_HOSTLIST_AUTO_FAIL_THRESHOLD:
|
case IDX_HOSTLIST_AUTO_FAIL_THRESHOLD:
|
||||||
dp->hostlist_auto_fail_threshold = (uint8_t)atoi(optarg);
|
dp->hostlist_auto_fail_threshold = atoi(optarg);
|
||||||
if (dp->hostlist_auto_fail_threshold < 1 || dp->hostlist_auto_fail_threshold>20)
|
if (dp->hostlist_auto_fail_threshold < 1 || dp->hostlist_auto_fail_threshold>20)
|
||||||
{
|
{
|
||||||
DLOG_ERR("auto hostlist fail threshold must be within 1..20\n");
|
DLOG_ERR("auto hostlist fail threshold must be within 1..20\n");
|
||||||
@@ -3174,7 +3177,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case IDX_HOSTLIST_AUTO_FAIL_TIME:
|
case IDX_HOSTLIST_AUTO_FAIL_TIME:
|
||||||
dp->hostlist_auto_fail_time = (uint8_t)atoi(optarg);
|
dp->hostlist_auto_fail_time = atoi(optarg);
|
||||||
if (dp->hostlist_auto_fail_time < 1)
|
if (dp->hostlist_auto_fail_time < 1)
|
||||||
{
|
{
|
||||||
DLOG_ERR("auto hostlist fail time is not valid\n");
|
DLOG_ERR("auto hostlist fail time is not valid\n");
|
||||||
@@ -3182,7 +3185,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case IDX_HOSTLIST_AUTO_RETRANS_THRESHOLD:
|
case IDX_HOSTLIST_AUTO_RETRANS_THRESHOLD:
|
||||||
dp->hostlist_auto_retrans_threshold = (uint8_t)atoi(optarg);
|
dp->hostlist_auto_retrans_threshold = atoi(optarg);
|
||||||
if (dp->hostlist_auto_retrans_threshold < 2 || dp->hostlist_auto_retrans_threshold>10)
|
if (dp->hostlist_auto_retrans_threshold < 2 || dp->hostlist_auto_retrans_threshold>10)
|
||||||
{
|
{
|
||||||
DLOG_ERR("auto hostlist fail threshold must be within 2..10\n");
|
DLOG_ERR("auto hostlist fail threshold must be within 2..10\n");
|
||||||
|
|||||||
+6
-3
@@ -50,7 +50,7 @@ static char log_buf[1024];
|
|||||||
static size_t log_buf_sz=0;
|
static size_t log_buf_sz=0;
|
||||||
static void syslog_log_function(int priority, const char *line)
|
static void syslog_log_function(int priority, const char *line)
|
||||||
{
|
{
|
||||||
syslog(priority,"%s",log_buf);
|
syslog(priority,"%s",line);
|
||||||
}
|
}
|
||||||
#ifdef __ANDROID__
|
#ifdef __ANDROID__
|
||||||
static enum android_LogPriority syslog_priority_to_android(int priority)
|
static enum android_LogPriority syslog_priority_to_android(int priority)
|
||||||
@@ -219,6 +219,9 @@ void dp_init(struct desync_profile *dp)
|
|||||||
LIST_INIT(&dp->ips_collection_exclude);
|
LIST_INIT(&dp->ips_collection_exclude);
|
||||||
LIST_INIT(&dp->pf_tcp);
|
LIST_INIT(&dp->pf_tcp);
|
||||||
LIST_INIT(&dp->pf_udp);
|
LIST_INIT(&dp->pf_udp);
|
||||||
|
#ifdef HAS_FILTER_SSID
|
||||||
|
LIST_INIT(&dp->filter_ssid);
|
||||||
|
#endif
|
||||||
|
|
||||||
memcpy(dp->hostspell, "host", 4); // default hostspell
|
memcpy(dp->hostspell, "host", 4); // default hostspell
|
||||||
dp->desync_skip_nosni = true;
|
dp->desync_skip_nosni = true;
|
||||||
@@ -286,14 +289,14 @@ struct desync_profile_list *dp_list_add(struct desync_profile_list_head *head)
|
|||||||
dp_init(&entry->dp);
|
dp_init(&entry->dp);
|
||||||
|
|
||||||
// add to the tail
|
// add to the tail
|
||||||
struct desync_profile_list *dpn,*dpl=LIST_FIRST(¶ms.desync_profiles);
|
struct desync_profile_list *dpn,*dpl=LIST_FIRST(head);
|
||||||
if (dpl)
|
if (dpl)
|
||||||
{
|
{
|
||||||
while ((dpn=LIST_NEXT(dpl,next))) dpl = dpn;
|
while ((dpn=LIST_NEXT(dpl,next))) dpl = dpn;
|
||||||
LIST_INSERT_AFTER(dpl, entry, next);
|
LIST_INSERT_AFTER(dpl, entry, next);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
LIST_INSERT_HEAD(¶ms.desync_profiles, entry, next);
|
LIST_INSERT_HEAD(head, entry, next);
|
||||||
|
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -23,7 +23,8 @@
|
|||||||
|
|
||||||
#define RAW_SNDBUF (64*1024) // in bytes
|
#define RAW_SNDBUF (64*1024) // in bytes
|
||||||
|
|
||||||
#define Q_MAXLEN 1024 // in packets
|
#define Q_MAXLEN 4986 // in packets
|
||||||
|
#define Q_RCVBUF (1024*1024) // in bytes
|
||||||
|
|
||||||
#define BADSEQ_INCREMENT_DEFAULT -10000
|
#define BADSEQ_INCREMENT_DEFAULT -10000
|
||||||
#define BADSEQ_ACK_INCREMENT_DEFAULT -66000
|
#define BADSEQ_ACK_INCREMENT_DEFAULT -66000
|
||||||
|
|||||||
+2
-5
@@ -98,6 +98,7 @@ hostfail_pool *HostFailPoolFind(hostfail_pool *p,const char *s)
|
|||||||
}
|
}
|
||||||
void HostFailPoolDel(hostfail_pool **p, hostfail_pool *elem)
|
void HostFailPoolDel(hostfail_pool **p, hostfail_pool *elem)
|
||||||
{
|
{
|
||||||
|
free(elem->str);
|
||||||
HASH_DEL(*p, elem);
|
HASH_DEL(*p, elem);
|
||||||
free(elem);
|
free(elem);
|
||||||
}
|
}
|
||||||
@@ -108,11 +109,7 @@ void HostFailPoolPurge(hostfail_pool **pp)
|
|||||||
HASH_ITER(hh, *pp, elem, tmp)
|
HASH_ITER(hh, *pp, elem, tmp)
|
||||||
{
|
{
|
||||||
if (now >= elem->expire)
|
if (now >= elem->expire)
|
||||||
{
|
HostFailPoolDel(pp, elem);
|
||||||
free(elem->str);
|
|
||||||
HASH_DEL(*pp, elem);
|
|
||||||
free(elem);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static time_t host_fail_purge_prev=0;
|
static time_t host_fail_purge_prev=0;
|
||||||
|
|||||||
+72
-72
@@ -52,14 +52,6 @@ bool l7_proto_match(t_l7proto l7proto, uint32_t filter_l7)
|
|||||||
(l7proto==STUN && (filter_l7 & L7_PROTO_STUN));
|
(l7proto==STUN && (filter_l7 & L7_PROTO_STUN));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PM_ABS 0
|
|
||||||
#define PM_HOST 1
|
|
||||||
#define PM_HOST_END 2
|
|
||||||
#define PM_HOST_SLD 3
|
|
||||||
#define PM_HOST_MIDSLD 4
|
|
||||||
#define PM_HOST_ENDSLD 5
|
|
||||||
#define PM_HTTP_METHOD 6
|
|
||||||
#define PM_SNI_EXT 7
|
|
||||||
bool IsHostMarker(uint8_t posmarker)
|
bool IsHostMarker(uint8_t posmarker)
|
||||||
{
|
{
|
||||||
switch(posmarker)
|
switch(posmarker)
|
||||||
@@ -318,7 +310,7 @@ size_t HttpPos(uint8_t posmarker, int16_t pos, const uint8_t *data, size_t sz)
|
|||||||
if (sz<10) break;
|
if (sz<10) break;
|
||||||
if (*method=='\n' || *method=='\r') method++;
|
if (*method=='\n' || *method=='\r') method++;
|
||||||
if (*method=='\n' || *method=='\r') method++;
|
if (*method=='\n' || *method=='\r') method++;
|
||||||
for (p=method,i=0;i<7;i++) if (*p>='A' && *p<='Z') p++;
|
for (p=method,i=0; i<9 && *p>='A' && *p<='Z'; i++,p++);
|
||||||
if (i<3 || *p!=' ') break;
|
if (i<3 || *p!=' ') break;
|
||||||
return CheckPos(sz,method-data+pos);
|
return CheckPos(sz,method-data+pos);
|
||||||
case PM_HOST:
|
case PM_HOST:
|
||||||
@@ -595,7 +587,7 @@ static uint8_t tvb_get_varint(const uint8_t *tvb, uint64_t *value)
|
|||||||
return 8;
|
return 8;
|
||||||
}
|
}
|
||||||
// impossible case
|
// impossible case
|
||||||
if (*value) *value = 0;
|
if (value) *value = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static uint8_t tvb_get_size(uint8_t tvb)
|
static uint8_t tvb_get_size(uint8_t tvb)
|
||||||
@@ -623,24 +615,18 @@ bool IsQUICCryptoHello(const uint8_t *data, size_t len, size_t *hello_offset, si
|
|||||||
uint8_t QUICDraftVersion(uint32_t version)
|
uint8_t QUICDraftVersion(uint32_t version)
|
||||||
{
|
{
|
||||||
/* IETF Draft versions */
|
/* IETF Draft versions */
|
||||||
if ((version >> 8) == 0xff0000) {
|
if ((version >> 8) == 0xff0000)
|
||||||
return (uint8_t)version;
|
return (uint8_t)version;
|
||||||
}
|
|
||||||
/* Facebook mvfst, based on draft -22. */
|
/* Facebook mvfst, based on draft -22. */
|
||||||
if (version == 0xfaceb001) {
|
if (version == 0xfaceb001)
|
||||||
return 22;
|
return 22;
|
||||||
}
|
|
||||||
/* Facebook mvfst, based on draft -27. */
|
/* Facebook mvfst, based on draft -27. */
|
||||||
if (version == 0xfaceb002 || version == 0xfaceb00e) {
|
if (version == 0xfaceb002 || version == 0xfaceb00e)
|
||||||
return 27;
|
return 27;
|
||||||
}
|
|
||||||
/* GQUIC Q050, T050 and T051: they are not really based on any drafts,
|
/* GQUIC Q050, T050 and T051: they are not really based on any drafts,
|
||||||
* but we must return a sensible value */
|
* but we must return a sensible value */
|
||||||
if (version == 0x51303530 ||
|
if (version == 0x51303530 || version == 0x54303530 || version == 0x54303531)
|
||||||
version == 0x54303530 ||
|
|
||||||
version == 0x54303531) {
|
|
||||||
return 27;
|
return 27;
|
||||||
}
|
|
||||||
/* https://tools.ietf.org/html/draft-ietf-quic-transport-32#section-15
|
/* https://tools.ietf.org/html/draft-ietf-quic-transport-32#section-15
|
||||||
"Versions that follow the pattern 0x?a?a?a?a are reserved for use in
|
"Versions that follow the pattern 0x?a?a?a?a are reserved for use in
|
||||||
forcing version negotiation to be exercised"
|
forcing version negotiation to be exercised"
|
||||||
@@ -648,19 +634,17 @@ uint8_t QUICDraftVersion(uint32_t version)
|
|||||||
used to select a proper salt (which depends on the version itself), but
|
used to select a proper salt (which depends on the version itself), but
|
||||||
we don't have a real version here! Let's hope that we need to handle
|
we don't have a real version here! Let's hope that we need to handle
|
||||||
only latest drafts... */
|
only latest drafts... */
|
||||||
if ((version & 0x0F0F0F0F) == 0x0a0a0a0a) {
|
if ((version & 0x0F0F0F0F) == 0x0a0a0a0a)
|
||||||
return 29;
|
return 29;
|
||||||
}
|
|
||||||
/* QUIC (final?) constants for v1 are defined in draft-33, but draft-34 is the
|
/* QUIC (final?) constants for v1 are defined in draft-33, but draft-34 is the
|
||||||
final draft version */
|
final draft version */
|
||||||
if (version == 0x00000001) {
|
if (version == 0x00000001)
|
||||||
return 34;
|
return 34;
|
||||||
}
|
|
||||||
/* QUIC Version 2 */
|
/* QUIC Version 2 */
|
||||||
/* TODO: for the time being use 100 as a number for V2 and let see how v2 drafts evolve */
|
/* TODO: for the time being use 100 as a number for V2 and let see how v2 drafts evolve */
|
||||||
if (version == 0x709A50C4) {
|
if ((version == 0x709A50C4) || (version == 0x6b3343cf))
|
||||||
return 100;
|
return 100;
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -670,7 +654,7 @@ static bool is_quic_draft_max(uint32_t draft_version, uint8_t max_version)
|
|||||||
}
|
}
|
||||||
static bool is_quic_v2(uint32_t version)
|
static bool is_quic_v2(uint32_t version)
|
||||||
{
|
{
|
||||||
return version == 0x6b3343cf;
|
return (version == 0x709A50C4) || (version == 0x6b3343cf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool quic_hkdf_expand_label(const uint8_t *secret, uint8_t secret_len, const char *label, uint8_t *out, size_t out_len)
|
static bool quic_hkdf_expand_label(const uint8_t *secret, uint8_t secret_len, const char *label, uint8_t *out, size_t out_len)
|
||||||
@@ -811,20 +795,19 @@ bool QUICDecryptInitial(const uint8_t *data, size_t data_len, uint8_t *clean, si
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t payload_len,token_len;
|
uint64_t payload_len,token_len,pn_offset;
|
||||||
size_t pn_offset;
|
|
||||||
pn_offset = 1 + 4 + 1 + data[5];
|
pn_offset = 1 + 4 + 1 + data[5];
|
||||||
if (pn_offset >= data_len) return false;
|
if (pn_offset >= data_len) return false;
|
||||||
|
// SCID length
|
||||||
pn_offset += 1 + data[pn_offset];
|
pn_offset += 1 + data[pn_offset];
|
||||||
if ((pn_offset + tvb_get_size(data[pn_offset])) >= data_len) return false;
|
if (pn_offset >= data_len || (pn_offset + tvb_get_size(data[pn_offset])) >= data_len) return false;
|
||||||
|
// token length
|
||||||
pn_offset += tvb_get_varint(data + pn_offset, &token_len);
|
pn_offset += tvb_get_varint(data + pn_offset, &token_len);
|
||||||
pn_offset += token_len;
|
pn_offset += token_len;
|
||||||
if ((pn_offset + tvb_get_size(data[pn_offset])) >= data_len) return false;
|
if (pn_offset >= data_len || (pn_offset + tvb_get_size(data[pn_offset])) >= data_len) return false;
|
||||||
pn_offset += tvb_get_varint(data + pn_offset, &payload_len);
|
pn_offset += tvb_get_varint(data + pn_offset, &payload_len);
|
||||||
if (payload_len<20 || (pn_offset + payload_len)>data_len) return false;
|
if (payload_len<20 || (pn_offset + payload_len)>data_len) return false;
|
||||||
|
|
||||||
aes_init_keygen_tables();
|
|
||||||
|
|
||||||
uint8_t sample_enc[16];
|
uint8_t sample_enc[16];
|
||||||
aes_context ctx;
|
aes_context ctx;
|
||||||
if (aes_setkey(&ctx, 1, aeshp, sizeof(aeshp)) || aes_cipher(&ctx, data + pn_offset + 4, sample_enc)) return false;
|
if (aes_setkey(&ctx, 1, aeshp, sizeof(aeshp)) || aes_cipher(&ctx, data + pn_offset + 4, sample_enc)) return false;
|
||||||
@@ -842,13 +825,13 @@ bool QUICDecryptInitial(const uint8_t *data, size_t data_len, uint8_t *clean, si
|
|||||||
|
|
||||||
phton64(aesiv + sizeof(aesiv) - 8, pntoh64(aesiv + sizeof(aesiv) - 8) ^ pkn);
|
phton64(aesiv + sizeof(aesiv) - 8, pntoh64(aesiv + sizeof(aesiv) - 8) ^ pkn);
|
||||||
|
|
||||||
size_t cryptlen = payload_len - pkn_len - 16;
|
uint64_t cryptlen = payload_len - pkn_len - 16;
|
||||||
if (cryptlen > *clean_len) return false;
|
if (cryptlen > *clean_len) return false;
|
||||||
*clean_len = cryptlen;
|
*clean_len = (size_t)cryptlen;
|
||||||
const uint8_t *decrypt_begin = data + pn_offset + pkn_len;
|
const uint8_t *decrypt_begin = data + pn_offset + pkn_len;
|
||||||
|
|
||||||
uint8_t atag[16],header[256];
|
uint8_t atag[16],header[2048];
|
||||||
size_t header_len = pn_offset + pkn_len;
|
uint64_t header_len = pn_offset + pkn_len;
|
||||||
if (header_len > sizeof(header)) return false; // not likely header will be so large
|
if (header_len > sizeof(header)) return false; // not likely header will be so large
|
||||||
memcpy(header, data, header_len);
|
memcpy(header, data, header_len);
|
||||||
header[0] = packet0;
|
header[0] = packet0;
|
||||||
@@ -883,7 +866,7 @@ bool QUICDefragCrypto(const uint8_t *clean,size_t clean_len, uint8_t *defrag,siz
|
|||||||
uint64_t offset,sz,szmax=0,zeropos=0,pos=0;
|
uint64_t offset,sz,szmax=0,zeropos=0,pos=0;
|
||||||
bool found=false;
|
bool found=false;
|
||||||
struct range64 ranges[MAX_DEFRAG_PIECES];
|
struct range64 ranges[MAX_DEFRAG_PIECES];
|
||||||
int i,range=0;
|
int i,j,range=0;
|
||||||
|
|
||||||
while(pos<clean_len)
|
while(pos<clean_len)
|
||||||
{
|
{
|
||||||
@@ -905,24 +888,54 @@ bool QUICDefragCrypto(const uint8_t *clean,size_t clean_len, uint8_t *defrag,siz
|
|||||||
if ((pos+sz)>clean_len) return false;
|
if ((pos+sz)>clean_len) return false;
|
||||||
|
|
||||||
if ((offset+sz)>defrag_data_len) return false; // defrag buf overflow
|
if ((offset+sz)>defrag_data_len) return false; // defrag buf overflow
|
||||||
|
|
||||||
|
// remove exact duplicates early to save cpu
|
||||||
|
for(i=0;i<range;i++)
|
||||||
|
if (ranges[i].offset==offset && ranges[i].len==sz)
|
||||||
|
goto skip_range;
|
||||||
|
|
||||||
if (zeropos < offset)
|
if (zeropos < offset)
|
||||||
// make sure no uninitialized gaps exist in case of not full fragment coverage
|
// make sure no uninitialized gaps exist in case of not full fragment coverage
|
||||||
memset(defrag_data+zeropos,0,offset-zeropos);
|
memset(defrag_data+zeropos,0,offset-zeropos);
|
||||||
if ((offset+sz) > zeropos)
|
if ((offset+sz) > zeropos)
|
||||||
zeropos=offset+sz;
|
zeropos=offset+sz;
|
||||||
memcpy(defrag_data+offset,clean+pos,sz);
|
|
||||||
if ((offset+sz) > szmax) szmax = offset+sz;
|
|
||||||
|
|
||||||
found=true;
|
found=true;
|
||||||
pos+=sz;
|
if ((offset+sz) > szmax) szmax = offset+sz;
|
||||||
|
memcpy(defrag_data+offset,clean+pos,sz);
|
||||||
ranges[range].offset = offset;
|
ranges[range].offset = offset;
|
||||||
ranges[range].len = sz;
|
ranges[range].len = sz;
|
||||||
range++;
|
range++;
|
||||||
|
skip_range:
|
||||||
|
pos+=sz;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (found)
|
if (found)
|
||||||
{
|
{
|
||||||
|
qsort(ranges, range, sizeof(*ranges), cmp_range64);
|
||||||
|
|
||||||
|
// for(i=0 ; i<range ; i++)
|
||||||
|
// printf("range1 %llu-%llu\n",ranges[i].offset,ranges[i].offset+ranges[i].len);
|
||||||
|
|
||||||
|
if (range>0)
|
||||||
|
{
|
||||||
|
for (j=0,i=1; i < range; i++)
|
||||||
|
{
|
||||||
|
uint64_t current_end = ranges[j].offset + ranges[j].len;
|
||||||
|
uint64_t next_start = ranges[i].offset;
|
||||||
|
uint64_t next_end = ranges[i].offset + ranges[i].len;
|
||||||
|
|
||||||
|
if (next_start <= current_end)
|
||||||
|
ranges[j].len = MAX(next_end,current_end) - ranges[j].offset;
|
||||||
|
else
|
||||||
|
ranges[++j] = ranges[i];
|
||||||
|
}
|
||||||
|
range = j+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// for(i=0 ; i<range ; i++)
|
||||||
|
// printf("range2 %llu-%llu\n",ranges[i].offset,ranges[i].offset+ranges[i].len);
|
||||||
|
|
||||||
defrag[0] = 6;
|
defrag[0] = 6;
|
||||||
defrag[1] = 0; // offset
|
defrag[1] = 0; // offset
|
||||||
// 2..9 - length 64 bit
|
// 2..9 - length 64 bit
|
||||||
@@ -931,21 +944,7 @@ bool QUICDefragCrypto(const uint8_t *clean,size_t clean_len, uint8_t *defrag,siz
|
|||||||
defrag[2] |= 0xC0; // 64 bit value
|
defrag[2] |= 0xC0; // 64 bit value
|
||||||
*defrag_len = (size_t)(szmax+10);
|
*defrag_len = (size_t)(szmax+10);
|
||||||
|
|
||||||
qsort(ranges, range, sizeof(*ranges), cmp_range64);
|
*bFull = range==1 && !ranges[0].offset;
|
||||||
|
|
||||||
//for(i=0 ; i<range ; i++)
|
|
||||||
// printf("RANGE %zu len %zu\n",ranges[i].offset,ranges[i].len);
|
|
||||||
|
|
||||||
for(i=0,offset=0,*bFull=true ; i<range ; i++)
|
|
||||||
{
|
|
||||||
if (ranges[i].offset!=offset)
|
|
||||||
{
|
|
||||||
*bFull = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
offset += ranges[i].len;
|
|
||||||
}
|
|
||||||
|
|
||||||
//printf("bFull=%u\n",*bFull);
|
//printf("bFull=%u\n",*bFull);
|
||||||
}
|
}
|
||||||
return found;
|
return found;
|
||||||
@@ -977,40 +976,41 @@ bool QUICExtractHostFromInitial(const uint8_t *data, size_t data_len, char *host
|
|||||||
|
|
||||||
bool IsQUICInitial(const uint8_t *data, size_t len)
|
bool IsQUICInitial(const uint8_t *data, size_t len)
|
||||||
{
|
{
|
||||||
// too small packets are not likely to be initials with client hello
|
// too small packets are not likely to be initials
|
||||||
// long header, fixed bit
|
// long header, fixed bit
|
||||||
if (len < 256 || (data[0] & 0xC0)!=0xC0) return false;
|
if (len < 128) return false;
|
||||||
|
|
||||||
uint32_t ver = QUICExtractVersion(data,len);
|
uint32_t ver = QUICExtractVersion(data,len);
|
||||||
if (QUICDraftVersion(ver) < 11) return false;
|
if (QUICDraftVersion(ver) < 11) return false;
|
||||||
|
|
||||||
// quic v1 : initial packets are 00b
|
if ((data[0] & 0xF0) != (is_quic_v2(ver) ? 0xD0 : 0xC0)) return false;
|
||||||
// quic v2 : initial packets are 01b
|
|
||||||
if ((data[0] & 0x30) != (is_quic_v2(ver) ? 0x10 : 0x00)) return false;
|
|
||||||
|
|
||||||
uint64_t offset=5, sz;
|
uint64_t offset=5, sz, sz2;
|
||||||
|
|
||||||
// DCID. must be present
|
// DCID
|
||||||
if (!data[offset] || data[offset] > QUIC_MAX_CID_LENGTH) return false;
|
if (data[offset] > QUIC_MAX_CID_LENGTH) return false;
|
||||||
offset += 1 + data[offset];
|
offset += 1 + data[offset];
|
||||||
|
|
||||||
|
if (offset>=len) return false;
|
||||||
|
|
||||||
// SCID
|
// SCID
|
||||||
if (data[offset] > QUIC_MAX_CID_LENGTH) return false;
|
if (data[offset] > QUIC_MAX_CID_LENGTH) return false;
|
||||||
offset += 1 + data[offset];
|
offset += 1 + data[offset];
|
||||||
|
|
||||||
// token length
|
// token length
|
||||||
|
if (offset>=len || (offset + tvb_get_size(data[offset])) > len) return false;
|
||||||
offset += tvb_get_varint(data + offset, &sz);
|
offset += tvb_get_varint(data + offset, &sz);
|
||||||
offset += sz;
|
offset += sz;
|
||||||
if (offset >= len) return false;
|
if (offset >= len) return false;
|
||||||
|
|
||||||
// payload length
|
// payload length
|
||||||
if ((offset + tvb_get_size(data[offset])) > len) return false;
|
sz2 = tvb_get_size(data[offset]);
|
||||||
|
if ((offset + sz2) > len) return false;
|
||||||
tvb_get_varint(data + offset, &sz);
|
tvb_get_varint(data + offset, &sz);
|
||||||
offset += sz;
|
offset += sz2 + sz;
|
||||||
if (offset > len) return false;
|
if (offset > len) return false;
|
||||||
|
|
||||||
// client hello cannot be too small. likely ACK
|
return true;
|
||||||
return sz>=96;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1035,7 +1035,7 @@ bool IsStunMessage(const uint8_t *data, size_t len)
|
|||||||
{
|
{
|
||||||
return len>=20 && // header size
|
return len>=20 && // header size
|
||||||
(data[0]&0xC0)==0 && // 2 most significant bits must be zeroes
|
(data[0]&0xC0)==0 && // 2 most significant bits must be zeroes
|
||||||
(data[3]&0b11)==0 && // length must be a multiple of 4
|
(data[3]&3)==0 && // length must be a multiple of 4
|
||||||
ntohl(*(uint32_t*)(&data[4]))==0x2112A442 && // magic cookie
|
pntoh32(data+4)==0x2112A442 && // magic cookie
|
||||||
ntohs(*(uint16_t*)(&data[2]))==len-20;
|
pntoh16(data+2)<=(len-20);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,25 @@ bool dropcaps(void);
|
|||||||
#define arch_nr (offsetof(struct seccomp_data, arch))
|
#define arch_nr (offsetof(struct seccomp_data, arch))
|
||||||
#define syscall_arg(x) (offsetof(struct seccomp_data, args[x]))
|
#define syscall_arg(x) (offsetof(struct seccomp_data, args[x]))
|
||||||
|
|
||||||
|
#ifndef __AUDIT_ARCH_64BIT
|
||||||
|
#define __AUDIT_ARCH_64BIT 0x80000000
|
||||||
|
#endif
|
||||||
|
#ifndef __AUDIT_ARCH_LE
|
||||||
|
#define __AUDIT_ARCH_LE 0x40000000
|
||||||
|
#endif
|
||||||
|
#ifndef EM_RISCV
|
||||||
|
#define EM_RISCV 243
|
||||||
|
#endif
|
||||||
|
#ifndef AUDIT_ARCH_RISCV64
|
||||||
|
#define AUDIT_ARCH_RISCV64 (EM_RISCV | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
|
||||||
|
#endif
|
||||||
|
#ifndef EM_LOONGARCH
|
||||||
|
#define EM_LOONGARCH 258
|
||||||
|
#endif
|
||||||
|
#ifndef AUDIT_ARCH_LOONGARCH64
|
||||||
|
#define AUDIT_ARCH_LOONGARCH64 (EM_LOONGARCH | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__aarch64__)
|
#if defined(__aarch64__)
|
||||||
|
|
||||||
# define ARCH_NR AUDIT_ARCH_AARCH64
|
# define ARCH_NR AUDIT_ARCH_AARCH64
|
||||||
@@ -72,6 +91,14 @@ bool dropcaps(void);
|
|||||||
|
|
||||||
# define ARCH_NR AUDIT_ARCH_RISCV64
|
# define ARCH_NR AUDIT_ARCH_RISCV64
|
||||||
|
|
||||||
|
#elif defined(__loongarch__) && __loongarch_grlen == 64
|
||||||
|
|
||||||
|
# define ARCH_NR AUDIT_ARCH_LOONGARCH64
|
||||||
|
|
||||||
|
#elif defined(__e2k__)
|
||||||
|
|
||||||
|
# define ARCH_NR AUDIT_ARCH_E2K
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
# error "Platform does not support seccomp filter yet"
|
# error "Platform does not support seccomp filter yet"
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
bool service_run();
|
bool service_run(int argc, char *argv[]);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
+11
-7
@@ -1,9 +1,13 @@
|
|||||||
CC ?= cc
|
CC ?= cc
|
||||||
OPTIMIZE ?= -Os
|
OPTIMIZE ?= -Os
|
||||||
CFLAGS += -std=gnu99 $(OPTIMIZE) -flto=auto
|
CFLAGS += -std=gnu99 $(OPTIMIZE) -flto=auto -ffunction-sections -fdata-sections
|
||||||
CFLAGS_SYSTEMD = -DUSE_SYSTEMD
|
CFLAGS_SYSTEMD = -DUSE_SYSTEMD
|
||||||
CFLAGS_BSD = -Wno-address-of-packed-member
|
CFLAGS_BSD = -Wno-address-of-packed-member
|
||||||
LDFLAGS_ANDROID = -llog
|
LDFLAGS += -flto=auto
|
||||||
|
LDFLAGS_ANDROID = -Wl,--gc-sections -llog
|
||||||
|
LDFLAGS_BSD = -Wl,--gc-sections
|
||||||
|
LDFLAGS_LINUX = -Wl,--gc-sections
|
||||||
|
LDFLAGS_MAC = -Wl,-dead_strip
|
||||||
LIBS = -lz -lpthread
|
LIBS = -lz -lpthread
|
||||||
LIBS_SYSTEMD = -lsystemd
|
LIBS_SYSTEMD = -lsystemd
|
||||||
LIBS_ANDROID = -lz
|
LIBS_ANDROID = -lz
|
||||||
@@ -13,20 +17,20 @@ SRC_FILES_ANDROID = $(SRC_FILES) andr/*.c
|
|||||||
all: tpws
|
all: tpws
|
||||||
|
|
||||||
tpws: $(SRC_FILES)
|
tpws: $(SRC_FILES)
|
||||||
$(CC) -s $(CFLAGS) -o tpws $(SRC_FILES) $(LIBS) $(LDFLAGS)
|
$(CC) -s $(CFLAGS) -o tpws $(SRC_FILES) $(LIBS) $(LDFLAGS) $(LDFLAGS_LINUX)
|
||||||
|
|
||||||
systemd: $(SRC_FILES)
|
systemd: $(SRC_FILES)
|
||||||
$(CC) -s $(CFLAGS) $(CFLAGS_SYSTEMD) -o tpws $(SRC_FILES) $(LIBS) $(LIBS_SYSTEMD) $(LDFLAGS)
|
$(CC) -s $(CFLAGS) $(CFLAGS_SYSTEMD) -o tpws $(SRC_FILES) $(LIBS) $(LIBS_SYSTEMD) $(LDFLAGS) $(LDFLAGS_LINUX)
|
||||||
|
|
||||||
android: $(SRC_FILES)
|
android: $(SRC_FILES)
|
||||||
$(CC) -s $(CFLAGS) -o tpws $(SRC_FILES_ANDROID) $(LIBS_ANDROID) $(LDFLAGS) $(LDFLAGS_ANDROID)
|
$(CC) -s $(CFLAGS) -o tpws $(SRC_FILES_ANDROID) $(LIBS_ANDROID) $(LDFLAGS) $(LDFLAGS_ANDROID)
|
||||||
|
|
||||||
bsd: $(SRC_FILES)
|
bsd: $(SRC_FILES)
|
||||||
$(CC) -s $(CFLAGS) $(CFLAGS_BSD) -Iepoll-shim/include -o tpws $(SRC_FILES) epoll-shim/src/*.c $(LIBS) $(LDFLAGS)
|
$(CC) -s $(CFLAGS) $(CFLAGS_BSD) -Iepoll-shim/include -o tpws $(SRC_FILES) epoll-shim/src/*.c $(LIBS) $(LDFLAGS) $(LDFLAGS_BSD)
|
||||||
|
|
||||||
mac: $(SRC_FILES)
|
mac: $(SRC_FILES)
|
||||||
$(CC) $(CFLAGS) $(CFLAGS_BSD) -Iepoll-shim/include -Imacos -o tpwsa -target arm64-apple-macos10.8 $(SRC_FILES) epoll-shim/src/*.c $(LIBS) $(LDFLAGS)
|
$(CC) $(CFLAGS) $(CFLAGS_BSD) -Iepoll-shim/include -Imacos -o tpwsa -target arm64-apple-macos10.8 $(SRC_FILES) epoll-shim/src/*.c $(LIBS) $(LDFLAGS) $(LDFLAGS_MAC)
|
||||||
$(CC) $(CFLAGS) $(CFLAGS_BSD) -Iepoll-shim/include -Imacos -o tpwsx -target x86_64-apple-macos10.8 $(SRC_FILES) epoll-shim/src/*.c $(LIBS) $(LDFLAGS)
|
$(CC) $(CFLAGS) $(CFLAGS_BSD) -Iepoll-shim/include -Imacos -o tpwsx -target x86_64-apple-macos10.8 $(SRC_FILES) epoll-shim/src/*.c $(LIBS) $(LDFLAGS) $(LDFLAGS_MAC)
|
||||||
strip tpwsa tpwsx
|
strip tpwsa tpwsx
|
||||||
lipo -create -output tpws tpwsx tpwsa
|
lipo -create -output tpws tpwsx tpwsa
|
||||||
rm -f tpwsx tpwsa
|
rm -f tpwsx tpwsa
|
||||||
|
|||||||
+1
-29
@@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
int unique_size_t(size_t *pu, int ct)
|
int unique_size_t(size_t *pu, int ct)
|
||||||
{
|
{
|
||||||
int i, j, u;
|
size_t i, j, u;
|
||||||
for (i = j = 0; j < ct; i++)
|
for (i = j = 0; j < ct; i++)
|
||||||
{
|
{
|
||||||
u = pu[j++];
|
u = pu[j++];
|
||||||
@@ -476,34 +476,6 @@ bool set_env_exedir(const char *argv0)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void mask_from_preflen6_make(uint8_t plen, struct in6_addr *a)
|
|
||||||
{
|
|
||||||
if (plen >= 128)
|
|
||||||
memset(a->s6_addr, 0xFF, 16);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
uint8_t n = plen >> 3;
|
|
||||||
memset(a->s6_addr, 0xFF, n);
|
|
||||||
memset(a->s6_addr + n, 0x00, 16 - n);
|
|
||||||
a->s6_addr[n] = (uint8_t)(0xFF00 >> (plen & 7));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
struct in6_addr ip6_mask[129];
|
|
||||||
void mask_from_preflen6_prepare(void)
|
|
||||||
{
|
|
||||||
for (int plen = 0; plen <= 128; plen++) mask_from_preflen6_make(plen, ip6_mask + plen);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__GNUC__) && !defined(__llvm__)
|
|
||||||
__attribute__((optimize("no-strict-aliasing")))
|
|
||||||
#endif
|
|
||||||
void ip6_and(const struct in6_addr * restrict a, const struct in6_addr * restrict b, struct in6_addr * restrict result)
|
|
||||||
{
|
|
||||||
// int 128 can cause alignment segfaults because sin6_addr in struct sockaddr_in6 is 8-byte aligned, not 16-byte
|
|
||||||
((uint64_t*)result->s6_addr)[0] = ((uint64_t*)a->s6_addr)[0] & ((uint64_t*)b->s6_addr)[0];
|
|
||||||
((uint64_t*)result->s6_addr)[1] = ((uint64_t*)a->s6_addr)[1] & ((uint64_t*)b->s6_addr)[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
void str_cidr4(char *s, size_t s_len, const struct cidr4 *cidr)
|
void str_cidr4(char *s, size_t s_len, const struct cidr4 *cidr)
|
||||||
{
|
{
|
||||||
char s_ip[16];
|
char s_ip[16];
|
||||||
|
|||||||
@@ -124,18 +124,6 @@ void print_cidr6(const struct cidr6 *cidr);
|
|||||||
bool parse_cidr4(char *s, struct cidr4 *cidr);
|
bool parse_cidr4(char *s, struct cidr4 *cidr);
|
||||||
bool parse_cidr6(char *s, struct cidr6 *cidr);
|
bool parse_cidr6(char *s, struct cidr6 *cidr);
|
||||||
|
|
||||||
static inline uint32_t mask_from_preflen(uint32_t preflen)
|
|
||||||
{
|
|
||||||
return preflen ? preflen<32 ? ~((1 << (32-preflen)) - 1) : 0xFFFFFFFF : 0;
|
|
||||||
}
|
|
||||||
void ip6_and(const struct in6_addr * restrict a, const struct in6_addr * restrict b, struct in6_addr * restrict result);
|
|
||||||
extern struct in6_addr ip6_mask[129];
|
|
||||||
void mask_from_preflen6_prepare(void);
|
|
||||||
static inline const struct in6_addr *mask_from_preflen6(uint8_t preflen)
|
|
||||||
{
|
|
||||||
return ip6_mask+preflen;
|
|
||||||
}
|
|
||||||
|
|
||||||
void msleep(unsigned int ms);
|
void msleep(unsigned int ms);
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
bool socket_supports_notsent();
|
bool socket_supports_notsent();
|
||||||
|
|||||||
+2
-2
@@ -219,14 +219,14 @@ struct desync_profile_list *dp_list_add(struct desync_profile_list_head *head)
|
|||||||
dp_init(&entry->dp);
|
dp_init(&entry->dp);
|
||||||
|
|
||||||
// add to the tail
|
// add to the tail
|
||||||
struct desync_profile_list *dpn,*dpl=LIST_FIRST(¶ms.desync_profiles);
|
struct desync_profile_list *dpn,*dpl=LIST_FIRST(head);
|
||||||
if (dpl)
|
if (dpl)
|
||||||
{
|
{
|
||||||
while ((dpn=LIST_NEXT(dpl,next))) dpl = dpn;
|
while ((dpn=LIST_NEXT(dpl,next))) dpl = dpn;
|
||||||
LIST_INSERT_AFTER(dpl, entry, next);
|
LIST_INSERT_AFTER(dpl, entry, next);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
LIST_INSERT_HEAD(¶ms.desync_profiles, entry, next);
|
LIST_INSERT_HEAD(head, entry, next);
|
||||||
|
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -74,7 +74,7 @@ struct desync_profile
|
|||||||
struct hostlist_collection_head hl_collection, hl_collection_exclude;
|
struct hostlist_collection_head hl_collection, hl_collection_exclude;
|
||||||
// pointer to autohostlist. NULL if no autohostlist for the profile.
|
// pointer to autohostlist. NULL if no autohostlist for the profile.
|
||||||
struct hostlist_file *hostlist_auto;
|
struct hostlist_file *hostlist_auto;
|
||||||
int hostlist_auto_fail_threshold, hostlist_auto_fail_time, hostlist_auto_retrans_threshold;
|
int hostlist_auto_fail_threshold, hostlist_auto_fail_time;
|
||||||
|
|
||||||
hostfail_pool *hostlist_auto_fail_counters;
|
hostfail_pool *hostlist_auto_fail_counters;
|
||||||
};
|
};
|
||||||
|
|||||||
+2
-5
@@ -98,6 +98,7 @@ hostfail_pool *HostFailPoolFind(hostfail_pool *p,const char *s)
|
|||||||
}
|
}
|
||||||
void HostFailPoolDel(hostfail_pool **p, hostfail_pool *elem)
|
void HostFailPoolDel(hostfail_pool **p, hostfail_pool *elem)
|
||||||
{
|
{
|
||||||
|
free(elem->str);
|
||||||
HASH_DEL(*p, elem);
|
HASH_DEL(*p, elem);
|
||||||
free(elem);
|
free(elem);
|
||||||
}
|
}
|
||||||
@@ -108,11 +109,7 @@ void HostFailPoolPurge(hostfail_pool **pp)
|
|||||||
HASH_ITER(hh, *pp, elem, tmp)
|
HASH_ITER(hh, *pp, elem, tmp)
|
||||||
{
|
{
|
||||||
if (now >= elem->expire)
|
if (now >= elem->expire)
|
||||||
{
|
HostFailPoolDel(pp, elem);
|
||||||
free(elem->str);
|
|
||||||
HASH_DEL(*pp, elem);
|
|
||||||
free(elem);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static time_t host_fail_purge_prev=0;
|
static time_t host_fail_purge_prev=0;
|
||||||
|
|||||||
+27
@@ -20,6 +20,25 @@ bool dropcaps(void);
|
|||||||
#define arch_nr (offsetof(struct seccomp_data, arch))
|
#define arch_nr (offsetof(struct seccomp_data, arch))
|
||||||
#define syscall_arg(x) (offsetof(struct seccomp_data, args[x]))
|
#define syscall_arg(x) (offsetof(struct seccomp_data, args[x]))
|
||||||
|
|
||||||
|
#ifndef __AUDIT_ARCH_64BIT
|
||||||
|
#define __AUDIT_ARCH_64BIT 0x80000000
|
||||||
|
#endif
|
||||||
|
#ifndef __AUDIT_ARCH_LE
|
||||||
|
#define __AUDIT_ARCH_LE 0x40000000
|
||||||
|
#endif
|
||||||
|
#ifndef EM_RISCV
|
||||||
|
#define EM_RISCV 243
|
||||||
|
#endif
|
||||||
|
#ifndef AUDIT_ARCH_RISCV64
|
||||||
|
#define AUDIT_ARCH_RISCV64 (EM_RISCV | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
|
||||||
|
#endif
|
||||||
|
#ifndef EM_LOONGARCH
|
||||||
|
#define EM_LOONGARCH 258
|
||||||
|
#endif
|
||||||
|
#ifndef AUDIT_ARCH_LOONGARCH64
|
||||||
|
#define AUDIT_ARCH_LOONGARCH64 (EM_LOONGARCH | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__aarch64__)
|
#if defined(__aarch64__)
|
||||||
|
|
||||||
# define ARCH_NR AUDIT_ARCH_AARCH64
|
# define ARCH_NR AUDIT_ARCH_AARCH64
|
||||||
@@ -74,6 +93,14 @@ bool dropcaps(void);
|
|||||||
|
|
||||||
# define ARCH_NR AUDIT_ARCH_RISCV64
|
# define ARCH_NR AUDIT_ARCH_RISCV64
|
||||||
|
|
||||||
|
#elif defined(__loongarch__) && __loongarch_grlen == 64
|
||||||
|
|
||||||
|
# define ARCH_NR AUDIT_ARCH_LOONGARCH64
|
||||||
|
|
||||||
|
#elif defined(__e2k__)
|
||||||
|
|
||||||
|
# define ARCH_NR AUDIT_ARCH_E2K
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
# error "Platform does not support seccomp filter yet"
|
# error "Platform does not support seccomp filter yet"
|
||||||
|
|||||||
+2
-3
@@ -1273,7 +1273,7 @@ void parse_params(int argc, char *argv[])
|
|||||||
params.tamper = true; // need to detect blocks and update autohostlist. cannot just slice.
|
params.tamper = true; // need to detect blocks and update autohostlist. cannot just slice.
|
||||||
break;
|
break;
|
||||||
case IDX_HOSTLIST_AUTO_FAIL_THRESHOLD:
|
case IDX_HOSTLIST_AUTO_FAIL_THRESHOLD:
|
||||||
dp->hostlist_auto_fail_threshold = (uint8_t)atoi(optarg);
|
dp->hostlist_auto_fail_threshold = atoi(optarg);
|
||||||
if (dp->hostlist_auto_fail_threshold<1 || dp->hostlist_auto_fail_threshold>20)
|
if (dp->hostlist_auto_fail_threshold<1 || dp->hostlist_auto_fail_threshold>20)
|
||||||
{
|
{
|
||||||
DLOG_ERR("auto hostlist fail threshold must be within 1..20\n");
|
DLOG_ERR("auto hostlist fail threshold must be within 1..20\n");
|
||||||
@@ -1281,7 +1281,7 @@ void parse_params(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case IDX_HOSTLIST_AUTO_FAIL_TIME:
|
case IDX_HOSTLIST_AUTO_FAIL_TIME:
|
||||||
dp->hostlist_auto_fail_time = (uint8_t)atoi(optarg);
|
dp->hostlist_auto_fail_time = atoi(optarg);
|
||||||
if (dp->hostlist_auto_fail_time<1)
|
if (dp->hostlist_auto_fail_time<1)
|
||||||
{
|
{
|
||||||
DLOG_ERR("auto hostlist fail time is not valid\n");
|
DLOG_ERR("auto hostlist fail time is not valid\n");
|
||||||
@@ -1897,7 +1897,6 @@ int main(int argc, char *argv[])
|
|||||||
set_console_io_buffering();
|
set_console_io_buffering();
|
||||||
set_env_exedir(argv[0]);
|
set_env_exedir(argv[0]);
|
||||||
srand(time(NULL));
|
srand(time(NULL));
|
||||||
mask_from_preflen6_prepare();
|
|
||||||
|
|
||||||
PRINT_VER;
|
PRINT_VER;
|
||||||
|
|
||||||
|
|||||||
+1
-4
@@ -835,8 +835,6 @@ static bool handle_unsent(tproxy_conn_t *conn)
|
|||||||
|
|
||||||
static bool proxy_mode_connect_remote(tproxy_conn_t *conn, struct tailhead *conn_list)
|
static bool proxy_mode_connect_remote(tproxy_conn_t *conn, struct tailhead *conn_list)
|
||||||
{
|
{
|
||||||
int remote_fd;
|
|
||||||
|
|
||||||
if (params.debug>=1)
|
if (params.debug>=1)
|
||||||
{
|
{
|
||||||
char ip_port[48];
|
char ip_port[48];
|
||||||
@@ -850,9 +848,8 @@ static bool proxy_mode_connect_remote(tproxy_conn_t *conn, struct tailhead *conn
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(conn->partner = new_conn(remote_fd, true)))
|
if (!(conn->partner = new_conn(0, true)))
|
||||||
{
|
{
|
||||||
close(remote_fd);
|
|
||||||
DLOG_ERR("socks out-of-memory (1)\n");
|
DLOG_ERR("socks out-of-memory (1)\n");
|
||||||
socks_send_rep(conn->socks_ver, conn->fd, S5_REP_GENERAL_FAILURE);
|
socks_send_rep(conn->socks_ver, conn->fd, S5_REP_GENERAL_FAILURE);
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Reference in New Issue
Block a user