mirror of
https://github.com/bol-van/zapret.git
synced 2024-11-29 21:40:52 +03:00
tpws: --tlsrec
This commit is contained in:
parent
2456aae8ad
commit
6dc413d0c9
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.
@ -645,6 +645,9 @@ tpws_check_domain_bypass()
|
||||
tpws_curl_test_update $1 $3 $s $s2 && break
|
||||
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
|
||||
report_strategy $1 $3 tpws
|
||||
}
|
||||
|
@ -1,21 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2016-2021 bol-van
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
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
|
||||
SOFTWARE.
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2016-2021 bol-van
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
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
|
||||
SOFTWARE.
|
||||
|
@ -1,4 +1,4 @@
|
||||
Поддерживаемые версии
|
||||
Поддерживаемые версии
|
||||
---------------------
|
||||
|
||||
FreeBSD 11.x+ , OpenBSD 6.x+, частично MacOS Sierra+
|
||||
|
190
docs/bsdfw.txt
190
docs/bsdfw.txt
@ -1,95 +1,95 @@
|
||||
WAN=em0 LAN=em1
|
||||
|
||||
FreeBSD IPFW :
|
||||
|
||||
ipfw delete 100
|
||||
ipfw add 100 fwd 127.0.0.1,988 tcp from me to any 80,443 proto ip4 xmit em0 not uid daemon
|
||||
ipfw add 100 fwd ::1,988 tcp from me to any 80,443 proto ip6 xmit em0 not uid daemon
|
||||
ipfw add 100 fwd 127.0.0.1,988 tcp from any to any 80,443 proto ip4 recv em1
|
||||
ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1
|
||||
|
||||
ipfw delete 100
|
||||
ipfw add 100 allow tcp from me to table\(nozapret\) 80,443
|
||||
ipfw add 100 fwd 127.0.0.1,988 tcp from me to table\(zapret\) 80,443 proto ip4 xmit em0 not uid daemon
|
||||
ipfw add 100 fwd ::1,988 tcp from me to table\(zapret\) 80,443 proto ip6 xmit em0 not uid daemon
|
||||
ipfw add 100 allow tcp from any to table\(nozapret\) 80,443 recv em1
|
||||
ipfw add 100 fwd 127.0.0.1,988 tcp from any to any 80,443 proto ip4 recv em1
|
||||
ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1
|
||||
|
||||
/opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
|
||||
|
||||
|
||||
; Loop avoidance.
|
||||
; 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.
|
||||
; dvtws sends ipv6 forged frames using another divert socket (HACK). they can be filtered out using 'diverted'.
|
||||
|
||||
|
||||
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 udp from any to any 443 out not diverted not sockarg xmit em0
|
||||
|
||||
ipfw delete 100
|
||||
ipfw add 100 allow tcp from me to table\(nozapret\) 80,443
|
||||
ipfw add 100 divert 989 tcp from any to table\(zapret\) 80,443 out not diverted not sockarg xmit em0
|
||||
|
||||
/opt/zapret/nfq/dvtws --port=989 --debug --dpi-desync=split
|
||||
|
||||
|
||||
sample ipfw NAT setup :
|
||||
|
||||
WAN=em0
|
||||
LAN=em1
|
||||
ipfw -q flush
|
||||
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 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 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 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 390 nat 1 ip4 from any to any out xmit $WAN
|
||||
ipfw -q add 10000 allow ip from any to any
|
||||
|
||||
Forwarding :
|
||||
sysctl net.inet.ip.forwarding=1
|
||||
sysctl net.inet6.ip6.forwarding=1
|
||||
|
||||
|
||||
OpenBSD PF :
|
||||
|
||||
; dont know how to rdr-to from local system. doesn't seem to work. only works for routed traffic.
|
||||
|
||||
/etc/pf.conf
|
||||
pass in quick on em1 inet proto tcp to port {80,443} rdr-to 127.0.0.1 port 988
|
||||
pass in quick on em1 inet6 proto tcp to port {80,443} rdr-to ::1 port 988
|
||||
pfctl -f /etc/pf.conf
|
||||
/opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
|
||||
|
||||
; dvtws works both for routed and local
|
||||
|
||||
pass in quick on em0 proto tcp from port {80,443} no state
|
||||
pass out quick on em0 proto tcp to port {80,443} divert-packet port 989 no state
|
||||
pfctl -f /etc/pf.conf
|
||||
./dvtws --port=989 --dpi-desync=split2
|
||||
|
||||
; dvtws with table limitations : to zapret,zapret6 but not to nozapret,nozapret6
|
||||
; reload tables : pfctl -f /etc/pf.conf
|
||||
set limit table-entries 2000000
|
||||
table <zapret> file "/opt/zapret/ipset/zapret-ip.txt"
|
||||
table <zapret-user> file "/opt/zapret/ipset/zapret-ip-user.txt"
|
||||
table <nozapret> file "/opt/zapret/ipset/zapret-ip-exclude.txt"
|
||||
pass out quick on em0 inet proto tcp to <nozapret> port {80,443}
|
||||
pass in quick on em0 inet proto tcp from <zapret> port {80,443} 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 out quick on em0 inet proto tcp to <zapret-user> port {80,443} divert-packet port 989 no state
|
||||
table <zapret6> file "/opt/zapret/ipset/zapret-ip6.txt"
|
||||
table <zapret6-user> file "/opt/zapret/ipset/zapret-ip-user6.txt"
|
||||
table <nozapret6> file "/opt/zapret/ipset/zapret-ip-exclude6.txt"
|
||||
pass out quick on em0 inet6 proto tcp to <nozapret6> port {80,443}
|
||||
pass in quick on em0 inet6 proto tcp from <zapret6> port {80,443} 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 out quick on em0 inet6 proto tcp to <zapret6-user> port {80,443} divert-packet port 989 no state
|
||||
WAN=em0 LAN=em1
|
||||
|
||||
FreeBSD IPFW :
|
||||
|
||||
ipfw delete 100
|
||||
ipfw add 100 fwd 127.0.0.1,988 tcp from me to any 80,443 proto ip4 xmit em0 not uid daemon
|
||||
ipfw add 100 fwd ::1,988 tcp from me to any 80,443 proto ip6 xmit em0 not uid daemon
|
||||
ipfw add 100 fwd 127.0.0.1,988 tcp from any to any 80,443 proto ip4 recv em1
|
||||
ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1
|
||||
|
||||
ipfw delete 100
|
||||
ipfw add 100 allow tcp from me to table\(nozapret\) 80,443
|
||||
ipfw add 100 fwd 127.0.0.1,988 tcp from me to table\(zapret\) 80,443 proto ip4 xmit em0 not uid daemon
|
||||
ipfw add 100 fwd ::1,988 tcp from me to table\(zapret\) 80,443 proto ip6 xmit em0 not uid daemon
|
||||
ipfw add 100 allow tcp from any to table\(nozapret\) 80,443 recv em1
|
||||
ipfw add 100 fwd 127.0.0.1,988 tcp from any to any 80,443 proto ip4 recv em1
|
||||
ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1
|
||||
|
||||
/opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
|
||||
|
||||
|
||||
; Loop avoidance.
|
||||
; 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.
|
||||
; dvtws sends ipv6 forged frames using another divert socket (HACK). they can be filtered out using 'diverted'.
|
||||
|
||||
|
||||
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 udp from any to any 443 out not diverted not sockarg xmit em0
|
||||
|
||||
ipfw delete 100
|
||||
ipfw add 100 allow tcp from me to table\(nozapret\) 80,443
|
||||
ipfw add 100 divert 989 tcp from any to table\(zapret\) 80,443 out not diverted not sockarg xmit em0
|
||||
|
||||
/opt/zapret/nfq/dvtws --port=989 --debug --dpi-desync=split
|
||||
|
||||
|
||||
sample ipfw NAT setup :
|
||||
|
||||
WAN=em0
|
||||
LAN=em1
|
||||
ipfw -q flush
|
||||
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 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 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 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 390 nat 1 ip4 from any to any out xmit $WAN
|
||||
ipfw -q add 10000 allow ip from any to any
|
||||
|
||||
Forwarding :
|
||||
sysctl net.inet.ip.forwarding=1
|
||||
sysctl net.inet6.ip6.forwarding=1
|
||||
|
||||
|
||||
OpenBSD PF :
|
||||
|
||||
; dont know how to rdr-to from local system. doesn't seem to work. only works for routed traffic.
|
||||
|
||||
/etc/pf.conf
|
||||
pass in quick on em1 inet proto tcp to port {80,443} rdr-to 127.0.0.1 port 988
|
||||
pass in quick on em1 inet6 proto tcp to port {80,443} rdr-to ::1 port 988
|
||||
pfctl -f /etc/pf.conf
|
||||
/opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
|
||||
|
||||
; dvtws works both for routed and local
|
||||
|
||||
pass in quick on em0 proto tcp from port {80,443} no state
|
||||
pass out quick on em0 proto tcp to port {80,443} divert-packet port 989 no state
|
||||
pfctl -f /etc/pf.conf
|
||||
./dvtws --port=989 --dpi-desync=split2
|
||||
|
||||
; dvtws with table limitations : to zapret,zapret6 but not to nozapret,nozapret6
|
||||
; reload tables : pfctl -f /etc/pf.conf
|
||||
set limit table-entries 2000000
|
||||
table <zapret> file "/opt/zapret/ipset/zapret-ip.txt"
|
||||
table <zapret-user> file "/opt/zapret/ipset/zapret-ip-user.txt"
|
||||
table <nozapret> file "/opt/zapret/ipset/zapret-ip-exclude.txt"
|
||||
pass out quick on em0 inet proto tcp to <nozapret> port {80,443}
|
||||
pass in quick on em0 inet proto tcp from <zapret> port {80,443} 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 out quick on em0 inet proto tcp to <zapret-user> port {80,443} divert-packet port 989 no state
|
||||
table <zapret6> file "/opt/zapret/ipset/zapret-ip6.txt"
|
||||
table <zapret6-user> file "/opt/zapret/ipset/zapret-ip-user6.txt"
|
||||
table <nozapret6> file "/opt/zapret/ipset/zapret-ip-exclude6.txt"
|
||||
pass out quick on em0 inet6 proto tcp to <nozapret6> port {80,443}
|
||||
pass in quick on em0 inet6 proto tcp from <zapret6> port {80,443} 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 out quick on em0 inet6 proto tcp to <zapret6-user> port {80,443} divert-packet port 989 no state
|
||||
|
494
docs/changes.txt
494
docs/changes.txt
@ -1,245 +1,249 @@
|
||||
v1
|
||||
|
||||
Initial release
|
||||
|
||||
v2
|
||||
|
||||
nfqws : command line options change. now using standard getopt.
|
||||
nfqws : added options for window size changing and "Host:" case change
|
||||
ISP support : tested on mns.ru and beeline (corbina)
|
||||
init scripts : rewritten init scripts for simple choise of ISP
|
||||
create_ipset : now using 'ipset restore', it works much faster
|
||||
readme : updated. now using UTF-8 charset.
|
||||
|
||||
v3
|
||||
|
||||
tpws : added transparent proxy (supports TPROXY and DNAT).
|
||||
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
|
||||
and added to zapret ip list
|
||||
ISP support : dom.ru support via TPROXY/DNAT
|
||||
ISP support : successfully tested sknt.ru on 'domru' configuration
|
||||
other configs will probably also work, but cannot test
|
||||
compile : openwrt compile howto
|
||||
|
||||
v4
|
||||
|
||||
tpws : added ability to insert extra space after http method : "GET /" => "GET /"
|
||||
ISP support : TKT support
|
||||
|
||||
v5
|
||||
|
||||
nfqws : ipv6 support in nfqws
|
||||
|
||||
v6
|
||||
|
||||
ipset : added "get_antizapret.sh"
|
||||
|
||||
v7
|
||||
|
||||
tpws : added ability to insert "." after Host: name
|
||||
|
||||
v8
|
||||
|
||||
openwrt init : removed hotplug.d/firewall because of race conditions. now only use /etc/firewall.user
|
||||
|
||||
v9
|
||||
|
||||
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
|
||||
ISP support : tiera support
|
||||
ISP support : added DNS filtering to ubuntu and debian scripts
|
||||
|
||||
v10
|
||||
|
||||
tpws : added split-pos option. split every message at specified position
|
||||
|
||||
v11
|
||||
|
||||
ipset : scripts optimizations
|
||||
|
||||
v12
|
||||
|
||||
nfqws : fix wrong tcp checksum calculation if packet length is odd and platform is big-endian
|
||||
|
||||
v13
|
||||
|
||||
added binaries
|
||||
|
||||
v14
|
||||
|
||||
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
|
||||
|
||||
v15
|
||||
|
||||
added --hostspell option to nfqws and tpws
|
||||
ISP support : beeline now catches "host" but other spellings still work
|
||||
openwrt/LEDE : changed init script to work with procd
|
||||
tpws, nfqws : minor cosmetic fixes
|
||||
|
||||
v16
|
||||
|
||||
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)
|
||||
|
||||
v17
|
||||
|
||||
ISP support : athome moved from nfqws to tpws because of instability and http request hangs
|
||||
tpws : added options unixeol,methodeol,hosttab
|
||||
|
||||
v18
|
||||
|
||||
tpws,nfqws : added hostnospace option
|
||||
|
||||
v19
|
||||
|
||||
tpws : added hostlist option
|
||||
|
||||
v20
|
||||
|
||||
added ip2net. ip2net groups ips from iplist into subnets and reduces ipset size twice
|
||||
|
||||
v21
|
||||
|
||||
added mdig. get_reestr.sh is *real* again
|
||||
|
||||
v22
|
||||
|
||||
total review of init script logic
|
||||
dropped support of older debian 7 and ubuntu 12/14 systems
|
||||
install_bin.sh : auto binaries preparation
|
||||
docs: readme review. some new topics added, others deleted
|
||||
docs: VPN setup with policy based routing using wireguard
|
||||
docs: wireguard modding guide
|
||||
|
||||
v23
|
||||
|
||||
major init system rewrite
|
||||
openwrt : separate firewall include /etc/firewall.zapret
|
||||
install_easy.sh : easy setup on openwrt, debian, ubuntu, centos, fedora, opensuse
|
||||
|
||||
v24
|
||||
|
||||
separate config from init scripts
|
||||
gzip support in ipset/*.sh and tpws
|
||||
|
||||
v25
|
||||
|
||||
init : move to native systemd units
|
||||
use links to units, init scripts and firewall includes, no more copying
|
||||
|
||||
v26
|
||||
|
||||
ipv6 support
|
||||
tpws : advanced bind options
|
||||
|
||||
v27
|
||||
|
||||
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.
|
||||
|
||||
v28
|
||||
|
||||
tpws : added socks5 support
|
||||
ipset : major RKN getlist rewrite. added antifilter.network support
|
||||
|
||||
v29
|
||||
|
||||
nfqws : DPI desync attack
|
||||
ip exclude system
|
||||
|
||||
v30
|
||||
|
||||
nfqws : DPI desync attack modes : fake,rst
|
||||
|
||||
v31
|
||||
|
||||
nfqws : DPI desync attack modes : disorder,disorder2,split,split2.
|
||||
nfqws : DPI desync fooling mode : badseq. multiple modes supported
|
||||
|
||||
v32
|
||||
|
||||
tpws : multiple binds
|
||||
init scripts : run only one instance of tpws in any case
|
||||
|
||||
v33
|
||||
|
||||
openwrt : flow offloading support
|
||||
config : MODE refactoring
|
||||
|
||||
v34
|
||||
|
||||
nfqws : dpi-desync 2 mode combos
|
||||
nfqws : dpi-desync without parameter no more supported. previously it meant "fake"
|
||||
nfqws : custom fake http request and tls client hello
|
||||
|
||||
v35
|
||||
|
||||
limited FreeBSD and OpenBSD support
|
||||
|
||||
v36
|
||||
|
||||
full FreeBSD and OpenBSD support
|
||||
|
||||
v37
|
||||
|
||||
limited MacOS support
|
||||
|
||||
v38
|
||||
|
||||
MacOS easy install
|
||||
|
||||
v39
|
||||
|
||||
nfqws: conntrack, wssize
|
||||
|
||||
v40
|
||||
|
||||
init scripts : IFACE_LAN, IFACE_WAN now accept multiple interfaces
|
||||
init scripts : openwrt uses now OPENWRT_LAN parameter to override incoming interfaces for tpws
|
||||
|
||||
v41
|
||||
|
||||
install_easy : openrc support
|
||||
|
||||
v42
|
||||
|
||||
blockcheck.sh
|
||||
|
||||
v43
|
||||
|
||||
nfqws: UDP desync with conntrack support (any-protocol only for now)
|
||||
|
||||
v44
|
||||
|
||||
nfqws: ipfrag
|
||||
|
||||
v45
|
||||
|
||||
nfqws: hop-by-hop ipv6 desync and fooling
|
||||
|
||||
v46
|
||||
|
||||
big startup script refactoring to support nftables and new openwrt snapshot builds with firewall4
|
||||
|
||||
v47
|
||||
|
||||
nfqws: QUIC initial decryption
|
||||
nfqws: udplen, fakeknown dpi desync modes
|
||||
|
||||
v48
|
||||
|
||||
nfqws, tpws : multiple --hostlist and --hostlist-exclude support
|
||||
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)
|
||||
|
||||
v49
|
||||
|
||||
QUIC support integrated to the main system and setup
|
||||
|
||||
v50
|
||||
|
||||
DHT protocol support.
|
||||
DPI desync mode 'tamper' for DHT.
|
||||
HEX string support in addition to binary files.
|
||||
v1
|
||||
|
||||
Initial release
|
||||
|
||||
v2
|
||||
|
||||
nfqws : command line options change. now using standard getopt.
|
||||
nfqws : added options for window size changing and "Host:" case change
|
||||
ISP support : tested on mns.ru and beeline (corbina)
|
||||
init scripts : rewritten init scripts for simple choise of ISP
|
||||
create_ipset : now using 'ipset restore', it works much faster
|
||||
readme : updated. now using UTF-8 charset.
|
||||
|
||||
v3
|
||||
|
||||
tpws : added transparent proxy (supports TPROXY and DNAT).
|
||||
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
|
||||
and added to zapret ip list
|
||||
ISP support : dom.ru support via TPROXY/DNAT
|
||||
ISP support : successfully tested sknt.ru on 'domru' configuration
|
||||
other configs will probably also work, but cannot test
|
||||
compile : openwrt compile howto
|
||||
|
||||
v4
|
||||
|
||||
tpws : added ability to insert extra space after http method : "GET /" => "GET /"
|
||||
ISP support : TKT support
|
||||
|
||||
v5
|
||||
|
||||
nfqws : ipv6 support in nfqws
|
||||
|
||||
v6
|
||||
|
||||
ipset : added "get_antizapret.sh"
|
||||
|
||||
v7
|
||||
|
||||
tpws : added ability to insert "." after Host: name
|
||||
|
||||
v8
|
||||
|
||||
openwrt init : removed hotplug.d/firewall because of race conditions. now only use /etc/firewall.user
|
||||
|
||||
v9
|
||||
|
||||
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
|
||||
ISP support : tiera support
|
||||
ISP support : added DNS filtering to ubuntu and debian scripts
|
||||
|
||||
v10
|
||||
|
||||
tpws : added split-pos option. split every message at specified position
|
||||
|
||||
v11
|
||||
|
||||
ipset : scripts optimizations
|
||||
|
||||
v12
|
||||
|
||||
nfqws : fix wrong tcp checksum calculation if packet length is odd and platform is big-endian
|
||||
|
||||
v13
|
||||
|
||||
added binaries
|
||||
|
||||
v14
|
||||
|
||||
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
|
||||
|
||||
v15
|
||||
|
||||
added --hostspell option to nfqws and tpws
|
||||
ISP support : beeline now catches "host" but other spellings still work
|
||||
openwrt/LEDE : changed init script to work with procd
|
||||
tpws, nfqws : minor cosmetic fixes
|
||||
|
||||
v16
|
||||
|
||||
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)
|
||||
|
||||
v17
|
||||
|
||||
ISP support : athome moved from nfqws to tpws because of instability and http request hangs
|
||||
tpws : added options unixeol,methodeol,hosttab
|
||||
|
||||
v18
|
||||
|
||||
tpws,nfqws : added hostnospace option
|
||||
|
||||
v19
|
||||
|
||||
tpws : added hostlist option
|
||||
|
||||
v20
|
||||
|
||||
added ip2net. ip2net groups ips from iplist into subnets and reduces ipset size twice
|
||||
|
||||
v21
|
||||
|
||||
added mdig. get_reestr.sh is *real* again
|
||||
|
||||
v22
|
||||
|
||||
total review of init script logic
|
||||
dropped support of older debian 7 and ubuntu 12/14 systems
|
||||
install_bin.sh : auto binaries preparation
|
||||
docs: readme review. some new topics added, others deleted
|
||||
docs: VPN setup with policy based routing using wireguard
|
||||
docs: wireguard modding guide
|
||||
|
||||
v23
|
||||
|
||||
major init system rewrite
|
||||
openwrt : separate firewall include /etc/firewall.zapret
|
||||
install_easy.sh : easy setup on openwrt, debian, ubuntu, centos, fedora, opensuse
|
||||
|
||||
v24
|
||||
|
||||
separate config from init scripts
|
||||
gzip support in ipset/*.sh and tpws
|
||||
|
||||
v25
|
||||
|
||||
init : move to native systemd units
|
||||
use links to units, init scripts and firewall includes, no more copying
|
||||
|
||||
v26
|
||||
|
||||
ipv6 support
|
||||
tpws : advanced bind options
|
||||
|
||||
v27
|
||||
|
||||
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.
|
||||
|
||||
v28
|
||||
|
||||
tpws : added socks5 support
|
||||
ipset : major RKN getlist rewrite. added antifilter.network support
|
||||
|
||||
v29
|
||||
|
||||
nfqws : DPI desync attack
|
||||
ip exclude system
|
||||
|
||||
v30
|
||||
|
||||
nfqws : DPI desync attack modes : fake,rst
|
||||
|
||||
v31
|
||||
|
||||
nfqws : DPI desync attack modes : disorder,disorder2,split,split2.
|
||||
nfqws : DPI desync fooling mode : badseq. multiple modes supported
|
||||
|
||||
v32
|
||||
|
||||
tpws : multiple binds
|
||||
init scripts : run only one instance of tpws in any case
|
||||
|
||||
v33
|
||||
|
||||
openwrt : flow offloading support
|
||||
config : MODE refactoring
|
||||
|
||||
v34
|
||||
|
||||
nfqws : dpi-desync 2 mode combos
|
||||
nfqws : dpi-desync without parameter no more supported. previously it meant "fake"
|
||||
nfqws : custom fake http request and tls client hello
|
||||
|
||||
v35
|
||||
|
||||
limited FreeBSD and OpenBSD support
|
||||
|
||||
v36
|
||||
|
||||
full FreeBSD and OpenBSD support
|
||||
|
||||
v37
|
||||
|
||||
limited MacOS support
|
||||
|
||||
v38
|
||||
|
||||
MacOS easy install
|
||||
|
||||
v39
|
||||
|
||||
nfqws: conntrack, wssize
|
||||
|
||||
v40
|
||||
|
||||
init scripts : IFACE_LAN, IFACE_WAN now accept multiple interfaces
|
||||
init scripts : openwrt uses now OPENWRT_LAN parameter to override incoming interfaces for tpws
|
||||
|
||||
v41
|
||||
|
||||
install_easy : openrc support
|
||||
|
||||
v42
|
||||
|
||||
blockcheck.sh
|
||||
|
||||
v43
|
||||
|
||||
nfqws: UDP desync with conntrack support (any-protocol only for now)
|
||||
|
||||
v44
|
||||
|
||||
nfqws: ipfrag
|
||||
|
||||
v45
|
||||
|
||||
nfqws: hop-by-hop ipv6 desync and fooling
|
||||
|
||||
v46
|
||||
|
||||
big startup script refactoring to support nftables and new openwrt snapshot builds with firewall4
|
||||
|
||||
v47
|
||||
|
||||
nfqws: QUIC initial decryption
|
||||
nfqws: udplen, fakeknown dpi desync modes
|
||||
|
||||
v48
|
||||
|
||||
nfqws, tpws : multiple --hostlist and --hostlist-exclude support
|
||||
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)
|
||||
|
||||
v49
|
||||
|
||||
QUIC support integrated to the main system and setup
|
||||
|
||||
v50
|
||||
|
||||
DHT protocol support.
|
||||
DPI desync mode 'tamper' for DHT.
|
||||
HEX string support in addition to binary files.
|
||||
|
||||
v51
|
||||
|
||||
tpws --tlsrec attack.
|
@ -1,63 +1,63 @@
|
||||
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 -m set --match-set zapret src -j NFQUEUE --queue-num 200 --queue-bypass
|
||||
|
||||
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 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 1:5 -j NFQUEUE --queue-num 200 --queue-bypass
|
||||
|
||||
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 --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 :
|
||||
|
||||
sysctl -w net.ipv4.ip_forward=1
|
||||
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
|
||||
|
||||
ip -f inet rule add fwmark 1 lookup 100
|
||||
ip -f inet route add local default dev lo table 100
|
||||
# prevent loop
|
||||
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 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 mark --mark 0x1/0x1 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 988
|
||||
|
||||
For DNAT :
|
||||
|
||||
# run tpws as user "tpws". its required to avoid loops.
|
||||
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 OUTPUT -p tcp --dport 80 -m owner ! --uid-owner tpws -j DNAT --to 127.0.0.127:988
|
||||
|
||||
|
||||
Reset all iptable rules :
|
||||
|
||||
iptables -F
|
||||
iptables -X
|
||||
iptables -t nat -F
|
||||
iptables -t nat -X
|
||||
iptables -t mangle -F
|
||||
iptables -t mangle -X
|
||||
iptables -t raw -F
|
||||
iptables -t raw -X
|
||||
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 -m set --match-set zapret src -j NFQUEUE --queue-num 200 --queue-bypass
|
||||
|
||||
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 -m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes 1:5 -j NFQUEUE --queue-num 200 --queue-bypass
|
||||
|
||||
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 --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 :
|
||||
|
||||
sysctl -w net.ipv4.ip_forward=1
|
||||
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
|
||||
|
||||
ip -f inet rule add fwmark 1 lookup 100
|
||||
ip -f inet route add local default dev lo table 100
|
||||
# prevent loop
|
||||
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 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 mark --mark 0x1/0x1 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 988
|
||||
|
||||
For DNAT :
|
||||
|
||||
# run tpws as user "tpws". its required to avoid loops.
|
||||
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 OUTPUT -p tcp --dport 80 -m owner ! --uid-owner tpws -j DNAT --to 127.0.0.127:988
|
||||
|
||||
|
||||
Reset all iptable rules :
|
||||
|
||||
iptables -F
|
||||
iptables -X
|
||||
iptables -t nat -F
|
||||
iptables -t nat -X
|
||||
iptables -t mangle -F
|
||||
iptables -t mangle -X
|
||||
iptables -t raw -F
|
||||
iptables -t raw -X
|
||||
|
||||
Reset iptable policies :
|
||||
|
||||
iptables -P INPUT ACCEPT
|
||||
iptables -P FORWARD ACCEPT
|
||||
iptables -P OUTPUT ACCEPT
|
||||
iptables -t mangle -P POSTROUTING ACCEPT
|
||||
iptables -t mangle -P PREROUTING ACCEPT
|
||||
iptables -t mangle -P INPUT ACCEPT
|
||||
iptables -t mangle -P FORWARD ACCEPT
|
||||
iptables -t mangle -P OUTPUT ACCEPT
|
||||
iptables -t raw -P PREROUTING ACCEPT
|
||||
iptables -t raw -P OUTPUT ACCEPT
|
||||
iptables -P INPUT ACCEPT
|
||||
iptables -P FORWARD ACCEPT
|
||||
iptables -P OUTPUT ACCEPT
|
||||
iptables -t mangle -P POSTROUTING ACCEPT
|
||||
iptables -t mangle -P PREROUTING ACCEPT
|
||||
iptables -t mangle -P INPUT ACCEPT
|
||||
iptables -t mangle -P FORWARD ACCEPT
|
||||
iptables -t mangle -P OUTPUT ACCEPT
|
||||
iptables -t raw -P PREROUTING ACCEPT
|
||||
iptables -t raw -P OUTPUT ACCEPT
|
||||
|
@ -1,266 +1,266 @@
|
||||
Пример ручной установки на debian-подобную систему
|
||||
--------------------------------------------------
|
||||
|
||||
На debian основано большое количество дистрибутивов linux, включая ubuntu.
|
||||
Здесь рассматриваются прежде всего Debian 8+ и Ubuntu 16+.
|
||||
Но с большой вероятностью может сработать и на производных от них.
|
||||
Главное условие - наличие systemd, apt и нескольких стандартных пакетов в репозитории.
|
||||
|
||||
Установить пакеты :
|
||||
apt-get update
|
||||
apt-get install ipset curl dnsutils git
|
||||
|
||||
Если хотите использовать nftables, то нужен пакет nftables, а ipset не обязателен.
|
||||
|
||||
Скопировать директорию zapret в /opt или скачать через git :
|
||||
cd /opt
|
||||
git clone --depth 1 https://github.com/bol-van/zapret
|
||||
|
||||
Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики.
|
||||
/opt/zapret/install_bin.sh
|
||||
АЛЬТЕРНАТИВА : make -C /opt/zapret. Получите динамические бинарики под вашу ось.
|
||||
Для сборки требуются dev пакеты : zlib1g-dev libcap-dev libnetfilter-queue-dev
|
||||
|
||||
Настроить параметры согласно разделу "Выбор параметров".
|
||||
|
||||
Создать ссылку на service unit в systemd :
|
||||
ln -fs /opt/zapret/init.d/systemd/zapret.service /lib/systemd/system
|
||||
|
||||
Удалить старые листы, если они были созданы ранее :
|
||||
/opt/zapret/ipset/clear_lists.sh
|
||||
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
|
||||
Выполнить скрипт обновления листа :
|
||||
/opt/zapret/ipset/get_config.sh
|
||||
Настроить таймер systemd для обновления листа :
|
||||
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.service /lib/systemd/system
|
||||
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.timer /lib/systemd/system
|
||||
|
||||
Принять изменения в systemd :
|
||||
systemctl daemon-reload
|
||||
|
||||
Включить автозапуск службы :
|
||||
systemctl enable zapret
|
||||
|
||||
Включить таймер обновления листа :
|
||||
systemctl enable zapret-list-update.timer
|
||||
|
||||
Запустить службу :
|
||||
systemctl start zapret
|
||||
|
||||
Шпаргалка по управлению службой и таймером :
|
||||
|
||||
enable auto start : systemctl enable zapret
|
||||
disable auto start : systemctl disable zapret
|
||||
start : systemctl start zapret
|
||||
stop : systemctl stop zapret
|
||||
status, output messages : systemctl status zapret
|
||||
timer info : systemctl list-timer
|
||||
delete service : systemctl disable zapret ; rm /lib/systemd/system/zapret.service
|
||||
delete timer : systemctl disable zapret-list-update.timer ; rm /lib/systemd/system/zapret-list-update.*
|
||||
|
||||
Centos 7+, Fedora
|
||||
-----------------
|
||||
|
||||
Centos с 7 версии и более-менее новые федоры построены на systemd.
|
||||
В качестве пакетного менеджера используется yum.
|
||||
|
||||
Установить пакеты :
|
||||
yum install -y curl ipset dnsutils git
|
||||
|
||||
Далее все аналогично debian.
|
||||
|
||||
OpenSUSE
|
||||
--------
|
||||
|
||||
Новые OpenSUSE основаны на systemd и менеджере пакетов zypper.
|
||||
|
||||
Установить пакеты :
|
||||
zypper --non-interactive install curl ipset
|
||||
|
||||
Далее все аналогично debian, кроме расположения systemd.
|
||||
В opensuse он находится не в /lib/systemd, а в /usr/lib/systemd.
|
||||
Правильные команды будут :
|
||||
|
||||
ln -fs /opt/zapret/init.d/systemd/zapret.service /usr/lib/systemd/system
|
||||
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.service /usr/lib/systemd/system
|
||||
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.timer /usr/lib/systemd/system
|
||||
|
||||
Arch linux
|
||||
----------
|
||||
|
||||
Построен на базе systemd.
|
||||
|
||||
Установить пакеты :
|
||||
pacman -Syy
|
||||
pacman --noconfirm -S ipset curl
|
||||
|
||||
Далее все аналогично debian.
|
||||
|
||||
Gentoo
|
||||
------
|
||||
|
||||
Эта система использует OpenRC - улучшенную версию sysvinit.
|
||||
Установка пакетов производится командой : emerge <package_name>
|
||||
Пакеты собираются из исходников.
|
||||
|
||||
Требуются все те же ipset, curl, git для скачивания с github.
|
||||
git и curl по умолчанию могут присутствовать, ipset отсутствует.
|
||||
|
||||
emerge ipset
|
||||
|
||||
Настроить параметры согласно разделу "Выбор параметров".
|
||||
|
||||
Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики.
|
||||
/opt/zapret/install_bin.sh
|
||||
АЛЬТЕРНАТИВА : make -C /opt/zapret. Получите динамические бинарики под вашу ось.
|
||||
|
||||
Удалить старые листы, если они были созданы ранее :
|
||||
/opt/zapret/ipset/clear_lists.sh
|
||||
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
|
||||
Выполнить скрипт обновления листа :
|
||||
/opt/zapret/ipset/get_config.sh
|
||||
Зашедулить обновление листа :
|
||||
crontab -e
|
||||
Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh"
|
||||
|
||||
Подключить init скрипт :
|
||||
|
||||
ln -fs /opt/zapret/init.d/openrc/zapret /etc/init.d
|
||||
rc-update add zapret
|
||||
|
||||
Запустить службу :
|
||||
|
||||
rc-service zapret start
|
||||
|
||||
Шпаргалка по управлению службой :
|
||||
|
||||
enable auto start : rc-update add zapret
|
||||
disable auto start : rc-update del zapret
|
||||
start : rc-service zapret start
|
||||
stop : rc-service zapret stop
|
||||
|
||||
|
||||
|
||||
Ручная установка на openwrt/LEDE 15.xx-21.xx
|
||||
--------------------------------------------
|
||||
|
||||
!!! Данная инструкция написана для систем, основанных на iptables+firewall3
|
||||
!!! В новых версиях openwrt переходит на nftables+firewall4, инструкция неприменима. Пользуйтесь install_easy.sh
|
||||
|
||||
Установить дополнительные пакеты :
|
||||
opkg update
|
||||
opkg install iptables-mod-extra iptables-mod-nfqueue iptables-mod-filter iptables-mod-ipopt iptables-mod-conntrack-extra ipset curl
|
||||
(ipv6) opkg install ip6tables-mod-nat
|
||||
(опционально) opkg install gzip
|
||||
(опционально) opkg install coreutils-sort
|
||||
|
||||
ЭКОНОМИЯ МЕСТА :
|
||||
|
||||
gzip от busybox в разы медленней полноценного варианта. gzip используется скриптами получения листов.
|
||||
sort от busybox медленней полноценного варианта и жрет намного больше памяти. sort используется скриптами получения листов.
|
||||
iptables-mod-nfqueue можно выкинуть, если не будем пользоваться nfqws
|
||||
curl можно выкинуть, если для получения ip листа будет использоваться только get_user.sh
|
||||
|
||||
Самая главная трудность - скомпилировать программы на C. Это можно сделать на linux x64 при помощи SDK, который
|
||||
можно скачать с официального сайта openwrt или LEDE. Но процесс кросс компиляции - это всегда сложности.
|
||||
Недостаточно запустить make как на традиционной linux системе.
|
||||
Поэтому в binaries имеются готовые статические бинарики для всех самых распространенных архитектур.
|
||||
Статическая сборка означает, что бинарик не зависит от типа libc (glibc, uclibc или musl) и наличия установленных so.
|
||||
Его можно использовать сразу. Лишь бы подходил тип CPU. У ARM и MIPS есть несколько версий.
|
||||
Скорее всего найдется рабочий вариант. Если нет - вам придется собирать самостоятельно.
|
||||
Для всех поддерживаемых архитектур бинарики запакованы upx. На текущий момент все, кроме mips64.
|
||||
|
||||
Скопировать директорию "zapret" в /opt на роутер.
|
||||
|
||||
Если места достаточно, самый простой способ :
|
||||
opkg update
|
||||
opkg install git-http
|
||||
mkdir /opt
|
||||
cd /opt
|
||||
git clone --depth 1 https://github.com/bol-van/zapret
|
||||
|
||||
Если места немного :
|
||||
opkg update
|
||||
opkg install openssh-sftp-server unzip
|
||||
ifconfig br-lan
|
||||
Скачать на комп с github zip архив кнопкой "Clone or download"->Download ZIP
|
||||
Скопировать средствами sftp zip архив на роутер в /tmp.
|
||||
mkdir /opt
|
||||
cd /opt
|
||||
unzip /tmp/zapret-master.zip
|
||||
mv zapret-master zapret
|
||||
rm /tmp/zapret-master.zip
|
||||
|
||||
Если места совсем мало :
|
||||
На linux системе скачать и распаковать zapret. Оставить необходимый минимум файлов.
|
||||
Запаковать в архив zapret.tar.gz.
|
||||
nc -l -p 1111 <zapret.tar.gz
|
||||
На роутере
|
||||
cd /tmp
|
||||
nc <linux_system_ip> 1111 >zapret.tar.gz
|
||||
|
||||
Не стоит работать с распакованной версией zapret на windows. Потеряются ссылки и chmod.
|
||||
|
||||
Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики.
|
||||
/opt/zapret/install_bin.sh
|
||||
|
||||
Создать ссылку на скрипт запуска :
|
||||
ln -fs /opt/zapret/init.d/openwrt/zapret /etc/init.d
|
||||
Создать ссылку на скрипт события поднятия интерфейса :
|
||||
ln -fs /opt/zapret/init.d/openwrt/90-zapret /etc/hotplug.d/iface
|
||||
|
||||
Настроить параметры согласно разделу "Выбор параметров".
|
||||
|
||||
Удалить старые листы, если они были созданы ранее :
|
||||
/opt/zapret/ipset/clear_lists.sh
|
||||
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
|
||||
Выполнить скрипт обновления листа :
|
||||
/opt/zapret/ipset/get_config.sh
|
||||
Зашедулить обновление листа :
|
||||
crontab -e
|
||||
Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh"
|
||||
|
||||
Включить автозапуск службы и запустить ее :
|
||||
/etc/init.d/zapret enable
|
||||
/etc/init.d/zapret start
|
||||
ПРИМЕЧАНИЕ : на этапе старта системы интерфейсы еще не подняты. в некоторых случаях невозможно правильно
|
||||
сформировать параметры запуска демонов, не зная имя физического интерфейса LAN.
|
||||
Cкрипт из /etc/hotplug.d/iface перезапустит демоны по событию поднятия LAN.
|
||||
|
||||
Создать ссылку на firewall include :
|
||||
ln -fs /opt/zapret/init.d/openwrt/firewall.zapret /etc/firewall.zapret
|
||||
Проверить была ли создана ранее запись о firewall include :
|
||||
uci show firewall | grep firewall.zapret
|
||||
Если firewall.zapret нет, значит добавить :
|
||||
uci add firewall include
|
||||
uci set firewall.@include[-1].path="/etc/firewall.zapret"
|
||||
uci set firewall.@include[-1].reload="1"
|
||||
uci commit firewall
|
||||
Проверить не включен ли flow offload :
|
||||
uci show firewall.@defaults[0]
|
||||
Если flow_offloading=1 или flow_offloading_hw=1 ,
|
||||
uci set firewall.@defaults[0].flow_offloading=0
|
||||
uci set firewall.@defaults[0].flow_offloading_hw=0
|
||||
uci commit firewall
|
||||
Перезапустить фаервол :
|
||||
fw3 restart
|
||||
|
||||
Посмотреть через iptables -nL, ip6tables -nL или через luci вкладку "firewall" появились ли нужные правила.
|
||||
|
||||
ЭКОНОМИЯ МЕСТА : если его мало, то можно оставить в директории zapret лишь подкаталоги
|
||||
ipset, common, файл config, init.d/openwrt.
|
||||
Далее нужно создать подкаталоги с реально используемыми бинариками (ip2net, mdig, tpws, nfq)
|
||||
и скопировать туда из binaries рабочие executables.
|
||||
|
||||
ЕСЛИ ВСЕ ПЛОХО С МЕСТОМ : откажитесь от работы со списком РКН. используйте только get_user.sh
|
||||
|
||||
ЕСЛИ СОВСЕМ ВСЕ УЖАСНО С МЕСТОМ : берете tpws и делаете все своими руками. поднятие iptables, автостарт бинарика.
|
||||
С некоторых версий скрипты запуска zapret без ipset не работают (он требуется для ip exclude)
|
||||
|
||||
СОВЕТ : Покупайте только роутеры с USB. В USB можно воткнуть флэшку и вынести на нее корневую файловую систему
|
||||
или использовать ее в качестве оверлея. Не надо мучать себя, запихивая незапихиваемое в 8 мб встроенной флэшки.
|
||||
Для комфортной работы с zapret нужен роутер с 16 Mb встроенной памяти или USB разъемом и 128+ Mb RAM.
|
||||
На 64 Mb без swap будут проблемы с листами РКН. Если у вас только 64 Mb, и вы хотите листы РКН, подключите swap.
|
||||
32 Mb для современных версий openwrt - конфигурация на грани живучести. Возможны хаотические падения процессов в oom.
|
||||
Работа с листами РКН невозможна в принципе.
|
||||
|
||||
Пример ручной установки на debian-подобную систему
|
||||
--------------------------------------------------
|
||||
|
||||
На debian основано большое количество дистрибутивов linux, включая ubuntu.
|
||||
Здесь рассматриваются прежде всего Debian 8+ и Ubuntu 16+.
|
||||
Но с большой вероятностью может сработать и на производных от них.
|
||||
Главное условие - наличие systemd, apt и нескольких стандартных пакетов в репозитории.
|
||||
|
||||
Установить пакеты :
|
||||
apt-get update
|
||||
apt-get install ipset curl dnsutils git
|
||||
|
||||
Если хотите использовать nftables, то нужен пакет nftables, а ipset не обязателен.
|
||||
|
||||
Скопировать директорию zapret в /opt или скачать через git :
|
||||
cd /opt
|
||||
git clone --depth 1 https://github.com/bol-van/zapret
|
||||
|
||||
Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики.
|
||||
/opt/zapret/install_bin.sh
|
||||
АЛЬТЕРНАТИВА : make -C /opt/zapret. Получите динамические бинарики под вашу ось.
|
||||
Для сборки требуются dev пакеты : zlib1g-dev libcap-dev libnetfilter-queue-dev
|
||||
|
||||
Настроить параметры согласно разделу "Выбор параметров".
|
||||
|
||||
Создать ссылку на service unit в systemd :
|
||||
ln -fs /opt/zapret/init.d/systemd/zapret.service /lib/systemd/system
|
||||
|
||||
Удалить старые листы, если они были созданы ранее :
|
||||
/opt/zapret/ipset/clear_lists.sh
|
||||
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
|
||||
Выполнить скрипт обновления листа :
|
||||
/opt/zapret/ipset/get_config.sh
|
||||
Настроить таймер systemd для обновления листа :
|
||||
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.service /lib/systemd/system
|
||||
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.timer /lib/systemd/system
|
||||
|
||||
Принять изменения в systemd :
|
||||
systemctl daemon-reload
|
||||
|
||||
Включить автозапуск службы :
|
||||
systemctl enable zapret
|
||||
|
||||
Включить таймер обновления листа :
|
||||
systemctl enable zapret-list-update.timer
|
||||
|
||||
Запустить службу :
|
||||
systemctl start zapret
|
||||
|
||||
Шпаргалка по управлению службой и таймером :
|
||||
|
||||
enable auto start : systemctl enable zapret
|
||||
disable auto start : systemctl disable zapret
|
||||
start : systemctl start zapret
|
||||
stop : systemctl stop zapret
|
||||
status, output messages : systemctl status zapret
|
||||
timer info : systemctl list-timer
|
||||
delete service : systemctl disable zapret ; rm /lib/systemd/system/zapret.service
|
||||
delete timer : systemctl disable zapret-list-update.timer ; rm /lib/systemd/system/zapret-list-update.*
|
||||
|
||||
Centos 7+, Fedora
|
||||
-----------------
|
||||
|
||||
Centos с 7 версии и более-менее новые федоры построены на systemd.
|
||||
В качестве пакетного менеджера используется yum.
|
||||
|
||||
Установить пакеты :
|
||||
yum install -y curl ipset dnsutils git
|
||||
|
||||
Далее все аналогично debian.
|
||||
|
||||
OpenSUSE
|
||||
--------
|
||||
|
||||
Новые OpenSUSE основаны на systemd и менеджере пакетов zypper.
|
||||
|
||||
Установить пакеты :
|
||||
zypper --non-interactive install curl ipset
|
||||
|
||||
Далее все аналогично debian, кроме расположения systemd.
|
||||
В opensuse он находится не в /lib/systemd, а в /usr/lib/systemd.
|
||||
Правильные команды будут :
|
||||
|
||||
ln -fs /opt/zapret/init.d/systemd/zapret.service /usr/lib/systemd/system
|
||||
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.service /usr/lib/systemd/system
|
||||
ln -fs /opt/zapret/init.d/systemd/zapret-list-update.timer /usr/lib/systemd/system
|
||||
|
||||
Arch linux
|
||||
----------
|
||||
|
||||
Построен на базе systemd.
|
||||
|
||||
Установить пакеты :
|
||||
pacman -Syy
|
||||
pacman --noconfirm -S ipset curl
|
||||
|
||||
Далее все аналогично debian.
|
||||
|
||||
Gentoo
|
||||
------
|
||||
|
||||
Эта система использует OpenRC - улучшенную версию sysvinit.
|
||||
Установка пакетов производится командой : emerge <package_name>
|
||||
Пакеты собираются из исходников.
|
||||
|
||||
Требуются все те же ipset, curl, git для скачивания с github.
|
||||
git и curl по умолчанию могут присутствовать, ipset отсутствует.
|
||||
|
||||
emerge ipset
|
||||
|
||||
Настроить параметры согласно разделу "Выбор параметров".
|
||||
|
||||
Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики.
|
||||
/opt/zapret/install_bin.sh
|
||||
АЛЬТЕРНАТИВА : make -C /opt/zapret. Получите динамические бинарики под вашу ось.
|
||||
|
||||
Удалить старые листы, если они были созданы ранее :
|
||||
/opt/zapret/ipset/clear_lists.sh
|
||||
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
|
||||
Выполнить скрипт обновления листа :
|
||||
/opt/zapret/ipset/get_config.sh
|
||||
Зашедулить обновление листа :
|
||||
crontab -e
|
||||
Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh"
|
||||
|
||||
Подключить init скрипт :
|
||||
|
||||
ln -fs /opt/zapret/init.d/openrc/zapret /etc/init.d
|
||||
rc-update add zapret
|
||||
|
||||
Запустить службу :
|
||||
|
||||
rc-service zapret start
|
||||
|
||||
Шпаргалка по управлению службой :
|
||||
|
||||
enable auto start : rc-update add zapret
|
||||
disable auto start : rc-update del zapret
|
||||
start : rc-service zapret start
|
||||
stop : rc-service zapret stop
|
||||
|
||||
|
||||
|
||||
Ручная установка на openwrt/LEDE 15.xx-21.xx
|
||||
--------------------------------------------
|
||||
|
||||
!!! Данная инструкция написана для систем, основанных на iptables+firewall3
|
||||
!!! В новых версиях openwrt переходит на nftables+firewall4, инструкция неприменима. Пользуйтесь install_easy.sh
|
||||
|
||||
Установить дополнительные пакеты :
|
||||
opkg update
|
||||
opkg install iptables-mod-extra iptables-mod-nfqueue iptables-mod-filter iptables-mod-ipopt iptables-mod-conntrack-extra ipset curl
|
||||
(ipv6) opkg install ip6tables-mod-nat
|
||||
(опционально) opkg install gzip
|
||||
(опционально) opkg install coreutils-sort
|
||||
|
||||
ЭКОНОМИЯ МЕСТА :
|
||||
|
||||
gzip от busybox в разы медленней полноценного варианта. gzip используется скриптами получения листов.
|
||||
sort от busybox медленней полноценного варианта и жрет намного больше памяти. sort используется скриптами получения листов.
|
||||
iptables-mod-nfqueue можно выкинуть, если не будем пользоваться nfqws
|
||||
curl можно выкинуть, если для получения ip листа будет использоваться только get_user.sh
|
||||
|
||||
Самая главная трудность - скомпилировать программы на C. Это можно сделать на linux x64 при помощи SDK, который
|
||||
можно скачать с официального сайта openwrt или LEDE. Но процесс кросс компиляции - это всегда сложности.
|
||||
Недостаточно запустить make как на традиционной linux системе.
|
||||
Поэтому в binaries имеются готовые статические бинарики для всех самых распространенных архитектур.
|
||||
Статическая сборка означает, что бинарик не зависит от типа libc (glibc, uclibc или musl) и наличия установленных so.
|
||||
Его можно использовать сразу. Лишь бы подходил тип CPU. У ARM и MIPS есть несколько версий.
|
||||
Скорее всего найдется рабочий вариант. Если нет - вам придется собирать самостоятельно.
|
||||
Для всех поддерживаемых архитектур бинарики запакованы upx. На текущий момент все, кроме mips64.
|
||||
|
||||
Скопировать директорию "zapret" в /opt на роутер.
|
||||
|
||||
Если места достаточно, самый простой способ :
|
||||
opkg update
|
||||
opkg install git-http
|
||||
mkdir /opt
|
||||
cd /opt
|
||||
git clone --depth 1 https://github.com/bol-van/zapret
|
||||
|
||||
Если места немного :
|
||||
opkg update
|
||||
opkg install openssh-sftp-server unzip
|
||||
ifconfig br-lan
|
||||
Скачать на комп с github zip архив кнопкой "Clone or download"->Download ZIP
|
||||
Скопировать средствами sftp zip архив на роутер в /tmp.
|
||||
mkdir /opt
|
||||
cd /opt
|
||||
unzip /tmp/zapret-master.zip
|
||||
mv zapret-master zapret
|
||||
rm /tmp/zapret-master.zip
|
||||
|
||||
Если места совсем мало :
|
||||
На linux системе скачать и распаковать zapret. Оставить необходимый минимум файлов.
|
||||
Запаковать в архив zapret.tar.gz.
|
||||
nc -l -p 1111 <zapret.tar.gz
|
||||
На роутере
|
||||
cd /tmp
|
||||
nc <linux_system_ip> 1111 >zapret.tar.gz
|
||||
|
||||
Не стоит работать с распакованной версией zapret на windows. Потеряются ссылки и chmod.
|
||||
|
||||
Запустить автоинсталятор бинариков. Он сам определит рабочую архитектуру и настроит все бинарики.
|
||||
/opt/zapret/install_bin.sh
|
||||
|
||||
Создать ссылку на скрипт запуска :
|
||||
ln -fs /opt/zapret/init.d/openwrt/zapret /etc/init.d
|
||||
Создать ссылку на скрипт события поднятия интерфейса :
|
||||
ln -fs /opt/zapret/init.d/openwrt/90-zapret /etc/hotplug.d/iface
|
||||
|
||||
Настроить параметры согласно разделу "Выбор параметров".
|
||||
|
||||
Удалить старые листы, если они были созданы ранее :
|
||||
/opt/zapret/ipset/clear_lists.sh
|
||||
По желанию прописать в /opt/zapret/ipset/zapret-hosts-user.txt свои домены.
|
||||
Выполнить скрипт обновления листа :
|
||||
/opt/zapret/ipset/get_config.sh
|
||||
Зашедулить обновление листа :
|
||||
crontab -e
|
||||
Создать строчку "0 12 */2 * * /opt/zapret/ipset/get_config.sh"
|
||||
|
||||
Включить автозапуск службы и запустить ее :
|
||||
/etc/init.d/zapret enable
|
||||
/etc/init.d/zapret start
|
||||
ПРИМЕЧАНИЕ : на этапе старта системы интерфейсы еще не подняты. в некоторых случаях невозможно правильно
|
||||
сформировать параметры запуска демонов, не зная имя физического интерфейса LAN.
|
||||
Cкрипт из /etc/hotplug.d/iface перезапустит демоны по событию поднятия LAN.
|
||||
|
||||
Создать ссылку на firewall include :
|
||||
ln -fs /opt/zapret/init.d/openwrt/firewall.zapret /etc/firewall.zapret
|
||||
Проверить была ли создана ранее запись о firewall include :
|
||||
uci show firewall | grep firewall.zapret
|
||||
Если firewall.zapret нет, значит добавить :
|
||||
uci add firewall include
|
||||
uci set firewall.@include[-1].path="/etc/firewall.zapret"
|
||||
uci set firewall.@include[-1].reload="1"
|
||||
uci commit firewall
|
||||
Проверить не включен ли flow offload :
|
||||
uci show firewall.@defaults[0]
|
||||
Если flow_offloading=1 или flow_offloading_hw=1 ,
|
||||
uci set firewall.@defaults[0].flow_offloading=0
|
||||
uci set firewall.@defaults[0].flow_offloading_hw=0
|
||||
uci commit firewall
|
||||
Перезапустить фаервол :
|
||||
fw3 restart
|
||||
|
||||
Посмотреть через iptables -nL, ip6tables -nL или через luci вкладку "firewall" появились ли нужные правила.
|
||||
|
||||
ЭКОНОМИЯ МЕСТА : если его мало, то можно оставить в директории zapret лишь подкаталоги
|
||||
ipset, common, файл config, init.d/openwrt.
|
||||
Далее нужно создать подкаталоги с реально используемыми бинариками (ip2net, mdig, tpws, nfq)
|
||||
и скопировать туда из binaries рабочие executables.
|
||||
|
||||
ЕСЛИ ВСЕ ПЛОХО С МЕСТОМ : откажитесь от работы со списком РКН. используйте только get_user.sh
|
||||
|
||||
ЕСЛИ СОВСЕМ ВСЕ УЖАСНО С МЕСТОМ : берете tpws и делаете все своими руками. поднятие iptables, автостарт бинарика.
|
||||
С некоторых версий скрипты запуска zapret без ipset не работают (он требуется для ip exclude)
|
||||
|
||||
СОВЕТ : Покупайте только роутеры с USB. В USB можно воткнуть флэшку и вынести на нее корневую файловую систему
|
||||
или использовать ее в качестве оверлея. Не надо мучать себя, запихивая незапихиваемое в 8 мб встроенной флэшки.
|
||||
Для комфортной работы с zapret нужен роутер с 16 Mb встроенной памяти или USB разъемом и 128+ Mb RAM.
|
||||
На 64 Mb без swap будут проблемы с листами РКН. Если у вас только 64 Mb, и вы хотите листы РКН, подключите swap.
|
||||
32 Mb для современных версий openwrt - конфигурация на грани живучести. Возможны хаотические падения процессов в oom.
|
||||
Работа с листами РКН невозможна в принципе.
|
||||
|
||||
|
@ -1,26 +1,26 @@
|
||||
nftables test cheat sheet
|
||||
simplified rules to test nfqws and tpws
|
||||
|
||||
|
||||
For DNAT :
|
||||
|
||||
# run tpws as user "tpws". its required to avoid loops.
|
||||
|
||||
nft delete table inet ztest
|
||||
nft create table inet ztest
|
||||
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 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
|
||||
|
||||
|
||||
For dpi desync attack :
|
||||
|
||||
nft delete table inet ztest
|
||||
nft create table inet ztest
|
||||
nft add chain inet ztest post "{type filter hook postrouting priority mangle;}"
|
||||
nft add rule inet ztest post tcp dport "{80,443}" queue num 200 bypass
|
||||
|
||||
|
||||
show rules : nft list table inet ztest
|
||||
delete table : nft delete table inet ztest
|
||||
nftables test cheat sheet
|
||||
simplified rules to test nfqws and tpws
|
||||
|
||||
|
||||
For DNAT :
|
||||
|
||||
# run tpws as user "tpws". its required to avoid loops.
|
||||
|
||||
nft delete table inet ztest
|
||||
nft create table inet ztest
|
||||
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 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
|
||||
|
||||
|
||||
For dpi desync attack :
|
||||
|
||||
nft delete table inet ztest
|
||||
nft create table inet ztest
|
||||
nft add chain inet ztest post "{type filter hook postrouting priority mangle;}"
|
||||
nft add rule inet ztest post tcp dport "{80,443}" queue num 200 bypass
|
||||
|
||||
|
||||
show rules : nft list table inet ztest
|
||||
delete table : nft delete table inet ztest
|
||||
|
@ -1,4 +1,4 @@
|
||||
nftables - это технология, пришедшая на замену iptables.
|
||||
nftables - это технология, пришедшая на замену iptables.
|
||||
В ней собрали все, что относилось к различным iptables. А их немало. iptables, ip6tables, ebtables, arptables, ipset.
|
||||
Весь код из разрозненных, но похожих компонент, собрали в одно целое с единым синтаксисом.
|
||||
Добавили различные конструкции языка, позволяющие писать правила более лаконично, не повторяя одни и те же команды с небольшими различиями.
|
||||
|
@ -1,4 +1,4 @@
|
||||
Специально для тех, кто хочет побыстрее начать, но не хочет слишком углубляться в простыню readme.txt.
|
||||
Специально для тех, кто хочет побыстрее начать, но не хочет слишком углубляться в простыню readme.txt.
|
||||
|
||||
Предупреждение : не пишите в issue вопросы типа "как скопировать файл", "как скачать", "как запустить", ...
|
||||
То есть все , что касается базовых навыков обращения с ОС linux. Эти вопросы буду закрывать сразу.
|
||||
|
2364
docs/readme.eng.md
2364
docs/readme.eng.md
File diff suppressed because it is too large
Load Diff
2887
docs/readme.txt
2887
docs/readme.txt
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,4 @@
|
||||
Данный мануал пишется не как копипастная инструкция, а как помощь уже соображающему.
|
||||
Данный мануал пишется не как копипастная инструкция, а как помощь уже соображающему.
|
||||
Если вы не знаете основ сетей, linux, openwrt, а пытаетесь что-то скопипастить отсюда без малейшего
|
||||
понимания смысла, то маловероятно, что у вас что-то заработает. Не тратье свое время напрасно.
|
||||
Цель - донести принципы как это настраивается вообще, а не указать какую буковку где вписать.
|
||||
|
@ -31,6 +31,11 @@ bool set_hl(int fd, int hl);
|
||||
bool set_ttl_hl(int fd, int ttl);
|
||||
int get_so_error(int fd);
|
||||
|
||||
// alignment-safe functions
|
||||
static inline uint16_t pntoh16(const uint8_t *p) {
|
||||
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;
|
||||
}
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include "strpool.h"
|
||||
|
||||
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 };
|
||||
|
||||
#define MAX_BINDS 32
|
||||
@ -41,6 +42,8 @@ struct params_s
|
||||
int hostpad;
|
||||
char hostspell[4];
|
||||
enum splithttpreq split_http_req;
|
||||
enum tlsrec tlsrec;
|
||||
int tlsrec_pos;
|
||||
bool split_any_protocol;
|
||||
int split_pos;
|
||||
bool disorder;
|
||||
|
@ -4,11 +4,12 @@
|
||||
#include "params.h"
|
||||
#include "hostlist.h"
|
||||
#include "protocol.h"
|
||||
#include "helpers.h"
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
// 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)
|
||||
{
|
||||
@ -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 };
|
||||
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;
|
||||
const char **method;
|
||||
bool bIsHttp = false, bBypass = false;
|
||||
char bRemovedHostSpace = 0;
|
||||
char Host[128];
|
||||
char *pc, Host[128];
|
||||
|
||||
*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);
|
||||
Host[pp - p] = '\0';
|
||||
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);
|
||||
}
|
||||
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")
|
||||
}
|
||||
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 ?)
|
||||
if (IsTLSClientHello((uint8_t*)segment,*size))
|
||||
{
|
||||
char host[256];
|
||||
char host[256];
|
||||
size_t tpos=0,elen;
|
||||
const uint8_t *ext;
|
||||
|
||||
VPRINT("packet contains TLS ClientHello")
|
||||
// we need host only if hostlist is present
|
||||
if ((params.hostlist || params.hostlist_exclude) && TLSHelloExtractHost((uint8_t*)segment,*size,host,sizeof(host)))
|
||||
VPRINT("packet contains TLS ClientHello")
|
||||
// we need host only if hostlist is present
|
||||
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)
|
||||
if (!HostlistCheck(params.hostlist, params.hostlist_exclude, host))
|
||||
{
|
||||
VPRINT("Not acting on this request")
|
||||
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;
|
||||
return;
|
||||
}
|
||||
|
||||
if (params.split_any_protocol && params.split_pos < *size)
|
||||
*split_pos = params.split_pos;
|
||||
}
|
||||
|
@ -1,7 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
bool find_host(char **pHost,char *buf,size_t bs);
|
||||
void modify_tcp_segment(char *segment,size_t segment_buffer_size,size_t *size,size_t *split_pos);
|
||||
bool find_host(uint8_t **pHost,uint8_t *buf,size_t bs);
|
||||
void modify_tcp_segment(uint8_t *segment,size_t segment_buffer_size,size_t *size,size_t *split_pos);
|
||||
|
74
tpws/tpws.c
74
tpws/tpws.c
@ -174,6 +174,8 @@ static void exithelp()
|
||||
" --methodspace\t\t\t; add extra space after method\n"
|
||||
" --methodeol\t\t\t; add end-of-line before method\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);
|
||||
}
|
||||
@ -288,19 +290,21 @@ void parse_params(int argc, char *argv[])
|
||||
{ "methodeol",no_argument,0,0 },// optidx=28
|
||||
{ "hosttab",no_argument,0,0 },// optidx=29
|
||||
{ "unixeol",no_argument,0,0 },// optidx=30
|
||||
{ "hostlist",required_argument,0,0 },// optidx=31
|
||||
{ "hostlist-exclude",required_argument,0,0 },// optidx=32
|
||||
{ "pidfile",required_argument,0,0 },// optidx=33
|
||||
{ "debug",optional_argument,0,0 },// optidx=34
|
||||
{ "local-rcvbuf",required_argument,0,0 },// optidx=35
|
||||
{ "local-sndbuf",required_argument,0,0 },// optidx=36
|
||||
{ "remote-rcvbuf",required_argument,0,0 },// optidx=37
|
||||
{ "remote-sndbuf",required_argument,0,0 },// optidx=38
|
||||
{ "socks",no_argument,0,0 },// optidx=39
|
||||
{ "no-resolve",no_argument,0,0 },// optidx=40
|
||||
{ "skip-nodelay",no_argument,0,0 },// optidx=41
|
||||
{ "tlsrec",required_argument,0,0 },// optidx=31
|
||||
{ "tlsrec-pos",required_argument,0,0 },// optidx=32
|
||||
{ "hostlist",required_argument,0,0 },// optidx=33
|
||||
{ "hostlist-exclude",required_argument,0,0 },// optidx=34
|
||||
{ "pidfile",required_argument,0,0 },// optidx=35
|
||||
{ "debug",optional_argument,0,0 },// optidx=36
|
||||
{ "local-rcvbuf",required_argument,0,0 },// optidx=37
|
||||
{ "local-sndbuf",required_argument,0,0 },// optidx=38
|
||||
{ "remote-rcvbuf",required_argument,0,0 },// optidx=39
|
||||
{ "remote-sndbuf",required_argument,0,0 },// optidx=40
|
||||
{ "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__)
|
||||
{ "enable-pf",no_argument,0,0 },// optidx=42
|
||||
{ "enable-pf",no_argument,0,0 },// optidx=44
|
||||
#endif
|
||||
{ NULL,0,NULL,0 }
|
||||
};
|
||||
@ -472,7 +476,7 @@ void parse_params(int argc, char *argv[])
|
||||
break;
|
||||
case 24: /* split-pos */
|
||||
i = atoi(optarg);
|
||||
if (i)
|
||||
if (i>0)
|
||||
params.split_pos = i;
|
||||
else
|
||||
{
|
||||
@ -504,7 +508,27 @@ void parse_params(int argc, char *argv[])
|
||||
params.unixeol = true;
|
||||
params.tamper = true;
|
||||
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(¶ms.hostlist_files, optarg))
|
||||
{
|
||||
fprintf(stderr, "strlist_add failed\n");
|
||||
@ -512,7 +536,7 @@ void parse_params(int argc, char *argv[])
|
||||
}
|
||||
params.tamper = true;
|
||||
break;
|
||||
case 32: /* hostlist-exclude */
|
||||
case 34: /* hostlist-exclude */
|
||||
if (!strlist_add(¶ms.hostlist_exclude_files, optarg))
|
||||
{
|
||||
fprintf(stderr, "strlist_add failed\n");
|
||||
@ -520,36 +544,36 @@ void parse_params(int argc, char *argv[])
|
||||
}
|
||||
params.tamper = true;
|
||||
break;
|
||||
case 33: /* pidfile */
|
||||
case 35: /* pidfile */
|
||||
strncpy(params.pidfile,optarg,sizeof(params.pidfile));
|
||||
params.pidfile[sizeof(params.pidfile)-1]='\0';
|
||||
break;
|
||||
case 34:
|
||||
case 36:
|
||||
params.debug = optarg ? atoi(optarg) : 1;
|
||||
break;
|
||||
case 35: /* local-rcvbuf */
|
||||
case 37: /* local-rcvbuf */
|
||||
params.local_rcvbuf = atoi(optarg)/2;
|
||||
break;
|
||||
case 36: /* local-sndbuf */
|
||||
case 38: /* local-sndbuf */
|
||||
params.local_sndbuf = atoi(optarg)/2;
|
||||
break;
|
||||
case 37: /* remote-rcvbuf */
|
||||
case 39: /* remote-rcvbuf */
|
||||
params.remote_rcvbuf = atoi(optarg)/2;
|
||||
break;
|
||||
case 38: /* remote-sndbuf */
|
||||
case 40: /* remote-sndbuf */
|
||||
params.remote_sndbuf = atoi(optarg)/2;
|
||||
break;
|
||||
case 39: /* socks */
|
||||
case 41: /* socks */
|
||||
params.proxy_type = CONN_TYPE_SOCKS;
|
||||
break;
|
||||
case 40: /* no-resolve */
|
||||
case 42: /* no-resolve */
|
||||
params.no_resolve = true;
|
||||
break;
|
||||
case 41: /* skip-nodelay */
|
||||
case 43: /* skip-nodelay */
|
||||
params.skip_nodelay = true;
|
||||
break;
|
||||
#if defined(BSD) && !defined(__OpenBSD__) && !defined(__APPLE__)
|
||||
case 42: /* enable-pf */
|
||||
case 44: /* enable-pf */
|
||||
params.pf_enable = true;
|
||||
break;
|
||||
#endif
|
||||
|
@ -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)
|
||||
{
|
||||
@ -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;
|
||||
if (len)
|
||||
@ -919,7 +919,7 @@ static bool handle_epoll(tproxy_conn_t *conn, struct tailhead *conn_list, uint32
|
||||
if (!conn_partner_alive(conn))
|
||||
{
|
||||
// throw it to a black hole
|
||||
char waste[65070];
|
||||
uint8_t waste[65070];
|
||||
ssize_t trd=0;
|
||||
|
||||
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
|
||||
{
|
||||
// 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);
|
||||
DBGPRINT("recv fd=%d rd=%zd err=%d",conn->fd, rd,errno)
|
||||
|
Loading…
Reference in New Issue
Block a user