Comment configurer deux itinéraires par défaut sous Linux (correspondant à deux interfaces), telle que le trafic entrant des deux interfaces est accepté.
J'ai un hôte ayant deux niques eth0
et eth1
. Sa liaison à deux réseaux, disons:
Dev: eth0
, IP: 1.1.1.4
, Netmask: 255.255.255.0
, Passerelle: 1.1.1.1
Dev: eth1
, IP: 2.2.2.4
, Netmask: 255.255.255.0
, Passerelle: 2.2.2.1
(Les deux réseaux sont connectés à Internet.)
Les itinéraires sont (ip route show
):
default via 1.1.1.1 dev eth0 metric 1
default via 2.2.2.1 dev eth1 metric 2
1.1.1.0/24 dev eth0 src 1.1.1.4
2.2.2.0/24 dev eth1 src 2.2.2.4
(Métrique inférieure signifie une priorité plus élevée.)
Maintenant quand quelqu'un pings 2.2.2.4
à partir d'un hôte externe (dire 4.4.4.4
), il n'y a pas de réponse.
La sortie de tcpdump -i eth1
sur mon hôte est:
22:41:27.431539 IP 4.4.4.4 > 2.2.2.4: ICMP echo request, id 8625, seq 4, length 64
22:41:28.439492 IP 4.4.4.4 > 2.2.2.4: ICMP echo request, id 8625, seq 5, length 64
22:41:29.447666 IP 4.4.4.4 > 2.2.2.4: ICMP echo request, id 8625, seq 6, length 64
22:41:30.455528 IP 4.4.4.4 > 2.2.2.4: ICMP echo request, id 8625, seq 7, length 64
Après quelques recherches, il s'avère que lorsque la pile réseau Linux reçoit un paquet de 4.4.4.4
, il vérifie sa table de routage pour voir quelle interface aurait dû être utilisée pour 4.4.4.4
(lequel est eth0
Dans la table de routage). Maintenant, comme le paquet est venu de eth1
Interface, Linux le défait tout simplement (cette stratégie est probablement d'empêcher l'usurpation IP).
Ce que je veux, c'est:
Le trafic sortant (à l'origine locale) devrait utiliser eth0
interface par défaut.
Le trafic entrant doit être accepté à partir des deux interfaces. (Donc 4.4.4.4
devrait être capable de ping à la fois 1.1.1.4
et 2.2.2.4
)
Utiliser IProute2, vous pouvez faire quelque chose comme ceci:
echo "1 admin" >> /etc/iproute2/rt_tables
echo "2 users" >> /etc/iproute2/rt_tables
ip rule add from 192.168.122.40/32 dev eth0 table admin
ip rule add from 192.168.123.41/32 dev eth1 table users
ip route add default via 192.168.122.1 dev eth0 table admin
ip route add default via 192.168.123.1 dev eth1 table users
Maintenant, vous aurez deux tableaux de routage avec deux passerelles.
Ce phénomène s'appelle unicast RPF (transfert de trajet inverse) sous forme de filtre de chemin d'accès standard mais inversé sous Linux. Vous pouvez désactiver cela sans aucune conséquence négative importante (sauf si vous êtes un fournisseur de services Internet .. et un routeur).
echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter
Ensuite, votre exemple devrait fonctionner comme vous le souhaitez.
Si votre application se lie à 0.0.0.0
Il est également nécessaire d'ajouter des règles telles que:
ip rule add from 0.0.0.0/32 to 192.168.122.0/24 dev eth0 table admin
ip rule add from 0.0.0.0/32 to 192.168.123.0/24 dev eth1 table users