diff --git a/changes.txt b/changes.txt index bbadab6..9df6e79 100644 --- a/changes.txt +++ b/changes.txt @@ -101,4 +101,14 @@ 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 diff --git a/init.d/debian/zapret b/init.d/debian/zapret new file mode 100755 index 0000000..db73e81 --- /dev/null +++ b/init.d/debian/zapret @@ -0,0 +1,242 @@ +#!/bin/sh +# For systemd : +# install : /usr/lib/lsb/install_initd zapret +# remove : /usr/lib/lsb/remove_initd zapret +### BEGIN INIT INFO +# Provides: zapret +# Required-Start: $local_fs $network +# Required-Stop: $local_fs $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +### END INIT INFO + + +# +++ REVIEW CONFIG HERE +++ + +# CHOOSE OPERATION MODE +# leave only one MODE= uncommented + +# using nfqws with ipset +#MODE=nfqws_ipset +# using nfqws for all +#MODE=nfqws_all +# CHOOSE NFQWS DAEMON OPTIONS. run "nfq/nfqws --help" for option list +NFQWS_OPT="--wsize=3 --hostspell=HOST" + +# using tpws with ipset +MODE=tpws_ipset +# using tpws for all +#MODE=tpws_all +# using tpws with hostlist +#MODE=tpws_hostlist +# CHOOSE TPWS DAEMON OPTIONS. run "tpws/tpws --help" for option list +TPWS_OPT="--hostspell=HOST --split-http-req=method" + +# only fill ipset, do not run daemons +#MODE=ipset + +# Custom mode +# Find out what works for you and modify "# PLACEHOLDER" parts of this script +#MODE=custom + +# CHOSE NETWORK INTERFACE BEHIND NAT (LAN) +SLAVE_ETH=eth0 + +# --- REVIEW CONFIG HERE --- + + + +NAME=zapret +DESC=anti-zapret +PIDDIR=/var/run + +ZAPRET_BASE=/opt/zapret +IPSET_CR=$ZAPRET_BASE/ipset/create_ipset.sh + +QNUM=200 +NFQWS=$ZAPRET_BASE/nfq/nfqws +NFQWS_OPT_BASE="--qnum=$QNUM" + +TPPORT=1188 +TPWS=$ZAPRET_BASE/tpws/tpws +TPWS_USER=tpws +TPWS_HOSTLIST=$ZAPRET_BASE/ipset/zapret-hosts.txt +TPWS_OPT_BASE="--port=$TPPORT --user=$TPWS_USER --bind-addr=127.0.0.1" + +# exit script on any error +set -e + +prepare_tpws() +{ + # $TPWS_USER is required to prevent redirection of the traffic originating from TPWS itself + # otherwise infinite loop will occur + # also its good idea not to run tpws as root + adduser --disabled-login --no-create-home --system --quiet $TPWS_USER + # otherwise linux kernel will treat 127.0.0.1 as "martian" ip and refuse routing to it + # NOTE : kernels <3.6 do not have this feature. consider upgrading or change DNAT to REDIRECT and do not bind to 127.0.0.1 + sysctl -w net.ipv4.conf.$SLAVE_ETH.route_localnet=1 +} + +fw_tpws_add() +{ + # $1 - iptable filter + prepare_tpws + echo "Adding iptables rule for tpws : $1" + iptables -t nat -C PREROUTING -i $SLAVE_ETH -p tcp $1 -j DNAT --to 127.0.0.1:$TPPORT 2>/dev/null || + iptables -t nat -I PREROUTING -i $SLAVE_ETH -p tcp $1 -j DNAT --to 127.0.0.1:$TPPORT + iptables -t nat -C OUTPUT -m owner ! --uid-owner $TPWS_USER -p tcp $1 -j DNAT --to 127.0.0.1:$TPPORT 2>/dev/null || + iptables -t nat -I OUTPUT -m owner ! --uid-owner $TPWS_USER -p tcp $1 -j DNAT --to 127.0.0.1:$TPPORT +} +fw_tpws_del() +{ + # $1 - iptable filter + echo "Deleting iptables rule for tpws : $1" + iptables -t nat -C PREROUTING -i $SLAVE_ETH -p tcp $1 -j DNAT --to 127.0.0.1:$TPPORT 2>/dev/null && + iptables -t nat -D PREROUTING -i $SLAVE_ETH -p tcp $1 -j DNAT --to 127.0.0.1:$TPPORT + iptables -t nat -C OUTPUT -m owner ! --uid-owner $TPWS_USER -p tcp $1 -j DNAT --to 127.0.0.1:$TPPORT 2>/dev/null && + iptables -t nat -D OUTPUT -m owner ! --uid-owner $TPWS_USER -p tcp $1 -j DNAT --to 127.0.0.1:$TPPORT + true +} +fw_nfqws_add_pre() +{ + # $1 - iptable filter + echo "Adding iptables rule for nfqws prerouting : $1" + iptables -t raw -C PREROUTING -p tcp --tcp-flags SYN,ACK SYN,ACK $1 -j NFQUEUE --queue-num $QNUM --queue-bypass 2>/dev/null || + iptables -t raw -I PREROUTING -p tcp --tcp-flags SYN,ACK SYN,ACK $1 -j NFQUEUE --queue-num $QNUM --queue-bypass +} +fw_nfqws_del_pre() +{ + # $1 - iptable filter + echo "Deleting iptables rule for nfqws prerouting : $1" + iptables -t raw -C PREROUTING -p tcp --tcp-flags SYN,ACK SYN,ACK $1 -j NFQUEUE --queue-num $QNUM --queue-bypass 2>/dev/null && + iptables -t raw -D PREROUTING -p tcp --tcp-flags SYN,ACK SYN,ACK $1 -j NFQUEUE --queue-num $QNUM --queue-bypass + true +} +fw_nfqws_add_post() +{ + # $1 - iptable filter + echo "Adding iptables rule for nfqws postrouting : $1" + iptables -t mangle -C POSTROUTING -p tcp $1 -j NFQUEUE --queue-num $QNUM --queue-bypass 2>/dev/null || + iptables -t mangle -I POSTROUTING -p tcp $1 -j NFQUEUE --queue-num $QNUM --queue-bypass +} +fw_nfqws_del_post() +{ + # $1 - iptable filter + echo "Deleting iptables rule for nfqws postrouting : $1" + iptables -t mangle -C POSTROUTING -p tcp $1 -j NFQUEUE --queue-num $QNUM --queue-bypass 2>/dev/null && + iptables -t mangle -D POSTROUTING -p tcp $1 -j NFQUEUE --queue-num $QNUM --queue-bypass + true +} + +run_daemon() +{ + # $1 - daemon string id or number. can use 1,2,3,... + # $2 - daemon + # $3 - daemon args + # use $PIDDIR/$DAEMONBASE$1.pid as pidfile + local DAEMONBASE=$(basename $2) + echo "Starting daemon $1: $2 $3" + start-stop-daemon --start --quiet --pidfile $PIDDIR/$DAEMONBASE$1.pid --background --make-pidfile \ + --exec $2 -- $3 +} +stop_daemon() +{ + # $1 - daemon string id or number. can use 1,2,3,... + # $2 - daemon + # use $PIDDIR/$DAEMONBASE$1.pid as pidfile + local DAEMONBASE=$(basename $2) + echo "Stopping daemon $1: $2" + start-stop-daemon --oknodo --stop --quiet --pidfile $PIDDIR/$DAEMONBASE$1.pid \ + --exec $2 +} + + +create_ipset() +{ + echo "Creating ipset" + ($IPSET_CR) +} + +case "$1" in + start) + case "${MODE}" in + tpws_hostlist) + fw_tpws_add "--dport 80" + run_daemon 1 $TPWS "$TPWS_OPT_BASE $TPWS_OPT --hostlist=$TPWS_HOSTLIST" + ;; + tpws_ipset) + create_ipset + fw_tpws_add "--dport 80 -m set --match-set zapret dst" + run_daemon 1 $TPWS "$TPWS_OPT_BASE $TPWS_OPT" + ;; + tpws_all) + fw_tpws_add "--dport 80" + run_daemon 1 $TPWS "$TPWS_OPT_BASE $TPWS_OPT" + ;; + nfqws_ipset) + create_ipset + fw_nfqws_add_pre "--sport 80 -m set --match-set zapret src" + fw_nfqws_add_post "--dport 80 -m set --match-set zapret dst" + run_daemon 1 $NFQWS "$NFQWS_OPT_BASE $NFQWS_OPT" + ;; + nfqws_all) + fw_nfqws_add_pre "--sport 80" + fw_nfqws_add_post "--dport 80" + run_daemon 1 $NFQWS "$NFQWS_OPT_BASE $NFQWS_OPT" + ;; + ipset) + create_ipset + ;; + custom) + # PLACEHOLDER + echo !!! NEED ATTENTION !!! + echo Configure iptables for required actions + echo Start daemon\(s\) + echo Study how other sections work + run_daemon 1 /bin/sleep 20 + ;; + esac + ;; + + stop) + case "${MODE}" in + tpws_hostlist) + fw_tpws_del "--dport 80" + stop_daemon 1 $TPWS + ;; + tpws_ipset) + fw_tpws_del "--dport 80 -m set --match-set zapret dst" + stop_daemon 1 $TPWS + ;; + tpws_all) + fw_tpws_del "--dport 80" + stop_daemon 1 $TPWS + ;; + nfqws_ipset) + fw_nfqws_del_pre "--sport 80 -m set --match-set zapret src" + fw_nfqws_del_post "--dport 80 -m set --match-set zapret dst" + stop_daemon 1 $NFQWS + ;; + nfqws_all) + fw_nfqws_del_pre "--sport 80" + fw_nfqws_del_post "--dport 80" + stop_daemon 1 $NFQWS + ;; + custom) + # PLACEHOLDER + echo !!! NEED ATTENTION !!! + echo Clear firewall rules here. Remove iptables changes made previously. + echo Stop daemon\(s\) previously started. + echo Study how other sections work. + ;; + esac + ;; + + *) + N=/etc/init.d/$NAME + echo "Usage: $N {start|stop}" >&2 + exit 1 + ;; +esac + +exit 0 diff --git a/init.d/debian7/zapret b/init.d/debian7/zapret deleted file mode 100755 index 256be52..0000000 --- a/init.d/debian7/zapret +++ /dev/null @@ -1,192 +0,0 @@ -#!/bin/sh -# For systemd : -# install : /usr/lib/lsb/install_initd zapret -# remove : /usr/lib/lsb/remove_initd zapret -### BEGIN INIT INFO -# Provides: zapret -# Required-Start: $local_fs $network -# Required-Stop: $local_fs $network -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -### END INIT INFO - -# CHOOSE ISP HERE. UNCOMMENT ONLY ONE LINE. -ISP=mns -#ISP=rt -#ISP=beeline -#ISP=domru -#ISP=tiera -#ISP=athome - -# Its possible not to use ipset. Use hostlist with tpws instead. -#ISP=hostlist - -# If ISP is unlisted then uncomment "custom" -# Find out what works for your ISP and modify "# PLACEHOLDER" parts of this script -#ISP=custom - -# CHOSE NETWORK INTERFACE BEHIND NAT -SLAVE_ETH=eth0 - - -ZAPRET_BASE=/opt/zapret - -IPSET_CR=$ZAPRET_BASE/ipset/create_ipset.sh -NAME=zapret -DESC=anti-zapret - -QNUM=200 -TPPORT=1188 -ROUTE_TABLE_NUM=100 -NFQWS=$ZAPRET_BASE/nfq/nfqws -TPWS=$ZAPRET_BASE/tpws/tpws -TPWS_USER=tpws -TPWS_HOSTLIST=$ZAPRET_BASE/ipset/zapret-hosts.txt - -PIDFILE=/var/run/$NAME.pid - -set -e - - -prepare_tpws() -{ - adduser --disabled-login --no-create-home --system --quiet $TPWS_USER - sysctl -w net.ipv4.conf.$SLAVE_ETH.route_localnet=1 -} - -case "$1" in - start) - echo "Creating ipset" - ($IPSET_CR) - - echo "Adding iptables rule" - case "${ISP}" in - hostlist) - prepare_tpws - iptables -t nat -C PREROUTING -p tcp --dport 80 -i $SLAVE_ETH -j DNAT --to 127.0.0.1:$TPPORT 2>/dev/null || - iptables -t nat -I PREROUTING -p tcp --dport 80 -i $SLAVE_ETH -j DNAT --to 127.0.0.1:$TPPORT - iptables -t nat -C OUTPUT -p tcp --dport 80 -m owner ! --uid-owner $TPWS_USER -j DNAT --to 127.0.0.1:$TPPORT 2>/dev/null || - iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner ! --uid-owner $TPWS_USER -j DNAT --to 127.0.0.1:$TPPORT - DAEMON=$TPWS - DAEMON_OPTS="--port=$TPPORT --hostlist=$TPWS_HOSTLIST --hostcase --split-http-req=method --user=$TPWS_USER --bind-addr=127.0.0.1" - ;; - mns) - iptables -t raw -C PREROUTING -p tcp --sport 80 --tcp-flags SYN,ACK SYN,ACK -m set --match-set zapret src -j NFQUEUE --queue-num $QNUM --queue-bypass 2>/dev/null || - iptables -t raw -I PREROUTING -p tcp --sport 80 --tcp-flags SYN,ACK SYN,ACK -m set --match-set zapret src -j NFQUEUE --queue-num $QNUM --queue-bypass - DAEMON=$NFQWS - DAEMON_OPTS="--qnum=$QNUM --wsize=3" - ;; - rt) - iptables -t raw -C PREROUTING -p tcp --sport 80 --tcp-flags SYN,ACK SYN,ACK -m set --match-set zapret src -j NFQUEUE --queue-num $QNUM --queue-bypass 2>/dev/null || - iptables -t raw -I PREROUTING -p tcp --sport 80 --tcp-flags SYN,ACK SYN,ACK -m set --match-set zapret src -j NFQUEUE --queue-num $QNUM --queue-bypass - DAEMON=$NFQWS - DAEMON_OPTS="--qnum=$QNUM --wsize=20" - ;; - beeline) - iptables -t mangle -C POSTROUTING -p tcp --dport 80 -m set --match-set zapret dst -j NFQUEUE --queue-num $QNUM --queue-bypass 2>/dev/null || - iptables -t mangle -I POSTROUTING -p tcp --dport 80 -m set --match-set zapret dst -j NFQUEUE --queue-num $QNUM --queue-bypass - DAEMON=$NFQWS - DAEMON_OPTS="--qnum=$QNUM --hostspell=HOST" - ;; - domru) - prepare_tpws - iptables -t nat -C PREROUTING -p tcp --dport 80 -i $SLAVE_ETH -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT 2>/dev/null || - iptables -t nat -I PREROUTING -p tcp --dport 80 -i $SLAVE_ETH -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT - iptables -t nat -C OUTPUT -p tcp --dport 80 -m owner ! --uid-owner $TPWS_USER -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT 2>/dev/null || - iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner ! --uid-owner $TPWS_USER -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT - # BLOCK SPOOFED DNS FROM DOMRU - iptables -t raw -C PREROUTING -p udp --sport 53 -m string --hex-string "|05030311|" --algo bm -j DROP --from 40 --to 300 || - iptables -t raw -I PREROUTING -p udp --sport 53 -m string --hex-string "|05030311|" --algo bm -j DROP --from 40 --to 300 - iptables -t raw -C PREROUTING -p udp --sport 53 -m string --hex-string "|2a022698a00200010000000000030017|" --algo bm -j DROP --from 40 --to 300 || - iptables -t raw -I PREROUTING -p udp --sport 53 -m string --hex-string "|2a022698a00200010000000000030017|" --algo bm -j DROP --from 40 --to 300 - DAEMON=$TPWS - DAEMON_OPTS="--port=$TPPORT --hostcase --split-http-req=host --user=$TPWS_USER --bind-addr=127.0.0.1" - ;; - tiera) - prepare_tpws - iptables -t nat -C PREROUTING -p tcp --dport 80 -i $SLAVE_ETH -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT 2>/dev/null || - iptables -t nat -I PREROUTING -p tcp --dport 80 -i $SLAVE_ETH -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT - iptables -t nat -C OUTPUT -p tcp --dport 80 -m owner ! --uid-owner $TPWS_USER -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT 2>/dev/null || - iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner ! --uid-owner $TPWS_USER -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT - DAEMON=$TPWS - DAEMON_OPTS="--port=$TPPORT --split-http-req=host --user=$TPWS_USER --bind-addr=127.0.0.1" - ;; - athome) - prepare_tpws - iptables -t nat -C PREROUTING -p tcp --dport 80 -i $SLAVE_ETH -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT 2>/dev/null || - iptables -t nat -I PREROUTING -p tcp --dport 80 -i $SLAVE_ETH -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT - iptables -t nat -C OUTPUT -p tcp --dport 80 -m owner ! --uid-owner $TPWS_USER -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT 2>/dev/null || - iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner ! --uid-owner $TPWS_USER -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT - DAEMON=$TPWS - DAEMON_OPTS="--port=$TPPORT --split-http-req=method --user=$TPWS_USER --bind-addr=127.0.0.1" - ;; - custom) - # PLACEHOLDER - echo !!! NEED ATTENTION !!! - echo Select daemon and options that work for you - echo \(optional\) Prepare environment for running daemon - echo Configure iptables for required actions - echo Study how other sections work - DAEMON=/bin/sleep - DAEMON_OPTS=20 - ;; - esac - - echo -n "Starting $DESC: " - start-stop-daemon --start --quiet --pidfile $PIDFILE --background --make-pidfile \ - --exec $DAEMON -- $DAEMON_OPTS - echo "$NAME." - ;; - stop) - echo "Deleting iptables rule" - - case "${ISP}" in - hostlist) - iptables -t nat -D PREROUTING -p tcp --dport 80 -i $SLAVE_ETH -j DNAT --to 127.0.0.1:$TPPORT - iptables -t nat -D OUTPUT -p tcp --dport 80 -m owner ! --uid-owner $TPWS_USER -j DNAT --to 127.0.0.1:$TPPORT - DAEMON=$TPWS - ;; - mns|rt) - iptables -t raw -D PREROUTING -p tcp --sport 80 --tcp-flags SYN,ACK SYN,ACK -m set --match-set zapret src -j NFQUEUE --queue-num $QNUM --queue-bypass - DAEMON=$NFQWS - ;; - beeline) - iptables -t mangle -D POSTROUTING -p tcp --dport 80 -m set --match-set zapret dst -j NFQUEUE --queue-num $QNUM --queue-bypass - DAEMON=$NFQWS - ;; - domru) - sysctl -w net.ipv4.conf.$SLAVE_ETH.route_localnet=0 - iptables -t nat -D PREROUTING -p tcp --dport 80 -i $SLAVE_ETH -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT - iptables -t nat -D OUTPUT -p tcp --dport 80 -m owner ! --uid-owner $TPWS_USER -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT - iptables -t raw -D PREROUTING -p udp --sport 53 -m string --hex-string "|05030311|" --algo bm -j DROP --from 40 --to 300 - iptables -t raw -D PREROUTING -p udp --sport 53 -m string --hex-string "|2a022698a00200010000000000030017|" --algo bm -j DROP --from 40 --to 300 - DAEMON=$TPWS - ;; - tiera|athome) - sysctl -w net.ipv4.conf.$SLAVE_ETH.route_localnet=0 - iptables -t nat -D PREROUTING -p tcp --dport 80 -i $SLAVE_ETH -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT - iptables -t nat -D OUTPUT -p tcp --dport 80 -m owner ! --uid-owner $TPWS_USER -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT - DAEMON=$TPWS - ;; - custom) - # PLACEHOLDER - echo !!! NEED ATTENTION !!! - echo Clear firewall rules here. Remove iptables changes made previously. - echo Select which daemon to stop. - echo Study how other sections work - ;; - esac - - echo -n "Stopping $DESC: " - start-stop-daemon --oknodo --stop --quiet --pidfile $PIDFILE \ - --exec $DAEMON - echo "$NAME." - ;; - *) - N=/etc/init.d/$NAME - echo "Usage: $N {start|stop}" >&2 - exit 1 - ;; -esac - -exit 0 diff --git a/init.d/openwrt/firewall.user.athome b/init.d/openwrt/firewall.user.athome deleted file mode 100644 index 777328f..0000000 --- a/init.d/openwrt/firewall.user.athome +++ /dev/null @@ -1,19 +0,0 @@ -TPPORT=1188 -TPWS_USER=daemon - -. /lib/functions/network.sh - -network_find_wan wan_iface - -for ext_iface in $wan_iface; do - network_get_device DEVICE $ext_iface - # DNAT for local traffic - iptables -t nat -C OUTPUT -p tcp --dport 80 -o $DEVICE -m owner ! --uid-owner $TPWS_USER -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT || - iptables -t nat -I OUTPUT -p tcp --dport 80 -o $DEVICE -m owner ! --uid-owner $TPWS_USER -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT - -done - -network_get_device DEVICE lan -sysctl -w net.ipv4.conf.$DEVICE.route_localnet=1 -iptables -t nat -C prerouting_lan_rule -p tcp --dport 80 -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT || - iptables -t nat -I prerouting_lan_rule -p tcp --dport 80 -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT diff --git a/init.d/openwrt/firewall.user.beeline b/init.d/openwrt/firewall.user.beeline deleted file mode 100644 index 02d2bb1..0000000 --- a/init.d/openwrt/firewall.user.beeline +++ /dev/null @@ -1,5 +0,0 @@ -# put it to /etc/firewall.user - -# for BEELINE ISP -iptables -t mangle -C 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 diff --git a/init.d/openwrt/firewall.user.custom b/init.d/openwrt/firewall.user.custom deleted file mode 100644 index e4cee18..0000000 --- a/init.d/openwrt/firewall.user.custom +++ /dev/null @@ -1,3 +0,0 @@ -# put it to /etc/firewall.user - -# study how other firewall.user scripts work and put here rules that work for you diff --git a/init.d/openwrt/firewall.user.domru b/init.d/openwrt/firewall.user.domru deleted file mode 100644 index d3bab22..0000000 --- a/init.d/openwrt/firewall.user.domru +++ /dev/null @@ -1,24 +0,0 @@ -TPPORT=1188 -TPWS_USER=daemon - -. /lib/functions/network.sh - -network_find_wan wan_iface - -for ext_iface in $wan_iface; do - network_get_device DEVICE $ext_iface - # BLOCK SPOOFED DNS FROM DOMRU - iptables -t raw -C PREROUTING -i $DEVICE -p udp --sport 53 -m string --hex-string "|05030311|" --algo bm -j DROP --from 40 --to 300 || - iptables -t raw -I PREROUTING -i $DEVICE -p udp --sport 53 -m string --hex-string "|05030311|" --algo bm -j DROP --from 40 --to 300 - iptables -t raw -C PREROUTING -i $DEVICE -p udp --sport 53 -m string --hex-string "|2a022698a00200010000000000030017|" --algo bm -j DROP --from 40 --to 300 || - iptables -t raw -I PREROUTING -i $DEVICE -p udp --sport 53 -m string --hex-string "|2a022698a00200010000000000030017|" --algo bm -j DROP --from 40 --to 300 - # DNAT for local traffic - iptables -t nat -C OUTPUT -p tcp --dport 80 -o $DEVICE -m owner ! --uid-owner $TPWS_USER -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT || - iptables -t nat -I OUTPUT -p tcp --dport 80 -o $DEVICE -m owner ! --uid-owner $TPWS_USER -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT - -done - -network_get_device DEVICE lan -sysctl -w net.ipv4.conf.$DEVICE.route_localnet=1 -iptables -t nat -C prerouting_lan_rule -p tcp --dport 80 -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT || - iptables -t nat -I prerouting_lan_rule -p tcp --dport 80 -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT diff --git a/init.d/openwrt/firewall.user.hostlist b/init.d/openwrt/firewall.user.hostlist deleted file mode 100644 index 7a91bd6..0000000 --- a/init.d/openwrt/firewall.user.hostlist +++ /dev/null @@ -1,20 +0,0 @@ -TPPORT=1188 -TPWS_USER=daemon - -. /lib/functions/network.sh - -network_find_wan wan_iface - -for ext_iface in $wan_iface; do - network_get_device DEVICE $ext_iface - # DNAT for local traffic - - iptables -t nat -C OUTPUT -p tcp --dport 80 -o $DEVICE -m owner ! --uid-owner $TPWS_USER -j DNAT --to 127.0.0.1:$TPPORT || - iptables -t nat -I OUTPUT -p tcp --dport 80 -o $DEVICE -m owner ! --uid-owner $TPWS_USER -j DNAT --to 127.0.0.1:$TPPORT - -done - -network_get_device DEVICE lan -sysctl -w net.ipv4.conf.$DEVICE.route_localnet=1 -iptables -t nat -C prerouting_lan_rule -p tcp --dport 80 -j DNAT --to 127.0.0.1:$TPPORT || - iptables -t nat -I prerouting_lan_rule -p tcp --dport 80 -j DNAT --to 127.0.0.1:$TPPORT diff --git a/init.d/openwrt/firewall.user.mns b/init.d/openwrt/firewall.user.mns deleted file mode 100644 index 30fabca..0000000 --- a/init.d/openwrt/firewall.user.mns +++ /dev/null @@ -1,2 +0,0 @@ -iptables -t raw -C 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 raw -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 diff --git a/init.d/openwrt/firewall.user.nfqws_all b/init.d/openwrt/firewall.user.nfqws_all new file mode 100644 index 0000000..89efba4 --- /dev/null +++ b/init.d/openwrt/firewall.user.nfqws_all @@ -0,0 +1,9 @@ +QNUM=200 +IPT_FILTER_PRE="-p tcp --sport 80" +IPT_FILTER_POST="-p tcp --dport 80" + +iptables -t raw -C PREROUTING $IPT_FILTER_PRE -j NFQUEUE --queue-num $QNUM --queue-bypass || + iptables -t raw -I PREROUTING $IPT_FILTER_PRE -j NFQUEUE --queue-num $QNUM --queue-bypass + +iptables -t mangle -C POSTROUTING $IPT_FILTER_POST -j NFQUEUE --queue-num $QNUM --queue-bypass || + iptables -t mangle -I POSTROUTING $IPT_FILTER_POST -j NFQUEUE --queue-num $QNUM --queue-bypass diff --git a/init.d/openwrt/firewall.user.nfqws_ipset b/init.d/openwrt/firewall.user.nfqws_ipset new file mode 100644 index 0000000..9236028 --- /dev/null +++ b/init.d/openwrt/firewall.user.nfqws_ipset @@ -0,0 +1,9 @@ +QNUM=200 +IPT_FILTER_PRE="-p tcp --sport 80 -m set --match-set zapret src" +IPT_FILTER_POST="-p tcp --dport 80 -m set --match-set zapret dst" + +iptables -t raw -C PREROUTING $IPT_FILTER_PRE -j NFQUEUE --queue-num $QNUM --queue-bypass || + iptables -t raw -I PREROUTING $IPT_FILTER_PRE -j NFQUEUE --queue-num $QNUM --queue-bypass + +iptables -t mangle -C POSTROUTING $IPT_FILTER_POST -j NFQUEUE --queue-num $QNUM --queue-bypass || + iptables -t mangle -I POSTROUTING $IPT_FILTER_POST -j NFQUEUE --queue-num $QNUM --queue-bypass diff --git a/init.d/openwrt/firewall.user.rt b/init.d/openwrt/firewall.user.rt deleted file mode 100644 index 30fabca..0000000 --- a/init.d/openwrt/firewall.user.rt +++ /dev/null @@ -1,2 +0,0 @@ -iptables -t raw -C 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 raw -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 diff --git a/init.d/openwrt/firewall.user.tiera b/init.d/openwrt/firewall.user.tiera deleted file mode 100644 index 777328f..0000000 --- a/init.d/openwrt/firewall.user.tiera +++ /dev/null @@ -1,19 +0,0 @@ -TPPORT=1188 -TPWS_USER=daemon - -. /lib/functions/network.sh - -network_find_wan wan_iface - -for ext_iface in $wan_iface; do - network_get_device DEVICE $ext_iface - # DNAT for local traffic - iptables -t nat -C OUTPUT -p tcp --dport 80 -o $DEVICE -m owner ! --uid-owner $TPWS_USER -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT || - iptables -t nat -I OUTPUT -p tcp --dport 80 -o $DEVICE -m owner ! --uid-owner $TPWS_USER -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT - -done - -network_get_device DEVICE lan -sysctl -w net.ipv4.conf.$DEVICE.route_localnet=1 -iptables -t nat -C prerouting_lan_rule -p tcp --dport 80 -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT || - iptables -t nat -I prerouting_lan_rule -p tcp --dport 80 -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$TPPORT diff --git a/init.d/openwrt/firewall.user.tpws_all b/init.d/openwrt/firewall.user.tpws_all new file mode 100644 index 0000000..a59221e --- /dev/null +++ b/init.d/openwrt/firewall.user.tpws_all @@ -0,0 +1,21 @@ +TPPORT=1188 +TPWS_USER=daemon +IPT_FILTER="-p tcp --dport 80" + +. /lib/functions/network.sh + +network_find_wan wan_iface + +for ext_iface in $wan_iface; do + network_get_device DEVICE $ext_iface + # DNAT for local traffic + + iptables -t nat -C OUTPUT -o $DEVICE -m owner ! --uid-owner $TPWS_USER $IPT_FILTER -j DNAT --to 127.0.0.1:$TPPORT || + iptables -t nat -I OUTPUT -o $DEVICE -m owner ! --uid-owner $TPWS_USER $IPT_FILTER -j DNAT --to 127.0.0.1:$TPPORT + +done + +network_get_device DEVICE lan +sysctl -w net.ipv4.conf.$DEVICE.route_localnet=1 +iptables -t nat -C prerouting_lan_rule $IPT_FILTER -j DNAT --to 127.0.0.1:$TPPORT || + iptables -t nat -I prerouting_lan_rule $IPT_FILTER -j DNAT --to 127.0.0.1:$TPPORT diff --git a/init.d/openwrt/firewall.user.tpws_hostlist b/init.d/openwrt/firewall.user.tpws_hostlist new file mode 120000 index 0000000..039a5ba --- /dev/null +++ b/init.d/openwrt/firewall.user.tpws_hostlist @@ -0,0 +1 @@ +firewall.user.tpws_all \ No newline at end of file diff --git a/init.d/openwrt/firewall.user.tpws_ipset b/init.d/openwrt/firewall.user.tpws_ipset new file mode 100644 index 0000000..929b4d3 --- /dev/null +++ b/init.d/openwrt/firewall.user.tpws_ipset @@ -0,0 +1,21 @@ +TPPORT=1188 +TPWS_USER=daemon +IPT_FILTER="-p tcp --dport 80 -m set --match-set zapret dst" + +. /lib/functions/network.sh + +network_find_wan wan_iface + +for ext_iface in $wan_iface; do + network_get_device DEVICE $ext_iface + # DNAT for local traffic + + iptables -t nat -C OUTPUT -o $DEVICE -m owner ! --uid-owner $TPWS_USER $IPT_FILTER -j DNAT --to 127.0.0.1:$TPPORT || + iptables -t nat -I OUTPUT -o $DEVICE -m owner ! --uid-owner $TPWS_USER $IPT_FILTER -j DNAT --to 127.0.0.1:$TPPORT + +done + +network_get_device DEVICE lan +sysctl -w net.ipv4.conf.$DEVICE.route_localnet=1 +iptables -t nat -C prerouting_lan_rule $IPT_FILTER -j DNAT --to 127.0.0.1:$TPPORT || + iptables -t nat -I prerouting_lan_rule $IPT_FILTER -j DNAT --to 127.0.0.1:$TPPORT diff --git a/init.d/openwrt/zapret b/init.d/openwrt/zapret index 3e76d6a..f89c441 100755 --- a/init.d/openwrt/zapret +++ b/init.d/openwrt/zapret @@ -1,38 +1,57 @@ #!/bin/sh /etc/rc.common # Copyright (C) 2006-2011 OpenWrt.org -# CHOOSE ISP HERE. UNCOMMENT ONLY ONE LINE. -ISP=mns -#ISP=rt -#ISP=beeline -#ISP=domru -#ISP=tiera -#ISP=athome - -# Its possible not to use ipset. Use hostlist with tpws instead. -#ISP=hostlist - -# If ISP is unlisted then uncomment "custom" -# Find out what works for your ISP and modify "# PLACEHOLDER" parts of this script -#ISP=custom - USE_PROCD=1 # start betfore firewall - we need ipset populated START=18 + +# +++ REVIEW CONFIG HERE +++ + +# CHOOSE OPERATION MODE +# leave only one MODE= uncommented + +# using nfqws with ipset +#MODE=nfqws_ipset +# using nfqws for all +#MODE=nfqws_all +# CHOOSE NFQWS DAEMON OPTIONS. run "nfq/nfqws --help" for option list +NFQWS_OPT="--wsize=3 --hostspell=HOST" + +# using tpws with ipset +MODE=tpws_ipset +# using tpws for all +#MODE=tpws_all +# using tpws with hostlist +#MODE=tpws_hostlist +# CHOOSE TPWS DAEMON OPTIONS. run "tpws/tpws --help" for option list +TPWS_OPT="--hostspell=HOST --split-http-req=method" + +# only fill ipset, do not run daemons +#MODE=ipset + +# Custom mode +# Find out what works for you and modify "# PLACEHOLDER" parts of this script +#MODE=custom + +# --- REVIEW CONFIG HERE --- + # !!!!! in openwrt you need to add firewall rules manually to /etc/firewall.user +PIDDIR=/var/run ZAPRET_BASE=/opt/zapret +IPSET_CR=$ZAPRET_BASE/ipset/create_ipset.sh QNUM=200 -TPPORT=1188 -ROUTE_TABLE_NUM=100 NFQWS=$ZAPRET_BASE/nfq/nfqws +NFQWS_OPT_BASE="--qnum=$QNUM" + +TPPORT=1188 TPWS=$ZAPRET_BASE/tpws/tpws -IPSET_CR=$ZAPRET_BASE/ipset/create_ipset.sh TPWS_USER=daemon TPWS_HOSTLIST=$ZAPRET_BASE/ipset/zapret-hosts.txt +TPWS_OPT_BASE="--port=$TPPORT --user=$TPWS_USER --bind-addr=127.0.0.1" # must execute /etc/firewall.user on every firewall reload @@ -54,57 +73,56 @@ set_firewall_user_reload() { done } -get_daemon() { - case "${ISP}" in - hostlist) - DAEMON_OPTS="--port=$TPPORT --hostcase --split-http-req=method --hostlist=$TPWS_HOSTLIST --bind-addr=127.0.0.1 --user=$TPWS_USER" - DAEMON=$TPWS - ;; - mns) - DAEMON_OPTS="--qnum=$QNUM --wsize=3" - DAEMON=$NFQWS - ;; - rt) - DAEMON_OPTS="--qnum=$QNUM --wsize=20" - DAEMON=$NFQWS - ;; - beeline) - DAEMON_OPTS="--qnum=$QNUM --hostspell=HOST" - DAEMON=$NFQWS - ;; - domru) - DAEMON_OPTS="--port=$TPPORT --hostcase --split-http-req=host --bind-addr=127.0.0.1 --user=$TPWS_USER" - DAEMON=$TPWS - ;; - tiera) - DAEMON_OPTS="--port=$TPPORT --split-http-req=host --bind-addr=127.0.0.1 --user=$TPWS_USER" - DAEMON=$TPWS - ;; - athome) - DAEMON_OPTS="--port=$TPPORT --split-http-req=method --bind-addr=127.0.0.1 --user=$TPWS_USER" - DAEMON=$TPWS - ;; - custom) - # PLACEHOLDER - echo !!! NEED ATTENTION !!! - echo Select which daemon and what options work for you - DAEMON_OPTS=20 - DAEMON=/bin/sleep - ;; - esac +run_daemon() +{ + # $1 - daemon string id or number. can use 1,2,3,... + # $2 - daemon + # $3 - daemon args + # use $PIDDIR/$DAEMONBASE$1.pid as pidfile + local DAEMONBASE=$(basename $2) + echo "Starting daemon $1: $2 $3" + procd_open_instance + procd_set_param command $2 $3 + procd_set_param pidfile $PIDDIR/$DAEMONBASE$1.pid + procd_close_instance +} + +create_ipset() +{ + echo "Creating ipset" + ($IPSET_CR) } start_service() { set_firewall_user_reload - echo "Creating ipset" - ($IPSET_CR) - get_daemon - [ -n "$DAEMON" ] && { - echo "Starting $DAEMON" - procd_open_instance - procd_set_param command $DAEMON $DAEMON_OPTS - procd_close_instance - } + case "${MODE}" in + tpws_hostlist) + run_daemon 1 $TPWS "$TPWS_OPT_BASE $TPWS_OPT --hostlist=$TPWS_HOSTLIST" + ;; + tpws_ipset) + create_ipset + run_daemon 1 $TPWS "$TPWS_OPT_BASE $TPWS_OPT" + ;; + tpws_all) + run_daemon 1 $TPWS "$TPWS_OPT_BASE $TPWS_OPT" + ;; + nfqws_ipset) + create_ipset + run_daemon 1 $NFQWS "$NFQWS_OPT_BASE $NFQWS_OPT" + ;; + nfqws_all) + run_daemon 1 $NFQWS "$NFQWS_OPT_BASE $NFQWS_OPT" + ;; + ipset) + create_ipset + ;; + custom) + # PLACEHOLDER + echo !!! NEED ATTENTION !!! + echo Start daemon\(s\) + echo Study how other sections work + ;; + esac } diff --git a/readme.txt b/readme.txt index 835e3a8..ab00eb9 100644 --- a/readme.txt +++ b/readme.txt @@ -1,4 +1,4 @@ -zapret v.21 +zapret v.22 Для чего это надо ----------------- @@ -129,56 +129,6 @@ tpws - это transparent proxy. Параметры манипуляции могут сочетаться в любых комбинациях. Есть исключения : split-pos заменяет split-http-req. hostdot и hosttab взаимоисключающи. -Провайдеры ----------- - -Поскольку ситуация с блокировками на отдельных провайдерах может меняться, информация может устаревать. Она дана больше для примера, чем как прямое руководство. -Автор не занимается мониторингом и оперативным обновлением этой информации. - -mns.ru : нужна замена window size на 3. mns.ru убирает заблокированные домены из выдачи своих DNS серверов. меняем на сторонние. аплинк westcall банит по IP адреса из списка РКН, где присутствует https - -at-home.ru : при дефолтном подключении все блокировалось по IP. после заказа внешнего IP (static NAT) банятся по IP https адреса - Для обхода DPI работает замена windows size на 3, но была замечена нестабильность и подвисания. Лучше всего работает сплит запроса около метода в течение всей http сессии. - В https подменяется сертификат. Если у вас все блокируется по IP, то нет никакого способа, кроме как проксирование порта 80 по аналогии с 443. - -beeline (corbina) : нужна замена регистра "Host:" на протяжении всей http сессии. С некоторых пор "host" не работает, но работают другие регистры букв. - -dom.ru : нужно проксирование HTTP сессий через tpws с заменой регистра "Host:" и разделение TCP сегментов на хедере "Host:". - Ахтунг ! Домру блокирует все поддомены заблоченого домена. IP адреса всевозможных поддоменов узнать невозможно из реестра - блокировок, поэтому если вдруг на каком-то сайте вылезает блокировочный баннер, то идите в консоль firefox, вкладка network. - Загружайте сайт и смотрите куда идет редирект. Потом вносите домен в zapret-hosts-user.txt. Например, на kinozal.tv имеются - 2 запрашиваемых поддомена : s.kinozal.tv и st.kinozal.tv с разными IP адресами. - Домру перехватывает DNS запросы и всовывает свой лже-ответ. Это обходится через дроп лже-ответа посредством iptables по наличию IP адреса заглушки или через dnscrypt. - -sknt.ru : проверена работа с tpws с параметром "--split-http-req=method". провайдер мониторит каждый пакет, поэтому при использовании nfq 2-й запрос в той же сессии зависает - -Ростелеком/tkt : помогает разделение http запроса на сегменты, настройки mns.ru подходят - ТКТ был куплен ростелекомом, используется фильтрация ростелекома. - Поскольку DPI не отбрасывает входящую сессию, а только всовывает свой пакет, который приходит раньше ответа от настоящего сервера, - блокировки так же обходятся без применения "тяжелой артиллерии" следующим правилом : - iptables -t raw -I PREROUTING -p tcp --sport 80 -m string --hex-string "|0D0A|Location: http://warning.rt.ru" --algo bm -j DROP --from 40 --to 200 - -tiera : Требуется сплит http запросов в течение всей сессии. - -Другие провайдеры ------------------ - -Первым делом необходимо выяснить не подменят ли ваш провайдер DNS. -Посмотрите во что ресолвятся заблокированные хосты у вашего провайдера и через какой-нибудь web net tools, которых можно нагуглить множество. Сравните. -Если ответы разные, то попробуйте заресолвить те же хосты с DNS сервера 8.8.8.8 через вашего провайдера. -Если ответ от 8.8.8.8 нормальный - поменяйте DNS. Если ответ ненормальный, значит провайдер перехватывает запросы на сторонние DNS. -Используйте dnscrypt. - -Далее необходимо выяснить какой метод обхода DPI работает на вашем провайдере. -В этом вам поможет скрипт https://github.com/ValdikSS/blockcheck. -Выберите какой демон вы будете использовать : nfqws или tpws. -Подготовьте вручную правила iptables для вашего случая, выполните их. -Запустите демон с нужными параметрами вручную. -Проверьте работает ли. -Когда вы найдете рабочий вариант, отредактируйте init скрипт для вашей системы. -Раскомментируйте ISP=custom. Добавьте ваш код в места "# PLACEHOLDER" по аналогии с секциями для других провайдеров для найденной рабочей комбинации. -Для openwrt поместите в /etc/firewall.user свой код по аналогии с готовыми скриптами. - Способы получения списка заблокированных IP ------------------------------------------- @@ -237,6 +187,41 @@ tpws должен запускаться без фильтрации по ipset. Сам поиск по доменам работает очень быстро, нагрузка связана с прокачиванием объема данных через процесс. Вариант хорошо подходит для тех, у кого быстрая система с 128+ Мб памяти и провайдер применяет DPI. +Проверка провайдера +------------------- + +Перед настройкой нужно провести исследование какую бяку устроил вам ваш провайдер. + +Нужно выяснить не подменяет ли он DNS и какой метод обхода DPI работает. +В этом вам поможет скрипт https://github.com/ValdikSS/blockcheck. + +Если DNS подменяется, но провайдер не перехватывает обращения к сторонним DNS, поменяйте DNS на публичный. +Например : 8.8.8.8, 8.8.4.4, 1.1.1.1, 1.0.0.1, 9.9.9.9 +Если DNS подменяется и провайдер перехватывает обращения к сторонним DNS, настройте dnscrypt. + +Проанализируйте какие методы дурения DPI работают, в соответствии с ними настройте init скрипт. + +Выбор режима в init скрипте +--------------------------- + +После установки init скрипта на систему (индивидуально для разных ОС) нужно его настроить. + +Отредактируйте /etc/init.d/zapret. +Выберите MODE. Снимите комментарий только с одного из присваиваний. + +nfqws_ipset - использовать nfqws для модификации трафика на порт 80 только на IP из ipset "zapret" +nfqws_all - использовать nfqws для модификации трафика на порт 80 для всех IP +tpws_ipset - использовать tpws для модификации трафика на порт 80 только на IP из ipset "zapret" +tpws_all - использовать tpws для модификации трафика на порт 80 для всех IP +tpws_hostlist - пропускать через tpws весь трафик на порт 80. tpws применяет дурение только к хостам из hostlist. +ipset - только заполнить ipset. ipset может быть применен для заворота трафика на прокси или на VPN +custom - нужно самому запрограммировать запуск демонов и правила iptables + +Можно изменить опции дурения, применяемые демонами nfqws и tpws : + +NFQWS_OPT="--wsize=3 --hostspell=HOST" +TPWS_OPT="--hostspell=HOST --split-http-req=method" + Пример установки на debian 8,9 ubuntu 16,18 ------------------------------------------- @@ -253,9 +238,9 @@ tpws должен запускаться без фильтрации по ipset. АЛЬТЕРНАТИВА : зайти в tpws,nfq,ip2net,mdig, в каждом выполнить make. Получите динамические бинарики под вашу ось. Скопировать скрипт запуска : - cp /opt/zapret/init.d/debian7/zapret /etc/init.d + cp /opt/zapret/init.d/debian/zapret /etc/init.d -В /etc/init.d/zapret выбрать пераметр "ISP". В зависимости от него будут применены нужные правила. +В /etc/init.d/zapret настроить параметры согласно разделу "Выбор режима в init скрипте". Там же выбрать параметр SLAVE_ETH, соответствующий названию внутреннего сетевого интерфейса. Зарегистрировать init скрипт в systemd : @@ -352,7 +337,7 @@ ipset можно выкинуть, если не будем пользовать Скопировать скрипт запуска : cp /opt/zapret/init.d/openwrt/zapret /etc/init.d -В /etc/init.d/zapret выбрать пераметр "ISP". В зависимости от него будут применены нужные правила. +В /etc/init.d/zapret настроить параметры согласно разделу "Выбор режима в init скрипте". Вручную первый раз получить новый список ip адресов (кроме hostlist) : /opt/zapret/ipset/get_antizapret.sh @@ -374,7 +359,10 @@ ipset можно выкинуть, если не будем пользовать /etc/init.d/zapret enable /etc/init.d/zapret start -В зависимости от вашего провайдера внести нужные записи в /etc/firewall.user. +В зависимости от выбранного режима внести нужные записи в /etc/firewall.user. +Базовые варианты лежат в /opt/zapret/init.d/openwrt/firewall.user.*. +Если у вас еще нет firewall.user или он пуст, можно скопировать файл. +В противном случае добавьте записи или интегрируйте с уже имеющимся кодом. fw3 restart Посмотреть через iptables -nL или через luci вкладку "firewall" появились ли нужные правила.