Règles IPTABLES

Salut à tous,

Bon, généralement, je m’en sors, mais la j’y comprend plus rien.
J’espère que quelqu’un aura une idée.

J’explique rapidement ma conf réseau :
Ma connexion internet > modem/routeur > ip d’une debian en DMZ.
Sur mon routeur, j’ai 3 bécannes qui sont connectées également, mais c’est juste pour le NET, et il fait office également d’accès Wifi, donc je ne peux pas le laisser en modem seul (enfin pas pour l’instant car j’y comprend plus rien :slightly_smiling:).

Cette debian est la suivante :

cat /etc/debian_version

7.8

iptables v1.4.14

cat /etc/sysctl.conf | grep ipv4.ip_forward

net.ipv4.ip_forward=1

Ma debian me sert de “routeur”. Elle est hébergée sur un ESX, et elle à 4 cartes réseau :

  • eth0 : ip LAN maison > connecté à mon modem/routeur : 192.168.1.0/24
  • eth1 : ip LAN VMWARE : 192.168.2.0/24
  • eth2 : ip WLAN VMWARE : 192.168.3.0/24
  • eth3 : ip DMZ VMWARE : 192.168.4.0/24

Le réseau vmware fonctionne bien sûr, la debian fait déjà son boulot…

Je cherche a faire avec la debian 2 choses :

  1. rediriger les requêtes venant de l’extérieur vers une autre IP de mon LAN (192.168.1.0/24)
  2. rediriger les requêtes venant de l’extérieur vers une autre IP de mon LAN vmware (192.168.2.0/24 ou 192.168.3.0/24 ou192.168.4.0/24)

Ben j’y arrive pas… :slightly_smiling:
J’ai testé plusieurs types de règles, du NAT PREROUTING, exemple :
iptables -t nat -A PREROUTING -j DNAT -i eth0 -p tcp --dport 21 --to-destination 192.168.3.13
En POSTROUTING, exemple :
iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -p tcp --dport 21 -d 192.168.3.13

du forward, du input tout simple, enfin, ça fait un petit temps que je suis dessus, et la, ben je comprends pas, je pense oublier un truc, mais quoi ?!

ça ne passe pas… donc la j’ai tout supprimé, car ça deviens… disons incompréhensible…

Je fais de la redirection Web avec NGINX (en proxypass), pas de souci, tout fonctionne bien vers différentes IP… mais iptables, j’y comprend plus rien…
alors si quelqu’un peut m’aider, je lui paye une binouse :slightly_smiling: ^_^.

Si vous avez besoin de plus d’info, pas de souci… mais pour ma part, j’ai surfé sur le net, testé plusieurs règles, aucune ne passe…

C’est-à-dire ?

C’est-à-dire ?

Bonjour,

Tu souhaite faire cela pour le port 21. Le port 21 est, par défaut, pour le protocole FTP.

Le protocole FTP a un fonctionnement bien particulier (voir très particulier). Voir File Transfer Protocol .

Même si ton réseau était impeccable par ailleurs, tu serais susceptible de rencontrer des difficultés dues au FTP.

Sinon, je n’ai jamais rencontré un modem/routeur que l’on ne pouvait pas remplacer par du Linux. Les livebox sont remplacables, les freebox aussi. D’ailleurs, de base, ces deux matériels fonctionnent sous Linux.


AnonymousCoward

Merci pour vos réponse :
@PascalHambourg : Alors, le réseau VMware fonctionne, c’est à dire que la debian permet de relayer les paquets entre les différentes sous réseau, et qu’elles ont accès au net, et que pour certaines d’entre elles, le reroutage via nginx permet d’y accéder depuis l’extérieur.

Lors que je dis que cela ne fonctionne pas, ben, je n’y accède pas depuis l’extérieur, alors qu’en interne, depuis n’importe quel LAN, c’est ok…

@AnonymousCoward : oui, je c’est que le FTP c’est particulier, j’ai besoin des ports 21, et un autre range de port. Mais j’ai tenté des redirection pour d’autres ports moins particulier, la c’est un exemple.
Par exemple, une redirection du port 22 vers un autre Linux ne fonctionne pas non plus…

