From da05000c7f42d7201945a287dd49a9b6b6b28fdc Mon Sep 17 00:00:00 2001 From: bol-van Date: Sat, 18 Jun 2022 11:35:26 +0300 Subject: [PATCH] wireguard docs: nftables complex case without SNAT --- docs/wireguard/wireguard_iproute_openwrt.txt | 57 +++++++++++++++++--- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/docs/wireguard/wireguard_iproute_openwrt.txt b/docs/wireguard/wireguard_iproute_openwrt.txt index 14d33be..4224794 100644 --- a/docs/wireguard/wireguard_iproute_openwrt.txt +++ b/docs/wireguard/wireguard_iproute_openwrt.txt @@ -284,7 +284,7 @@ cat << EOF | nft -f - EOF ------------------------------------------------ -/etc/init.d/zapret restart_fw +# /etc/init.d/zapret restart_fw --- По поводу двойного NAT --- @@ -350,6 +350,10 @@ connmark относится к соединению, fwmark - к пакету. Если к нам приходит пакет с какого-то другого интерфейса, то восстанавливаем его connmark в fwmark по маске 0x800. И теперь он подпадает под правило ip rule, заворачиваясь на wgvps, что и требовалось. +Альтернативное решение - использовать на VPSке для проброса портов не только DNAT, но и SNAT/MASQUERADE. Тогда source address +будет заменен на 192.168.254.1. Он по таблице маршрутизации пойдет на wgvps. Но в этом случае клиентские программы, +на которые осуществляется проброс портов, не будут видеть реальный IP подключенца. + --/etc/firewall.user---------------------------- . /opt/zapret/init.d/openwrt/functions @@ -376,9 +380,53 @@ ipt PREROUTING -t mangle ! -i $DEVICE -j CONNMARK --restore-mark --nfmask 0x800 ipt PREROUTING -t mangle -i $DEVICE -m conntrack --ctstate NEW -j CONNMARK --set-xmark 0x800/0x800 ------------------------------------------------ - # fw3 restart +Вариант nftables : + +--/etc/firewall.zapret.hook.post_up---------------------------- +#!/bin/sh + +. /opt/zapret/init.d/openwrt/functions + +ZAPRET_NFT_TABLE=zapret + +cat << EOF | nft -f - 2>/dev/null + delete chain inet $ZAPRET_NFT_TABLE my_output + delete chain inet $ZAPRET_NFT_TABLE my_prerouting + delete chain inet $ZAPRET_NFT_TABLE my_nat +EOF + +network_get_device DEVICE wgvps + +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 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 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 + add rule inet $ZAPRET_NFT_TABLE my_nat oifname $DEVICE mark and 0x1000 == 0x1000 masquerade +EOF +------------------------------------------------ + +# /etc/init.d/zapret restart_fw + +К сожалению, здесь возможности nftables немного хромают. Полноценного эквивалента CONNMARK --restore-mark --nfmask +не существует. Оригинал iptables предполагал копирование одного бита 0x800 из connmark в mark. +Лучшее, что можно сделать в nftables, это копирование одного бита с занулением всех остальных. +Сложные выражения типа "meta mark set mark and ~0x800 or (ct mark and 0x800)" nft не понимает. +Об этом же говорит попытка перевода через iptables-translate. + Сейчас уже можно с vpn сервера пингануть ip адрес внутри локалки клиента. Пинги должны ходить. Отсутствие двойного NAT значительно облегчает проброс портов с внешнего IP vpn сервера в локалку какого-либо клиента. @@ -397,16 +445,13 @@ config rule ------------------------------------------------ # fw3 restart +# /etc/init.d/zapret restart_fw --/etc/network/interfaces.d/wgvps------------- post-up iptables -t nat -A PREROUTING -i eth0 -p tcp -m multiport --dports 5001,5201 -j DNAT --to-destination 192.168.2.2 - post-up iptables -t nat -A POSTROUTING -o $IFACE -d 192.168.2.2 -p tcp -m multiport --dports 5001,5201 -j MASQUERADE post-up iptables -t nat -A PREROUTING -i eth0 -p udp -m multiport --dports 5001,5201 -j DNAT --to-destination 192.168.2.2 - post-up iptables -t nat -A POSTROUTING -o $IFACE -d 192.168.2.2 -p udp -m multiport --dports 5001,5201 -j MASQUERADE post-down iptables -t nat -D PREROUTING -i eth0 -p tcp -m multiport --dports 5001,5201 -j DNAT --to-destination 192.168.2.2 - post-down iptables -t nat -D POSTROUTING -o $IFACE -d 192.168.2.2 -p tcp -m multiport --dports 5001,5201 -j MASQUERADE post-down iptables -t nat -D PREROUTING -i eth0 -p udp -m multiport --dports 5001,5201 -j DNAT --to-destination 192.168.2.2 - post-down iptables -t nat -D POSTROUTING -o $IFACE -d 192.168.2.2 -p udp -m multiport --dports 5001,5201 -j MASQUERADE ---------------------------------------------- # ifdown wgvps ; ifup wgvps