tpws: --tlsrec

This commit is contained in:
bol-van 2023-10-12 12:35:06 +03:00
parent 2456aae8ad
commit 6dc413d0c9
30 changed files with 3372 additions and 3493 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -645,6 +645,9 @@ tpws_check_domain_bypass()
tpws_curl_test_update $1 $3 $s $s2 && break tpws_curl_test_update $1 $3 $s $s2 && break
done done
done done
for s2 in '--tlsrec=sni' '--tlsrec=sni --split-pos=10' '--tlsrec=sni --split-pos=10 --disorder'; do
tpws_curl_test_update $1 $3 $s2 && [ "$FORCE" != 1 ] && break
done
fi fi
report_strategy $1 $3 tpws report_strategy $1 $3 tpws
} }

View File

@ -1,21 +1,21 @@
MIT License MIT License
Copyright (c) 2016-2021 bol-van Copyright (c) 2016-2021 bol-van
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions: furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software. copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.

View File

@ -1,4 +1,4 @@
Поддерживаемые версии Поддерживаемые версии
--------------------- ---------------------
FreeBSD 11.x+ , OpenBSD 6.x+, частично MacOS Sierra+ FreeBSD 11.x+ , OpenBSD 6.x+, частично MacOS Sierra+

View File

@ -1,95 +1,95 @@
WAN=em0 LAN=em1 WAN=em0 LAN=em1
FreeBSD IPFW : FreeBSD IPFW :
ipfw delete 100 ipfw delete 100
ipfw add 100 fwd 127.0.0.1,988 tcp from me to any 80,443 proto ip4 xmit em0 not uid daemon ipfw add 100 fwd 127.0.0.1,988 tcp from me to any 80,443 proto ip4 xmit em0 not uid daemon
ipfw add 100 fwd ::1,988 tcp from me to any 80,443 proto ip6 xmit em0 not uid daemon ipfw add 100 fwd ::1,988 tcp from me to any 80,443 proto ip6 xmit em0 not uid daemon
ipfw add 100 fwd 127.0.0.1,988 tcp from any to any 80,443 proto ip4 recv em1 ipfw add 100 fwd 127.0.0.1,988 tcp from any to any 80,443 proto ip4 recv em1
ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1 ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1
ipfw delete 100 ipfw delete 100
ipfw add 100 allow tcp from me to table\(nozapret\) 80,443 ipfw add 100 allow tcp from me to table\(nozapret\) 80,443
ipfw add 100 fwd 127.0.0.1,988 tcp from me to table\(zapret\) 80,443 proto ip4 xmit em0 not uid daemon ipfw add 100 fwd 127.0.0.1,988 tcp from me to table\(zapret\) 80,443 proto ip4 xmit em0 not uid daemon
ipfw add 100 fwd ::1,988 tcp from me to table\(zapret\) 80,443 proto ip6 xmit em0 not uid daemon ipfw add 100 fwd ::1,988 tcp from me to table\(zapret\) 80,443 proto ip6 xmit em0 not uid daemon
ipfw add 100 allow tcp from any to table\(nozapret\) 80,443 recv em1 ipfw add 100 allow tcp from any to table\(nozapret\) 80,443 recv em1
ipfw add 100 fwd 127.0.0.1,988 tcp from any to any 80,443 proto ip4 recv em1 ipfw add 100 fwd 127.0.0.1,988 tcp from any to any 80,443 proto ip4 recv em1
ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1 ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1
/opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 /opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
; Loop avoidance. ; Loop avoidance.
; FreeBSD artificially ignores sockarg for ipv6 in the kernel. ; FreeBSD artificially ignores sockarg for ipv6 in the kernel.
; This limitation is coming from the ipv6 early age. Code is still in "testing" state. 10-20 years. Everybody forgot about it. ; This limitation is coming from the ipv6 early age. Code is still in "testing" state. 10-20 years. Everybody forgot about it.
; dvtws sends ipv6 forged frames using another divert socket (HACK). they can be filtered out using 'diverted'. ; dvtws sends ipv6 forged frames using another divert socket (HACK). they can be filtered out using 'diverted'.
ipfw delete 100 ipfw delete 100
ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted not sockarg xmit em0 ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted not sockarg xmit em0
ipfw add 100 divert 989 udp from any to any 443 out not diverted not sockarg xmit em0 ipfw add 100 divert 989 udp from any to any 443 out not diverted not sockarg xmit em0
ipfw delete 100 ipfw delete 100
ipfw add 100 allow tcp from me to table\(nozapret\) 80,443 ipfw add 100 allow tcp from me to table\(nozapret\) 80,443
ipfw add 100 divert 989 tcp from any to table\(zapret\) 80,443 out not diverted not sockarg xmit em0 ipfw add 100 divert 989 tcp from any to table\(zapret\) 80,443 out not diverted not sockarg xmit em0
/opt/zapret/nfq/dvtws --port=989 --debug --dpi-desync=split /opt/zapret/nfq/dvtws --port=989 --debug --dpi-desync=split
sample ipfw NAT setup : sample ipfw NAT setup :
WAN=em0 WAN=em0
LAN=em1 LAN=em1
ipfw -q flush ipfw -q flush
ipfw -q nat 1 config if $WAN unreg_only reset ipfw -q nat 1 config if $WAN unreg_only reset
ipfw -q add 10 allow ip from any to any via $LAN ipfw -q add 10 allow ip from any to any via $LAN
ipfw -q add 20 allow ip from any to any via lo0 ipfw -q add 20 allow ip from any to any via lo0
ipfw -q add 300 nat 1 ip4 from any to any in recv $WAN ipfw -q add 300 nat 1 ip4 from any to any in recv $WAN
ipfw -q add 301 check-state ipfw -q add 301 check-state
ipfw -q add 350 skipto 390 tcp from any to any out xmit $WAN setup keep-state ipfw -q add 350 skipto 390 tcp from any to any out xmit $WAN setup keep-state
ipfw -q add 350 skipto 390 udp from any to any out xmit $WAN keep-state ipfw -q add 350 skipto 390 udp from any to any out xmit $WAN keep-state
ipfw -q add 360 allow all from any to me in recv $WAN ipfw -q add 360 allow all from any to me in recv $WAN
ipfw -q add 390 nat 1 ip4 from any to any out xmit $WAN ipfw -q add 390 nat 1 ip4 from any to any out xmit $WAN
ipfw -q add 10000 allow ip from any to any ipfw -q add 10000 allow ip from any to any
Forwarding : Forwarding :
sysctl net.inet.ip.forwarding=1 sysctl net.inet.ip.forwarding=1
sysctl net.inet6.ip6.forwarding=1 sysctl net.inet6.ip6.forwarding=1
OpenBSD PF : OpenBSD PF :
; dont know how to rdr-to from local system. doesn't seem to work. only works for routed traffic. ; dont know how to rdr-to from local system. doesn't seem to work. only works for routed traffic.
/etc/pf.conf /etc/pf.conf
pass in quick on em1 inet proto tcp to port {80,443} rdr-to 127.0.0.1 port 988 pass in quick on em1 inet proto tcp to port {80,443} rdr-to 127.0.0.1 port 988
pass in quick on em1 inet6 proto tcp to port {80,443} rdr-to ::1 port 988 pass in quick on em1 inet6 proto tcp to port {80,443} rdr-to ::1 port 988
pfctl -f /etc/pf.conf pfctl -f /etc/pf.conf
/opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 /opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
; dvtws works both for routed and local ; dvtws works both for routed and local
pass in quick on em0 proto tcp from port {80,443} no state pass in quick on em0 proto tcp from port {80,443} no state
pass out quick on em0 proto tcp to port {80,443} divert-packet port 989 no state pass out quick on em0 proto tcp to port {80,443} divert-packet port 989 no state
pfctl -f /etc/pf.conf pfctl -f /etc/pf.conf
./dvtws --port=989 --dpi-desync=split2 ./dvtws --port=989 --dpi-desync=split2
; dvtws with table limitations : to zapret,zapret6 but not to nozapret,nozapret6 ; dvtws with table limitations : to zapret,zapret6 but not to nozapret,nozapret6
; reload tables : pfctl -f /etc/pf.conf ; reload tables : pfctl -f /etc/pf.conf
set limit table-entries 2000000 set limit table-entries 2000000
table <zapret> file "/opt/zapret/ipset/zapret-ip.txt" table <zapret> file "/opt/zapret/ipset/zapret-ip.txt"
table <zapret-user> file "/opt/zapret/ipset/zapret-ip-user.txt" table <zapret-user> file "/opt/zapret/ipset/zapret-ip-user.txt"
table <nozapret> file "/opt/zapret/ipset/zapret-ip-exclude.txt" table <nozapret> file "/opt/zapret/ipset/zapret-ip-exclude.txt"
pass out quick on em0 inet proto tcp to <nozapret> port {80,443} pass out quick on em0 inet proto tcp to <nozapret> port {80,443}
pass in quick on em0 inet proto tcp from <zapret> port {80,443} no state pass in quick on em0 inet proto tcp from <zapret> port {80,443} no state
pass out quick on em0 inet proto tcp to <zapret> port {80,443} divert-packet port 989 no state pass out quick on em0 inet proto tcp to <zapret> port {80,443} divert-packet port 989 no state
pass in quick on em0 inet proto tcp from <zapret-user> port {80,443} no state pass in quick on em0 inet proto tcp from <zapret-user> port {80,443} no state
pass out quick on em0 inet proto tcp to <zapret-user> port {80,443} divert-packet port 989 no state pass out quick on em0 inet proto tcp to <zapret-user> port {80,443} divert-packet port 989 no state
table <zapret6> file "/opt/zapret/ipset/zapret-ip6.txt" table <zapret6> file "/opt/zapret/ipset/zapret-ip6.txt"
table <zapret6-user> file "/opt/zapret/ipset/zapret-ip-user6.txt" table <zapret6-user> file "/opt/zapret/ipset/zapret-ip-user6.txt"
table <nozapret6> file "/opt/zapret/ipset/zapret-ip-exclude6.txt" table <nozapret6> file "/opt/zapret/ipset/zapret-ip-exclude6.txt"
pass out quick on em0 inet6 proto tcp to <nozapret6> port {80,443} pass out quick on em0 inet6 proto tcp to <nozapret6> port {80,443}
pass in quick on em0 inet6 proto tcp from <zapret6> port {80,443} no state pass in quick on em0 inet6 proto tcp from <zapret6> port {80,443} no state
pass out quick on em0 inet6 proto tcp to <zapret6> port {80,443} divert-packet port 989 no state pass out quick on em0 inet6 proto tcp to <zapret6> port {80,443} divert-packet port 989 no state
pass in quick on em0 inet6 proto tcp from <zapret6-user> port {80,443} no state pass in quick on em0 inet6 proto tcp from <zapret6-user> port {80,443} no state
pass out quick on em0 inet6 proto tcp to <zapret6-user> port {80,443} divert-packet port 989 no state pass out quick on em0 inet6 proto tcp to <zapret6-user> port {80,443} divert-packet port 989 no state

