Richtige Konfiguration von iptables für zwei Portweiterleitungsebenen: externer Server über VPN mit lokalem Server verbunden

Richtige Konfiguration von iptables für zwei Portweiterleitungsebenen: externer Server über VPN mit lokalem Server verbunden

Ich hatte einen Minecraft-Server auf einem VPS (Debian 10) laufen, aber der VPS war zu schwach, um damit umzugehen, also wollte ich einen leistungsfähigeren lokalen Server verwenden, um ihn auszuführen (Ubuntu 22.04). Der VPS hostet einen OpenVPN-Server und der lokale Server stellt als einziger Client eine Verbindung her. Der VPS befindet sich bei 10.8.0.1 und der lokale Server bei 10.8.0.6 (192.168.1.185 im lokalen Netzwerk).

Ich habe iptables-Regeln verwendet, um tun0-VPN-Pakete unter 10.8.0.6:25565 an die IP des lokalen Servers weiterzuleiten. Das funktioniert einwandfrei: Ich kann den Minecraft-Server vom VPS aus abfragen. Dann habe ich denselben Regelsatz (natürlich mit vertauschten relevanten IPs) auf dem VPS eingerichtet, um Verbindungen von vps_external_ip:25565 an 10.8.0.6:25565 weiterzuleiten. Diese Regel leitet die Pakete bis zum lokalen Server weiter, aber die Verbindung läuft immer ab. Das Merkwürdige ist, dass weder funktionierende Verbindungen von VPS -> lokaler Server noch extern -> VPS -> lokaler Server die Paketzähler der POSTROUTING-MASQUERADE-Regeln erhöhen, aber das tun sie bei den PREROUTING-Regeln. Bei diesen TCP/UDP-Verbindungen läuft einfach eine Zeit ab, wenn sie den VPS unter eth0:25565 erreichen, es gibt keine Fehlermeldungen wegen verweigerter Verbindung.

Die IPV4-Weiterleitung ist auf beiden Maschinen aktiviert und ich habe es mit deaktiviertem UFW versucht, ohne Erfolg.

Ich habe für den NAT-Postroute beider Server eine Protokollregel eingerichtet, bin mir aber nicht sicher, wie ich das Problem beheben kann, da ich keine finden konnte.

POSTROUTE-Protokollausgabe (iptables -t nat -I POSTROUTING -j LOG --log-prefix "NAT:" --log-level 7)

##### VPS
Apr 23 20:52:02 vpskernel: [1552376.122382] NAT1:IN= OUT=tun0 SRC=<my ip> DST=10.8.0.6 LEN=48 TOS=0x08 PREC=0x20 TTL=114 ID=21284 DF PROTO=TCP SPT=1806 DPT=25565 WINDOW=64240 RES=0x00 SYN URGP=0

#### Local server
<could not find any relevant logs grepping /var/log/kern.log for NAT1 and there were no logs at all for tun0>

Ich habe /etc/ufw/before.rules für jeden Server verwendet, um die iptables-Regeln einzurichten.
VPS /etc/ufw/before.rules:

# START OPENVPN RULES
# NAT table rules
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
# END OPENVPN RULES

-A PREROUTING -i eth0 -d <vps external IP> -p tcp --dport 25565 -j DNAT --to-destination 10.8.0.6:25565
-A PREROUTING -i eth0 -d <vps external IP> -p udp --dport 25565 -j DNAT --to-destination 10.8.0.6:25565
-A POSTROUTING -s 10.0.0.0/8 ! -d 10.0.0.0/8 -j MASQUERADE
COMMIT

Lokaler Server /etc/ufw/before.rules:

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -i tun0 -d 10.8.0.6 -p tcp --dport 25565 -j DNAT --to-destination 192.168.1.185:25565
-A PREROUTING -i tun0 -d 10.8.0.6 -p udp --dport 25565 -j DNAT --to-destination 192.168.1.185:25565
# setup routing
-A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MASQUERADE
COMMIT

Die PREROUTING-Regeln funktionieren, aber die Zähler der POSTROUTING-Regeln werden nicht hochgezählt.

Ich habe tcpdump auf 25565 ausgeführt, um das Problem zu beheben. Ich sehe, dass die Pakete eingehen, aber ich sehe keine Rückmeldung auf irgendwelchen Schnittstellen, wenn ich eine externe Verbindung herstelle. Wenn ich direkt vom VPS aus abfrage, sehe ich, dass der lokale Server auf tun0 antwortet. Es sieht so aus, als ob das Problem darin besteht, dass der lokale Server versucht, direkt auf meine IP auf en01 zu antworten, anstatt auf den VPS auf tun0, aber ich bin nicht sicher, wie ich das beheben kann.

VPS TCPdump:

# eth 0
21:43:39.972647 IP my_ip.2729 > vps_ip.25565: Flags [S], seq 1483515507, win 64240, options [mss 1460,nop,nop,sackOK], length 0
# tun0
21:43:39.972739 IP my_ip.2729 > 10.8.0.6.25565: Flags [S], seq 1483515507, win 64240, options [mss 1460,nop,nop,sackOK], length 0

TCPdump des lokalen Servers:

#tun0
21:43:39.972566 IP my_ip.2729 > 10.8.0.6.25565: Flags [S], seq 1483515507, win 64240, options [mss 1356,nop,nop,sackOK], length 0

#en01
21:43:39.972618 IP 10.8.0.6.25565 > my_ip.2729: Flags [S.], seq 2141764446, ack 1483515508, win 64240, options [mss 1460,nop,nop,sackOK], length 0

Antwort1

Endlich habe ich es herausgefunden. Die meisten Online-Anleitungen zur Portweiterleitung enthielten eine POSTROUTING-Regel, die für OpenVPN (oder in meiner Situation) nicht funktioniert. Anstatt lokale IPs als Quelle mit einem Ziel zuzulassen, das keine lokale IP war, musste ich die Postrouting-Regel für alles außer einer lokalen IP so einrichten, dass sie als tun0 VPS-IP umgeschrieben wurde.

VPS /etc/ufw/before.rules (s und d vertauscht):
-A POSTROUTING -d 10.0.0.0/8 ! -s 10.0.0.0/8 -j MASQUERADE -t nat

Darüber hinaus wurde die POSTROUTING-Regel nur auf dem VPS benötigt.

verwandte Informationen