Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

configuration d'une passerelle linux

4 réponses
Avatar
Elekaj34
Bonsoir,


Voici mon probleme, avec le reseau ci-dessous


Passerelle Linux
_______ ________________________
Internet<---->| Modem |-----| eth1 eth0 |------> Switch LAN
|_______| | 10.0.0.5 192.168.1.5 |
|________________________|

Le modem est rélié a la passerelle Linux par un cable RJ45 croisé.
L'adresse du Modem/Routeur est 10.0.0.1, mask 255.0.0.0
Sur la passerelle, eth1 a pour IP 10.0.0.5, mask 255.0.0.0
eth0 a pour IP 192.168.1.5, mask 255.255.255.0, relié au Switch par un
cable RJ45 droit. Sur le switch, il y a une quinzaine de PC.

L'adressage IP se fait via DHCP sur le LAN. Les DNS sont renseigné
manuellement.

Pour faire passerelle, j'ai utilisé le script de Léa
(voici une copie adapté a mes besoins)

------------------ SCRIPT IPTABLES ------------------------------------
#!/bin/sh

# mettez ici l'emplacement d'iptables :
IPTABLES=/sbin/iptables
# mettez ici le nom de l'interface réseau vers internet :
EXTERNAL_IF="eth1"
# mettez ici le nom de l'interface réseau vers votre lan :
INTERNAL_IF="eth0"

# si vous voulez pouvoir autoriser les connexions ftp :
modprobe ip_conntrack_ftp
# si vous voulez pouvoir autoriser le DCC sous IRC :
#modprobe ip_conntrack_irc

$IPTABLES -N LOG_DROP

# Politique par defaut
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

# "On accepte le traffic sur 'lo'"
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
$IPTABLES -A FORWARD -i lo -j ACCEPT
$IPTABLES -A FORWARD -o lo -j ACCEPT

# "On accepte le traffic sur le réseau local"
$IPTABLES -A INPUT -i $INTERNAL_IF -j ACCEPT
$IPTABLES -A OUTPUT -o $INTERNAL_IF -j ACCEPT
$IPTABLES -A FORWARD -i $INTERNAL_IF -j ACCEPT
$IPTABLES -A FORWARD -o $INTERNAL_IF -j ACCEPT

# On loggue les packets DROPés
$IPTABLES -A LOG_DROP -j LOG --log-prefix "[IPT] "
$IPTABLES -A LOG_DROP -j DROP

echo 1 > /proc/sys/net/ipv4/ip_forward
$IPTABLES -A POSTROUTING -t nat -o $EXTERNAL_IF -j MASQUERADE

$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp --sport ssh -m state --state
ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTERNAL_IF -p tcp --dport ssh -m state --state
NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTERNAL_IF -p tcp --sport ssh -m state --state
ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp --dport ssh -m state --state
NEW,ESTABLISHED,RELATED -j ACCEPT

# Autorisation connections FTP
$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp --sport 1024:65535 --dport
1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTERNAL_IF -p tcp --sport 1024:65535 --dport
1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Activation du ping
$IPTABLES -A OUTPUT -p icmp -m state --state NEW,RELATED,ESTABLISHED -j
ACCEPT
$IPTABLES -A INPUT -p icmp -m state --state NEW,RELATED,ESTABLISHED -j
ACCEPT


----------------------------------------------------------------------------------

Sur un poste client, j'arrive a lire mes mails, acceder au web mais je
ne peut pas faire de transfert FTP (même en passif).

Dans ce script, ce que je trouve de drole, c'est que nulle part je donne
les autorisation en sortie (LAN vers Internet donc) pour :
DNS, HTTP, POP, SMTP etc...
La seule chose que j'autorise en entrée (Internet vers passerelle
Linux), c'est SSH est ca marche pas.
De plus, les paquets droppés sont loggués ou ? je ne les trouve ni dans
/var/log/messages ni dans /var/log/dmesg.

Le but, c'est de pouvoir accepter en local vers internet tout, et entrée
(internet vers lan) rien sauf ssh et les connections demandées par les
machines locales. Je voudrais egalement que le FTP (actif et passif)
fonctionne.
Qu'est ce qui va de travers dans ce script ?

Cordialement

Alain

4 réponses

Avatar
Pascal
Salut,

Elekaj34 wrote:

# si vous voulez pouvoir autoriser les connexions ftp :
modprobe ip_conntrack_ftp


Il faut aussi le module ip_nat_ftp si la passerelle fait du NAT.

$IPTABLES -A FORWARD -i lo -j ACCEPT
$IPTABLES -A FORWARD -o lo -j ACCEPT


Ça sert à quoi ? Comment peut-il y avoir du forward depuis ou vers
l'interface de loopback ?

# "On accepte le traffic sur le réseau local"
$IPTABLES -A FORWARD -i $INTERNAL_IF -j ACCEPT
$IPTABLES -A FORWARD -o $INTERNAL_IF -j ACCEPT


Gloup. Si je ne m'abuse, ça autorise tout le trafic entre internet et le
réseau local dans les deux sens. C'est vraiment ce que tu veux ?
Une règle FORWARD devrait toujours comporter l'interface d'entrée et
l'interface de sortie.

