OVH Cloud OVH Cloud

iptables : router une adresse:port

14 réponses
Avatar
Gillot
Bonjour a tous.

Tout d'abord, je tiens à préciser que je suis autodidacte en termes de
gestion réseau.

Je vais essayer de faire bref mais concis. Voici la configuration adoptée :


@internet@-----$IPEXT
|
|
$IPFIXE
(ROUTEUR ADSL)
$IPROUTEUR
|
|
$IPFWEXT
eth1
(MACHINE LINUX)
(FIREWALL FILTRANT)
(IPTABLES)
eth0
$IPFWINT
|
|
(SWITCH)
|
|
$IPLOC
(LAN LOCAL)


En bref, je voudrais router ce qui arrive d'internet sur le port 2323 à
partir d'une machine dont l'ip est définie, vers une machine particulière
du réseau : $IPLOC sur le port 23

A savoir que le routeur prends le port entrant 2323 et le "nate" en port
23 à la sortie du routeur(j'espère m'être bien fait comprendre).

Je ne met pas tout le filtrage IP, ce serai un peu long, mais le principe
est : Je bloque tout, puis je laisse passer que ce que je veux. (FORWARD)
(Méthode classique, me semble-t-il)

Je veux juster que ce qui arrive sur eth1 en port 23 soit redirigé vers le
poste $IPLOC en port 23 :

# iptables /sbin/iptables -t nat -A POSTROUTING -p tcp -s $IPEXP --dport
23 -i $INTEXT -j DNAT --to-destination $IPLOC:23

Or, cette règle ne fonctionne pas et je ne comprends pas pourquoi. Si
quelqu'un peut m'expliquer et par la même occasion, me donner la réponse,
je lui en serai trés reconnaissant.

Sachant qu'a l'avenir, je voudrais pouvoir autoriser cet accés à plusieurs
postes distants simultanément (normalement ça devrait être possible)
Comment procèderiez-vous ???

A+ GIllot

4 réponses

1 2
Avatar
TiChou
Dans l'article news:,
Gillot écrivait :

/sbin/iptables -A FORWARD -s $IPEXT -j ACCEPT

... ça devrait suffire, n'est-ce pas ???


Suffire pour quoi faire exactement ?


Pour autoriser le traffic entrant et sortant vers $IPEXT.
Peut-être qu'il vaut mieux :
/sbin/iptables -A FORWARD -s $IPEXT -d $IPLOC -j ACCEPT


Ici vous acceptez à forwarder tous les paquets, quelque soit sur l'interface
d'arrivée et de sortie, dont l'IP source est $IPEXT et l'IP de destination
est $IPLOC. Mais ça n'autorise pas pour autant les paquets dont l'IP source
est $IPLOC est l'IP de destination $IPEXT à être forwardé. Donc ça
n'autorise le trafic que dans un sens.

Bon, mais ça fonctionne toujours pas.


Et tcpdump dit quoi ... ?

