La Fibre
Télécom => Logiciels et systèmes d'exploitation => Linux (usage serveur) => Discussion démarrée par: vivien le 22 juin 2012 à 19:24:23
-
Experts Linux : configuration pour proposer un test de débit avec 100ms de ping en +
Je cherche à mettre en place un test de débit simulant une latence supplèmentaire.
J'aurais besoin de conseils d'experts Linux pour mettre en place la configuration.
Élèments à ma disposition :
- Un serveur (sans virtualisation possible)
- Deux cartes réseaux qui ont chacune leur IP publique et leur passerelle.
- Eth0 est l'interface sans latence supplèmentaire
- Eth1 est l'interface avec 100ms de latence supplèmentaire.
Pour générer la latence supplèmentaire, j'utilise NetEm (cf Tutoriel pour générer des pertes de paquets / latence / gigue sur un équipement avec NetEm (https://lafibre.info/tutoriels/generer-des-pertes-de-paquets/))
Voici la ligne de commande utilisée : tc qdisc add dev eth1 root netem delay 100ms
Les paquets émis (et non ceux reçus) sur eth1 prennent 100ms de retard.
Voici à quoi j'ai pensé comme fichier /etc/network/interfaces :
auto eth0
iface eth0 inet static
address 89.89.89.22
netmask 255.255.255.252
gateway 89.89.89.21
metric 10
auto eth1
iface eth1 inet static
address 89.89.89.6
netmask 255.255.255.252
gateway 89.89.89.5
metric 1000
Ce qui donne en routage :
# route
Table de routage IP du noyau
Destination Passerelle Genmask Indic Metric Ref Use Iface
default 89.89.89.21 0.0.0.0 UG 10 0 0 eth0
default 89.89.89.5 0.0.0.0 UG 1000 0 0 eth1
89.89.89.4 * 255.255.255.252 U 0 0 0 eth1
89.89.89.20 * 255.255.255.252 U 0 0 0 eth0
La problématique avec cette configuration :
après avoir mis rp_filter à 0 (sinon rien ne passe), le problème c'est que les paquets reçus par Eth1 partent par Eth0. La latence de 100ms n'est donc pas appliquée.
Quand je fais ping 89.89.89.56 depuis Internet, le paquet rentre sur le serveur par eth1 et sort par eth0 (métrique plus faible)
Ce que je cherche à faire est la chose suivante :
- Les connexions initiées par le serveur partent vers eth0 (89.89.89.22)
- Les connexions initiées par Internet sur l'IP 89.89.89.22 rentrent par eth0 et sortent par eth0
- Les connexions initiées par Internet sur l'IP 89.89.89.6 rentrent par eth1 et sortent par eth1 (avec le +100ms de NetEm)
Autre solution : que NetEm rajoute la latence de 100ms sur les paquets reçus par eth1 (au lieu des paquets émis)
Je prends aussi toutes les idées pour faire ce test avec 100ms de + sans virtualiser un serveur
-
# route
Table de routage IP du noyau
Destination Passerelle Genmask Indic Metric Ref Use Iface
default 89.89.89.21 0.0.0.0 UG 10 0 0 eth0
default 89.89.89.5 0.0.0.0 UG 1000 0 0 eth1
89.89.89.4 * 255.255.255.252 U 0 0 0 eth1
89.89.89.20 * 255.255.255.252 U 0 0 0 eth0
La problématique avec cette configuration :
après avoir mis rp_filter à 0
Bien sûr, puisque tes routes ne définissent pas une partition des adresses IP routables : rp_filter voudrait dire que toute adresse IP routable non locale (autre que 89.89.89.4 et 89.89.89.20) est accessible uniquement via eth0 et uniquement via eth1.
le problème c'est que les paquets reçus par Eth1 partent par Eth0.
Oui, bien sûr.
Ce que je cherche à faire est la chose suivante :
- Les connexions initiées par le serveur partent vers eth0 (89.89.89.21 89.89.89.22)
- Les connexions initiées par Internet sur l'IP 89.89.89.21 89.89.89.22 rentrent par eth0 et sortent par eth0
- Les connexions initiées par Internet sur l'IP 89.89.89.5 89.89.89.6 rentrent par eth1 et sortent par eth1 (avec le +100ms de NetEm)
Autrement dit :
1) les sockets non liées localement (adresse IP locale = 0) doivent avoir IP locale = 89.89.89.22
2) les paquets avec IP source = 89.89.89.22 sortent par eth0
3) les paquets avec IP source = 89.89.89.6 sortent par eth1
Pour le 1) c'est le paramètre src de la route par défaut qui s'en charge.
Pour 2) et 3) il faut utiliser les politiques de routage avec "ip rule" :
Je pense qu'il faut quelque comme ça (pas testé) :
# politique de routage basé sur des règles
# créer les routes par défaut dans des tables spécifiques
# on nomme les tables plutôt que d'utiliser des numéros
ip route add to default table route_to_eth0 dev eth0
ip route add to default table route_to_eth1 dev eth1
# "table main" indique la table par défaut et pourrait être omis
# cette table est considérée en dernier
# les paquets localement générés qui ont une adresse locale 0 prennent l'adresse locale 89.89.89.22
ip route add to default table main src 89.89.89.22 dev eth0
# créer les sélecteurs de tables de routage
ip rule add from 89.89.89.22 table route_to_eth0
ip rule add from 89.89.89.6 table route_to_eth1
# il faut purger le cache de routage
ip route flush cache
Il faut que ces noms symboliques de tables de routage soient définis dans /etc/iproute2/rt_tables.
Pour afficher l'état des règles :
ip rule show
ip route show table all
EDIT : adresses IP corrigées
-
Merci, je vais tester ça.
-
J'ai fait des tests avec un vieux PC équipé de deux cartes réseaux. Je n'arrive pas à faire marcher la configuration.
Environnement de test : deux box qui ont chacune une IP publique et une DMZ vers l'IP 192.168.x.100. Tous les masques sont des /24
=> Box N°1 connecté sur Eth0 : IP box 192.168.1.254 et DMZ vers 192.168.1.100
=> Box N°2 connecté sur Eth1 : IP box 192.168.0.254 et DMZ vers 192.168.0.100
Configuration réseau du PC :
# Box N°1
auto eth0
iface eth0 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.254
metric 10
dns-nameservers 192.168.1.254
# Box N°2
auto eth1
iface eth1 inet static
address 192.168.0.100
netmask 255.255.255.0
gateway 192.168.0.254
metric 100
J'ai rajouté les lignes qui vont bien à la fin du fichier /etc/iproute2/rt_tables
nano -w /etc/iproute2/rt_tables
1 route_to_eth0
2 route_to_eth1
Passage de eth0 et eth1 en fonctionnement de type routeur (je en sais pas si c'est nécessaire) :
sysctl -w net.ipv4.conf.eth0.rp_filter=0
sysctl -w net.ipv4.conf.eth1.rp_filter=0
Créer les routes par défaut dans des tables spécifiques :
ip route add to default table route_to_eth0 dev eth0
ip route add to default table route_to_eth1 dev eth1
Créer les sélecteurs de tables de routage :
ip rule add from 192.168.1.254 table route_to_eth0
ip rule add from 192.168.0.254 table route_to_eth1
Ce que cela donne :
ip rule show
0: from all lookup local
32764: from 192.168.0.254 lookup route_to_eth1
32765: from 192.168.1.254 lookup route_to_eth0
32766: from all lookup main
32767: from all lookup default
ip route show table all
default via 192.168.1.254 dev eth0 metric 10
default via 192.168.0.254 dev eth1 metric 100
192.168.0.0/24 dev eth1 proto kernel scope link src 192.168.0.100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
broadcast 192.168.0.0 dev eth1 table local proto kernel scope link src 192.168.0.100
local 192.168.0.100 dev eth1 table local proto kernel scope host src 192.168.0.100
broadcast 192.168.0.255 dev eth1 table local proto kernel scope link src 192.168.0.100
broadcast 192.168.1.0 dev eth0 table local proto kernel scope link src 192.168.1.100
local 192.168.1.100 dev eth0 table local proto kernel scope host src 192.168.1.100
broadcast 192.168.1.255 dev eth0 table local proto kernel scope link src 192.168.1.100
fe80::/64 dev eth1 proto kernel metric 256
fe80::/64 dev eth0 proto kernel metric 256
unreachable default dev lo table unspec proto kernel metric 4294967295 error -101 hoplimit 255
local ::1 via :: dev lo table local proto none metric 0
local fe80::215:e9ff:fe3d:b12b via :: dev lo table local proto none metric 0
local fe80::215:f2ff:fe94:3244 via :: dev lo table local proto none metric 0
ff00::/8 dev eth1 table local metric 256
ff00::/8 dev eth0 table local metric 256
unreachable default dev lo table unspec proto kernel metric 4294967295 error -101 hoplimit 255
Depuis internet, j'arrive à me connecter en ssh sur la machine via la box N°1 (eth0) mais pas celle sur eth1.
Une analyse avec tcpdump montre que les paquets [SYN] arrivent sur eth1 mais partent via eth0. :(
Quand je rajoute la commande suivante, je perds l’accès internet :
ip route add to default table main src 192.168.1.100 dev eth0
-
Configuration réseau du PC :
# Box N°1
auto eth0
iface eth0 inet static
address 192.168.1.100
# Box N°2
auto eth1
iface eth1 inet static
address 192.168.0.100
ip rule add from 192.168.1.254 table route_to_eth0
ip rule add from 192.168.0.254 table route_to_eth1
Déjà, il y a comme un problème!
-
Quel problème ?
Deux box qui ont chacune leur nat et chacune leur passerelle en .254.
-
Quel problème ?
Deux box qui ont chacune leur nat et chacune leur passerelle en .254.
Tu n'as pas compris à quoi sert la régle ip rule from 1.2.3.4 table 123.
Cela signifie: les paquets sortants avec l'ipv4 source 1.2.3.4 doivent utiliser la table de routage 123.
-
Effectivement, c'est donc :
ip rule add from 192.168.1.100 table route_to_eth0
ip rule add from 192.168.0.100 table route_to_eth1
-
J'ai continué les tests avec mon vieux PC équipé de deux cartes réseaux. Je n'arrive toujours pas à faire marcher la configuration.
J'ai tout recopié pour éviter les différentes erreurs des posts précédents.
Environnement de test : deux box qui ont chacune une IP publique et une DMZ vers l'IP 192.168.x.100. Tous les masques sont des /24
=> Box N°1 connecté sur Eth0 : IP box 192.168.1.254 et DMZ vers 192.168.1.100
=> Box N°2 connecté sur Eth1 : IP box 192.168.0.254 et DMZ vers 192.168.0.100
Configuration réseau du PC :
# Box N°1
auto eth0
iface eth0 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.254
metric 10
dns-nameservers 192.168.1.254
# Box N°2
auto eth1
iface eth1 inet static
address 192.168.0.100
netmask 255.255.255.0
gateway 192.168.0.254
metric 100
J'ai fait des tests en modifiant le metric : il est possible de me connecter en ssh depuis Internet via l'interface qui a le metric le plus important
J'ai rajouté les lignes qui vont bien à la fin du fichier /etc/iproute2/rt_tables
nano -w /etc/iproute2/rt_tables
1 route_to_eth0
2 route_to_eth1
Passage de eth0 et eth1 en fonctionnement de type routeur (je en sais pas si c'est nécessaire) :
sysctl -w net.ipv4.conf.eth0.rp_filter=0
sysctl -w net.ipv4.conf.eth1.rp_filter=0
Créer les routes par défaut dans des tables spécifiques :
ip route add to default table route_to_eth0 dev eth0
ip route add to default table route_to_eth1 dev eth1
Créer les sélecteurs de tables de routage :
ip rule add from 192.168.1.100 table route_to_eth0 (à partir de cette commande, je perds l’accès à internet)
ip rule add from 192.168.0.100 table route_to_eth1
Ce que cela donne :
ip rule show
0: from all lookup local
32764: from 192.168.0.100 lookup route_to_eth1
32765: from 192.168.1.100 lookup route_to_eth0
32766: from all lookup main
32767: from all lookup default
ip route show table all
default dev eth1 table route_to_eth1 scope link
default via 192.168.0.254 dev eth1 metric 100
default via 192.168.1.254 dev eth0 metric 1000
192.168.0.0/24 dev eth1 proto kernel scope link src 192.168.0.100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
default dev eth0 table route_to_eth0 scope link
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
broadcast 192.168.0.0 dev eth1 table local proto kernel scope link src 192.168.0.100
local 192.168.0.100 dev eth1 table local proto kernel scope host src 192.168.0.100
broadcast 192.168.0.255 dev eth1 table local proto kernel scope link src 192.168.0.100
broadcast 192.168.1.0 dev eth0 table local proto kernel scope link src 192.168.1.100
local 192.168.1.100 dev eth0 table local proto kernel scope host src 192.168.1.100
broadcast 192.168.1.255 dev eth0 table local proto kernel scope link src 192.168.1.100
fe80::/64 dev eth1 proto kernel metric 256
fe80::/64 dev eth0 proto kernel metric 256
unreachable default dev lo table unspec proto kernel metric 4294967295 error -101 hoplimit 255
local ::1 via :: dev lo table local proto none metric 0
local fe80::215:e9ff:fe3d:b12b via :: dev lo table local proto none metric 0
local fe80::215:f2ff:fe94:3244 via :: dev lo table local proto none metric 0
ff00::/8 dev eth1 table local metric 256
ff00::/8 dev eth0 table local metric 256
unreachable default dev lo table unspec proto kernel metric 4294967295 error -101 hoplimit 255
-
ip add add 192.168.1.100/24 dev eth0
ip add add 192.168.0.100/24 dev eth1
ip route flush
ip route add 192.168.1.100/24 dev eth0 scope link table route_to_eth0
ip route add 192.168.0.100/24 dev eth1 scope link table route_to_eth1
ip route add default via 192.168.1.254 dev eth0 table route_to_eth0
ip route add default via 192.168.0.254 dev eth1 table route_to_eth1
ip rule add from 192.168.1.100 table route_to_eth0
ip rule add fwmark 0xa0 table route_to_eth0
ip rule add from 192.168.0.100 table route_to_eth1
ip rule add fwmark 0xa1 table route_to_eth1
iptables -t mangle -A PREROUTING -i eth0 -j MARK --set-xmark 0xa0/0xffffffff
iptables -t mangle -A PREROUTING -i eth1 -j MARK --set-xmark 0xa1/0xffffffff
Oui l'utilisation de netfilter est bourrin :)