iptables-Regeln funktionieren nicht zum Zulassen einer bestimmten IP

iptables-Regeln funktionieren nicht zum Zulassen einer bestimmten IP

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.192nicht 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 udpoder tcp, und sein $vpn_server_ip: $vpn_portdie 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. -ADie Option hängt die Regel an das Ende an. Wenn Sie -Idie Option verwenden, fügen Sie die Regel an den Anfang der Kette ein.

DROPDas Problem besteht hier darin, dass Sie wahrscheinlich bereits eine Regel REJECTvor 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, ACCEPTsind 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, ACCEPTscheint 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 reinem 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.

verwandte Informationen