Y compris depuis le sous-réseau du LAN maison ?

Peux-tu fournir le jeu de règles iptables complet en place affiché par [mono]iptables-save[/mono] ?

Bonsoir,

Merci pour ton temps PascalHambourg.

Voici le contenu de iptables save, j’ai tronqué les règles Fail2ban qui sont en fin de fichier, car ça fait trop long…
[i][code]*raw
:PREROUTING ACCEPT [52504]
:OUTPUT ACCEPT [41457:4567806]
COMMIT

Completed on Tue May 26 21:30:01 2015

Generated by iptables-save v1.4.14 on Tue May 26 21:30:01 2015

*nat
:PREROUTING ACCEPT [4023:819641]
:INPUT ACCEPT [790:100710]
:OUTPUT ACCEPT [6656:443255]
:POSTROUTING ACCEPT [1889:134465]
:dnat - [0:0]
:net_dnat - [0:0]
-A POSTROUTING -s 192.168.3.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -o eth0 -j MASQUERADE
-A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -s 192.168.4.0/24 -o eth0 -j MASQUERADE
COMMIT

Completed on Tue May 26 21:30:01 2015

Generated by iptables-save v1.4.14 on Tue May 26 21:30:01 2015

*mangle
:PREROUTING ACCEPT [52504]
:INPUT ACCEPT [47468]
:FORWARD ACCEPT [1946:1447054]
:OUTPUT ACCEPT [41457:4567806]
:POSTROUTING ACCEPT [46943:6282942]
:tcfor - [0:0]
:tcin - [0:0]
:tcout - [0:0]
:tcpost - [0:0]
:tcpre - [0:0]
COMMIT

Completed on Tue May 26 21:30:01 2015

Generated by iptables-save v1.4.14 on Tue May 26 21:30:01 2015

*filter
:INPUT DROP [3:120]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [12352:1320472]
:fail2ban-apache - [0:0]
…[/code][/i]

Le fichier la est vide, car j’ai fait du nettoyage dans les règles.
Voici un script que j’avais créer pour réinitialiser le pare-feu en cas de problème :

[code][i]#!/bin/bash

±---------------+ ±---------------+

| 192.168.1.0/24 | eth0 --------------------- eth1 | 192.168.2.0/24 |

±---------------+ | ±---------------+

|

| ±---------------+

----------- eth2 | 192.168.3.0/24 |

| ±---------------+

|

| ±---------------+

----------- eth3 | 192.168.4.0/24 |

±---------------+

#empty known rules
iptables --flush
iptables --table nat --flush
iptables --table mangle --flush
iptables --delete-chain

Default policies:

#DROP input and forward if they are not filtered
iptables --policy INPUT DROP
iptables --policy FORWARD DROP

#for now, accept output
iptables --policy OUTPUT ACCEPT

Basics rules

#Rules to allow connections on loopback (localhost ==> 127.0.0.1)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

#allow ping
iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT

#allow port for sc
iptables -A INPUT -p tcp --dport 13000 -j ACCEPT
iptables -A INPUT -p tcp --dport 14000 -j ACCEPT
iptables -A INPUT -p tcp --dport 13292 -j ACCEPT
iptables -A INPUT -p tcp --dport 17000 -j ACCEPT
iptables -A INPUT -p tcp --dport 17100 -j ACCEPT

#redirect port to sc
iptables -t nat -A PREROUTING -j DNAT -i eth0 -p tcp --dport 13000 --to-destination 192.168.3.13
iptables -t nat -A PREROUTING -j DNAT -i eth0 -p tcp --dport 14000 --to-destination 192.168.3.13
iptables -t nat -A PREROUTING -j DNAT -i eth0 -p tcp --dport 13292 --to-destination 192.168.3.13
iptables -t nat -A PREROUTING -j DNAT -i eth0 -p tcp --dport 17000 --to-destination 192.168.3.13
iptables -t nat -A PREROUTING -j DNAT -i eth0 -p tcp --dport 17100 --to-destination 192.168.3.13

iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -p tcp --dport 13000 -d 192.168.3.13
iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -p tcp --dport 14000 -d 192.168.3.13
iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -p tcp --dport 13292 -d 192.168.3.13
iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -p tcp --dport 17000 -d 192.168.3.13
iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -p tcp --dport 17100 -d 192.168.3.13

Gateway

#allow new or established or related connections
iptables -A INPUT -m state --state NEW -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth0 -o eth2 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth0 -o eth3 -m state --state ESTABLISHED,RELATED -j ACCEPT

#allow forward from the eth0 to outside
iptables -A FORWARD -i eth2 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth3 -o eth0 -j ACCEPT

#allow forward from outside to eth0 if connection is established or related
iptables -A FORWARD -i eth0 -o eth2 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth0 -o eth3 -m state --state ESTABLISHED,RELATED -j ACCEPT

#if you don’t know your outside interface ip:
#this rule does the “masquerade” ==> changes packets ip
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -o eth0 -j MASQUERADE

#Don’t allow forward from output to output
iptables -A FORWARD -i eth0 -o eth0 -j REJECT[/i][/code]

Y a des tests aussi :slightly_smiling:, mais aucune des règles n’est fonctionnel…

Voici la table de routage, toute simple mais je pense qu’elle est bonne… :
# route -n Table de routage IP du noyau Destination Passerelle Genmask Indic Metric Ref Use Iface 0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2 192.168.4.0 0.0.0.0 255.255.255.0 U 0 0 0 eth3

Par avance, merci de votre aide :slightly_smiling:

Il me semble que tu as tronqué bien plus que les règles de fail2ban. Il en manque beaucoup par rapport aux règles du script.

Règle de base quand on met au point du routage, des redirections, du NAT : d’abord on ne bloque rien, on laisse tout passer. Ensuite quand tout marche, on peut commencer à mettre en place les règles de filtrage. Sinon on ne peut jamais savoir si le problème vient d’un filtrage excessif ou d’autre chose.

Observations sur ton jeu de règles :

  • Qu’est-ce que “sc” ? Si les paquets reçus à destination de ports sont redirigés vers une adresse non locale (un autre machine physique ou virtuelle) alors il ne sert à rien de les accepter en entrée (INPUT). Il faut plutôt les accepter en FORWARD, ce qui manque dans ton script.

  • Certaines règles sont mal formatées car elles intercalent des critères de correspondance entre la cible et les paramètres de la cible. Exemple :

iptables -t nat -A PREROUTING -j DNAT -i eth0 -p tcp --dport 13000 --to-destination 192.168.3.13 # mauvais iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 13000 -j DNAT --to-destination 192.168.3.13# bon

  • La règle [mono]-A POSTROUTING -o eth0 -j MASQUERADE[/mono] (qui ne figure pas dans le script) rend redondantes toutes les autres règles de MASQUERADE.

  • Les règles de MASQUERADE pour les ports particuliers sont sans effet car elles spécifient comme interface de sortie eth0 et l’adresse de destination 192.168.3.13 qui n’est pas routée par eth0 mais par eth2. La correspondance simultanée de ces deux critères n’est pas possible.

  • Il y a des doublons des règles [mono]FORWARD -i eth0[/mono]

  • Tu as écrit dans ton premier messag vouloir rediriger des connexion vers le LAN (physique), or la règle REJECT qui s’applique aux paquets entrant et ressortant par eth0 empêche cela.

PS : tu n’as pas répondu à la question de mon message précédent concernant le LAN maison.

Bonjour,

Merci de ta réponse.
Le résultat de mon iptables-save est très light, car j’ai tout nettoyer.
Le script m’a permis au début de faire une initialisation du pare-feu sans avoir à taper ligne par ligne, et éventuellement de réinjecter une bonne configuration.

En effet, j’ai omis de répondre pour le LAN maison vers mon réseau “virtuel” (ma debian), la réponse est non, cela ne fonctionne pas… je ne peux pas contacter les réseaux 192.168.2/3/4, mais le 192.168.1.* oui. Mais je pense que c’est un problème du au fait de mes erreurs de règle.

“sc” est le nom d’un service hébergé sur un serveur pour que je me souvienne de la correspondance des règles. Cela signifie Security Center…:slightly_smiling:

