Iptables-Firewall weiterleiten

Iptables-Firewall weiterleiten

Ich arbeite derzeit an einem Linux-Router und kann ihn nicht wie gewünscht mit einer Firewall schützen.

Der Router hat drei Schnittstellen: WAN, das ist ein 172.18.15.0/24sicheres privates Mobile Broadband-Subnetz, und ein 172.18.15.2privates Gerätesubnetz 10.0.0.0/24, dem ich nicht vertraue. WAN dient zum Zugriff über OpenVPN und ist das Standard-Gateway des Routers.

Die Router-IPs sind 172.18.15.1und 10.0.0.1. In iptables habe ich eine DNAT-Regel, um den Portverkehr 80von auf dem Rückweg 10.0.0.1an Hexe MASQUERADE weiterzuleiten.172.18.15.2

Dieses Teil funktioniert einwandfrei.

Was mir Sorgen bereitet, ist, dass es auch offengelegt wird, wenn jemand aus einem privaten Subnetz 10.0.0.1als Standardgateway wählt oder eine Route dorthin erstellt 172.18.15.0/24. Dieses Verhalten möchte ich unterbinden, sodass der einzige Weg, auf das Internet zuzugreifen, über die Adresse ist .10.0.0.1172.18.15.2172.18.15.210.0.0.1

Wenn ich die Weiterleitung kündige, kündige ich auch DNAT, was ein Problem darstellt.

Eine Möglichkeit, die mir einfällt, ist, Apache zu installieren und einen Reverse-Proxy zu erstellen. Ich bin mir jedoch nicht sicher, ob das der richtige Weg ist.

Danke für die Vorschläge!

BEARBEITEN:

172.18.15.2ist ein einfaches Gerät. Es kann nur seine eigene Adresse und die Adresse des Gateways haben, in diesem Fall 172.18.15.1. Es antwortet, weil ich es eingestellt habe/etc/sysctl.conf net.ipv4.ip_forwarf=1

Hier ist der Dump von iptables-save -c
enp1s0 ist die Schnittstelle für 10.0.0.0/24
enp2s0 ist die Schnittstelle für 172.18.15.0/24
wwx582c80139263 ist die Schnittstelle für das mobile Breitband-Gateway

# Generated by iptables-save v1.6.0 on Mon Apr 16 08:27:45 2018
*filter
:INPUT ACCEPT [840:388180]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [643:92809]
[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -m tcp --dport 80 -j ACCEPT
[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -j DROP
COMMIT
# Completed on Mon Apr 16 08:27:45 2018
# Generated by iptables-save v1.6.0 on Mon Apr 16 08:27:45 2018
*nat
:PREROUTING ACCEPT [10:648]
:INPUT ACCEPT [10:648]
:OUTPUT ACCEPT [11:770]
:POSTROUTING ACCEPT [11:770]
[0:0] -A PREROUTING -i enp1s0 -p tcp -m tcp --dport 80 -j DNAT --to- 
destination 172.18.15.2:80
[0:0] -A POSTROUTING -s 172.18.15.0/24 -j MASQUERADE
[0:0] -A POSTROUTING -o wwx582c80139263 -j MASQUERADE
COMMIT
# Completed on Mon Apr 16 08:27:45 2018

Antwort1

Die Verwendung eines Reverse-Proxys (der einen Header für Protokollierungszwecke einfügen sollte X-Forwarded-For) und das Entfernen der Netzwerkweiterleitung wäre eine saubere Lösung. Die folgende Lösung sollte klar verstanden werden, um unerwartete Effekte bei weiteren Änderungen der iptables-Regeln zu vermeiden.

Das gesagt...

Das Problem

  • LAN 10.0.0.0/24-Knoten dürfen den Router nicht als Router verwenden, zumindest nicht um zu erreichen 172.18.15.0/24. Einige tun das trotzdem.
  • Der Router stellt durch Verwendung von DNAT und Weiterleitung Dienste für Knoten bereit, die sich an 172.18.15.0/24( 172.18.15.2:80) befinden.10.0.0.0/24
  • Sobald Pakete die Filter-/Weiterleitungskette erreichen, gibt es keine Möglichkeit mehr zu unterscheiden, ob sie ursprünglich für jemanden bestimmt waren 10.0.0.1und dann einer DNAT-Prüfung unterzogen wurden oder ob sie direkt an diesen Empfänger gesendet wurden 172.18.15.2(was verboten sein sollte).

Die Lösung

Die Klassifizierung muss also vor dem NAT erfolgen: in der Mangle-Tabelle, wie in diesem zu sehen istPaketfluss in Netfilter und allgemeinem NetworkingSchema. Diese einzigartige Regel reicht aus, um damit umzugehen:

iptables -t mangle -A PREROUTING -s 10.0.0.0/24 -d 172.18.15.0/24 -j DROP

Aber normalerweise sollte es für eine bessere Verwaltung eine Rollentrennung geben: Mangle zum Ändern (nicht Löschen) oder hier Markieren und die Filtertabelle (Standard) zum Filtern und Löschen. Das ist möglich, indem man beim Mangle-Schritt eine Markierung verwendet und diese Markierung beim Filterschritt zum Löschen anpasst. Das hier ist also gleichwertig:

iptables -t mangle -A PREROUTING -s 10.0.0.0/24 -d 172.18.15.0/24 -j MARK --set-mark 1
iptables -A FORWARD -m mark --mark 1 -j DROP

(und um wirklich vollständig zu sein: iptables -A INPUT -m mark --mark 1 -j DROPum den Zugriff auf zu verhindern 172.18.15.1)

Beide Methoden sind gleichwertig. Wenn natürlich wirklich nur das Gerät 172.18.15.2 geschützt werden muss, ersetzen Sie einfach -d 172.18.15.0/24durch -d 172.18.15.2.

UPDATE: Eine einfachere Methode, die auf conntrack basiert (das aufgrund von NAT bereits verwendet wird), kann verwendet werden: AbfragenKontaktum zu wissen, ob das Paket tatsächlich DNATed war, und es zu löschen, wenn nicht. Das vereinfacht die Dinge, denn das ist nur eine Regel und einfach in der Filter-/FOWARD-Kette. Als dritte Methode anstelle der oben genannten Regeln:

iptables -A FORWARD -s 10.0.0.0/24 -d 172.18.15.0/24 -m conntrack ! --ctstate DNAT -j DROP

Auch die folgende Zeile ist nutzlos und kann entfernt werden. PREROUTING hat das Ziel mit DNAT geändert, sodass der Datenfluss INPUT nie erreicht, sondern stattdessen durch die FORWARD-Kette geht:

[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -m tcp --dport 80 -j ACCEPT

verwandte Informationen