Probleme IPTABLES et IP RULE ADD

Bonjour à tous,
Comme toujours dans mon cas, au bout du bout je me tourne vers vous …
MON PERIMETRE :
Une debian stable 3.1R2 noyau 2.6.8-2-386
Trois cartes reseau.
LAN : 89.0.7.0 (oui je sais mais bon c’est comme ca !)
WAN1 : 192.168.100.0 -> routeur0 192.168.100.1
WAN2 : 192.168.101.0 -> routeur1 192.168.101.1
-> routeur2 192.168.101.2

MA PROBLEMATIQUE :
Le LAN sort sur le net via le routeur par defaut routeur0 : 192.168.100.1.
Si la liaison routeur0 tombe je veux basculer mon trafic sur routeur1 et routeur2 en separant les flux …
Jusque là tout va bien. J’ai donc :

INTERFACES :
auto eth0
iface eth0 inet static
address 89.0.7.7
netmask 255.255.255.0
network 89.0.7.0
broadcast 89.0.7.255

auto eth1
iface eth1 inet static
address 192.168.100.254
netmask 255.255.255.0
broadcast 192.168.100.255
gateway 192.168.100.1

auto eth2
iface eth2 inet static
address 192.168.101.254
netmask 255.255.255.0
broadcast 192.168.101.255

auto eth2:1
iface eth2:1 inet static
address 192.168.101.101
netmask 255.255.255.0
broadcast 192.168.101.255

IPRULES :
#*************************

Debut des definitions.

#-------------------------

#clear
ip route flush cache

ip rule del fwmark 1
ip rule del fwmark 2
ip rule del fwmark 3
ip route del table 1
ip route del table 2
ip route del table 3

Regle de transmission aux bonnes tables de routages

Regle bouygues

ip rule add fwmark 1 table 1

Regle orange1

ip rule add fwmark 2 table 2

Regle orange2

ip rule add fwmark 3 table 3

Creation des tables de routages pour les differentes lignes XDSL

Vers bouygues

ip route add default via 192.168.100.1 dev eth1 table 1

Autres flux

ip route add default via 192.168.101.1 dev eth2 table 2

Backup

ip route add default via 192.168.101.2 dev eth2 table 3

ip route flush cache

Puis IPTABLES :
#*************************

Debut des definitions.

#-------------------------

clear
IPTABLES=“iptables”

FILTERPOLICYDEFAULT_INPUT="ACCEPT"
FILTERPOLICYDEFAULT_OUTPUT="ACCEPT"
FILTERPOLICYDEFAULT_FORWARD="ACCEPT"
NATPOLICYDEFAULT_PREROUTING="ACCEPT"
NATPOLICYDEFAULT_POSTROUTING="ACCEPT"
PORTS_UN=“1024:65535”

Passerelles

On flush la table de FORWARD, INPUT et OUTPUT

$IPTABLES -F
$IPTABLES -X
$IPTABLES -F FORWARD
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT

On flush la table de nat

$IPTABLES -t nat -F
$IPTABLES -t nat -X
$IPTABLES -t mangle -F
$IPTABLES -t mangle -X

#on flush log_and_drop
$IPTABLES -X log_and_drop
$IPTABLES -N log_and_drop

echo "#--------------------------------"
echo “# Regles par defaut”

echo “Regle FILTER INPUT : $FILTERPOLICYDEFAULT_INPUT”
$IPTABLES -t filter -P INPUT $FILTERPOLICYDEFAULT_INPUT

echo “Regle FILTER OUTPUT : $FILTERPOLICYDEFAULT_OUTPUT”
$IPTABLES -t filter -P OUTPUT $FILTERPOLICYDEFAULT_OUTPUT

echo “Regle FILTER FORWARD : $FILTERPOLICYDEFAULT_FORWARD”
$IPTABLES -t filter -P FORWARD $FILTERPOLICYDEFAULT_FORWARD