$IPTABLES -A POSTROUTING -t nat -o $EXTERNAL_IF -j MASQUERADE


La cible SNAT serait légèrement plus efficace si l'adresse de eth1 est fixe.

$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp --sport ssh -m state --state
ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTERNAL_IF -p tcp --dport ssh -m state --state
NEW,ESTABLISHED,RELATED -j ACCEPT


Ceci autorise le trafic SSH entre la passerelle en tant que cliente et
une machine serveur sur internet.
Au passage, je n'ai jamais vu une connexion SSH qui soit RELATED.

# Autorisation connections FTP
$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp --sport 1024:65535 --dport
1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTERNAL_IF -p tcp --sport 1024:65535 --dport
1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT


Ceci autorise des connexions entre la passerelle et l'extérieur. Celles
entre internet et le réseau local ne sont filtrées que par la chaîne
FORWARD.

# Activation du ping
$IPTABLES -A OUTPUT -p icmp -m state --state NEW,RELATED,ESTABLISHED -j
ACCEPT
$IPTABLES -A INPUT -p icmp -m state --state NEW,RELATED,ESTABLISHED -j
ACCEPT


Ces règles n'acceptent pas seulement le ping mais aussi tous les autres
types ICMP. Ce n'est pas forcément un mal d'ailleurs.

Sur un poste client, j'arrive a lire mes mails, acceder au web mais je
ne peut pas faire de transfert FTP (même en passif).


Charger le module ip_nat_ftp.

Dans ce script, ce que je trouve de drole, c'est que nulle part je donne
les autorisation en sortie (LAN vers Internet donc) pour :
DNS, HTTP, POP, SMTP etc...


Sisi, tu l'autorise avec les deux règles FORWARD.

La seule chose que j'autorise en entrée (Internet vers passerelle
Linux), c'est SSH est ca marche pas.


Pourtant ça devrait passer, du moins sur la passerelle. Si le
modem-routeur fait aussi du NAT, tu n'as pas oublié de faire la
redirection de port correspondante dans la config de celui-ci, ou de
déclarer la passerelle en "DMZ" ? Sans ça, par défaut aucun trafic
venant de l'extérieur ne passera le modem-routeur.

De plus, les paquets droppés sont loggués ou ? je ne les trouve ni dans
/var/log/messages ni dans /var/log/dmesg.


Normal, la chaîne LOG_DROP n'est appelée nulle part dans ton script.

Le but, c'est de pouvoir accepter en local vers internet tout, et entrée
(internet vers lan) rien sauf ssh et les connections demandées par les
machines locales. Je voudrais egalement que le FTP (actif et passif)
fonctionne.
Qu'est ce qui va de travers dans ce script ?


Presque tout :( . Voici des règles basiques pour ce que tu veux faire,
aux erreurs d'écriture près. Il y a pas mal de lacunes (traitement des
paquets non acceptés et autres finasseries) mais ça compliquerait pas mal.

# pour le suivi de connexion et NAT FTP si pas déja fait ailleurs
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp

# politiques par défaut
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
# on accepte tout en sortie de la passerelle, pas la peine de s'emmerder
$IPTABLES -P OUTPUT ACCEPT

# filtrage du spoofing IP sur l'interface internet si pas déjà fait
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/$EXTERNAL_IF/rp_filter

# forward IP activé si pas déjà fait ailleurs
echo 1 > /proc/sys/net/ipv4/ip_forward

# On accepte tout le traffic sur 'lo'
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT

# On accepte tout le traffic du réseau local vers la passerelle
$IPTABLES -A INPUT -i $INTERNAL_IF -j ACCEPT

# On accepte tout le trafic du réseau local vers internet
$IPTABLES -A FORWARD -i $INTERNAL_IF -o EXTERNAL_IF -j ACCEPT

# et le trafic de retour (y compris FTP)
$IPTABLES -A FORWARD -i $EXTERNAL_IF -o INTERNAL_IF
-m state --state ESTABLISHED,RELATED -j ACCEPT

# NAT source du trafic du LAN vers internet
$IPTABLES -A POSTROUTING -t nat -o $EXTERNAL_IF -s 192.168.1.0/24
-j SNAT --to-source 10.0.0.5

# On accepte les connexions SSH de l'extérieur sur la passerelle
$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp --dport 22 --syn
-m state --state NEW -j ACCEPT

# On accepte le trafic de retour de l'extérieur vers la passerelle
$IPTABLES -A INPUT -i $EXTERNAL_IF
-m state --state ESTABLISHED,RELATED -j ACCEPT

# On accepte le ping depuis internet sur la passerelle
$IPTABLES -A INPUT -i $EXTERNAL_IF -p icmp --icmp-type echo-request
-j ACCEPT

Avatar
Elekaj34
wrote:
Salut,
Qu'est ce qui va de travers dans ce script ?



Presque tout :( . Voici des règles basiques pour ce que tu veux faire,
aux erreurs d'écriture près. Il y a pas mal de lacunes (traitement des
paquets non acceptés et autres finasseries) mais ça compliquerait pas mal.