Je vais récrire mon script pour tenter de corriger mes erreurs (ce qui me semblait évident car cela ne fonctionnait pas) en rapport avec les remarques.
Je le posterais dès que j’aurais finis pour correction :slightly_smiling: (je pense ne pas être trop long, car cela me taraude l’esprit :slightly_smiling:).

A très vite.
(et encore merci de l’aide)

Bon, je pense que c’est un peu mieux, mais qu’il me manque des choses.
Je vais essayer de traduire ce que je tente de faire :

  1. La carte eth0 est dans le réseau interne 192.168.1.0/24 (le.14), la carte eth1 en 192.168.2.0/24 (.1)…
  2. Toutes connexions entrantes sont redirigées vers l’adresse 192.168.1.14 (ip “DMZ”) ;
  3. La Debian sert de DHCP pour eth1/2/3 ;
  4. Les requêtes de eth0, avec comme ip source le 192.168.1.0/24 doivent être acceptée vers eth1/3, mais les extérieures doivent être soumises à des règles ;
  5. Les requêtes de eth1 vers eth0/3 sont autorisées ;
  6. Les requêtes de eth2 vers eth0/1/3 sont autorisées ;
  7. Les requêtes de eth3 vers eth0 sont autorisées mais que vers l’extérieur (WAN) et non le 192.168.1.0/24 ;
  8. Rediriger les requêtes sur des ports 13000/14000/13292/17000/17100 vers l’ip 192.168.3.13 de n’importe qu’elle source.

Le script suivant ne contient pas tout, car certaines d’entre elle, je ne sais pas les écrire en terme iptables… :s
J’ai commenté les règles DROP comme conseillé :slightly_smiling:

[i][code]#!/bin/bash

±---------------+ ±---------------+

| 192.168.1.0/24 | eth0 --------------------- eth1 | 192.168.2.0/24 |

±---------------+ | ±---------------+

|

| ±---------------+

----------- eth2 | 192.168.3.0/24 |

| ±---------------+

|

| ±---------------+

----------- eth3 | 192.168.4.0/24 |

±---------------+

Specified eth connection zone

#empty known rules
iptables --flush
iptables --table nat --flush
iptables --table mangle --flush
iptables --delete-chain

Default policies:

#DROP input and forward if they are not filtered
#iptables -t filter -P INPUT DROP
#iptables -t filter -P FORWARD DROP

#accept output
iptables -t filter -P OUTPUT ACCEPT

Basics rules

#Rules to allow connections on loopback (localhost ==> 127.0.0.1)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

#allow ping
iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT

redirect port for SC

iptables -A FORWARD -p tcp --dport 13000 -i eth0 -o eth2 -d 192.168.3.13 -j ACCEPT
iptables -A FORWARD -p tcp --dport 14000 -i eth0 -o eth2 -d 192.168.3.13 -j ACCEPT
iptables -A FORWARD -p tcp --dport 13292 -i eth0 -o eth2 -d 192.168.3.13 -j ACCEPT
iptables -A FORWARD -p tcp --dport 17000 -i eth0 -o eth2 -d 192.168.3.13 -j ACCEPT
iptables -A FORWARD -p tcp --dport 17100 -i eth0 -o eth2 -d 192.168.3.13 -j ACCEPT

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 13000 -j DNAT --to-destination 192.168.3.13
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 14000 -j DNAT --to-destination 192.168.3.13
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 13292 -j DNAT --to-destination 192.168.3.13
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 17000 -j DNAT --to-destination 192.168.3.13
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 17100 -j DNAT --to-destination 192.168.3.13

iptables -t nat -A POSTROUTING -i eth0 -o eth2 -p tcp --dport 13000 -d 192.168.3.13
iptables -t nat -A POSTROUTING -i eth0 -o eth2 -p tcp --dport 14000 -d 192.168.3.13
iptables -t nat -A POSTROUTING -i eth0 -o eth2 -p tcp --dport 13292 -d 192.168.3.13
iptables -t nat -A POSTROUTING -i eth0 -o eth2 -p tcp --dport 17000 -d 192.168.3.13
iptables -t nat -A POSTROUTING -i eth0 -o eth2 -p tcp --dport 17100 -d 192.168.3.13