echo "#--------------------------------"
echo "# Translation d adresse"
echo “Regle PREROUTING : $NATPOLICYDEFAULT_PREROUTING”
$IPTABLES -t nat -P PREROUTING $NATPOLICYDEFAULT_PREROUTING
echo “Regle POSTROUTING : $NATPOLICYDEFAULT_POSTROUTING”
$IPTABLES -t nat -P POSTROUTING $NATPOLICYDEFAULT_POSTROUTING

#*************************

Debut des commandes.

#-------------------------

On active le routage

echo 1 > /proc/sys/net/ipv4/ip_forward

Enregistrement dans syslog des paquets rejetes pas rp_filter

#echo 1 > /proc/sys/net/ipv4/conf/all/log_martians

Un paquet revient par le meme chemin

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 0 > $f
done

Definition de log_and_drop

#$IPTABLES -A log_and_drop -j LOG --log-level debug --log-prefix "filter drop "
#$IPTABLES -A log_and_drop -j ACCEPT

#*************************

Debut des regles.

#-------------------------

$IPTABLES -A PREROUTING -t mangle -s 89.0.7.0/8 -d 89.31.147.47 -p all -j MARK --set-mark 1
$IPTABLES -A PREROUTING -t mangle -s 89.0.7.0/8 -d 62.97.236.181 -p all -j MARK --set-mark 1

Bon -> si vous êtes arrivé là c’est que mon post vous passionne !!!

J’ajoute un petit ip route list table main :
89.0.7.0/24 dev eth0 proto kernel scope link src 89.0.7.7
192.168.100.0/24 dev eth1 proto kernel scope link src 192.168.100.254
192.168.101.0/24 dev eth2 proto kernel scope link src 192.168.101.254
default via 192.168.100.1 dev eth1

Ben voila mon soucis :
POURQUOI J’AI PAS MES TABLES 1 ET 2 … ??

Pourquoi mes preroutings ne fonctionnent pas ?

MAIS par moment cela fonctionne …???

Merci de vos avis.

Ben… en fait j’ai scrollé le pavé indigeste. Désolé. A cette heure-ci j’ai déjà trop de neurones endormis.

La commande “ip route list table main” affiche explicitement le seul contenu de la table “main”. Spécifie le nom ou le numéro d’une autre table.

Mais encore ? C’est censé faire quoi et il se passe quoi à la place ?

Merci pour ton intérêt a cette heure tardive.
Effectivement le scrolling est de mise.
OK pour le main, je posterais demain la liste des tables effectivement crées.

C’est sensé faire quoi :
Ben j’ai mis deux adresses qui lorsqu’elles sont appelées devraient passer par la table …
Mer… mon post est faux :
$IPTABLES -A PREROUTING -t mangle -s 89.0.7.0/8 -d 89.31.147.47 -p all -j MARK --set-mark 2
$IPTABLES -A PREROUTING -t mangle -s 89.0.7.0/8 -d 62.97.236.181 -p all -j MARK --set-mark 2
devraient passer par la table 2 et … ne le font pas.
Elles continuent de passer par la route par default (interfaces).

  1. Dans ton premier message les deux règles posaient la marque 1 et non 2, donc forçaient l’utilisation de la passerelle par défaut.

  2. Le préfixe source 89.0.7.0/8 a quelque chose d’incohérent : 89.0.7.0 ne correspond pas à une longueur de préfixe /8 puisqu’il y a des bits à 1 au-delà des 8 bits de poids fort.
    Le résultat dépend alors de façon dont iptables traite ce préfixe :

  • soit il tronque le préfixe à 89.0.0.0/8 et l’adresse 89.31.147.47 tombe dedans, donc les paquets retour provenant de cette adresse seront marqués et rebouclés vers l’extérieur au lieu d’être routés vers le LAN ;
  • soit il garde tout et la correspondance ne marchera jamais, donc les paquets destinés à 89.31.147.47 ne seront pas marqués.

Tu peux soit spécifier la valeur correcte qui est 89.0.7.0/24, soit spécifier l’interface d’entrée avec -i eth0, ce qui est plus simple.

Merci de votre interet :
Correction faites :

#*************************

Debut des regles.

#-------------------------

