
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.1
und 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 Netzwerkpakets. 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-rule
Weitere 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