Ma question est fondamentalement la même que Autoriser uniquement certains trafics sortants sur certaines interfaces.
J'ai deux interfaces eth1
(10.0.0.2) et wlan0
(192.168.0.2).
Ma route par défaut est pour eth1
.
Disons que je veux que tout le trafic https passe par wlan0
.
Maintenant, si j'utilise la solution suggérée dans l'autre question, le trafic https passera par wlan0
, mais aura toujours l'adresse source de eth1
(10.0.0.2). Étant donné que cette adresse n'est pas acheminable pour le wlan0
passerelle, les réponses ne reviendront jamais. Le moyen le plus simple serait simplement de définir correctement l'adresse de liaison dans l'application, mais dans ce cas, cela ne s'applique pas.
Je pense que je dois réécrire le src-addr :
# first mark it so that iproute can route it through wlan0
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2
Maintenant, tcpdump voit très bien les paquets sortants et les paquets entrants arrivent pour 192.168.0.2, mais ils ne se retrouvent probablement jamais dans l'application, car tout ce que je vois, c'est que l'application renvoie le paquet SYN, bien que le SYN- ACK a déjà été reçu.
Alors j'ai pensé que je devais peut-être aussi réécrire l'adresse entrante :
iptables -A PREROUTING -t nat -i wlan0 -p tcp --sport 443 -j DNAT --to 10.0.0.2
mais cela n'a pas fonctionné non plus. Donc je suis un peu coincé ici. Des suggestions ?
Réponse acceptée :
Vous êtes proche.
La véritable raison pour laquelle l'application ne voit pas le trafic de retour est due à la protection contre l'usurpation d'adresse IP intégrée au noyau. C'est-à-dire que le trafic de retour ne correspond pas à la table de routage et est donc supprimé. Vous pouvez résoudre ce problème en désactivant la protection contre l'usurpation comme ceci :
sudo sysctl net.ipv4.conf.wlan0.rp_filter=0
Mais je ne le recommanderais pas. La méthode la plus appropriée consiste à créer une instance de routage alternative.
- La marque est nécessaire. Gardez-le.
- Le NAT source est également nécessaire.
- Le DNAT final n'est pas nécessaire, vous pouvez donc le supprimer.
Assurez-vous d'avoir le iproute
paquet installé. Si vous avez l'ip
commande alors vous êtes défini (ce qui semble être le cas, mais si ce n'est pas le cas, obtenez-le d'abord).
Modifier /etc/iproute2/rt_tables
et ajoutez un nouveau tableau en ajoutant la ligne suivante :
200 wlan-route
Vous devez ensuite configurer votre nouvelle table de routage nommée wlan-route
avec une passerelle par défaut et créez des règles pour envoyer conditionnellement le trafic vers cette table. Je suppose que votre passerelle par défaut est 192.168.0.1. Naturellement, cela doit correspondre à votre réseau réel, et pas seulement à mes hypothèses.
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
ip rule add fwmark 0x1 table wlan-route
Votre script annoté final ressemblerait à ceci :
# Populate secondary routing table
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
# Anything with this fwmark will use the secondary routing table
ip rule add fwmark 0x1 table wlan-route
# Mark these packets so that iproute can route it through wlan-route
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2