$IPTABLES -A PREROUTING -t mangle -s 89.0.7.0/24 -d 89.31.147.47 -p all -j MARK --set-mark 2
$IPTABLES -A PREROUTING -t mangle -s 89.0.7.0/24 -d 62.97.236.181 -p all -j MARK --set-mark 2

Je fais un nouvel ip route list :
89.0.7.0/24 dev eth0 proto kernel scope link src 89.0.7.7
192.168.100.0/24 dev eth1 proto kernel scope link src 192.168.100.254
192.168.101.0/24 dev eth2 proto kernel scope link src 192.168.101.254
default via 192.168.100.1 dev eth1

Voici ce que j’obtiens.
Les routes et tables ne sont pas visibles.
Si je fais un traceroute vers 62.97.236.181 j’obtiens :
traceroute to leroy.no (62.97.236.181), 30 hops max, 38 byte packets
1 192.168.100.1 (192.168.100.1) 15.277 ms 1.076 ms 0.754 ms
2 *

J’ai bien essayé avec -i eth0 mais idem …
Avez vous une idées ?

Pourtant :
passerelle:/etc/iproute2# ip route show table 1
default via 192.168.100.1 dev eth1
passerelle:/etc/iproute2# ip route show table 2
default via 192.168.101.1 dev eth2
passerelle:/etc/iproute2# ip route show table 3
default via 192.168.101.2 dev eth2

De plus : c’est pour moi a n’y rien comprendre !

passerelle:/etc/init.d# iptables -t mangle -nvL
Chain PREROUTING (policy ACCEPT 7526K packets, 6276M bytes)
pkts bytes target prot opt in out source destination
0 0 MARK all – eth0 * 0.0.0.0/0 89.104.200.99 MARK set 0x2
0 0 MARK all – eth0 * 0.0.0.0/0 89.31.147.47 MARK set 0x2
0 0 MARK all – eth0 * 0.0.0.0/0 89.161.214.217 MARK set 0x2
0 0 MARK all – eth0 * 0.0.0.0/0 62.97.236.181 MARK set 0x2
8 722 MARK all – * * 89.0.7.0/24 192.168.101.0/24 MARK set 0x2

Chain INPUT (policy ACCEPT 129K packets, 15M bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 7396K packets, 6261M bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 168K packets, 15M bytes)
pkts bytes target prot opt in out source destination

Chain POSTROUTING (policy ACCEPT 7565K packets, 6276M bytes)
pkts bytes target prot opt in out source destination

A priori les routes sont bien là. Et ben non …

passerelle:/etc/init.d# traceroute agriculture.gouv.fr
traceroute to agriculture.gouv.fr (89.31.147.47), 30 hops max, 38 byte packets
1 192.168.100.1 (192.168.100.1) 0.781 ms 0.735 ms 0.716 ms
2 *

Par défaut, “ip route list” n’affiche que le contenu de la table de routage “main”. Comme je l’ai déjà dit, pour afficher le contenu d’une autre table il faut spécifier son nom ou son numéro.

[quote=“zoummuoz”]traceroute to leroy.no (62.97.236.181), 30 hops max, 38 byte packets
1 192.168.100.1 (192.168.100.1) 15.277 ms 1.076 ms 0.754 ms
2 *[/quote]
Visiblement tu lances le traceroute depuis la passerelle et pas depuis une station du LAN. Or les règles dans une chaîne PREROUTING ne traitent que les paquets entrants, pas les paquets émis. Pour cela il faut mettre des règles dans une chaîne OUTPUT aussi (sans options -s et -i).

D’autre part il peut y avoir un problème avec l’adresse source par défaut des paquets émis par la passerelle vers l’extérieur (192.168.100.254) si la passerelle ne fait pas de NAT source/MASQUERADE en sortie ou si le routeur utilisé n’a pas de route vers 192.168.100.254.

Si si , le traceroute est bien fait à partir d’une station du lan …

Ici a partir d’un W7 :
C:\Documents and Settings\Administrateur>tracert leroy.no
Détermination de l’itinéraire vers leroy.no [62.97.236.181]
avec un maximum de 30 sauts :
1 <1 ms <1 ms <1 ms 89.0.7.7
2 <1 ms <1 ms <1 ms 192.168.100.1

