Leiten Sie zielportspezifische Pakete über VPN weiter

Leiten Sie zielportspezifische Pakete über VPN weiter

Ich versuche etwas sehr Ähnliches zu erreichen wieiptables - Ziel zum Weiterleiten von Paketen an eine bestimmte Schnittstelle?Undhttps://unix.stackexchange.com/questions/21093/output-traffic-on-different-interfaces-based-on-destination-portaber ich kriege es nicht zum Laufen.

Hier ist mein Setup:

RPi4 (lokale IP, eth0: 10.0.0.196/24; Wireguard-IP: 10.10.10.2/24; Wireguard-Schnittstelle heißt „Client“) <---> Server (Wireguard-IP: 10.10.10.1/24, globale IPv4) <---> Internet

Hier ist mein bisheriger Testausschnitt:

systemctl start [email protected]

sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.client.rp_filter=0

for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do
  echo 0 > $i
done

ip rule add fwmark 2 table 3
ip route add default via 10.10.10.1 table 3
ip route flush cache

iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 2
iptables -t nat -A POSTROUTING -o client -j SNAT --to-source 10.10.10.2

Wenn ich dann versuche zu erreichen zum Beispiel

telnet -4 gmail-smtp-in.l.google.com 25
Trying 108.177.119.26...
telnet: Unable to connect to remote host: No route to host

Der übrige Datenverkehr (alles, was nicht mit meiner Markierung „2“ markiert ist) wird ordnungsgemäß über eth0 (nicht „Client“) geleitet und funktioniert einwandfrei (wie ping 1.1.1.1und curl ifconfig.me).


So sehen das Routing und die Iptables vor und nach dem Ausführen des obigen Snippets aus.

VOR:

# ip route show table all
default via 10.0.0.1 dev eth0 proto dhcp src 10.0.0.196 metric 100
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.196
10.0.0.1 dev eth0 proto dhcp scope link src 10.0.0.196 metric 100
broadcast 10.0.0.0 dev eth0 table local proto kernel scope link src 10.0.0.196
local 10.0.0.196 dev eth0 table local proto kernel scope host src 10.0.0.196
broadcast 10.0.0.255 dev eth0 table local proto kernel scope link src 10.0.0.196
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
# iptables -S -t nat
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P POSTROUTING ACCEPT
-P OUTPUT ACCEPT
# iptables -S -t mangle
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT

NACH:

# ip route show table all
default via 10.10.10.1 dev client table 3
default via 10.0.0.1 dev eth0 proto dhcp src 10.0.0.196 metric 100
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.196
10.0.0.1 dev eth0 proto dhcp scope link src 10.0.0.196 metric 100
10.10.10.0/24 dev client proto kernel scope link src 10.10.10.2
broadcast 10.0.0.0 dev eth0 table local proto kernel scope link src 10.0.0.196
local 10.0.0.196 dev eth0 table local proto kernel scope host src 10.0.0.196
broadcast 10.0.0.255 dev eth0 table local proto kernel scope link src 10.0.0.196
broadcast 10.10.10.0 dev client table local proto kernel scope link src 10.10.10.2
local 10.10.10.2 dev client table local proto kernel scope host src 10.10.10.2
broadcast 10.10.10.255 dev client table local proto kernel scope link src 10.10.10.2
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
# ip rule show
0:      from all lookup local
32765:  from all fwmark 0x2 lookup 3
32766:  from all lookup main
32767:  from all lookup default
# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
# iptables -S -t nat
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P POSTROUTING ACCEPT
-P OUTPUT ACCEPT
-A POSTROUTING -o client -j SNAT --to-source 10.10.10.2
# iptables -S -t mangle
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A OUTPUT -p tcp -m tcp --dport 25 -j MARK --set-xmark 0x2/0xffffffff

Antwort1

Hier ist ein Bild des NetzwerkpaketsFluss durch Netfilter-Tabellen. Es scheint mir, dass es nicht funktioniert, weil die Routing-Entscheidungen getroffen werdenVordas Paket passiert Ihre fwmark-Regel und Sie können es nicht über eine andere Schnittstelle beenden.

Sie können dafür direkt richtlinienbasiertes Routing verwenden, kein Bedarf an fwmark. Wenn Sie Ihr Beispiel richtig lesen, sollte dies umleitenalleIhren ausgehenden SMTP-Verkehr über Wireguard:

iptables -t nat -A POSTROUTING -o client -j SNAT --to-source 10.10.10.2
ip rule add priority 1000 dport 25 table 3
ip route add default via 10.10.10.1 table 3

man ip-ruleWeitere Einzelheiten finden Sie unter

Antwort2

Ich verstehe, dass Sie nur eine VPN-Verbindung herstellen müssen, die den gesamten externen Datenverkehr über das VPN sendet. Wenn ich es richtig verstanden habe, konfigurieren Sie Ihren Wireguard folgendermaßen:

SERVERSEITE(/etc/wireguard/wg0.conf)

[Interface]
PrivateKey = <YOUR PRIVATE KEY HERE>
Address = 10.10.10.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D 
POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT

[Peer]
PublicKey = [CLIETS PUBLIC KEY]
AllowedIPs = 10.10.10.2/32   # The client's IP address

KUNDENSEITE(/etc/wireguard/wg0.conf)

[Interface]
PrivateKey = <Output of privatekey file that contains your private key>
Address = 10.10.10.2/24
PostUp = ip route add [SERVER_PUBLIC_IP] via [LOCAL_GATEWAY_IP] dev eth0

[Peer]
PublicKey = <Server Public key>
Endpoint = <Server Public IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepAlive = 25

Beachten Sie, dass Sie eine Route hinzufügen müssen, um den gesamten Datenverkehr an IhreöffentlichWireguard-IP über das Ethernet, andernfalls wird die Verbindung Ihres Clients unterbrochen.

Die folgende Anleitung war für mich sehr hilfreich: So richten Sie WireGuard-Firewall-Regeln unter Linux ein

HINWEIS 1: In diesem Fall müssen Sie NAT MASQUERADE nur auf der Serverseite einrichten.

HINWEIS 2: Sie müssen die IP-Weiterleitung auf Ihren Linux-Rechnern einrichten:

sudo echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sudo sysctl -p

verwandte Informationen