mirror of
https://github.com/bol-van/zapret.git
synced 2024-11-30 05:50:53 +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
|
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
|
||||||
}
|
}
|
||||||
|
@ -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.
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
Поддерживаемые версии
|
Поддерживаемые версии
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
FreeBSD 11.x+ , OpenBSD 6.x+, частично MacOS Sierra+
|
FreeBSD 11.x+ , OpenBSD 6.x+, частично MacOS Sierra+
|
||||||
|
190
docs/bsdfw.txt
190
docs/bsdfw.txt
@ -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
|
||||||
|
494
docs/changes.txt
494
docs/changes.txt
@ -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.
|
@ -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
|
||||||
|
@ -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.
|
||||||
Cкрипт из /etc/hotplug.d/iface перезапустит демоны по событию поднятия LAN.
|
Cкрипт из /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.
|
||||||
Работа с листами РКН невозможна в принципе.
|
Работа с листами РКН невозможна в принципе.
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
nftables - это технология, пришедшая на замену iptables.
|
nftables - это технология, пришедшая на замену iptables.
|
||||||
В ней собрали все, что относилось к различным iptables. А их немало. iptables, ip6tables, ebtables, arptables, ipset.
|
В ней собрали все, что относилось к различным iptables. А их немало. iptables, ip6tables, ebtables, arptables, ipset.
|
||||||
Весь код из разрозненных, но похожих компонент, собрали в одно целое с единым синтаксисом.
|
Весь код из разрозненных, но похожих компонент, собрали в одно целое с единым синтаксисом.
|
||||||
Добавили различные конструкции языка, позволяющие писать правила более лаконично, не повторяя одни и те же команды с небольшими различиями.
|
Добавили различные конструкции языка, позволяющие писать правила более лаконично, не повторяя одни и те же команды с небольшими различиями.
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
Специально для тех, кто хочет побыстрее начать, но не хочет слишком углубляться в простыню readme.txt.
|
Специально для тех, кто хочет побыстрее начать, но не хочет слишком углубляться в простыню readme.txt.
|
||||||
|
|
||||||
Предупреждение : не пишите в issue вопросы типа "как скопировать файл", "как скачать", "как запустить", ...
|
Предупреждение : не пишите в issue вопросы типа "как скопировать файл", "как скачать", "как запустить", ...
|
||||||
То есть все , что касается базовых навыков обращения с ОС linux. Эти вопросы буду закрывать сразу.
|
То есть все , что касается базовых навыков обращения с ОС 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, а пытаетесь что-то скопипастить отсюда без малейшего
|
Если вы не знаете основ сетей, linux, openwrt, а пытаетесь что-то скопипастить отсюда без малейшего
|
||||||
понимания смысла, то маловероятно, что у вас что-то заработает. Не тратье свое время напрасно.
|
понимания смысла, то маловероятно, что у вас что-то заработает. Не тратье свое время напрасно.
|
||||||
Цель - донести принципы как это настраивается вообще, а не указать какую буковку где вписать.
|
Цель - донести принципы как это настраивается вообще, а не указать какую буковку где вписать.
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
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"
|
" --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(¶ms.hostlist_files, optarg))
|
if (!strlist_add(¶ms.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(¶ms.hostlist_exclude_files, optarg))
|
if (!strlist_add(¶ms.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
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user