Wir verwenden CSF seit einiger Zeit erfolgreich in einer virtualisierten (OpenVZ) Umgebung, indem wir venet- und überbrückte Schnittstellen kombinieren, damit wir öffentliche IPs + lokal adressierte virtuelle Systeme verwenden können.

Kernel IP routing table
Destination       Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.0.100        0.0.0.0         255.255.255.255 UH    0      0        0 venet0
xxx.xxx.xxx.24    0.0.0.0         255.255.255.255 UH    0      0        0 venet0
xxx.xxx.xxx.0     0.0.0.0         255.255.255.0   U     0      0        0 vmbr0
10.0.0.0          0.0.0.0         255.255.255.0   U     0      0        0 vmbr10
0.0.0.0           xxx.xxx.xxx.254 0.0.0.0         UG    0      0        0 vmbr0

Wir leiten den Verkehr von "lokalen" IPs über eine iptables-Regel weiter:

iptables -t nat -A POSTROUTING -s "10.0.0.0/24" -o vmbr0 -j MASQUERADE

/proc/sys/net/ipv4/ip_forward Wert ist offensichtlich auf 1 gesetzt

Die mit Host und venet vernetzten Maschinen führen ihre eigene CSF-Installation aus, die alle Firewall-Regeln für dieses Setup erstellt, einschließlich der Möglichkeit, "Umleitungen" zu internen IPs zu erstellen.

Damit können wir bestimmte Ports auf der Host-IP öffnen, die von den lokalen internen virtuellen Maschinen im lokalen Netzwerk bedient werden. Zu der langen Liste von Firewall-Regeln, die CSF erstellt, gehören:

Chain PREROUTING (policy ACCEPT 53M packets, 15G bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 DNAT       tcp  --  !lo    *       0.0.0.0/0            XXX.XXX.XXX.184      tcp dpt:5100 to:10.0.0.100:5000 

Chain POSTROUTING (policy ACCEPT 9700K packets, 615M bytes)
num   pkts bytes target     prot opt in     out     source               destination         

3        0     0 SNAT       tcp  --  *      !lo     0.0.0.0/0            10.0.0.100          to:XXX.XXX.XXX.184 
8       10   600 MASQUERADE  all  --  *      vmbr0   10.0.0.0/24          0.0.0.0/0           

Die Umleitungsfunktion der CSF-Firewall funktioniert, aber die gemeldete IP ist die des Hosts, nicht die Ursprungs-IP, sodass wir sie nicht mit einer anderen CSF-Instanz (oder einer einfachen Firewall-Regel) auf dem virtuellen Zielsystem einschränken können. Wir verstehen, dass sie auf PREROUTING auch nicht auf den CSF des Hosts beschränkt werden können.

In der CSF-Readme heißt es tatsächlich: "Alle Umleitungen zu einer anderen IP-Adresse werden immer auf dem Zielserver mit der Quelle dieses Servers angezeigt, nicht mit der ursprünglichen IP-Adresse." Dies ist also eine Standardfunktion.

CSF unterstützt eine postrules.sh-Datei, in die wir die NAT-Regeln manuell einfügen könnten, aber wir sind uns nicht sicher, ob es mit IPTABLES SNAT und/oder DNAT möglich ist, die "echte" Quell-IP an das Ziel der NAT-IP zu übergeben.

answer

Frage:

We are unsure if with IPTABLES SNAT and/or DNAT it is possible to pass the "real" source IP to the destination.

Antworten:

Ja, es ist möglich, und hier erfahren Sie, wie Sie es tun, wenn Sie CSF verwenden. Verlassen Sie sich nicht auf die Umleitungsfunktion von CSF, dh eine Zeile ähnlich der folgenden in /etc/csf/csf.redirect:

XXX.XXX.XXX.184|2222|10.0.0.100|22|tcp

Geben Sie stattdessen die folgenden iptablesBefehle ein /etc/csf/csfpost.sh:

/sbin/iptables -I FORWARD -i vmbr0 -o vmbr10 -d 10.0.0.0/24 -j ACCEPT
/sbin/iptables -I FORWARD -i vmbr0 -o vmbr10 -d 10.0.0.0/24 -j LOCALINPUT
/sbin/iptables -t nat -A PREROUTING -i vmbr0 -p tcp -m tcp --dport 2222 -j DNAT --to-destination 10.0.0.100:22

Prüfen:

$ ssh xxx.xxx.xxx.184 -p 2222 'netstat -tn'
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0     72 10.0.0.100:22           xxx.xxx.xxx.199:55812   ESTABLISHED

Erläuterung:

/sbin/iptables --table nat --append PREROUTING --in-interface vmbr0 --protocol tcp --match tcp --dport 2222 --jump DNAT --to-destination 10.0.0.100:22

Diese Zeile leitet TCP-Datenverkehr, der über die externe Schnittstelle an Port ankommt, 2222an die interne Adresse 10.0.0.100an Port um 22.

  • /sbin/iptablesdie vollständige iptablesausführbare Datei ist erforderlich.
  • --table nat an der Tabelle nat (Network Address Translation) arbeiten.
  • --append PREROUTINGhängen Sie diese Regel nach allen vorhandenen Regeln in der PREROUTINGKette an.
  • --in-interface vmbr0Fangen Sie den gesamten Verkehr auf der vmbr0Schnittstelle ein.
  • --protocol tcp nur TCP-Verkehr abfangen.
  • --match tcp Verwenden Sie das TCP-Modul.
  • --dport 2222Fangen Sie nur Verkehr auf, der zum Hafen geleitet wird 2222.
  • --jump DNAT Führen Sie eine Zielnetzwerkadressübersetzung durch.
  • --to-destination 10.0.0.100:22ändern Sie die Zieladresse in 10.0.0.100und den Zielport in 22.
/sbin/iptables --insert FORWARD --in-interface vmbr0 --out-interface vmbr10 --destination 10.0.0.0/24 --jump LOCALINPUT

Diese Zeile ermöglicht es, nicht alle Filterungen von CSF zu überspringen, nur weil wir umleiten.

  • /sbin/iptablesdie vollständige iptablesausführbare Datei ist erforderlich.
  • --insert FORWARDFügen Sie diese Regel vor bestehenden Regeln in der FORWARDKette ein. Hierhin gehen umgeleitete Pakete, im Gegensatz zB zur INPUTKette.
  • --in-interface vmbr0über die vmbr0Schnittstelle eingehenden Datenverkehr abgleichen.
  • --out-interface vmbr10vmbr0als Folge der Umleitung von der Schnittstelle ausgehenden Datenverkehr abgleichen.
  • --destination 10.0.0.0/24 nur Datenverkehr abgleichen, der für das interne Netzwerk bestimmt (umgeleitet) ist.
  • --jump LOCALINPUTdurch die LOCALINPUTKette gehen. Hier führt CSF all die guten Filter durch, für die es bekannt ist, und verhindert, dass gesperrte und auf die schwarze Liste gesetzte IPs das System erreichen. Mit dieser Regel erweitern wir die Filterung von CSF auf alle Hosts im internen Netzwerk (im Gegensatz zu nur Verkehr, der für den Host bestimmt ist, auf dem CSF ausgeführt wird).
/sbin/iptables --insert FORWARD --in-interface vmbr0 --out-interface vmbr10 --destination 10.0.0.0/24 --jump ACCEPT

Diese Leitung leitet den gesamten verbleibenden weitergeleiteten Verkehr an die internen Hosts weiter.

  • /sbin/iptablesdie vollständige iptablesausführbare Datei ist erforderlich.
  • --insert FORWARDFügen Sie diese Regel vor bestehenden Regeln in der FORWARDKette ein. Diese Regel wird ausgewertet, nachdem alle Filings in der LOCALINPUTKette durchgeführt wurden.
  • --in-interface vmbr0über die vmbr0Schnittstelle eingehenden Datenverkehr abgleichen.
  • --out-interface vmbr10vmbr0als Folge der Umleitung von der Schnittstelle ausgehenden Datenverkehr abgleichen.
  • --destination 10.0.0.0/24 nur Datenverkehr abgleichen, der für das interne Netzwerk bestimmt (umgeleitet) ist.
  • --jump ACCEPTNachdem CSF alle seine Filterungen (in der LOCALINPUTKette) durchgeführt hat, möchten wir, dass die verbleibenden Pakete bearbeitet werden ACCEPT.

Die einzige Möglichkeit, die von Ihnen erwähnte "echte" Quell-IP am Ziel zu sehen, besteht darin, sie zu vermeiden oder zu maskieren. Denken Sie daran, SNAT und DNAT stehen für Source- bzw. Destination Network TRANSLATION. Sobald das Paket also die Natting-Regeln durchläuft, werden die Quell-/Zieladressen endgültig "geändert". Sie können sie am Zielort nicht abrufen.