# pour le suivi de connexion et NAT FTP si pas déja fait ailleurs
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp

# politiques par défaut
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
# on accepte tout en sortie de la passerelle, pas la peine de s'emmerder
$IPTABLES -P OUTPUT ACCEPT

# filtrage du spoofing IP sur l'interface internet si pas déjà fait
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/$EXTERNAL_IF/rp_filter

# forward IP activé si pas déjà fait ailleurs
echo 1 > /proc/sys/net/ipv4/ip_forward

# On accepte tout le traffic sur 'lo'
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT

# On accepte tout le traffic du réseau local vers la passerelle
$IPTABLES -A INPUT -i $INTERNAL_IF -j ACCEPT

# On accepte tout le trafic du réseau local vers internet
$IPTABLES -A FORWARD -i $INTERNAL_IF -o EXTERNAL_IF -j ACCEPT

# et le trafic de retour (y compris FTP)
$IPTABLES -A FORWARD -i $EXTERNAL_IF -o INTERNAL_IF
-m state --state ESTABLISHED,RELATED -j ACCEPT

# NAT source du trafic du LAN vers internet
$IPTABLES -A POSTROUTING -t nat -o $EXTERNAL_IF -s 192.168.1.0/24
-j SNAT --to-source 10.0.0.5

# On accepte les connexions SSH de l'extérieur sur la passerelle
$IPTABLES -A INPUT -i $EXTERNAL_IF -p tcp --dport 22 --syn
-m state --state NEW -j ACCEPT

# On accepte le trafic de retour de l'extérieur vers la passerelle
$IPTABLES -A INPUT -i $EXTERNAL_IF
-m state --state ESTABLISHED,RELATED -j ACCEPT

# On accepte le ping depuis internet sur la passerelle
$IPTABLES -A INPUT -i $EXTERNAL_IF -p icmp --icmp-type echo-request
-j ACCEPT


Bonjour,

Merci pour la réponse, le FTP fonctionne correctement (même en actif).
Tout ce qui marchait avant marche encore. Par contre, le SSh en entrée
(internet vers passerelle) ne marche toujours pas (j'ai essayer
d'accepter le port 80, c'est pareil)
Je vais continuer a potasser la doc iptables, j'ai du rater un episode
je pense

Encore merci

Alain


Avatar
Pascal
Elekaj34 wrote:

Merci pour la réponse, le FTP fonctionne correctement (même en actif).
Tout ce qui marchait avant marche encore. Par contre, le SSh en entrée
(internet vers passerelle) ne marche toujours pas (j'ai essayer
d'accepter le port 80, c'est pareil)


Pourtant je ne pense pas m'être trompé dans l'écriture de la règle pour
SSH. Si tu écris depuis l'installation en question (jupin.net sur Free
dégroupé), les services SSH et HTTP sont bien accessibles de
l'extérieur. Sinon, il faudrait peut-être regarder du côté de la
configuration du modem-routeur, car si ce dernier ne redirige pas
correctement les connexions entrantes désirées, il n'y a rien à espérer.
Par exemple, la règle qui accepte le ping de l'extérieur sur la
passerelle ne sert à rien si le routeur répond lui-même au ping ou le
bloque au lieu de le transmettre à la passerelle.

Avatar
Elekaj34
wrote:
Elekaj34 wrote:


Merci pour la réponse, le FTP fonctionne correctement (même en actif).
Tout ce qui marchait avant marche encore. Par contre, le SSh en entrée
(internet vers passerelle) ne marche toujours pas (j'ai essayer
d'accepter le port 80, c'est pareil)



Pourtant je ne pense pas m'être trompé dans l'écriture de la règle pour
SSH. Si tu écris depuis l'installation en question (jupin.net sur Free
dégroupé), les services SSH et HTTP sont bien accessibles de
l'extérieur. Sinon, il faudrait peut-être regarder du côté de la
configuration du modem-routeur, car si ce dernier ne redirige pas
correctement les connexions entrantes désirées, il n'y a rien à espérer.
Par exemple, la règle qui accepte le ping de l'extérieur sur la
passerelle ne sert à rien si le routeur répond lui-même au ping ou le
bloque au lieu de le transmettre à la passerelle.


Non, ce n'est pas pour ma connections Free dégroupé mais pour le reseau
informatique d'une association. La connection se fait par satellite avec
FranceTelecom.
En réalité, d'après le tech FT, avec notre offre, les routeurs FT
n'autorise que les connections de type ESTABLISHED ou RELATED (en
equivalent iptables). De ce fait, FT bloque toutes les demandes de
connections (qques soit le port) a destination de notre modem. Il ne
passe donc que les connections etablies par notre réseau local.
Si je fais un tcpdump sur le port SSH de Eth1, aucun paquets en entrée
sur ce port (malgrès les requetes)

Sinon, j'ai mis eth1 et le modem sur un HUB avec un autre PC connecté
sur ce HUB. Les connections SSH marchent nickel donc le script est OK.

Je considère que mon problème technique iptables est résolu.

Merci

Alain