
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/24
sicheres privates Mobile Broadband-Subnetz, und ein 172.18.15.2
privates 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.1
und 10.0.0.1
. In iptables habe ich eine DNAT-Regel, um den Portverkehr 80
von auf dem Rückweg 10.0.0.1
an 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.1
als 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.1
172.18.15.2
172.18.15.2
10.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.2
ist 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 erreichen172.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.1
und dann einer DNAT-Prüfung unterzogen wurden oder ob sie direkt an diesen Empfänger gesendet wurden172.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 DROP
um 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/24
durch -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