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.