From a38d4e79cd437a8b985ab2a6a512f370961684da Mon Sep 17 00:00:00 2001 From: bol-van Date: Sat, 18 Jun 2022 18:18:47 +0300 Subject: [PATCH] wireguard docs: more info, enable nozapret filter --- docs/wireguard/wireguard_iproute_openwrt.txt | 75 +++++++++++++++----- 1 file changed, 58 insertions(+), 17 deletions(-) diff --git a/docs/wireguard/wireguard_iproute_openwrt.txt b/docs/wireguard/wireguard_iproute_openwrt.txt index 06b0bd6..b761437 100644 --- a/docs/wireguard/wireguard_iproute_openwrt.txt +++ b/docs/wireguard/wireguard_iproute_openwrt.txt @@ -231,11 +231,33 @@ config rule # ping 192.168.254.3 +--- Подготовка zapret --- + +Выполните install_easy.sh. Он настроит режим обхода DPI. Если обход DPI не нужен - выберите MODE=filter. +Так же он заресолвит домены из ipset/zapret-hosts-user-ipban.txt и внесет крон-джоб для периодического обновления ip. + +Если вы используете в своих правилах ipset zapret, то он ресолвится и обновляется только, если выбран режим фильтрации обхода DPI по ipset. +По сути он вам нужен исключительно, если обход DPI не помогает. Например, удается как-то пробить http, но не удается пробить https. +И при этом вы хотите, чтобы на VPN направлялись только ip из скачанного ip листа, в добавок к заресолвленному ipset/zapret-hosts-user.txt. +Именно этот случай и рассмотрен в данном примере. Если это не так, то убирайте правила с портом 443 из нижеприведенных правил iptables/nftables. +Если не хотите ограничиваться листом, и хотите направлять все на порт 443, то уберите фильтры из правил iptables/nftables, +связанные с ipset/nfset "zapret". + +Фильтрация по именам доменов (MODE_FILTER=hostlist) невозможна средствами iptables/nftables. Она производится исключительно в tpws и nfqws +по результатам анализа протокола прикладного уровня, иногда достаточно сложного, связанного с дешифировкой пакета (QUIC). +Скачиваются листы с именами доменов, не ip адресами. ipset/zapret-hosts-user.txt не ресолвится, а используется как hostlist. +Потому вам нельзя расчитывать на ipset zapret. +Тем не менее при выборе этого режима фильтрации , либо вовсе при ее отсутствии (MODE_FILTER=none), ipset/zapret-hosts-user-ipban.txt +все равно ресолвится. Вы всегда можете расчитывать на ipset/nfset "ipban", "nozapret". + +"nozapret" - это ipset/nfset, связанный с системой исключения ip. Сюда загоняется все из ipset/zapret-hosts-user-exclude.txt после ресолвинга. + + --- Маркировка трафика --- Завернем на vpn все из ipset zapret на tcp:443 и все из ipban. OUTPUT относится к исходящим с роутера пакетам, PREROUTING - ко всем остальным. -Если с самого роутера ничего заруливать не надо, можно опустить все до команд с PREROUTING. +Если с самого роутера ничего заруливать не надо, можно опустить часть, отвечающую за OUTPUT. --/etc/firewall.user---------------------------- . /opt/zapret/init.d/openwrt/functions @@ -245,13 +267,13 @@ create_ipset no-update network_find_wan_all wan_iface for ext_iface in $wan_iface; do network_get_device DEVICE $ext_iface - ipt OUTPUT -t mangle -o $DEVICE -p tcp --dport 443 -m set --match-set zapret dst -j MARK --set-mark 0x800/0x800 - ipt OUTPUT -t mangle -o $DEVICE -m set --match-set ipban dst -j MARK --set-mark 0x800/0x800 + ipt OUTPUT -t mangle -o $DEVICE -p tcp --dport 443 -m set --match-set zapret dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800 + ipt OUTPUT -t mangle -o $DEVICE -m set --match-set ipban dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800 done network_get_device DEVICE lan -ipt PREROUTING -t mangle -i $DEVICE -p tcp --dport 443 -m set --match-set zapret dst -j MARK --set-mark 0x800/0x800 -ipt PREROUTING -t mangle -i $DEVICE -m set --match-set ipban dst -j MARK --set-mark 0x800/0x800 +ipt PREROUTING -t mangle -i $DEVICE -p tcp --dport 443 -m set --match-set zapret dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800 +ipt PREROUTING -t mangle -i $DEVICE -m set --match-set ipban dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800 ------------------------------------------------ # /etc/init.d/firewall restart @@ -264,6 +286,7 @@ ipt PREROUTING -t mangle -i $DEVICE -m set --match-set ipban dst -j MARK --set-m будут устанавливаться без сжатия squashfs. Убедитесь, что у вас достаточно места. Либо сразу настраивайте образ через image builder. +Фаервол fw4 работает в одноименной nftable - "inet fw4". "inet" означает, что таблица принимает и ipv4, и ipv6. Поскольку для маркировки трафика используется nfset, принадлежащий таблице zapret, цепочки необходимо помещать в ту же таблицу. Для синхронизации лучше всего использовать хук INIT_FW_POST_UP_HOOK="/etc/firewall.zapret.hook.post_up" @@ -282,18 +305,36 @@ EOF cat << EOF | nft -f - add chain inet $ZAPRET_NFT_TABLE my_output { type route hook output priority mangle; } flush chain inet $ZAPRET_NFT_TABLE my_output - add rule inet $ZAPRET_NFT_TABLE my_output oifname @wanif ip daddr @ipban meta mark set mark or 0x800 - add rule inet $ZAPRET_NFT_TABLE my_output oifname @wanif tcp dport 443 ip daddr @zapret meta mark set mark or 0x800 + add rule inet $ZAPRET_NFT_TABLE my_output oifname @wanif ip daddr @ipban ip daddr != @nozapret meta mark set mark or 0x800 + add rule inet $ZAPRET_NFT_TABLE my_output oifname @wanif tcp dport 443 ip daddr @zapret ip daddr != @nozapret meta mark set mark or 0x800 add chain inet $ZAPRET_NFT_TABLE my_prerouting { type filter hook prerouting priority mangle; } flush chain inet $ZAPRET_NFT_TABLE my_prerouting - add rule inet $ZAPRET_NFT_TABLE my_prerouting iifname @lanif ip daddr @ipban meta mark set mark or 0x800 - add rule inet $ZAPRET_NFT_TABLE my_prerouting iifname @lanif tcp dport 443 ip daddr @zapret meta mark set mark or 0x800 + add rule inet $ZAPRET_NFT_TABLE my_prerouting iifname @lanif ip daddr @ipban ip daddr != @nozapret meta mark set mark or 0x800 + add rule inet $ZAPRET_NFT_TABLE my_prerouting iifname @lanif tcp dport 443 ip daddr @zapret ip daddr != @nozapret meta mark set mark or 0x800 EOF ------------------------------------------------ # /etc/init.d/zapret restart_fw +Проверка правил : +# /etc/init.d/zapret list_table +или +# nft -t list table inet zapret + +Должны быть цепочки my_prerouting и my_output. + +Проверка заполнения nfsets : +# nft list set inet zapret zapret +# nft list set inet zapret ipban +# nft list set inet zapret nozapret + +Проверка заполнения множеств lanif, wanif, wanif6, link_local : +# /etc/init.d/zapret list_ifsets + +Должны присутствовать имена интерфейсов во множествах lanif, wanif. +wanif6 заполняется только при включении ipv6. +link_local нужен только для tpws при включении ipv6. --- По поводу двойного NAT --- @@ -370,14 +411,14 @@ create_ipset no-update network_find_wan_all wan_iface for ext_iface in $wan_iface; do network_get_device DEVICE $ext_iface - ipt OUTPUT -t mangle -o $DEVICE -p tcp --dport 443 -m set --match-set zapret dst -j MARK --set-mark 0x800/0x800 - ipt OUTPUT -t mangle -o $DEVICE -m set --match-set ipban dst -j MARK --set-mark 0x800/0x800 + ipt OUTPUT -t mangle -o $DEVICE -p tcp --dport 443 -m set --match-set zapret dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800 + ipt OUTPUT -t mangle -o $DEVICE -m set --match-set ipban dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800 ipt OUTPUT -t mangle -o $DEVICE -j MARK --set-mark 0x1000/0x1000 done network_get_device DEVICE lan -ipt PREROUTING -t mangle -i $DEVICE -p tcp --dport 443 -m set --match-set zapret dst -j MARK --set-mark 0x800/0x800 -ipt PREROUTING -t mangle -i $DEVICE -m set --match-set ipban dst -j MARK --set-mark 0x800/0x800 +ipt PREROUTING -t mangle -i $DEVICE -p tcp --dport 443 -m set --match-set zapret dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800 +ipt PREROUTING -t mangle -i $DEVICE -m set --match-set ipban dst -m set ! --match-set nozapret dst -j MARK --set-mark 0x800/0x800 # do masquerade for OUTPUT to ensure correct outgoing address ipt postrouting_tunvps_rule -t nat -m mark --mark 0x1000/0x1000 -j MASQUERADE @@ -407,16 +448,16 @@ EOF cat << EOF | nft -f - add chain inet $ZAPRET_NFT_TABLE my_output { type route hook output priority mangle; } flush chain inet $ZAPRET_NFT_TABLE my_output - add rule inet $ZAPRET_NFT_TABLE my_output oifname @wanif ip daddr @ipban meta mark set mark or 0x800 - add rule inet $ZAPRET_NFT_TABLE my_output oifname @wanif tcp dport 443 ip daddr @zapret meta mark set mark or 0x800 + add rule inet $ZAPRET_NFT_TABLE my_output oifname @wanif ip daddr @ipban ip daddr != @nozapret meta mark set mark or 0x800 + add rule inet $ZAPRET_NFT_TABLE my_output oifname @wanif tcp dport 443 ip daddr @zapret ip daddr != @nozapret meta mark set mark or 0x800 add rule inet $ZAPRET_NFT_TABLE my_output oifname @wanif meta mark set mark or 0x1000 add chain inet $ZAPRET_NFT_TABLE my_prerouting { type filter hook prerouting priority mangle; } flush chain inet $ZAPRET_NFT_TABLE my_prerouting add rule inet $ZAPRET_NFT_TABLE my_prerouting iifname $DEVICE ct state new ct mark set ct mark or 0x800 add rule inet $ZAPRET_NFT_TABLE my_prerouting iifname != $DEVICE meta mark set ct mark and 0x800 - add rule inet $ZAPRET_NFT_TABLE my_prerouting iifname @lanif ip daddr @ipban meta mark set mark or 0x800 - add rule inet $ZAPRET_NFT_TABLE my_prerouting iifname @lanif tcp dport 443 ip daddr @zapret meta mark set mark or 0x800 + add rule inet $ZAPRET_NFT_TABLE my_prerouting iifname @lanif ip daddr @ipban ip daddr != @nozapret meta mark set mark or 0x800 + add rule inet $ZAPRET_NFT_TABLE my_prerouting iifname @lanif tcp dport 443 ip daddr @zapret ip daddr != @nozapret meta mark set mark or 0x800 add chain inet $ZAPRET_NFT_TABLE my_nat { type nat hook postrouting priority 100 ; } flush chain inet $ZAPRET_NFT_TABLE my_nat