Dem OpenVPN-Client eine öffentliche IP zuweisen. Iptables, Route oder was soll ich dafür verwenden?

Dem OpenVPN-Client eine öffentliche IP zuweisen. Iptables, Route oder was soll ich dafür verwenden?

Ich habe einen Server mit Pi-Hole, der so konfiguriert ist, dass er Werbung und Tracker blockiert. Die Clients sind über OpenVPN verbunden und erhalten Adressen von 10.8.0.0/24. OpenVPN überträgt nur den DNS an den Client und der Datenverkehr wird über das lokale Gateway geleitet, aber natürlich kann jeder Client im VPN jeden anderen Client über seine 10.8.0.x-Adressen kontaktieren.

Ich habe eine zweite IPv4 bestellt, die ich speziell für den Client 10.8.0.4 verwenden möchte. Ich möchte auf die öffentliche IP zugreifen und diesen Client direkt dem Internet aussetzen können, um eine lokal gehostete Nextcloud zu verwenden.

Ich habe Server Fault durchsucht und einige ähnliche Probleme gefunden. Ich habe versucht, POSTROUTING- und PREROUTING-Regeln zu iptables hinzuzufügen, aber das hat nicht funktioniert. Die IPv4 wird derzeit vorübergehend zu eth0 über „ip addr add xx.xx.xx.xx. dev eth0“ hinzugefügt, nicht über tun0 (ist das richtig?). Der OpenVPN-Server ist genau wie in den Pi-Hole-Dokumenten beschrieben konfiguriert (https://docs.pi-hole.net/guides/vpn/openvpn/only-dns-via-vpn/). net.ipv4.ip_forward ist aktiviert.

Muss ich überhaupt iptables verwenden? Ist es möglich oder ratsam, die öffentliche IP zu einer Route oder so hinzuzufügen? Tut mir leid, wenn die Frage dumm klingt. Ich bin ziemlich neu bei OpenVPN und der Konfiguration von Route/iptables.

Das ist das erste, was ich versucht habe:Leiten Sie den gesamten eingehenden Datenverkehr mithilfe von iptables von einer sekundären öffentlichen IP-Adresse auf eine interne IP-Adresse um.

Meine aktuellen iptables-Regeln sind:

# Generated by xtables-save v1.8.2 on Thu Dec 12 14:37:26 2019
*nat
:PREROUTING ACCEPT [329:28209]
:INPUT ACCEPT [281:25114]
:POSTROUTING ACCEPT [17:1423]
:OUTPUT ACCEPT [245:22126]
-A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to-source xx.xx.xx.xx
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Thu Dec 12 14:37:26 2019
# Generated by xtables-save v1.8.2 on Thu Dec 12 14:37:26 2019
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i tun0 -j ACCEPT
-A INPUT -i tun0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i tun0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i tun0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i tun0 -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 2202 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 1194 -j ACCEPT
-A INPUT -p udp -m udp --dport 1194 -j ACCEPT
-A INPUT -p udp -m udp --dport 80 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p udp -m udp --dport 443 -j REJECT --reject-with icmp-port-unreachable
COMMIT
# Completed on Thu Dec 12 14:37:26 2019

iptables NAT-Regeln:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       all  --  10.8.0.0/24         !10.8.0.0/24          to:xx.xx.xx.xx
MASQUERADE  all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Nach dem Kommentar von NiKiZe habe ich die öffentliche IP-Adresse vorübergehend hinzugefügt über

ip addr add xx.xx.xx.xx dev eth0

und habe beide Regeln eingegeben (zur Klarstellung: ich habe den funktionierenden Regelsatz über iptables-save exportiert, beide Befehle bearbeitet und ihn über iptables-restore wiederhergestellt)

-A PREROUTING -d xx.xx.xx.xx -j DNAT --to-destination 10.8.0.4
-A POSTROUTING -s 10.8.0.4 ! -d 10.8.0.4 -j SNAT --to-source xx.xx.xx.xx

Ich habe dann mehrere Terminalsitzungen geöffnet und den Webverkehr mit tcpdump auf dem OpenVPN-Server und meinem lokalen Server überwacht und bestätigt, dass eingehender Verkehr bei eth0 zu pi.hole.http korrekt an meinen lokalen Server server.vpn.http weitergeleitet wird. Aber die Antwort läuft ab ...

Meine aktuellen NAT-Regeln sind:

user@dns:~# iptables -t nat -vL --line-numbers
Chain PREROUTING (policy ACCEPT 1 packets, 52 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 DNAT       all  --  any    any     anywhere             pi.hole              to:10.8.0.4

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 1 packets, 60 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 SNAT       all  --  any    any     server.vpn        !server.vpn         to:xx.xx.xx.xx <- temporarily added ip address
2        0     0 SNAT       all  --  any    any     10.8.0.0/24         !10.8.0.0/24          to:xx.xx.xx.xx <- main ip address, statically entered
3        0     0 MASQUERADE  all  --  any    eth0    anywhere             anywhere

Chain OUTPUT (policy ACCEPT 1 packets, 60 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Noch eine Änderung: Wenn ich „src server.vpn“ zu tcpdump hinzufüge, sehe ich, dass kein ausgehender Datenverkehr vom lokalen Server kommt. Es muss also entweder ein Problem mit der lokalen Serverkonfiguration oder der Postrouting-Regel vorliegen. Habe ich Recht?

Nach dem Ändern der Route im server.vpn funktioniert die Verbindung. 'route -n' Vorher:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.178.1   0.0.0.0         UG    0      0        0 eth0
10.8.0.0        0.0.0.0         255.255.255.0   U     0      0        0 tun0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth3
169.254.160.0   169.254.160.1   255.255.248.0   UG    0      0        0 tun1000
169.254.160.0   0.0.0.0         255.255.248.0   U     0      0        0 tun1000
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.178.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0

Und danach:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.8.0.1        0.0.0.0         UG    0      0        0 tun0
10.8.0.0        0.0.0.0         255.255.255.0   U     0      0        0 tun0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth3
169.254.160.0   169.254.160.1   255.255.248.0   UG    0      0        0 tun1000
169.254.160.0   0.0.0.0         255.255.248.0   U     0      0        0 tun1000
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.178.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0

Wenn ich das richtig verstehe, bedeutet das, dass JEDE Netzwerkverbindung, auch die von server.vpn initiierte, über das VPN geleitet wird. Das ist nicht das erwartete Verhalten. Ich möchte einfach, dass der Server lokal erreichbar ist und das normale, lokal geroutete Internet verwendet und auch Verbindungen beantwortet, die von der öffentlichen IP auf dem OpenVPN-Server geroutet werden.

verwandte Informationen