Ich habe einen Host mit 2 Netzwerkschnittstellen: WLAN und Site-Site-VPN (Zerotier).
root@host:~# ifconfig wlp0s20f3
wlp0s20f3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.38 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::a098:2166:78af:d78d prefixlen 64 scopeid 0x20<link>
ether ac:12:03:ab:6e:31 txqueuelen 1000 (Ethernet)
RX packets 1071869 bytes 1035656551 (1.0 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 911450 bytes 134092251 (134.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@host:~# ifconfig ztklh3tu4b
ztklh3tu4b: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 2800
inet 10.147.18.192 netmask 255.255.255.0 broadcast 10.147.18.255
inet6 fe80::f8f6:d1ff:fe3d:4f09 prefixlen 64 scopeid 0x20<link>
ether fa:f6:d1:3d:4f:09 txqueuelen 1000 (Ethernet)
RX packets 8836 bytes 1146994 (1.1 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 667 bytes 281732 (281.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Ich möchte den gesamten Datenverkehr (ein- und ausgehend) zu diesem Host blockieren, außer einer IP hinter dem VPN. Daher habe ich folgende iptable-Regeln hinzugefügt:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -s 10.147.18.80 -j ACCEPT
iptables -A OUTPUT -d 10.147.18.80 -j ACCEPT
Wenn ich 10.147.18.80 anpinge, gelingt mir das nicht. Hier sind die Ping-Ergebnisse:
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3067ms
root@host:~# ping 10.147.18.80
PING 10.147.18.80 (10.147.18.80) 56(84) bytes of data.
^C
--- 10.147.18.80 ping statistics ---
6 packets transmitted, 0 received, 100% packet loss, time 5097ms
Wenn ich die IP in der iptables-Regel in etwas anderes wie 8.8.8.8 ändere, funktioniert alles wie erwartet, d. h. ich kann mit nichts anderem als 8.8.8.8 kommunizieren.
Bearbeiten Die folgende Ausgabe von iptables -nvL zeigt die Ketten:
root@host:~# iptables -nvL
Chain INPUT (policy DROP 23 packets, 4560 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 10.147.18.80 0.0.0.0/0
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy DROP 330 packets, 25776 bytes)
pkts bytes target prot opt in out source destination
8 672 ACCEPT all -- * * 0.0.0.0/0 10.147.18.80
Die obige Ausgabe von iptables zeigt, dass Pakete an die IP gesendet werden, aber keine Antwort empfangen wird, wenn die Regeln gelten.
Tcpdump auf meinem Host zeigt dasselbe Verhalten:
tcpdump: data link type LINUX_SLL2
tcpdump: listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
13:28:32.323064 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17342, offset 0, flags [DF], proto ICMP (1), length 84)
10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 1, length 64
13:28:33.330145 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17567, offset 0, flags [DF], proto ICMP (1), length 84)
10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 2, length 64
13:28:34.354178 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17694, offset 0, flags [DF], proto ICMP (1), length 84)
10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 3, length 64
13:28:35.378135 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17714, offset 0, flags [DF], proto ICMP (1), length 84)
10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 4, length 64
Tcpdump auf 10.147.18.80 zeigt keine eingehende ICMP-Echoanforderung von 10.147.18.192 an. Was könnte schiefgelaufen sein?
Antwort1
Wenn Sie einen VPN-Client auf diesem Host verwenden, um die zweite Schnittstelle zu erstellen, vergessen Sie nicht, auchVerbindungen zum VPN-Server zulassen, sonst ist Ihre lokale IP 10.147.18.192
nicht mehr erreichbar.
Sie müssen mindestens ausgehenden und eingehenden Datenverkehr zum/vom VPN-Server auf der Schnittstelle zulassen wlp0s20f3
:
iptables -I OUTPUT -d $vpn_server_ip -p $proto --dport $vpn_port -j ACCEPT
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$proto
wird udp
oder tcp
, und sein $vpn_server_ip
: $vpn_port
die IP-Adresse oder der Bereich und Port des/der VPN-Server(s)
Ich kann beim Erraten dieser Werte nicht wirklich helfen, aber Ihre VPN-Dokumentation oder tcpdump/wireguard mit einer funktionierenden Verbindung zum VPN-Tunnel sollten Ihnen diese Informationen geben.
Antwort2
Diese beiden Befehle erwähnen Sie in Ihrer Frage:
iptables -A INPUT -s 10.147.18.80 -j ACCEPT
iptables -A OUTPUT -d 10.147.18.80 -j ACCEPT
Sie hängen diese Regeln an das Ende der Ketten an.
-A
Die Option hängt die Regel an das Ende an. Wenn Sie -I
die Option verwenden, fügen Sie die Regel an den Anfang der Kette ein.
DROP
Das Problem besteht hier darin, dass Sie wahrscheinlich bereits eine Regel REJECT
vor der Regel in einer der Ketten haben ACCEPT
, die den Datenverkehr verwirft, bevor er das Ende der Kette erreicht. Wie zum Beispiel eine Regel, die den Datenverkehr zu oder von einem ganzen Subnetz verwirft, das die IP 10.147.18.80 enthält.
Wenn Sie in einer Kette eine Regel haben, die Datenverkehr zu oder von dieser IP (je nachdem, ob es sich um eine INPUT- oder OUTPUT-Kette handelt) vor der ACCEPT-Regel verwirft/ablehnt, wird der Datenverkehr verworfen und alle anderen Regeln in der Kette werden nicht mehr verarbeitet, unabhängig davon, ob die Regel nur diese IP oder das gesamte Subnetz angibt.
DROP
, REJECT
, ACCEPT
sind Beendigungsziele. Sobald iptables mit dieser Regel übereinstimmt, beendet es die Verarbeitung anderer Regeln in der Kette und fährt nicht mit der nächsten Regel fort.
Versuchen
iptables -I INPUT -s 10.147.18.80 -j ACCEPT
iptables -I OUTPUT -d 10.147.18.80 -j ACCEPT
Dadurch werden diese Regeln oben in den Ketten platziert, sodass sie als erste Regeln angewendet werden und andere Regeln für diesen Datenverkehr in diesen Ketten dann nicht mehr verarbeitet werden.
Sie können alle Regeln in einer Kette mit etwas wie auflisten
iptables -nvL
oder wenn Sie nur bestimmte Ketten anzeigen möchten
iptables -nvL INPUT
iptables -nvL OUTPUT
BEARBEITEN
Angesichts der von Ihnen eingefügten Ausgabe und der Tatsache, dass Sie einen Ping senden können, wenn Sie die Standardaktionen entsprechend ändern, ACCEPT
scheint dies nicht das Problem zu sein.
Sie können beispielsweise „tcpdump“ verwenden, um zu prüfen, ob Datenverkehr hinein- und zurückgeht.
Ein Befehl wie dieser gibt Ihnen alle ICMP-Pakete aus, die von der Maschine gesendet oder empfangen werden
tcpdump -nnvvi any icmp
Wenn Sie in der Ausgabe so etwas erhalten
10:13:48.866598 IP (tos 0x0, ttl 255, id 30625, offset 0, flags [DF], proto ICMP (1), length 84)
10.147.18.192 > 10.147.18.80: ICMP echo request, id 26621, seq 4, length 64
10:13:48.867771 IP (tos 0x0, ttl 53, id 0, offset 0, flags [none], proto ICMP (1), length 84)
10.147.18.80 > 10.147.18.192: ICMP echo reply, id 26621, seq 4, length 64
Dann werden Ihre Ping-Pakete gesendet und zurückgesendet, aber von einer anderen Regel abgelehnt.
Sie können überprüfen, ob Sie möglicherweise andere Regeln in anderen Tabellen wie der NAT- oder Mingle-Tabelle haben, und ob einige der dortigen Regeln möglicherweise mit dem Datenverkehr in Konflikt stehen.
iptables -t nat -nvL
iptables -t mingle -nvL
Sie können auch anhand der Nummer in der Liste sehen, ob die Pakete die ACCEPT-Regel in der OUTPUT-Kette durchlaufen pkts
. Wenn diese Nummer nach dem Ping-Versuch ansteigt, die Nummer in der INPUT-Kette jedoch 0 bleibt, liegt das Problem bei den Regeln für eingehenden Datenverkehr.
Überprüfen Sie außerdem Ihre Routen mit ip r
einem Befehl oder etwas Ähnlichem, wenn der Datenverkehr möglicherweise nicht über die Schnittstelle im selben Subnetz austritt, sodass die Quell-IP der zurückkehrenden Pakete unterwegs möglicherweise aufgrund einiger NAT-Regeln geändert wird.