View File

@ -1,245 +1,249 @@
v1 v1
Initial release Initial release
v2 v2
nfqws : command line options change. now using standard getopt. nfqws : command line options change. now using standard getopt.
nfqws : added options for window size changing and "Host:" case change nfqws : added options for window size changing and "Host:" case change
ISP support : tested on mns.ru and beeline (corbina) ISP support : tested on mns.ru and beeline (corbina)
init scripts : rewritten init scripts for simple choise of ISP init scripts : rewritten init scripts for simple choise of ISP
create_ipset : now using 'ipset restore', it works much faster create_ipset : now using 'ipset restore', it works much faster
readme : updated. now using UTF-8 charset. readme : updated. now using UTF-8 charset.
v3 v3
tpws : added transparent proxy (supports TPROXY and DNAT). tpws : added transparent proxy (supports TPROXY and DNAT).
can help when ISP tracks whole HTTP session, not only the beginning can help when ISP tracks whole HTTP session, not only the beginning
ipset : added zapret-hosts-user.txt which contain user defined host names to be resolved ipset : added zapret-hosts-user.txt which contain user defined host names to be resolved
and added to zapret ip list and added to zapret ip list
ISP support : dom.ru support via TPROXY/DNAT ISP support : dom.ru support via TPROXY/DNAT
ISP support : successfully tested sknt.ru on 'domru' configuration ISP support : successfully tested sknt.ru on 'domru' configuration
other configs will probably also work, but cannot test other configs will probably also work, but cannot test
compile : openwrt compile howto compile : openwrt compile howto
v4 v4
tpws : added ability to insert extra space after http method : "GET /" => "GET /" tpws : added ability to insert extra space after http method : "GET /" => "GET /"
ISP support : TKT support ISP support : TKT support
v5 v5
nfqws : ipv6 support in nfqws nfqws : ipv6 support in nfqws
v6 v6
ipset : added "get_antizapret.sh" ipset : added "get_antizapret.sh"
v7 v7
tpws : added ability to insert "." after Host: name tpws : added ability to insert "." after Host: name
v8 v8
openwrt init : removed hotplug.d/firewall because of race conditions. now only use /etc/firewall.user openwrt init : removed hotplug.d/firewall because of race conditions. now only use /etc/firewall.user
v9 v9
ipban : added ipban ipset. place domains banned by ip to zapret-hosts-user-ipban.txt ipban : added ipban ipset. place domains banned by ip to zapret-hosts-user-ipban.txt
these IPs must be soxified for both http and https these IPs must be soxified for both http and https
ISP support : tiera support ISP support : tiera support
ISP support : added DNS filtering to ubuntu and debian scripts ISP support : added DNS filtering to ubuntu and debian scripts
v10 v10
tpws : added split-pos option. split every message at specified position tpws : added split-pos option. split every message at specified position
v11 v11
ipset : scripts optimizations ipset : scripts optimizations
v12 v12
nfqws : fix wrong tcp checksum calculation if packet length is odd and platform is big-endian nfqws : fix wrong tcp checksum calculation if packet length is odd and platform is big-endian
v13 v13
added binaries added binaries
v14 v14
change get_antizapret script to work with https://github.com/zapret-info/z-i/raw/master/dump.csv change get_antizapret script to work with https://github.com/zapret-info/z-i/raw/master/dump.csv
filter out 192.168.*, 127.*, 10.* from blocked ips filter out 192.168.*, 127.*, 10.* from blocked ips
v15 v15
added --hostspell option to nfqws and tpws added --hostspell option to nfqws and tpws
ISP support : beeline now catches "host" but other spellings still work ISP support : beeline now catches "host" but other spellings still work
openwrt/LEDE : changed init script to work with procd openwrt/LEDE : changed init script to work with procd
tpws, nfqws : minor cosmetic fixes tpws, nfqws : minor cosmetic fixes
v16 v16
tpws: split-http-req=method : split inside method name, not after tpws: split-http-req=method : split inside method name, not after
ISP support : mns.ru changed split pos to 3 (got redirect page with HEAD req : curl -I ej.ru) ISP support : mns.ru changed split pos to 3 (got redirect page with HEAD req : curl -I ej.ru)
v17 v17
ISP support : athome moved from nfqws to tpws because of instability and http request hangs ISP support : athome moved from nfqws to tpws because of instability and http request hangs
tpws : added options unixeol,methodeol,hosttab tpws : added options unixeol,methodeol,hosttab
v18 v18
tpws,nfqws : added hostnospace option tpws,nfqws : added hostnospace option
v19 v19
tpws : added hostlist option tpws : added hostlist option
v20 v20
added ip2net. ip2net groups ips from iplist into subnets and reduces ipset size twice added ip2net. ip2net groups ips from iplist into subnets and reduces ipset size twice
v21 v21
added mdig. get_reestr.sh is *real* again added mdig. get_reestr.sh is *real* again
v22 v22
total review of init script logic total review of init script logic
dropped support of older debian 7 and ubuntu 12/14 systems dropped support of older debian 7 and ubuntu 12/14 systems
install_bin.sh : auto binaries preparation install_bin.sh : auto binaries preparation
docs: readme review. some new topics added, others deleted docs: readme review. some new topics added, others deleted
docs: VPN setup with policy based routing using wireguard docs: VPN setup with policy based routing using wireguard
docs: wireguard modding guide docs: wireguard modding guide
v23 v23
major init system rewrite major init system rewrite
openwrt : separate firewall include /etc/firewall.zapret openwrt : separate firewall include /etc/firewall.zapret
install_easy.sh : easy setup on openwrt, debian, ubuntu, centos, fedora, opensuse install_easy.sh : easy setup on openwrt, debian, ubuntu, centos, fedora, opensuse
v24 v24
separate config from init scripts separate config from init scripts
gzip support in ipset/*.sh and tpws gzip support in ipset/*.sh and tpws
v25 v25
init : move to native systemd units init : move to native systemd units
use links to units, init scripts and firewall includes, no more copying use links to units, init scripts and firewall includes, no more copying
v26 v26
ipv6 support ipv6 support
tpws : advanced bind options tpws : advanced bind options
v27 v27
tpws : major connection code rewrite. originally it was derived from not top quality example , with many bugs and potential problems. tpws : major connection code rewrite. originally it was derived from not top quality example , with many bugs and potential problems.
next generation connection code uses nonblocking sockets. now its in EXPERIMENTAL state. next generation connection code uses nonblocking sockets. now its in EXPERIMENTAL state.
v28 v28
tpws : added socks5 support tpws : added socks5 support
ipset : major RKN getlist rewrite. added antifilter.network support ipset : major RKN getlist rewrite. added antifilter.network support
v29 v29
nfqws : DPI desync attack nfqws : DPI desync attack
ip exclude system ip exclude system
v30 v30
nfqws : DPI desync attack modes : fake,rst nfqws : DPI desync attack modes : fake,rst
v31 v31
nfqws : DPI desync attack modes : disorder,disorder2,split,split2. nfqws : DPI desync attack modes : disorder,disorder2,split,split2.
nfqws : DPI desync fooling mode : badseq. multiple modes supported nfqws : DPI desync fooling mode : badseq. multiple modes supported
v32 v32
tpws : multiple binds tpws : multiple binds
init scripts : run only one instance of tpws in any case init scripts : run only one instance of tpws in any case
v33 v33
openwrt : flow offloading support openwrt : flow offloading support
config : MODE refactoring config : MODE refactoring
v34 v34
nfqws : dpi-desync 2 mode combos nfqws : dpi-desync 2 mode combos
nfqws : dpi-desync without parameter no more supported. previously it meant "fake" nfqws : dpi-desync without parameter no more supported. previously it meant "fake"
nfqws : custom fake http request and tls client hello nfqws : custom fake http request and tls client hello
v35 v35
limited FreeBSD and OpenBSD support limited FreeBSD and OpenBSD support
v36 v36
full FreeBSD and OpenBSD support full FreeBSD and OpenBSD support
v37 v37
limited MacOS support limited MacOS support
v38 v38
MacOS easy install MacOS easy install
v39 v39
nfqws: conntrack, wssize nfqws: conntrack, wssize
v40 v40
init scripts : IFACE_LAN, IFACE_WAN now accept multiple interfaces init scripts : IFACE_LAN, IFACE_WAN now accept multiple interfaces
init scripts : openwrt uses now OPENWRT_LAN parameter to override incoming interfaces for tpws init scripts : openwrt uses now OPENWRT_LAN parameter to override incoming interfaces for tpws
v41 v41
install_easy : openrc support install_easy : openrc support
v42 v42
blockcheck.sh blockcheck.sh
v43 v43
nfqws: UDP desync with conntrack support (any-protocol only for now) nfqws: UDP desync with conntrack support (any-protocol only for now)
v44 v44
nfqws: ipfrag nfqws: ipfrag
v45 v45
nfqws: hop-by-hop ipv6 desync and fooling nfqws: hop-by-hop ipv6 desync and fooling
v46 v46
big startup script refactoring to support nftables and new openwrt snapshot builds with firewall4 big startup script refactoring to support nftables and new openwrt snapshot builds with firewall4
v47 v47
nfqws: QUIC initial decryption nfqws: QUIC initial decryption
nfqws: udplen, fakeknown dpi desync modes nfqws: udplen, fakeknown dpi desync modes
v48 v48
nfqws, tpws : multiple --hostlist and --hostlist-exclude support nfqws, tpws : multiple --hostlist and --hostlist-exclude support
launch system, ipset : no more list merging. all lists are passed separately to nfqws and tpws launch system, ipset : no more list merging. all lists are passed separately to nfqws and tpws
nfqws : udplen fooling supports packet shrinking (negative increment value) nfqws : udplen fooling supports packet shrinking (negative increment value)
v49 v49
QUIC support integrated to the main system and setup QUIC support integrated to the main system and setup
v50 v50
DHT protocol support. DHT protocol support.
DPI desync mode 'tamper' for DHT. DPI desync mode 'tamper' for DHT.
HEX string support in addition to binary files. HEX string support in addition to binary files.
v51
tpws --tlsrec attack.

View File

@ -1,63 +1,63 @@
For window size changing : For window size changing :
iptables -t mangle -I PREROUTING -p tcp --sport 80 --tcp-flags SYN,ACK SYN,ACK -j NFQUEUE --queue-num 200 --queue-bypass iptables -t mangle -I PREROUTING -p tcp --sport 80 --tcp-flags SYN,ACK SYN,ACK -j NFQUEUE --queue-num 200 --queue-bypass
iptables -t mangle -I PREROUTING -p tcp --sport 80 --tcp-flags SYN,ACK SYN,ACK -m set --match-set zapret src -j NFQUEUE --queue-num 200 --queue-bypass iptables -t mangle -I PREROUTING -p tcp --sport 80 --tcp-flags SYN,ACK SYN,ACK -m set --match-set zapret src -j NFQUEUE --queue-num 200 --queue-bypass
For outgoing data manipulation ("Host:" case changing) : For outgoing data manipulation ("Host:" case changing) :
iptables -t mangle -I POSTROUTING -p tcp --dport 80 -m set --match-set zapret dst -j NFQUEUE --queue-num 200 --queue-bypass iptables -t mangle -I POSTROUTING -p tcp --dport 80 -m set --match-set zapret dst -j NFQUEUE --queue-num 200 --queue-bypass
iptables -t mangle -I POSTROUTING -p tcp --dport 80 -m set --match-set zapret dst -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 1:5 -j NFQUEUE --queue-num 200 --queue-bypass iptables -t mangle -I POSTROUTING -p tcp --dport 80 -m set --match-set zapret dst -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 1:5 -j NFQUEUE --queue-num 200 --queue-bypass
For dpi desync attack : For dpi desync attack :
iptables -t mangle -I POSTROUTING -p tcp -m multiport --dports 80,443 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 2:4 -m mark ! --mark 0x40000000/0x40000000 -j NFQUEUE --queue-num 200 --queue-bypass iptables -t mangle -I POSTROUTING -p tcp -m multiport --dports 80,443 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 2:4 -m mark ! --mark 0x40000000/0x40000000 -j NFQUEUE --queue-num 200 --queue-bypass
iptables -t mangle -I POSTROUTING -p tcp --dport 443 -m mark ! --mark 0x40000000/0x40000000 -j NFQUEUE --queue-num 200 --queue-bypass iptables -t mangle -I POSTROUTING -p tcp --dport 443 -m mark ! --mark 0x40000000/0x40000000 -j NFQUEUE --queue-num 200 --queue-bypass
iptables -t mangle -I POSTROUTING -p udp --dport 443 -m mark ! --mark 0x40000000/0x40000000 -j NFQUEUE --queue-num 200 --queue-bypass iptables -t mangle -I POSTROUTING -p udp --dport 443 -m mark ! --mark 0x40000000/0x40000000 -j NFQUEUE --queue-num 200 --queue-bypass
For TPROXY : For TPROXY :
sysctl -w net.ipv4.ip_forward=1 sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
ip -f inet rule add fwmark 1 lookup 100 ip -f inet rule add fwmark 1 lookup 100
ip -f inet route add local default dev lo table 100 ip -f inet route add local default dev lo table 100
# prevent loop # prevent loop
iptables -t filter -I INPUT -p tcp --dport 988 -j REJECT iptables -t filter -I INPUT -p tcp --dport 988 -j REJECT
iptables -t mangle -A PREROUTING -i eth1 -p tcp --dport 80 -j MARK --set-mark 1 iptables -t mangle -A PREROUTING -i eth1 -p tcp --dport 80 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth1 -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 988 iptables -t mangle -A PREROUTING -i eth1 -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 988
iptables -t mangle -A PREROUTING -i eth1 -p tcp --dport 80 -m set --match-set zapret dst -j MARK --set-mark 1 iptables -t mangle -A PREROUTING -i eth1 -p tcp --dport 80 -m set --match-set zapret dst -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth1 -p tcp --dport 80 -m mark --mark 0x1/0x1 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 988 iptables -t mangle -A PREROUTING -i eth1 -p tcp --dport 80 -m mark --mark 0x1/0x1 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 988
For DNAT : For DNAT :
# run tpws as user "tpws". its required to avoid loops. # run tpws as user "tpws". its required to avoid loops.
sysctl -w net.ipv4.conf.eth1.route_localnet=1 sysctl -w net.ipv4.conf.eth1.route_localnet=1
iptables -t nat -I PREROUTING -p tcp --dport 80 -j DNAT --to 127.0.0.127:988 iptables -t nat -I PREROUTING -p tcp --dport 80 -j DNAT --to 127.0.0.127:988
iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner ! --uid-owner tpws -j DNAT --to 127.0.0.127:988 iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner ! --uid-owner tpws -j DNAT --to 127.0.0.127:988
Reset all iptable rules : Reset all iptable rules :
iptables -F iptables -F
iptables -X iptables -X
iptables -t nat -F iptables -t nat -F
iptables -t nat -X iptables -t nat -X
iptables -t mangle -F iptables -t mangle -F
iptables -t mangle -X iptables -t mangle -X
iptables -t raw -F iptables -t raw -F
iptables -t raw -X iptables -t raw -X
Reset iptable policies : Reset iptable policies :
iptables -P INPUT ACCEPT iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT iptables -P OUTPUT ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT iptables -t mangle -P POSTROUTING ACCEPT
iptables -t mangle -P PREROUTING ACCEPT iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P OUTPUT ACCEPT iptables -t mangle -P OUTPUT ACCEPT
iptables -t raw -P PREROUTING ACCEPT iptables -t raw -P PREROUTING ACCEPT
iptables -t raw -P OUTPUT ACCEPT iptables -t raw -P OUTPUT ACCEPT

View File

@ -1,266 +1,266 @@
Пример ручной установки на debian-подобную систему Пример ручной установки на debian-подобную систему
-------------------------------------------------- --------------------------------------------------
На debian основано большое количество дистрибутивов linux, включая ubuntu. На debian основано большое количество дистрибутивов linux, включая ubuntu.
Здесь рассматриваются прежде всего Debian 8+ и Ubuntu 16+. Здесь рассматриваются прежде всего Debian 8+ и Ubuntu 16+.
Но с большой вероятностью может сработать и на производных от них. Но с большой вероятностью может сработать и на производных от них.
Главное условие - наличие systemd, apt и нескольких стандартных пакетов в репозитории. Главное условие - наличие systemd, apt и нескольких стандартных пакетов в репозитории.
Установить пакеты : Установить пакеты :
apt-get update apt-get update
apt-get install ipset curl dnsutils git apt-get install ipset curl dnsutils git
Если хотите использовать nftables, то нужен пакет nftables, а ipset не обязателен. Если хотите использовать nftables, то нужен пакет nftables, а ipset не обязателен.
Скопировать директорию zapret в /opt или скачать через git : Скопировать директорию zapret в /opt или скачать через git :
cd /opt cd /opt
git clone --depth 1 https://github.com/bol-van/zapret git clone --depth 1 https://github.com/bol-van/zapret
Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики. Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики.
/opt/zapret/install_bin.sh /opt/zapret/install_bin.sh
АЛЬТЕРНАТИВА : make -C /opt/zapret. Получите динамические бинарики под вашу ось. АЛЬТЕРНАТИВА : make -C /opt/zapret. Получите динамические бинарики под вашу ось.
Для сборки требуются dev пакеты : zlib1g-dev libcap-dev libnetfilter-queue-dev Для сборки требуются dev пакеты : zlib1g-dev libcap-dev libnetfilter-queue-dev
Настроить параметры согласно разделу "Выбор параметров". Настроить параметры согласно разделу "Выбор параметров".
Создать ссылку на service unit в systemd : Создать ссылку на service unit в systemd :
ln -fs /opt/zapret/init.d/systemd/zapret.service /lib/systemd/system ln -fs /opt/zapret/init.d/systemd/zapret.service /lib/systemd/system
Удалить старые листы, если они были созданы ранее : Удалить старые листы, если они были созданы ранее :
/opt/zapret/ipset/clear_lists.sh /opt/zapret/ipset/clear_lists.sh
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены. По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
Выполнить скрипт обновления листа : Выполнить скрипт обновления листа :
/opt/zapret/ipset/get_config.sh /opt/zapret/ipset/get_config.sh
Настроить таймер systemd для обновления листа : Настроить таймер systemd для обновления листа :
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.service /lib/systemd/system ln -fs /opt/zapret/init.d/systemd/zapret-list-update.service /lib/systemd/system
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.timer /lib/systemd/system ln -fs /opt/zapret/init.d/systemd/zapret-list-update.timer /lib/systemd/system
Принять изменения в systemd : Принять изменения в systemd :
systemctl daemon-reload systemctl daemon-reload
Включить автозапуск службы : Включить автозапуск службы :
systemctl enable zapret systemctl enable zapret
Включить таймер обновления листа : Включить таймер обновления листа :
systemctl enable zapret-list-update.timer systemctl enable zapret-list-update.timer
Запустить службу : Запустить службу :
systemctl start zapret systemctl start zapret
Шпаргалка по управлению службой и таймером : Шпаргалка по управлению службой и таймером :
enable auto start : systemctl enable zapret enable auto start : systemctl enable zapret
disable auto start : systemctl disable zapret disable auto start : systemctl disable zapret
start : systemctl start zapret start : systemctl start zapret
stop : systemctl stop zapret stop : systemctl stop zapret
status, output messages : systemctl status zapret status, output messages : systemctl status zapret
timer info : systemctl list-timer timer info : systemctl list-timer
delete service : systemctl disable zapret ; rm /lib/systemd/system/zapret.service delete service : systemctl disable zapret ; rm /lib/systemd/system/zapret.service
delete timer : systemctl disable zapret-list-update.timer ; rm /lib/systemd/system/zapret-list-update.* delete timer : systemctl disable zapret-list-update.timer ; rm /lib/systemd/system/zapret-list-update.*
Centos 7+, Fedora Centos 7+, Fedora
----------------- -----------------
Centos с 7 версии и более-менее новые федоры построены на systemd. Centos с 7 версии и более-менее новые федоры построены на systemd.
В качестве пакетного менеджера используется yum. В качестве пакетного менеджера используется yum.
Установить пакеты : Установить пакеты :
yum install -y curl ipset dnsutils git yum install -y curl ipset dnsutils git
Далее все аналогично debian. Далее все аналогично debian.
OpenSUSE OpenSUSE
-------- --------
Новые OpenSUSE основаны на systemd и менеджере пакетов zypper. Новые OpenSUSE основаны на systemd и менеджере пакетов zypper.
Установить пакеты : Установить пакеты :
zypper --non-interactive install curl ipset zypper --non-interactive install curl ipset
Далее все аналогично debian, кроме расположения systemd. Далее все аналогично debian, кроме расположения systemd.
В opensuse он находится не в /lib/systemd, а в /usr/lib/systemd. В opensuse он находится не в /lib/systemd, а в /usr/lib/systemd.
Правильные команды будут : Правильные команды будут :
ln -fs /opt/zapret/init.d/systemd/zapret.service /usr/lib/systemd/system ln -fs /opt/zapret/init.d/systemd/zapret.service /usr/lib/systemd/system
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.service /usr/lib/systemd/system ln -fs /opt/zapret/init.d/systemd/zapret-list-update.service /usr/lib/systemd/system
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.timer /usr/lib/systemd/system ln -fs /opt/zapret/init.d/systemd/zapret-list-update.timer /usr/lib/systemd/system
Arch linux Arch linux
---------- ----------
Построен на базе systemd. Построен на базе systemd.
Установить пакеты : Установить пакеты :
pacman -Syy pacman -Syy
pacman --noconfirm -S ipset curl pacman --noconfirm -S ipset curl
Далее все аналогично debian. Далее все аналогично debian.
Gentoo Gentoo
------ ------
Эта система использует OpenRC - улучшенную версию sysvinit. Эта система использует OpenRC - улучшенную версию sysvinit.
Установка пакетов производится командой : emerge <package_name> Установка пакетов производится командой : emerge <package_name>
Пакеты собираются из исходников. Пакеты собираются из исходников.
Требуются все те же ipset, curl, git для скачивания с github. Требуются все те же ipset, curl, git для скачивания с github.
git и curl по умолчанию могут присутствовать, ipset отсутствует. git и curl по умолчанию могут присутствовать, ipset отсутствует.
emerge ipset emerge ipset
Настроить параметры согласно разделу "Выбор параметров". Настроить параметры согласно разделу "Выбор параметров".
Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики. Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики.
/opt/zapret/install_bin.sh /opt/zapret/install_bin.sh
АЛЬТЕРНАТИВА : make -C /opt/zapret. Получите динамические бинарики под вашу ось. АЛЬТЕРНАТИВА : make -C /opt/zapret. Получите динамические бинарики под вашу ось.
Удалить старые листы, если они были созданы ранее : Удалить старые листы, если они были созданы ранее :
/opt/zapret/ipset/clear_lists.sh /opt/zapret/ipset/clear_lists.sh
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены. По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
Выполнить скрипт обновления листа : Выполнить скрипт обновления листа :
/opt/zapret/ipset/get_config.sh /opt/zapret/ipset/get_config.sh
Зашедулить обновление листа : Зашедулить обновление листа :
crontab -e crontab -e
Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh" Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh"
Подключить init скрипт : Подключить init скрипт :
ln -fs /opt/zapret/init.d/openrc/zapret /etc/init.d ln -fs /opt/zapret/init.d/openrc/zapret /etc/init.d
rc-update add zapret rc-update add zapret
Запустить службу : Запустить службу :
rc-service zapret start rc-service zapret start
Шпаргалка по управлению службой : Шпаргалка по управлению службой :
enable auto start : rc-update add zapret enable auto start : rc-update add zapret
disable auto start : rc-update del zapret disable auto start : rc-update del zapret
start : rc-service zapret start start : rc-service zapret start
stop : rc-service zapret stop stop : rc-service zapret stop
Ручная установка на openwrt/LEDE 15.xx-21.xx Ручная установка на openwrt/LEDE 15.xx-21.xx
-------------------------------------------- --------------------------------------------
!!! Данная инструкция написана для систем, основанных на iptables+firewall3 !!! Данная инструкция написана для систем, основанных на iptables+firewall3
!!! В новых версиях openwrt переходит на nftables+firewall4, инструкция неприменима. Пользуйтесь install_easy.sh !!! В новых версиях openwrt переходит на nftables+firewall4, инструкция неприменима. Пользуйтесь install_easy.sh
Установить дополнительные пакеты : Установить дополнительные пакеты :
opkg update opkg update
opkg install iptables-mod-extra iptables-mod-nfqueue iptables-mod-filter iptables-mod-ipopt iptables-mod-conntrack-extra ipset curl opkg install iptables-mod-extra iptables-mod-nfqueue iptables-mod-filter iptables-mod-ipopt iptables-mod-conntrack-extra ipset curl
(ipv6) opkg install ip6tables-mod-nat (ipv6) opkg install ip6tables-mod-nat
(опционально) opkg install gzip (опционально) opkg install gzip
(опционально) opkg install coreutils-sort (опционально) opkg install coreutils-sort
ЭКОНОМИЯ МЕСТА : ЭКОНОМИЯ МЕСТА :
gzip от busybox в разы медленней полноценного варианта. gzip используется скриптами получения листов. gzip от busybox в разы медленней полноценного варианта. gzip используется скриптами получения листов.
sort от busybox медленней полноценного варианта и жрет намного больше памяти. sort используется скриптами получения листов. sort от busybox медленней полноценного варианта и жрет намного больше памяти. sort используется скриптами получения листов.
iptables-mod-nfqueue можно выкинуть, если не будем пользоваться nfqws iptables-mod-nfqueue можно выкинуть, если не будем пользоваться nfqws
curl можно выкинуть, если для получения ip листа будет использоваться только get_user.sh curl можно выкинуть, если для получения ip листа будет использоваться только get_user.sh
Самая главная трудность - скомпилировать программы на C. Это можно сделать на linux x64 при помощи SDK, который Самая главная трудность - скомпилировать программы на C. Это можно сделать на linux x64 при помощи SDK, который
можно скачать с официального сайта openwrt или LEDE. Но процесс кросс компиляции - это всегда сложности. можно скачать с официального сайта openwrt или LEDE. Но процесс кросс компиляции - это всегда сложности.
Недостаточно запустить make как на традиционной linux системе. Недостаточно запустить make как на традиционной linux системе.
Поэтому в binaries имеются готовые статические бинарики для всех самых распространенных архитектур. Поэтому в binaries имеются готовые статические бинарики для всех самых распространенных архитектур.
Статическая сборка означает, что бинарик не зависит от типа libc (glibc, uclibc или musl) и наличия установленных so. Статическая сборка означает, что бинарик не зависит от типа libc (glibc, uclibc или musl) и наличия установленных so.
Его можно использовать сразу. Лишь бы подходил тип CPU. У ARM и MIPS есть несколько версий. Его можно использовать сразу. Лишь бы подходил тип CPU. У ARM и MIPS есть несколько версий.
Скорее всего найдется рабочий вариант. Если нет - вам придется собирать самостоятельно. Скорее всего найдется рабочий вариант. Если нет - вам придется собирать самостоятельно.
Для всех поддерживаемых архитектур бинарики запакованы upx. На текущий момент все, кроме mips64. Для всех поддерживаемых архитектур бинарики запакованы upx. На текущий момент все, кроме mips64.
Скопировать директорию "zapret" в /opt на роутер. Скопировать директорию "zapret" в /opt на роутер.
Если места достаточно, самый простой способ : Если места достаточно, самый простой способ :
opkg update opkg update
opkg install git-http opkg install git-http
mkdir /opt mkdir /opt
cd /opt cd /opt
git clone --depth 1 https://github.com/bol-van/zapret git clone --depth 1 https://github.com/bol-van/zapret
Если места немного : Если места немного :
opkg update opkg update
opkg install openssh-sftp-server unzip opkg install openssh-sftp-server unzip
ifconfig br-lan ifconfig br-lan
Скачать на комп с github zip архив кнопкой "Clone or download"->Download ZIP Скачать на комп с github zip архив кнопкой "Clone or download"->Download ZIP
Скопировать средствами sftp zip архив на роутер в /tmp. Скопировать средствами sftp zip архив на роутер в /tmp.
mkdir /opt mkdir /opt
cd /opt cd /opt
unzip /tmp/zapret-master.zip unzip /tmp/zapret-master.zip
mv zapret-master zapret mv zapret-master zapret
rm /tmp/zapret-master.zip rm /tmp/zapret-master.zip
Если места совсем мало : Если места совсем мало :
На linux системе скачать и распаковать zapret. Оставить необходимый минимум файлов. На linux системе скачать и распаковать zapret. Оставить необходимый минимум файлов.
Запаковать в архив zapret.tar.gz. Запаковать в архив zapret.tar.gz.
nc -l -p 1111 <zapret.tar.gz nc -l -p 1111 <zapret.tar.gz
На роутере На роутере
cd /tmp cd /tmp
nc <linux_system_ip> 1111 >zapret.tar.gz nc <linux_system_ip> 1111 >zapret.tar.gz
Не стоит работать с распакованной версией zapret на windows. Потеряются ссылки и chmod. Не стоит работать с распакованной версией zapret на windows. Потеряются ссылки и chmod.
Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики. Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики.
/opt/zapret/install_bin.sh /opt/zapret/install_bin.sh
Создать ссылку на скрипт запуска : Создать ссылку на скрипт запуска :
ln -fs /opt/zapret/init.d/openwrt/zapret /etc/init.d ln -fs /opt/zapret/init.d/openwrt/zapret /etc/init.d
Создать ссылку на скрипт события поднятия интерфейса : Создать ссылку на скрипт события поднятия интерфейса :
ln -fs /opt/zapret/init.d/openwrt/90-zapret /etc/hotplug.d/iface ln -fs /opt/zapret/init.d/openwrt/90-zapret /etc/hotplug.d/iface
Настроить параметры согласно разделу "Выбор параметров". Настроить параметры согласно разделу "Выбор параметров".
Удалить старые листы, если они были созданы ранее : Удалить старые листы, если они были созданы ранее :
/opt/zapret/ipset/clear_lists.sh /opt/zapret/ipset/clear_lists.sh
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены. По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
Выполнить скрипт обновления листа : Выполнить скрипт обновления листа :
/opt/zapret/ipset/get_config.sh /opt/zapret/ipset/get_config.sh
Зашедулить обновление листа : Зашедулить обновление листа :
crontab -e crontab -e
Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh" Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh"
Включить автозапуск службы и запустить ее : Включить автозапуск службы и запустить ее :
/etc/init.d/zapret enable /etc/init.d/zapret enable
/etc/init.d/zapret start /etc/init.d/zapret start
ПРИМЕЧАНИЕ : на этапе старта системы интерфейсы еще не подняты. в некоторых случаях невозможно правильно ПРИМЕЧАНИЕ : на этапе старта системы интерфейсы еще не подняты. в некоторых случаях невозможно правильно
сформировать параметры запуска демонов, не зная имя физического интерфейса LAN. сформировать параметры запуска демонов, не зная имя физического интерфейса LAN.
рипт из /etc/hotplug.d/iface перезапустит демоны по событию поднятия LAN. рипт из /etc/hotplug.d/iface перезапустит демоны по событию поднятия LAN.
Создать ссылку на firewall include : Создать ссылку на firewall include :
ln -fs /opt/zapret/init.d/openwrt/firewall.zapret /etc/firewall.zapret ln -fs /opt/zapret/init.d/openwrt/firewall.zapret /etc/firewall.zapret
Проверить была ли создана ранее запись о firewall include : Проверить была ли создана ранее запись о firewall include :
uci show firewall | grep firewall.zapret uci show firewall | grep firewall.zapret
Если firewall.zapret нет, значит добавить : Если firewall.zapret нет, значит добавить :
uci add firewall include uci add firewall include
uci set firewall.@include[-1].path="/etc/firewall.zapret" uci set firewall.@include[-1].path="/etc/firewall.zapret"
uci set firewall.@include[-1].reload="1" uci set firewall.@include[-1].reload="1"
uci commit firewall uci commit firewall
Проверить не включен ли flow offload : Проверить не включен ли flow offload :
uci show firewall.@defaults[0] uci show firewall.@defaults[0]
Если flow_offloading=1 или flow_offloading_hw=1 , Если flow_offloading=1 или flow_offloading_hw=1 ,
uci set firewall.@defaults[0].flow_offloading=0 uci set firewall.@defaults[0].flow_offloading=0
uci set firewall.@defaults[0].flow_offloading_hw=0 uci set firewall.@defaults[0].flow_offloading_hw=0
uci commit firewall uci commit firewall
Перезапустить фаервол : Перезапустить фаервол :
fw3 restart fw3 restart
Посмотреть через iptables -nL, ip6tables -nL или через luci вкладку "firewall" появились ли нужные правила. Посмотреть через iptables -nL, ip6tables -nL или через luci вкладку "firewall" появились ли нужные правила.
ЭКОНОМИЯ МЕСТА : если его мало, то можно оставить в директории zapret лишь подкаталоги ЭКОНОМИЯ МЕСТА : если его мало, то можно оставить в директории zapret лишь подкаталоги
ipset, common, файл config, init.d/openwrt. ipset, common, файл config, init.d/openwrt.
Далее нужно создать подкаталоги с реально используемыми бинариками (ip2net, mdig, tpws, nfq) Далее нужно создать подкаталоги с реально используемыми бинариками (ip2net, mdig, tpws, nfq)
и скопировать туда из binaries рабочие executables. и скопировать туда из binaries рабочие executables.
ЕСЛИ ВСЕ ПЛОХО С МЕСТОМ : откажитесь от работы со списком РКН. используйте только get_user.sh ЕСЛИ ВСЕ ПЛОХО С МЕСТОМ : откажитесь от работы со списком РКН. используйте только get_user.sh
ЕСЛИ СОВСЕМ ВСЕ УЖАСНО С МЕСТОМ : берете tpws и делаете все своими руками. поднятие iptables, автостарт бинарика. ЕСЛИ СОВСЕМ ВСЕ УЖАСНО С МЕСТОМ : берете tpws и делаете все своими руками. поднятие iptables, автостарт бинарика.
С некоторых версий скрипты запуска zapret без ipset не работают (он требуется для ip exclude) С некоторых версий скрипты запуска zapret без ipset не работают (он требуется для ip exclude)
СОВЕТ : Покупайте только роутеры с USB. В USB можно воткнуть флэшку и вынести на нее корневую файловую систему СОВЕТ : Покупайте только роутеры с USB. В USB можно воткнуть флэшку и вынести на нее корневую файловую систему
или использовать ее в качестве оверлея. Не надо мучать себя, запихивая незапихиваемое в 8 мб встроенной флэшки. или использовать ее в качестве оверлея. Не надо мучать себя, запихивая незапихиваемое в 8 мб встроенной флэшки.
Для комфортной работы с zapret нужен роутер с 16 Mb встроенной памяти или USB разъемом и 128+ Mb RAM. Для комфортной работы с zapret нужен роутер с 16 Mb встроенной памяти или USB разъемом и 128+ Mb RAM.
На 64 Mb без swap будут проблемы с листами РКН. Если у вас только 64 Mb, и вы хотите листы РКН, подключите swap. На 64 Mb без swap будут проблемы с листами РКН. Если у вас только 64 Mb, и вы хотите листы РКН, подключите swap.
32 Mb для современных версий openwrt - конфигурация на грани живучести. Возможны хаотические падения процессов в oom. 32 Mb для современных версий openwrt - конфигурация на грани живучести. Возможны хаотические падения процессов в oom.
Работа с листами РКН невозможна в принципе. Работа с листами РКН невозможна в принципе.

View File

@ -1,26 +1,26 @@
nftables test cheat sheet nftables test cheat sheet
simplified rules to test nfqws and tpws simplified rules to test nfqws and tpws
For DNAT : For DNAT :
# run tpws as user "tpws". its required to avoid loops. # run tpws as user "tpws". its required to avoid loops.
nft delete table inet ztest nft delete table inet ztest
nft create table inet ztest nft create table inet ztest
nft add chain inet ztest pre "{type nat hook prerouting priority dstnat;}" nft add chain inet ztest pre "{type nat hook prerouting priority dstnat;}"
nft add rule inet ztest pre tcp dport "{80,443}" redirect to :988 nft add rule inet ztest pre tcp dport "{80,443}" redirect to :988
nft add chain inet ztest out "{type nat hook output priority -100;}" nft add chain inet ztest out "{type nat hook output priority -100;}"
nft add rule inet ztest out tcp dport "{80,443}" skuid != tpws redirect to :988 nft add rule inet ztest out tcp dport "{80,443}" skuid != tpws redirect to :988
For dpi desync attack : For dpi desync attack :
nft delete table inet ztest nft delete table inet ztest
nft create table inet ztest nft create table inet ztest
nft add chain inet ztest post "{type filter hook postrouting priority mangle;}" nft add chain inet ztest post "{type filter hook postrouting priority mangle;}"
nft add rule inet ztest post tcp dport "{80,443}" queue num 200 bypass nft add rule inet ztest post tcp dport "{80,443}" queue num 200 bypass
show rules : nft list table inet ztest show rules : nft list table inet ztest
delete table : nft delete table inet ztest delete table : nft delete table inet ztest

View File

@ -1,4 +1,4 @@
nftables - это технология, пришедшая на замену iptables. nftables - это технология, пришедшая на замену iptables.
В ней собрали все, что относилось к различным iptables. А их немало. iptables, ip6tables, ebtables, arptables, ipset. В ней собрали все, что относилось к различным iptables. А их немало. iptables, ip6tables, ebtables, arptables, ipset.
Весь код из разрозненных, но похожих компонент, собрали в одно целое с единым синтаксисом. Весь код из разрозненных, но похожих компонент, собрали в одно целое с единым синтаксисом.
Добавили различные конструкции языка, позволяющие писать правила более лаконично, не повторяя одни и те же команды с небольшими различиями. Добавили различные конструкции языка, позволяющие писать правила более лаконично, не повторяя одни и те же команды с небольшими различиями.

View File

@ -1,4 +1,4 @@
Специально для тех, кто хочет побыстрее начать, но не хочет слишком углубляться в простыню readme.txt. Специально для тех, кто хочет побыстрее начать, но не хочет слишком углубляться в простыню readme.txt.
Предупреждение : не пишите в issue вопросы типа "как скопировать файл", "как скачать", "как запустить", ... Предупреждение : не пишите в issue вопросы типа "как скопировать файл", "как скачать", "как запустить", ...
То есть все , что касается базовых навыков обращения с ОС linux. Эти вопросы буду закрывать сразу. То есть все , что касается базовых навыков обращения с ОС linux. Эти вопросы буду закрывать сразу.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
Данный мануал пишется не как копипастная инструкция, а как помощь уже соображающему. Данный мануал пишется не как копипастная инструкция, а как помощь уже соображающему.
Если вы не знаете основ сетей, linux, openwrt, а пытаетесь что-то скопипастить отсюда без малейшего Если вы не знаете основ сетей, linux, openwrt, а пытаетесь что-то скопипастить отсюда без малейшего
понимания смысла, то маловероятно, что у вас что-то заработает. Не тратье свое время напрасно. понимания смысла, то маловероятно, что у вас что-то заработает. Не тратье свое время напрасно.
Цель - донести принципы как это настраивается вообще, а не указать какую буковку где вписать. Цель - донести принципы как это настраивается вообще, а не указать какую буковку где вписать.

View File

@ -31,6 +31,11 @@ bool set_hl(int fd, int hl);
bool set_ttl_hl(int fd, int ttl); bool set_ttl_hl(int fd, int ttl);
int get_so_error(int fd); int get_so_error(int fd);
// alignment-safe functions
static inline uint16_t pntoh16(const uint8_t *p) { static inline uint16_t pntoh16(const uint8_t *p) {
return ((uint16_t)p[0] << 8) | (uint16_t)p[1]; return ((uint16_t)p[0] << 8) | (uint16_t)p[1];
} }
static inline void phton16(uint8_t *p, uint16_t v) {
p[0] = (uint8_t)(v>>8);
p[1] = (uint8_t)v;
}

View File

@ -8,6 +8,7 @@
#include "strpool.h" #include "strpool.h"
enum splithttpreq { split_none = 0, split_method, split_host }; enum splithttpreq { split_none = 0, split_method, split_host };
enum tlsrec { tlsrec_none = 0, tlsrec_sni, tlsrec_pos };
enum bindll { unwanted=0, no, prefer, force }; enum bindll { unwanted=0, no, prefer, force };
#define MAX_BINDS 32 #define MAX_BINDS 32
@ -41,6 +42,8 @@ struct params_s
int hostpad; int hostpad;
char hostspell[4]; char hostspell[4];
enum splithttpreq split_http_req; enum splithttpreq split_http_req;
enum tlsrec tlsrec;
int tlsrec_pos;
bool split_any_protocol; bool split_any_protocol;
int split_pos; int split_pos;
bool disorder; bool disorder;

View File

@ -4,11 +4,12 @@
#include "params.h" #include "params.h"
#include "hostlist.h" #include "hostlist.h"
#include "protocol.h" #include "protocol.h"
#include "helpers.h"
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
// pHost points to "Host: ..." // pHost points to "Host: ..."
bool find_host(char **pHost,char *buf,size_t bs) bool find_host(uint8_t **pHost,uint8_t *buf,size_t bs)
{ {
if (!*pHost) if (!*pHost)
{ {
@ -23,14 +24,15 @@ bool find_host(char **pHost,char *buf,size_t bs)
} }
static const char *http_methods[] = { "GET /","POST /","HEAD /","OPTIONS /","PUT /","DELETE /","CONNECT /","TRACE /",NULL }; static const char *http_methods[] = { "GET /","POST /","HEAD /","OPTIONS /","PUT /","DELETE /","CONNECT /","TRACE /",NULL };
void modify_tcp_segment(char *segment,size_t segment_buffer_size,size_t *size,size_t *split_pos) // segment buffer has at least 5 extra bytes to extend data block
void modify_tcp_segment(uint8_t *segment,size_t segment_buffer_size,size_t *size,size_t *split_pos)
{ {
char *p, *pp, *pHost = NULL; uint8_t *p, *pp, *pHost = NULL;
size_t method_len = 0, pos; size_t method_len = 0, pos;
const char **method; const char **method;
bool bIsHttp = false, bBypass = false; bool bIsHttp = false, bBypass = false;
char bRemovedHostSpace = 0; char bRemovedHostSpace = 0;
char Host[128]; char *pc, Host[128];
*split_pos=0; *split_pos=0;
@ -57,7 +59,7 @@ void modify_tcp_segment(char *segment,size_t segment_buffer_size,size_t *size,si
memcpy(Host, p, pp - p); memcpy(Host, p, pp - p);
Host[pp - p] = '\0'; Host[pp - p] = '\0';
VPRINT("Requested Host is : %s", Host) VPRINT("Requested Host is : %s", Host)
for(p = Host; *p; p++) *p=tolower(*p); for(pc = Host; *pc; pc++) *pc=tolower(*pc);
bBypass = !HostlistCheck(params.hostlist, params.hostlist_exclude, Host); bBypass = !HostlistCheck(params.hostlist, params.hostlist_exclude, Host);
} }
if (!bBypass) if (!bBypass)
@ -208,28 +210,62 @@ void modify_tcp_segment(char *segment,size_t segment_buffer_size,size_t *size,si
{ {
VPRINT("Not acting on this request") VPRINT("Not acting on this request")
} }
return;
} }
else if (params.split_pos && params.split_pos < *size)
if (IsTLSClientHello(segment,*size))
{ {
// split-pos is the only parameter applicable to non-http block (may be https ?) char host[256];
if (IsTLSClientHello((uint8_t*)segment,*size)) size_t tpos=0,elen;
{ const uint8_t *ext;
char host[256];
VPRINT("packet contains TLS ClientHello") VPRINT("packet contains TLS ClientHello")
// we need host only if hostlist is present // we need host only if hostlist is present
if ((params.hostlist || params.hostlist_exclude) && TLSHelloExtractHost((uint8_t*)segment,*size,host,sizeof(host))) if ((params.hostlist || params.hostlist_exclude) && TLSHelloExtractHost((uint8_t*)segment,*size,host,sizeof(host)))
{
VPRINT("hostname: %s",host)
if (!HostlistCheck(params.hostlist, params.hostlist_exclude, host))
{ {
VPRINT("hostname: %s",host) VPRINT("Not acting on this request")
if (!HostlistCheck(params.hostlist, params.hostlist_exclude, host)) return;
{
VPRINT("Not acting on this request")
return;
}
} }
*split_pos = params.split_pos;
} }
else if (params.split_any_protocol) switch(params.tlsrec)
{
case tlsrec_sni:
if (TLSFindExt(segment,*size,0,&ext,&elen))
tpos = ext-segment+1; // between typical 1st and 2nd char of hostname
break;
case tlsrec_pos:
tpos = params.tlsrec_pos;
break;
default:
break;
}
if (tpos)
{
// construct 2 TLS records from one
uint16_t l = pntoh16(segment+3); // length
if (l>=2)
{
// length is checked in IsTLSClientHello and cannot exceed buffer size
if (tpos>=l) tpos=1;
VPRINT("making 2 TLS records at pos %zu",tpos)
memmove(segment+5+tpos+5,segment+5+tpos,l-tpos);
segment[5+tpos] = segment[0];
segment[5+tpos+1] = segment[1];
segment[5+tpos+2] = segment[2];
phton16(segment+5+tpos+3,l-tpos);
phton16(segment+3,tpos);
*size += 5;
}
}
if (params.split_pos < *size)
*split_pos = params.split_pos; *split_pos = params.split_pos;
return;
} }
if (params.split_any_protocol && params.split_pos < *size)
*split_pos = params.split_pos;
} }

View File

@ -1,7 +1,8 @@
#pragma once #pragma once
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h>
#include <sys/types.h> #include <sys/types.h>
bool find_host(char **pHost,char *buf,size_t bs); bool find_host(uint8_t **pHost,uint8_t *buf,size_t bs);
void modify_tcp_segment(char *segment,size_t segment_buffer_size,size_t *size,size_t *split_pos); void modify_tcp_segment(uint8_t *segment,size_t segment_buffer_size,size_t *size,size_t *split_pos);

View File

@ -174,6 +174,8 @@ static void exithelp()
" --methodspace\t\t\t; add extra space after method\n" " --methodspace\t\t\t; add extra space after method\n"
" --methodeol\t\t\t; add end-of-line before method\n" " --methodeol\t\t\t; add end-of-line before method\n"
" --unixeol\t\t\t; replace 0D0A to 0A\n" " --unixeol\t\t\t; replace 0D0A to 0A\n"
" --tlsrec=sni\t\t\t; make 2 TLS records. split at SNI. don't split if SNI is not present\n"
" --tlsrec-pos=<pos>\t\t; make 2 TLS records. split at specified pos\n"
); );
exit(1); exit(1);
} }
@ -288,19 +290,21 @@ void parse_params(int argc, char *argv[])
{ "methodeol",no_argument,0,0 },// optidx=28 { "methodeol",no_argument,0,0 },// optidx=28
{ "hosttab",no_argument,0,0 },// optidx=29 { "hosttab",no_argument,0,0 },// optidx=29
{ "unixeol",no_argument,0,0 },// optidx=30 { "unixeol",no_argument,0,0 },// optidx=30
{ "hostlist",required_argument,0,0 },// optidx=31 { "tlsrec",required_argument,0,0 },// optidx=31
{ "hostlist-exclude",required_argument,0,0 },// optidx=32 { "tlsrec-pos",required_argument,0,0 },// optidx=32
{ "pidfile",required_argument,0,0 },// optidx=33 { "hostlist",required_argument,0,0 },// optidx=33
{ "debug",optional_argument,0,0 },// optidx=34 { "hostlist-exclude",required_argument,0,0 },// optidx=34
{ "local-rcvbuf",required_argument,0,0 },// optidx=35 { "pidfile",required_argument,0,0 },// optidx=35
{ "local-sndbuf",required_argument,0,0 },// optidx=36 { "debug",optional_argument,0,0 },// optidx=36
{ "remote-rcvbuf",required_argument,0,0 },// optidx=37 { "local-rcvbuf",required_argument,0,0 },// optidx=37
{ "remote-sndbuf",required_argument,0,0 },// optidx=38 { "local-sndbuf",required_argument,0,0 },// optidx=38
{ "socks",no_argument,0,0 },// optidx=39 { "remote-rcvbuf",required_argument,0,0 },// optidx=39
{ "no-resolve",no_argument,0,0 },// optidx=40 { "remote-sndbuf",required_argument,0,0 },// optidx=40
{ "skip-nodelay",no_argument,0,0 },// optidx=41 { "socks",no_argument,0,0 },// optidx=41
{ "no-resolve",no_argument,0,0 },// optidx=42
{ "skip-nodelay",no_argument,0,0 },// optidx=43
#if defined(BSD) && !defined(__OpenBSD__) && !defined(__APPLE__) #if defined(BSD) && !defined(__OpenBSD__) && !defined(__APPLE__)
{ "enable-pf",no_argument,0,0 },// optidx=42 { "enable-pf",no_argument,0,0 },// optidx=44
#endif #endif
{ NULL,0,NULL,0 } { NULL,0,NULL,0 }
}; };
@ -472,7 +476,7 @@ void parse_params(int argc, char *argv[])
break; break;
case 24: /* split-pos */ case 24: /* split-pos */
i = atoi(optarg); i = atoi(optarg);
if (i) if (i>0)
params.split_pos = i; params.split_pos = i;
else else
{ {
@ -504,7 +508,27 @@ void parse_params(int argc, char *argv[])
params.unixeol = true; params.unixeol = true;
params.tamper = true; params.tamper = true;
break; break;
case 31: /* hostlist */ case 31: /* tlsrec */
if (!strcmp(optarg, "sni"))
params.tlsrec = tlsrec_sni;
else
{
fprintf(stderr, "Invalid argument for tlsrec\n");
exit_clean(1);
}
params.tamper = true;
break;
case 32: /* tlsrec-pos */
if ((params.tlsrec_pos = atoi(optarg))>0)
params.tlsrec = tlsrec_pos;
else
{
fprintf(stderr, "Invalid argument for tlsrec-pos\n");
exit_clean(1);
}
params.tamper = true;
break;
case 33: /* hostlist */
if (!strlist_add(&params.hostlist_files, optarg)) if (!strlist_add(&params.hostlist_files, optarg))
{ {
fprintf(stderr, "strlist_add failed\n"); fprintf(stderr, "strlist_add failed\n");
@ -512,7 +536,7 @@ void parse_params(int argc, char *argv[])
} }
params.tamper = true; params.tamper = true;
break; break;
case 32: /* hostlist-exclude */ case 34: /* hostlist-exclude */
if (!strlist_add(&params.hostlist_exclude_files, optarg)) if (!strlist_add(&params.hostlist_exclude_files, optarg))
{ {
fprintf(stderr, "strlist_add failed\n"); fprintf(stderr, "strlist_add failed\n");
@ -520,36 +544,36 @@ void parse_params(int argc, char *argv[])
} }
params.tamper = true; params.tamper = true;
break; break;
case 33: /* pidfile */ case 35: /* pidfile */
strncpy(params.pidfile,optarg,sizeof(params.pidfile)); strncpy(params.pidfile,optarg,sizeof(params.pidfile));
params.pidfile[sizeof(params.pidfile)-1]='\0'; params.pidfile[sizeof(params.pidfile)-1]='\0';
break; break;
case 34: case 36:
params.debug = optarg ? atoi(optarg) : 1; params.debug = optarg ? atoi(optarg) : 1;
break; break;
case 35: /* local-rcvbuf */ case 37: /* local-rcvbuf */
params.local_rcvbuf = atoi(optarg)/2; params.local_rcvbuf = atoi(optarg)/2;
break; break;
case 36: /* local-sndbuf */ case 38: /* local-sndbuf */
params.local_sndbuf = atoi(optarg)/2; params.local_sndbuf = atoi(optarg)/2;
break; break;
case 37: /* remote-rcvbuf */ case 39: /* remote-rcvbuf */
params.remote_rcvbuf = atoi(optarg)/2; params.remote_rcvbuf = atoi(optarg)/2;
break; break;
case 38: /* remote-sndbuf */ case 40: /* remote-sndbuf */
params.remote_sndbuf = atoi(optarg)/2; params.remote_sndbuf = atoi(optarg)/2;
break; break;
case 39: /* socks */ case 41: /* socks */
params.proxy_type = CONN_TYPE_SOCKS; params.proxy_type = CONN_TYPE_SOCKS;
break; break;
case 40: /* no-resolve */ case 42: /* no-resolve */
params.no_resolve = true; params.no_resolve = true;
break; break;
case 41: /* skip-nodelay */ case 43: /* skip-nodelay */
params.skip_nodelay = true; params.skip_nodelay = true;
break; break;
#if defined(BSD) && !defined(__OpenBSD__) && !defined(__APPLE__) #if defined(BSD) && !defined(__OpenBSD__) && !defined(__APPLE__)
case 42: /* enable-pf */ case 44: /* enable-pf */
params.pf_enable = true; params.pf_enable = true;
break; break;
#endif #endif

View File

@ -133,7 +133,7 @@ ssize_t send_with_ttl(int fd, const void *buf, size_t len, int flags, int ttl)
} }
static bool send_buffer_create(send_buffer_t *sb, char *data, size_t len, int ttl) static bool send_buffer_create(send_buffer_t *sb, const void *data, size_t len, int ttl)
{ {
if (sb->data) if (sb->data)
{ {
@ -258,7 +258,7 @@ static bool conn_has_unsent_pair(tproxy_conn_t *conn)
} }
static ssize_t send_or_buffer(send_buffer_t *sb, int fd, char *buf, size_t len, int ttl) static ssize_t send_or_buffer(send_buffer_t *sb, int fd, const void *buf, size_t len, int ttl)
{ {
ssize_t wr=0; ssize_t wr=0;
if (len) if (len)
@ -919,7 +919,7 @@ static bool handle_epoll(tproxy_conn_t *conn, struct tailhead *conn_list, uint32
if (!conn_partner_alive(conn)) if (!conn_partner_alive(conn))
{ {
// throw it to a black hole // throw it to a black hole
char waste[65070]; uint8_t waste[65070];
ssize_t trd=0; ssize_t trd=0;
while((rd=recv(conn->fd, waste, sizeof(waste), MSG_DONTWAIT))>0 && trd<MAX_WASTE) while((rd=recv(conn->fd, waste, sizeof(waste), MSG_DONTWAIT))>0 && trd<MAX_WASTE)
@ -969,7 +969,7 @@ static bool handle_epoll(tproxy_conn_t *conn, struct tailhead *conn_list, uint32
#endif #endif
{ {
// incoming data from local leg // incoming data from local leg
char buf[RD_BLOCK_SIZE + 4]; uint8_t buf[RD_BLOCK_SIZE + 5];
rd = recv(conn->fd, buf, RD_BLOCK_SIZE, MSG_DONTWAIT); rd = recv(conn->fd, buf, RD_BLOCK_SIZE, MSG_DONTWAIT);
DBGPRINT("recv fd=%d rd=%zd err=%d",conn->fd, rd,errno) DBGPRINT("recv fd=%d rd=%zd err=%d",conn->fd, rd,errno)