A propos, je travaille à distance, alors je teste pas au fur et à mesure,
sinon je risque de perdre ma connection et ...
J'ai fait un script de test qui lance mon script de test pendant 30
secondes durant lesquelles j'essaye pour voir si ça marche, et ensuite, ça
reviens à la config de base (qui me permet l'accés !)

J'ai réduit le script, si vous voulez jeter un oeil, car moi je commence à
plus rien y voir !!! Vous tomberez peut-être sur le "bug" :

#!/bin/bash

# GESTION FIREWALL IP par Iptables

# Insertion des modules de gestion réseau, tunneling etc...
/sbin/modprobe ip_tables
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_nat_irc
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_nat
/sbin/modprobe ip_gre
/sbin/modprobe ip_conntrack
#/sbin/modprobe ip_conntrack_pptp

# Annulation du firewall
echo Arret du firewall
/sbin/iptables -F
/sbin/iptables -F -t nat

# Je remet les regles par defaut
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT

# Polices par defaut
/sbin/iptables -t nat -P PREROUTING ACCEPT
/sbin/iptables -t nat -P POSTROUTING ACCEPT
/sbin/iptables -t nat -P OUTPUT ACCEPT

# AdresseIP sur le net : Depuis le 20/01/2004, adresse IP Fixe
# -------------------------------------------------------------
# site distant
IPEXT=<adresse IP>
# siege
IPFIXE=<adresse IP>
# Autres parametres
IPROUTEUR2.168.100.111

IPFWEXT2.168.100.1
INTEXT=eth1

IPFWINT2.168.1.112
INTLOC=eth0

IPLOC2.168.1.254

echo On rajoute deux regles pour les logs
/sbin/iptables -N LOG_DROP
/sbin/iptables -A LOG_DROP -j DROP
/sbin/iptables -N LOG_ACCEPT
/sbin/iptables -A LOG_ACCEPT -j ACCEPT

echo On accepte tout sur le loopback de la machine locale
# ====================================================== > /sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT

echo On accepte ce qui se passe sur le reseau local
# ================================================ > /sbin/iptables -A FORWARD -i eth0 -o eth1 -s 192.168.1.0/24 -j
ACCEPT
/sbin/iptables -A FORWARD -i eth1 -o eth0 -d 192.168.1.0/24 -m
state --state ESTABLISHED,RELATED -j ACCEPT

echo On accepte les appels entrants pour l acces AS400
# =================================================== > /sbin/iptables -A FORWARD -s $IPEXT -d $IPLOC -j ACCEPT

echo On redirige le port 23 sur l AS400.
# ======================================= > /sbin/iptables -t nat -A PREROUTING -p tcp -i eth1 -d $IPFWEXT
--dport 23 -s $IPEXT -j DNAT --to-destination
$IPLOC:23 /sbin/iptables -t filter -A FORWARD -i eth1 -o eth0 -p
tcp -d $IPLOC --dport 23 -s $IPEXT -m state
--state NEW,ESTABLISHED,RELATED -j ACCEPT


En fait, '--state NEW' suffirait vu qu'on accepte déjà les paquets
ESTABLISHED et RELATED.

echo Autoriser le traffic internet du reseau local vers internet
# ========================================================== > /sbin/iptables -A FORWARD -i $INTLOC -o $INTEXT -j ACCEPT
/sbin/iptables -A FORWARD -i $INTEXT -o $INTLOC -j ACCEPT


Redondances.

/sbin/iptables -A INPUT -i $INTLOC -j ACCEPT
/sbin/iptables -A OUTPUT -o $INTLOC -j ACCEPT

# Le masquerading est actif : Partage de la connection Internet

# Activer le forwarding IP
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -t nat -A POSTROUTING -o $INTEXT -s 192.168.1.0/24 -j SNAT
--to $IPROUTEUR


Ici je me suis trompé, il ne faut pas mettre --to $IPROUTEUR mais --to
$IPFWEXT, car il s'agit de dire au routeur que les paquets viennent du
Linux.

--
TiChou



Avatar
Gillot
/sbin/iptables -A FORWARD -s $IPEXT -j ACCEPT

... ça devrait suffire, n'est-ce pas ???


Suffire pour quoi faire exactement ?


Pour autoriser le traffic entrant et sortant vers $IPEXT.
Peut-être qu'il vaut mieux :
/sbin/iptables -A FORWARD -s $IPEXT -d $IPLOC -j ACCEPT


Ici vous acceptez à forwarder tous les paquets, quelque soit sur l'interface
d'arrivée et de sortie, dont l'IP source est $IPEXT et l'IP de destination
est $IPLOC. Mais ça n'autorise pas pour autant les paquets dont l'IP source
est $IPLOC est l'IP de destination $IPEXT à être forwardé. Donc ça
n'autorise le trafic que dans un sens.


Je dois donc mettre aussi la règle suivante, si je comprends bien ...
/sbin/iptables -A FORWARD -s $IPLOC -d $IPEXT -j ACCEPT

Et tcpdump dit quoi ... ?


Ben vu que je suis à distance et que j'emprunte le même chemin pour me
connecter sur le serveur, c'est assez difficile à utiliser dans ces
conditions...

echo Autoriser le traffic internet du reseau local vers internet
# ========================================================== >> /sbin/iptables -A FORWARD -i $INTLOC -o $INTEXT -j ACCEPT
/sbin/iptables -A FORWARD -i $INTEXT -o $INTLOC -j ACCEPT


Redondances.


C'est la que je ne comprends plus par rapport à ce qui est dit ci-dessus
... faut-il vraiment donner le chemin dans les deux sens pour une règle
FORWARD ???


A+ Gillot ;o)




Avatar
Gillot

Dans l'article news:,
Gillot écrivait :

/sbin/iptables -A FORWARD -s $IPEXT -j ACCEPT

... ça devrait suffire, n'est-ce pas ???


Suffire pour quoi faire exactement ?


Pour autoriser le traffic entrant et sortant vers $IPEXT.
Peut-être qu'il vaut mieux :
/sbin/iptables -A FORWARD -s $IPEXT -d $IPLOC -j ACCEPT


Ici vous acceptez à forwarder tous les paquets, quelque soit sur l'interface
d'arrivée et de sortie, dont l'IP source est $IPEXT et l'IP de destination
est $IPLOC. Mais ça n'autorise pas pour autant les paquets dont l'IP source
est $IPLOC est l'IP de destination $IPEXT à être forwardé. Donc ça
n'autorise le trafic que dans un sens.

Bon, mais ça fonctionne toujours pas.


Et tcpdump dit quoi ... ?