Gateway

#allow new or established or related connections
iptables -A INPUT -m state --state NEW -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth0 -o eth2 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth0 -o eth3 -m state --state ESTABLISHED,RELATED -j ACCEPT

#allow forward from the eth1/2/3 to outside
iptables -A FORWARD -i eth2 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth3 -o eth0 -j ACCEPT

#allow forward from outside to eth1/2/3 if connection is established or related
iptables -A FORWARD -i eth0 -o eth2 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth0 -o eth3 -m state --state ESTABLISHED,RELATED -j ACCEPT

#if you don’t know your outside interface ip:
#this rule does the “masquerade” ==> changes packets ip
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -o eth0 -j MASQUERADE

#Don’t allow forward from output to output
#iptables -A FORWARD -i eth0 -o eth0 -j REJECT[/code][/i]

C’est un peu mieux ou pas ?

C’est mieux, mais

  • Commenter les commandes qui règlent les politiques par défaut à DROP ne les font pas revenir à ACCEPT.
  • La correspondance [mono]multiport[/mono] permet de mettre plusieurs ports ou intervalles dans la même règle, cela permet de diminuer le nombre de règles nécessaires. Exemple :
  • L’option [mono]-i[/mono] n’est pas valide dans la chaîne POSTROUTING.
  • Quel est l’intérêt des règles dans nat/POSTROUTING pour les paquets redirigés vers 192.168.3.13 ? Elles ne contiennent pas de cible donc n’ont pas d’action.

Je commencerais avec ceci pour vérifier que le routage et les redirections fonctionnent :

[code]iptables -F
iptables -t nat -F
iptables -t mangle -F

iptables -P INPUT -j ACCEPT
iptables -P OUTPUT -j ACCEPT
iptables -P FORWARD -j ACCEPT

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

iptables -t nat -A PREROUTING -i eth0 -p tcp -m multiport --dports 13000,14000,13292,17000,17100 -j DNAT --to-destination 192.168.3.13[/code]
Ensuite tu pourras ajouter le filtrage.

Salut,

Super, merci de ta réponse. J’ai vu l’option multiport hier soir, je ne connaissais pas… pratique :slightly_smiling:

En fait, pour le FORWARD, il me semblait qu’il fallait faire une règle PREROUTING et POSTROUTING pour que le trafic fonctionne bien… je me trompe ?

Pour les règles Virtuel > LAN, je vais travailler iptables (c’est mon but) pour mieux comprendre, mais certaines règles me sont encore un peu obscur…

Merci de ton aide, je vais checker cela ASAP :slightly_smiling:.

Non, la plupart du temps ce n’est pas nécessaire.

En revanche ça l’est dans un cas particulier que tu as mentionné dans ton premier message : si la connexion redirigée par DNAT entre et ressort par la même interface, ici eth0. Dans ce cas, comme les paquets de réponse doivent repasser par le routeur qui fait la redirection NAT, on doit masquer l’adresse source d’origine, sinon le serveur final renverrait les paquets de réponse directement au client sans passer par le routeur. C’est d’ailleurs un inconvénient : le serveur ne voit pas l’adresse réelle du client qui n’apparaît pas dans les logs, ne peut pas servir pour du contrôle d’accès… Toutefois une règle de MASQUERADE générale sur eth0 suffirait.

Bonsoir,

Je reviens vers vous, et merci :slightly_smiling:, car je m’en suis sorti.
En effet, la règle suivante m’a aidée, et du coup, mes redirections maintenant fonctionne, et mon script ce construit au fur et à mesure.
iptables -t nat -A PREROUTING -i eth0 -p tcp -m multiport --dports 13000,14000,13292,17000,17100 -j DNAT --to-destination 192.168.3.13

J’ai remarqué que iptables est très très pointilleux sur la casse… auparavant, je ne faisait que du INPUT/OUTPUT, et la avec les redirections… un peu plus de taff, mais je m’éclate :slightly_smiling:.

Encore merci à toi PascalHambourg, tu gères.

Iptables est juste sensible à la casse, comme la plupart des commandes y compris le shell. Il n’y a guère que pour les noms de domaine que la casse est sans importance.