Mais effectivement, j’ai essayé de faire la meme chose depuis la passerelle et cela ne fonctionne pas.
Un wget ne fonctionne pas non plus.
J’ai essayé d’ajouter une regle OUTPUT :
iptables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

Mais un apt-get install nmap ne fonctionne pas :

passerelle:/etc/init.d# apt-get install nmap
Lecture des listes de paquets… Fait
Construction de l’arbre des dépendances… Fait
Les NOUVEAUX paquets suivants seront installés :
nmap
0 mis à jour, 1 nouvellement installés, 0 à enlever et 14 non mis à jour.
Il est nécessaire de prendre 575ko dans les archives.
Après dépaquetage, 1933ko d’espace disque supplémentaires seront utilisés.
0% [Connexion à ftp.proxad.net (212.27.60.27)]
et cela en reste là …

Ce doit être a mon avis un truc a la con - et comme j’ai ne nez dedans depuis trop longtemps je ne vois plus rien …

Bonsoir,
Je fais un petit up car je n’ai toujours pa trouvé de solus.

Je n’ai pas d’acces internet sur la passerelle (aptitude ne peut rien pour moi)

J’ai reinstaller ces scripts sur une nouvelle machine sur debian 6 toute neuve et c’est idem.

Avez vous une idées.

Merci a tous.

Je ne vois pas non plus d’où vient le problème. Toutes tes règles de routage avancé ne devraient pas affecter les communications de la machine elle-même. D’ailleurs le traceroute part bien vers le routeur par défaut.

A ta place, je repartirais d’une configuration basique avec l’accès internet qui marche pour tout le monde, avec juste la configuration IP des interfaces, une passerelle par défaut et le masquerading. Ensuite petit à petit j’ajouterais les tables de routage, les règles de routage et les règles iptables, en testant à chaque fois pour voir à quel moment ça ne marche plus.

OK, j’en étais arrivé à la même conclusion … je vais voir …
C’est du temps tout ça …

Merci de ton intérêt et tes commentaires.

Re …
Je viens de refaire la manip sur une Debian 6 toute neuve noyau 2.6.32-5-686 … et même résultat.
J’ai meme ajouter des tables nommées dans rt_tables. De plus je vois bien mes paquets tagés lorsque je tape un iptables -t mangle -vnL PREROUTING (les Ko augmente et les 0x1, 0x2 et 0x3 augmentent en temps réel).

root@passerelle-quimper2:~# iptables -t mangle -vnL PREROUTING
Chain PREROUTING (policy ACCEPT 1972K packets, 1020M bytes)
pkts bytes target prot opt in out source destination
78 11992 MARK all – * * 0.0.0.0/0 87.230.55.47 MARK set 0x2
251K 26M MARK tcp – * * 89.0.7.0/24 0.0.0.0/0 tcp dpt:80 MARK set 0x2
53371 45M MARK tcp – * * 89.0.7.0/24 0.0.0.0/0 tcp dpt:443 MARK set 0x2
0 0 MARK all – eth0 * 0.0.0.0/0 89.104.200.9 9 MARK set 0x2
0 0 MARK all – eth0 * 0.0.0.0/0 89.31.147.47 MARK set 0x2
0 0 MARK all – eth0 * 0.0.0.0/0 89.161.214.2 17 MARK set 0x2
0 0 MARK all – eth0 * 0.0.0.0/0 62.97.236.18 1 MARK set 0x2
8556 755K MARK all – * * 89.0.7.0/24 192.168.101. 0/24 MARK set 0x2
0 0 MARK all – * * 89.0.7.0/24 192.168.111. 0/24 MARK set 0x3
997K 334M MARK all – * * 89.0.7.0/24 !192.168.101. 0/24 MARK set 0x1

On dirait que bien que les paquets soient tagger, le routage soit inopérant …
J’en viens a me demander si cela ne vient pas des option du noyau ?
Est ce qu’un membre du forum pourrais me dire si sur une debian 6.01 install réseau j’ai bien nativement d’activé :
IP: advanced router (CONFIG_IP_ADVANCED_ROUTER)
IP: policy routing (CONFIG_IP_MULTIPLE_TABLES)
IP: use netfilter MARK value as routing key (CONFIG_IP_ROUTE_FWMARK)
Sinon comment faire pour les activer ? (je suis pas top sur la config noyau … :blush: )
Merci de votre aide.

