Iptables - redirection de port
Le
Droopy191
Salut,
Je débute avec iptables. J'ai réussi à mettre en place une passerelle
qui fait du nat. Sur cette passerelle, un serveur ssh en écoute sur le
port 22. Je voudrais coté WAN uniquement rediriger le port 14722 vers le
port 22 de la passerelle.
J'ai réussi à faire ce que veux de la facon suivante mais je m'interroge
si c'est la bonne manière:
J'autorise le port 22 en entrée, je redirige le port 14722 vers le port
22 du serveur, mais je suis obligé de dropper le port 22 classique car
sinon le serveur est aussi accessible sur le port 22.
De plus la régle PREROUTING + DROP est noté dépréciée.
# drop du port 22
iptables -t nat -I PREROUTING -i $WAN_interface -p tcp --dport ssh -j DROP
# transfert de port sur la passerelle pour le coté WAN
iptables -t nat -I PREROUTING -i $WAN_interface -p tcp --dport 14722 -j
REDIRECT --to-ports ssh
# Connexions ssh depuis internet sur la passerelle
iptables -A INPUT -i $WAN_interface -p tcp --dport ssh -m conntrack
--ctstate NEW -j ACCEPT
Comment feriez vous ?
Serait il plus adapté de faire une redirection de port classique comme
pour une machine du LAN ?
--
DR
Je débute avec iptables. J'ai réussi à mettre en place une passerelle
qui fait du nat. Sur cette passerelle, un serveur ssh en écoute sur le
port 22. Je voudrais coté WAN uniquement rediriger le port 14722 vers le
port 22 de la passerelle.
J'ai réussi à faire ce que veux de la facon suivante mais je m'interroge
si c'est la bonne manière:
J'autorise le port 22 en entrée, je redirige le port 14722 vers le port
22 du serveur, mais je suis obligé de dropper le port 22 classique car
sinon le serveur est aussi accessible sur le port 22.
De plus la régle PREROUTING + DROP est noté dépréciée.
# drop du port 22
iptables -t nat -I PREROUTING -i $WAN_interface -p tcp --dport ssh -j DROP
# transfert de port sur la passerelle pour le coté WAN
iptables -t nat -I PREROUTING -i $WAN_interface -p tcp --dport 14722 -j
REDIRECT --to-ports ssh
# Connexions ssh depuis internet sur la passerelle
iptables -A INPUT -i $WAN_interface -p tcp --dport ssh -m conntrack
--ctstate NEW -j ACCEPT
Comment feriez vous ?
Serait il plus adapté de faire une redirection de port classique comme
pour une machine du LAN ?
--
DR

Poser une question

Droopy191 a écrit :
Les goûts et les couleurs...
Jusque là c'est bon.
En effet, puisque la redirection a lieu avant le filtrage.
C'est mal. La table nat n'est pas faite pour le filtrage, et il y a un
risque d'effet de bord. La table filter est là pour ça.
Le plus simplement, je demanderais directement à sshd d'écouter sur le
port 14722 au lieu du port 22.
Sinon, mais c'est un peu plus compliqué, il est possible de marquer les
paquets dans la chaîne PREROUTING de la table mangle (donc avant nat)
avec la cible MARK en fonction du port de destination et de filtrer en
fonction de la marque avec la correspondance mark dans la chaîne INPUT.
Que veux-tu dire exactement ?
Je l'avais soupçonné comme iptables grognait sur la commande.
Mais je ne vois pas comment c'est possible, puiqu'il faut autoriser le
port 22 dans la table filter ( c'est bien le port d'écoute de ssh)
14722- > PREROUTING -> 22 -> FILTER -> ssh
22 -> FILTER -> ssh
Dans ce cas les 2 ports sont accessibles depuis le coté WAN.
Je crois que vous donnez une piste plus bas avec la table mangle.
Bien évidement. Mais ici, je m'applique à comprendre iptables, ne jugez
pas trop sévèrement le bien fondé de ma demande ;-)
Bon il va falloir que je retourne à la doc.
Si j'ai bien compris, la table mangle sert à manipuler les paquets.
Je marque les paquets qui m'interesse pour pouvoir les filtrer à l'étape
suivante FILTER ? Ceci dit, je ne vois pas comment je vais pouvoir
distinguer les 2 types, puisque à l'arrivée dans la table MANGLE ils
seront tous les 2 sur le port 22.
Qq chose de ce gout la( je faire une redirection de port comme si ma
passerelle était une machine différente sur le LAN )
#iptables -t nat -A PREROUTING -i $WAN_interface -p tcp --dport 14722 -j
DNAT --to-destination 192.168.50.1:22
#iptables -A FORWARD -i $WAN_interface -p tcp --dport 22 -o
$LAN_interface -d 192.168.50.1 -m conntrack --ctstate NEW -j ACCEPT
--
DR
Oui. Ici on va juste leur donner une marque à usage interne du noyau,
sans les modifier.
Comme dit plus haut, la chaîne PREROUTING de la table mangle est
parcourue avant la chaîne de même nom de la table nat.
Ça peut aussi marcher. Ensuite pour le filtrage la distinction peut se
faire sur l'adresse de destination. Mais attention si l'adresse interne
peut être atteinte depuis l'extérieur (qui contrôle le routage amont ?).
Encore une autre possibilité : rediriger le port 22 vers un port ou une
adresse inutilisé(e) et filtrer les paquets ensuite. On peut même
exploiter une particularité intéressante du noyau qui jette tout paquet
destiné à une adresse de loopback (127.0.0.0/8) reçu par une interface
autre que loopback (lo), ce qui économise la règle de filtrage.
Ça, par contre, ce n'est pas bon. Les paquets destinés à la machine
passent par INPUT, pas par FORWARD.
J'ai beau avoir un schema du processus ;-)
http://www.csie.ntu.edu.tw/~b92035/cnl/hw1/Iptables.gif
j'avais mal compris.
J'étais sur la table mangle avant Input.
Ok
L'adresse interne n'est accessible que depuis le LAN.
L'étape suivante serait de de filtrer suivant la destination ( ip locale
192.168.50.1 accepté / ip WAN rejeté ) ?
Ok, c'est logique une fois dit. J'avais dans l'idée de faire "ressortir"
les paquets et de les faire entrer comme si ils venaient du LAN.
merci pour vos éclaircissements
--
DR
Ça dépend du routage amont.
Par exemple.
Ça ne marche pas comme ça sous Linux. Un paquet qui sort, il sort et ne
rentre pas. Seules exeptions : les paquets émis par l'interface de
loopback et les paquets émis en broadcast ou multicast, qui reviennt par
INPUT mais toujours pas par FORWARD.