Nous utilisons CSF sur un environnement virtualisé (OpenVZ) avec succès depuis un certain temps en combinant des interfaces venet et pontées afin que nous puissions utiliser des IP publiques + des systèmes virtuels adressés localement.

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

Nous acheminons le trafic des ips "locales" via une règle iptables :

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

La valeur de /proc/sys/net/ipv4/ip_forward est évidemment définie sur 1

Les machines en réseau hôte et venet exécutent leur propre installation CSF qui crée toutes les règles de pare-feu pour cette configuration, ce qui inclut la possibilité de créer des "redirections" vers des adresses IP internes.

Avec cela, nous pouvons ouvrir des ports spécifiques sur l'adresse IP de l'hôte qui sont servis par les machines virtuelles internes locales sur le réseau local. Parmi la longue liste de règles de pare-feu créées par CSF figurent :

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           

La fonction de redirection sur le pare-feu CSF fonctionne mais l'adresse IP signalée est celle de l'hôte, pas l'adresse IP d'origine, nous ne pouvons donc pas la limiter avec une autre instance CSF (ou une simple règle de pare-feu) sur le système virtuel de destination. Nous comprenons qu'étant sur PREROUTING, ils ne peuvent pas non plus être limités sur le CSF hôte.

Le fichier readme CSF indique en fait "Toutes les redirections vers une autre adresse IP apparaîtront toujours sur le serveur de destination avec la source de ce serveur, pas l'adresse IP d'origine." il s'agit donc d'une fonctionnalité standard.

CSF prend en charge un fichier postrules.sh dans lequel nous pourrions inclure les règles NAT manuellement, mais nous ne savons pas si avec IPTABLES SNAT et/ou DNAT, il est possible de transmettre l'IP source "réelle" à la destination de l'IP NAT.

answer

Question:

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

Réponse:

Oui, c'est possible, et voici comment procéder si vous utilisez CSF. Ne vous fiez pas à la fonction de redirection de CSF, c'est-à-dire avoir une ligne similaire à la suivante dans /etc/csf/csf.redirect:

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

A la place, mettez les iptablescommandes suivantes dans /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

Test:

$ 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

Explication:

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

Cette ligne redirige le trafic TCP entrant sur l'interface externe sur le port 2222vers l'adresse interne sur 10.0.0.100le port 22.

  • /sbin/iptablesl' iptablesexécutable complet est requis.
  • --table nat travailler sur la table nat (Network Address Translation).
  • --append PREROUTINGajouter cette règle après toutes les règles existantes dans la PREROUTINGchaîne.
  • --in-interface vmbr0intercepter tout le trafic entrant sur l' vmbr0interface.
  • --protocol tcp attraper uniquement le trafic tcp.
  • --match tcp utiliser le module tcp.
  • --dport 2222attraper uniquement le trafic dirigé vers le port 2222.
  • --jump DNAT effectuer une traduction d'adresse de réseau de destination.
  • --to-destination 10.0.0.100:22remplacez l'adresse de destination par 10.0.0.100et le port de destination par 22.
/sbin/iptables --insert FORWARD --in-interface vmbr0 --out-interface vmbr10 --destination 10.0.0.0/24 --jump LOCALINPUT

Cette ligne permet de ne pas sauter tout le filtrage de CSF juste parce que nous redirigeons.

  • /sbin/iptablesl' iptablesexécutable complet est requis.
  • --insert FORWARDinsérer cette règle avant les règles existantes dans la FORWARDchaîne. C'est là que vont les paquets redirigés, par opposition par exemple à la INPUTchaîne.
  • --in-interface vmbr0correspondre au trafic entrant sur l' vmbr0interface.
  • --out-interface vmbr10correspondre au trafic sortant de l' vmbr0interface en tant qu'effet de la redirection.
  • --destination 10.0.0.0/24 correspondre uniquement au trafic destiné (redirigé vers) le réseau interne.
  • --jump LOCALINPUTpasser par la LOCALINPUTchaîne. C'est là que CSF effectue tout le bon filtrage pour lequel il est connu, empêchant les IP interdites et sur liste noire d'atteindre le système. Avec cette règle, nous étendons le filtrage de CSF à tous les hôtes du réseau interne (par opposition au trafic destiné uniquement à l'hôte sur lequel CSF s'exécute).
/sbin/iptables --insert FORWARD --in-interface vmbr0 --out-interface vmbr10 --destination 10.0.0.0/24 --jump ACCEPT

Cette ligne transmet tout le trafic transféré restant aux hôtes internes.

  • /sbin/iptablesl' iptablesexécutable complet est requis.
  • --insert FORWARDinsérer cette règle avant les règles existantes dans la FORWARDchaîne. Cette règle sera évaluée une fois que tout le classement aura été effectué dans la LOCALINPUTchaîne.
  • --in-interface vmbr0correspondre au trafic entrant sur l' vmbr0interface.
  • --out-interface vmbr10correspondre au trafic sortant de l' vmbr0interface en tant qu'effet de la redirection.
  • --destination 10.0.0.0/24 correspondre uniquement au trafic destiné (redirigé vers) le réseau interne.
  • --jump ACCEPTaprès que CSF a effectué tout son filtrage (dans la LOCALINPUTchaîne), nous voulons que les paquets restants soient ACCEPTédités.

La seule façon de voir la "vraie" adresse IP source, que vous avez mentionnée, à la destination est d'éviter de la Natting ou de la Masquerading. N'oubliez pas que SNAT et DNAT signifient respectivement Source et Destination Network TRANSLATION, donc une fois que le paquet traverse les règles Natting, les adresses source/destination sont "modifiées" pour de bon. Vous ne pouvez pas les récupérer à destination.