S,
Sans autre opinion que ce qui a été dit : prendre les choses une par une. Test passant, non passant et aux limites, mais je ne réponds au très jolies règles …

Bah, tu r’gardes …

 grep -q CONFIG_IP_MULTIPLE_TABLES /boot/config-3.0.0-1-amd64 ; echo $?

S’il revoit 0, Ya, Sinon, Yapa !!!

CONFIG_IP_ROUTE_FWMARK n’est pas présent effectivement : il est en natif dans tous les protocols maintenant, depuis la 2.6.20 !!! (Toutes les options {DECNET,IP,IPV6}_ROUTE_FWMARK ont été retirée et inclue directement lorsque tu choisis l’option IP: policy routing (CONFIG_IP_MULTIPLE_TABLES)).
=> Donc, aucun souci de ce coté là non plus : toutes les options que tu demandes sont ok.

Cela fait longtemps que j’ai pas fait du ipfwm … Hmmm, ne faut-il pas explicitement entrer les table T1, T2 … ??? plutôt que 1, 2 … ??? Et sensible à la casse … ???
@+

Bon toujours teigneux … ai bien verifié le noyau et c’est ok !
J’ai approté les modifs suivantes :
/etc/iproute2 et le fichier rt_tables :

reserved values

201 bouygues
202 autres
203 backup

255 local
254 main
253 default
0 unspec

local

Mon nouveau script iprule :
clear
ip route flush cache

#nettoyage des regles.
ip rule del fwmark 1
ip rule del fwmark 2
ip rule del fwmark 3
#Nettoyage
ip route del table bouygues
ip route del table autres
ip route del table backup

Regle de transmission aux bonnes tables de routages

ip rule add fwmark 1 lookup bouygues

Regle Autres flux

ip rule add fwmark 2 lookup autres

Regle Backup

ip rule add fwmark 3 lookup backup

Vers BOUYGUES

ip route add default via 192.168.100.1 dev eth1 table bouygues

Autres flux

ip route add default via 192.168.101.1 dev eth2 table autres

Backup

ip route add default via 192.168.101.2 dev eth2 table backup

ip route flush cache

Puis iptables :
#*************************

Debut des definitions.

#-------------------------

clear
IPTABLES=“iptables”

FILTERPOLICYDEFAULT_INPUT="ACCEPT"
FILTERPOLICYDEFAULT_OUTPUT="ACCEPT"
FILTERPOLICYDEFAULT_FORWARD="ACCEPT"
NATPOLICYDEFAULT_PREROUTING="ACCEPT"
NATPOLICYDEFAULT_POSTROUTING="ACCEPT"
PORTS_UN=“1024:65535”

Passerelles

On flush la table de FORWARD, INPUT et OUTPUT

$IPTABLES -F
$IPTABLES -F FORWARD
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT

On flush la table de nat

$IPTABLES -t nat -F
$IPTABLES -t nat -X
$IPTABLES -t mangle -F
$IPTABLES -t mangle -X

#on flush log_and_drop
$IPTABLES -X log_and_drop
$IPTABLES -N log_and_drop

echo "#--------------------------------"
echo “# Regles par defaut”

echo “Regle FILTER INPUT : $FILTERPOLICYDEFAULT_INPUT”
$IPTABLES -t filter -P INPUT $FILTERPOLICYDEFAULT_INPUT

echo “Regle FILTER OUTPUT : $FILTERPOLICYDEFAULT_OUTPUT”
$IPTABLES -t filter -P OUTPUT $FILTERPOLICYDEFAULT_OUTPUT

echo “Regle FILTER FORWARD : $FILTERPOLICYDEFAULT_FORWARD”
$IPTABLES -t filter -P FORWARD $FILTERPOLICYDEFAULT_FORWARD