A propos, je travaille à distance, alors je teste pas au fur et à mesure,
sinon je risque de perdre ma connection et ...
J'ai fait un script de test qui lance mon script de test pendant 30
secondes durant lesquelles j'essaye pour voir si ça marche, et ensuite, ça
reviens à la config de base (qui me permet l'accés !)

J'ai réduit le script, si vous voulez jeter un oeil, car moi je commence à
plus rien y voir !!! Vous tomberez peut-être sur le "bug" :

#!/bin/bash

# GESTION FIREWALL IP par Iptables

# Insertion des modules de gestion réseau, tunneling etc...
/sbin/modprobe ip_tables
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_nat_irc
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_nat
/sbin/modprobe ip_gre
/sbin/modprobe ip_conntrack
#/sbin/modprobe ip_conntrack_pptp

# Annulation du firewall
echo Arret du firewall
/sbin/iptables -F
/sbin/iptables -F -t nat

# Je remet les regles par defaut
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT

# Polices par defaut
/sbin/iptables -t nat -P PREROUTING ACCEPT
/sbin/iptables -t nat -P POSTROUTING ACCEPT
/sbin/iptables -t nat -P OUTPUT ACCEPT

# AdresseIP sur le net : Depuis le 20/01/2004, adresse IP Fixe
# -------------------------------------------------------------
# site distant
IPEXT=<adresse IP>
# siege
IPFIXE=<adresse IP>
# Autres parametres
IPROUTEUR2.168.100.111

IPFWEXT2.168.100.1
INTEXT=eth1

IPFWINT2.168.1.112
INTLOC=eth0

IPLOC2.168.1.254

echo On rajoute deux regles pour les logs
/sbin/iptables -N LOG_DROP
/sbin/iptables -A LOG_DROP -j DROP
/sbin/iptables -N LOG_ACCEPT
/sbin/iptables -A LOG_ACCEPT -j ACCEPT

echo On accepte tout sur le loopback de la machine locale
# ====================================================== >> /sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT

echo On accepte ce qui se passe sur le reseau local
# ================================================ >> /sbin/iptables -A FORWARD -i eth0 -o eth1 -s 192.168.1.0/24 -j
ACCEPT
/sbin/iptables -A FORWARD -i eth1 -o eth0 -d 192.168.1.0/24 -m
state --state ESTABLISHED,RELATED -j ACCEPT

echo On accepte les appels entrants pour l acces AS400
# =================================================== >> /sbin/iptables -A FORWARD -s $IPEXT -d $IPLOC -j ACCEPT

echo On redirige le port 23 sur l AS400.
# ======================================= >> /sbin/iptables -t nat -A PREROUTING -p tcp -i eth1 -d $IPFWEXT
--dport 23 -s $IPEXT -j DNAT --to-destination
$IPLOC:23 /sbin/iptables -t filter -A FORWARD -i eth1 -o eth0 -p
tcp -d $IPLOC --dport 23 -s $IPEXT -m state
--state NEW,ESTABLISHED,RELATED -j ACCEPT


En fait, '--state NEW' suffirait vu qu'on accepte déjà les paquets
ESTABLISHED et RELATED.

echo Autoriser le traffic internet du reseau local vers internet
# ========================================================== >> /sbin/iptables -A FORWARD -i $INTLOC -o $INTEXT -j ACCEPT
/sbin/iptables -A FORWARD -i $INTEXT -o $INTLOC -j ACCEPT


Redondances.

/sbin/iptables -A INPUT -i $INTLOC -j ACCEPT
/sbin/iptables -A OUTPUT -o $INTLOC -j ACCEPT

# Le masquerading est actif : Partage de la connection Internet

# Activer le forwarding IP
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -t nat -A POSTROUTING -o $INTEXT -s 192.168.1.0/24 -j SNAT
--to $IPROUTEUR


Ici je me suis trompé, il ne faut pas mettre --to $IPROUTEUR mais --to
$IPFWEXT, car il s'agit de dire au routeur que les paquets viennent du
Linux.





Avatar
Gillot
Bon, j'ai encore fait des essais en essayant de tout reprendre à zéro.

Je craque ...

========== AVANT =====================
Avant, j'avais un poste avec un modem, et donc une interface ppp0.
J'avais en plus une ip dynamique ($IPDYN) sur le net.

Les règles suivantes fonctionnaient :

# Pour l'accés au poste $IPLOC en port 23
/sbin/iptables -t nat -A PREROUTING -p tcp -d $IPDYN --dport 23
-i ppp0 -j DNAT --to-destination $IPLOC:23

Ensuite, je passais le tout par :
/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 0.0.0.0/0
-o ppp0 -j MASQUERADE

Sur le poste distant ($IPEXT), si je faisais :
telnet $IPDYN

ça fonctionnait impec'.


========== APRES ===================== Maintenant, j'ai un routeur et une ip fixe.

Le script des règles IPTABLES est le même, ormis l'interface ppp0 qui
deviens eth1 et $IPDYN qui deviens $IPFIXE.

Le routeur accepte les entrées en port 2323, et les "nate" en port 23 sur
son entrée sur le réseau local. (vérifié avec tcpdump)

exemple : si j'appelle du poste distant (1.2.3.4) sur mon ipfixe
(ex: 5.6.7.8) :
# telnet 5.6.7.8:2323

Je tombe bien sur mon serveur linux qui ecoute en telnet sur le port 23 et
qui est juste derrière le routeur pour jourer le rôle de firewall filtrant.
Un tcpdump lancé sur ce dernier me rapporte bien qu'il recoit mon ip
1.2.3.4 comme ip distante.

Pourquoi la même config qu'avant ne fonctionne pas ? Pour l'instant, je
cherche à faire marcher le truc, j'optimiserai aprés, mais la, j'ai besoin
que ça fonctionne.


Merci pour votre aide.

A+ Gillot ;o)
1 2