echo "#--------------------------------"
echo "# Translation d adresse"
echo “Regle PREROUTING : $NATPOLICYDEFAULT_PREROUTING”
$IPTABLES -t nat -P PREROUTING $NATPOLICYDEFAULT_PREROUTING
echo “Regle POSTROUTING : $NATPOLICYDEFAULT_POSTROUTING”
$IPTABLES -t nat -P POSTROUTING $NATPOLICYDEFAULT_POSTROUTING

#*************************

Debut des commandes.

#-------------------------

On active le routage

echo 1 > /proc/sys/net/ipv4/ip_forward
#echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter

Enregistrement dans syslog des paquets rejetes pas rp_filter

#echo 1 > /proc/sys/net/ipv4/conf/all/log_martians

Un paquet revient par le meme chemin

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 0 > $f
done

Definition de log_and_drop

#$IPTABLES -A log_and_drop -j LOG --log-level debug --log-prefix "filter drop "
#$IPTABLES -A log_and_drop -j ACCEPT

#*************************

Debut des regles.

#-------------------------

#Site ip-adress.com
$IPTABLES -t mangle -A PREROUTING -p all -d 87.230.55.47 -j MARK --set-mark 0x2
$IPTABLES -t nat -A POSTROUTING -d 87.230.55.47/32 -j MASQUERADE

HTTP

$IPTABLES -A PREROUTING -t mangle -s 89.0.7.0/24 -p tcp --dport 80 -j MARK --set-mark 0x3
$IPTABLES -t nat -A POSTROUTING -p tcp --dport 80 -j MASQUERADE
$IPTABLES -A PREROUTING -t mangle -s 89.0.7.0/24 -p tcp --dport 443 -j MARK --set-mark 0x3
$IPTABLES -t nat -A POSTROUTING -p tcp --dport 443 -j MASQUERADE

Et la put… miracle ca passe ! si je vais sur ip-address.com mon ip est bien celle de mon adsl 2 et non de ma ls. Les flux web passent bien via mon adsl 3 !
MAIS : TOUJOURS PAS DE POSSIBILITE de faire un ‘aptitude update’ :
Err ftp.fr.debian.org/debian/ squeeze-updates/main Translation-fr
Impossible d’initialiser la connexion à ftp.fr.debian.org: 80 (2a01:e0c:1:1598::2). - connect (101: Le réseau n’est pas accessible) [IP : 2a01:e0c:1:1598::2 80]

Ça je sais chef, c’est le forward IpV6 qui est oublié !!!
C’est dans proc comme tu l’as déjà fait pour IpV4 puis dans sysctl.conf lorsque tout aura marché !!!
Édit : j’m’y suis fit nicky aussi, en mon temps … comme quoi, ça change ! :slightly_smiling:

Many thank’sss
Je teste cela des lundi. (pas sur place là)

J’ajoute :
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

puis pour que ca se lance en auto dans /etc/sysctl.conf:
net.ipv6.conf.default.forwarding=1

Ben non, trop content je me suis precipité et … toujours pareil.
Err ftp.fr.debian.org squeeze-updates Release.gpg
Impossible d’initialiser la connexion à ftp.fr.debian.org: 80 (2a01:e0c:1:1598::2). - connect (101: Le réseau n’est pas acces

Avez vous d’autre vidée ou tests a faire qui pouraient m’eclairer ?

Merci a tous.

Oui, plusieurs. C’est pas suffisant ta commande pour faire suivre les paquets, cela avait été ma première réaction aussi, il y a plusieurs commandes précises pour forwarder tout les paquets. Cela dit, ce n’est pas pour autant que c’est la solution.

Pour ftp.fr.debian.org : pourquoi ne pas forcer de l’IpV4, pour voir … ???
Dis-nous la suite ???

Édit du 10 Août : j’y ai réfléchis hier soir, tard, tu fais du nat !!! Avec IpV6, … T’as pas plus compliqué ? C’est fini ça le nat dans du nat dans du nat avec IpV6, so => remême conclusion, vire le IpV6 et vois si ça marche. Penser à forcer le dns à accepter et répondre uniquement en IpV4, natté ou non !!!
@+