Petite histoire,
3 interfaces, eth0 (LAN), eth1 (ADSL), eth2 (4G).
eth0 -> eth1: fonctionne
(ports 80, 443, 4070) eth0 -> eth2: ne se produit pas
Il s'agit d'une représentation graphique de l'idée:
Port 80 et 443 via eth2
et le reste via eth1
Netscheme:
eth0: -ip 10.0.0.1 -net 10.0.0.0/8 -gw 10.0.0.1 (the servers own intf)
eth1: -ip 192.168.1.74 -net 192.168.1.0/24 -gw 192.168.1.254
eth2: -ip 192.168.1.91 -net 192.168.0.0/24 -gw 192.168.0.1
Ce nouveau script redirige 22 et 4070 vers la bonne table, je pense.
Cependant, après avoir atteint cette table, il n'est pas redirigé vers eth2.
Ce script fonctionne, sauf pour 22 et 4070!
(Le port 80 n'est pas commenté et il fonctionne mais via eth1 qui est faux.)
modprobe iptable_nat
modprobe ip_conntrack
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -F PREROUTING
iptables -t nat -F
iptables -t mangle -F
iptables -F
# This next line restores any issues trying to connect to something
# if you get weird ACK packets when trying to connect (at least i did)!
iptables -t mangle -A PREROUTING -p tcp -j CONNMARK --restore-mark
ip route flush table main
iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 22 -j MARK --set-mark 1
### iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 80 -j MARK --set-mark 1
iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 4070 -j MARK --set-mark 1
## Setup routes
# LAN
route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0
# ADSL
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1
# 4G (Only accessible if marking packages with \x01
route add -net 192.168.0.0 netmask 255.255.255.0 dev eth2
# Default via ADSL
## -- Does the same as ip route below? route add default gw 192.168.1.254
echo "201 eth2.out" >> /etc/iproute2/rt_tables
ip rule add fwmark 1 table eth2.out
ip route add default via 192.168.0.1 dev eth2 table eth2.out
ip route add default via 192.168.1.254 dev eth1
## Setup forwards
# From 4G to LAN
iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From ADSL to LAN
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From LAN to ADSL (Default route out)
# - Note: If marked packages is sent to ADSL they will be mangled and rerouted to 4G
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
Ancien script:
Ignore everything below unless you're interested in retracing my steps!!
J'ai créé un script router.sh pour configurer mon environnement au cas où je ferais quelque chose de mal. J'ai 3 ports que je veux envoyer à une connexion 4G et le reste via une connexion ADSL fixe. Pour ce faire, j'ai demandé à iptables de modifier les paquets sur la route par défaut et de les envoyer via mon interface 4G si --dport == 443 | 80 | 4070
Cependant, cela ne fonctionne pas; Je suis toujours acheminé via ma ligne fixe, quoi qu'il arrive.
Voici à quoi ressemble mon script:
#!/bin/bash
## routing tables
# wireless = 4G via eth2
# adsl = adsl via eth1
modprobe iptable_nat
modprobe ip_conntrack
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -t nat -F
ip route flush table main
ip route flush table wireless
ip route flush table adsl
## Setup routing tables
# ADSL
ip route add table adsl to 192.168.1.0/24 dev eth1
# 4G
ip route add table wireless to 192.168.0.0 dev eth2
ip rule add fwmark 0x1 table wireless
## Setup routes
# LAN
route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0
# ADSL
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1
# 4G (Only accessible if marking packages with \x01
route add -net 192.168.0.0 netmask 255.255.255.0 dev eth2
# Default via ADSL
route add default gw 192.168.1.254
## Forward ports into the LAN
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 10.0.0.3:80
## Lets mark all packets we want for 4G forward
# HTTPS
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# HTTP
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 80 -j MARK --set-mark 1
# Spotify
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 4070 -j MARK --set-mark 1
## Setup forwards
# From 4G to LAN
iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From ADSL to LAN
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# From LAN to ADSL (Default route out)
# - Note: If marked packages is sent to ADSL they will be mangled and rerouted to 4G
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -j LOG
#iptables --table nat --append POSTROUTING --out-interface eth2 --jump SNAT --to-source "192.168.1.74"
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
J'ai également essayé d'ajouter ces 3 au bas du script:
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 80 -j SNAT --to "192.168.0.91"
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 443 -j SNAT --to "192.168.0.91"
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 4070 -j SNAT --to "192.168.0.91"
Également essayé sans succès:
iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 1
Last but not least, essayé:
## Lets mark all packets we want for 4G forward
# HTTPS
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# HTTP
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 80 -j MARK --set-mark 1
# Spotify
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 4070 -j MARK --set-mark 1
Le routage fonctionne, je peux naviguer sur le Web, écouter de la musique et autres, mais je le fais via la mauvaise interface. Je recherche sur Google depuis longtemps et j'ai trouvé des morceaux pour comprendre ce que je fais et pourquoi je le fais. Je pourrais faire la mise en forme du trafic via tc mais si c'est possible via le marquage des packages dans iptables, cela m'aiderait beaucoup.
Je suppose que je fais mal l'ordre sur les différentes règles, principalement la partie MASQUERADE ? ou si cela devait même être là?
Quelqu'un peut-il expliquer comment le port DNAT dit, tcp: 80 à partir d'une interface externe (un ou les deux protocoles) à un espace d'adressage 10.0.0.0 interne?
Les sorties:
root@Netbridge:~# route -n Kernel IP routing table Destination
Gateway Genmask Flags Metric Ref Use Iface<br>
0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth1<br>
10.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 eth0<br>
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2<br>
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
root@Netbridge:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0c:29:7e:9e:4e
inet addr:10.0.0.1 Bcast:10.255.255.255 Mask:255.0.0.0
eth1 Link encap:Ethernet HWaddr 00:0c:29:7e:9e:58
inet addr:192.168.1.74 Bcast:192.168.1.255 Mask:255.255.255.0
eth2 Link encap:Ethernet HWaddr 00:0c:29:7e:9e:62
inet addr:192.168.0.91 Bcast:192.168.0.255 Mask:255.255.255.0
Suivre ces instructions:
trafic de sortie sur différentes interfaces basées sur la destination par
iptables-forward-specific-port-to-specific-nic
Parmi quelques autres threads liés.
localhost
et à l'adresse de l'eth2
interface?ethX
adresse IP d'un empêchera les hôtes duethX
LAN d'accéder au serveur local à l'aideethY
de l'adresse IP et n'empêchera pas les hôtes d'ethY
accéder au serveur à l'aideethX
de l'adresse IP. N'oubliez pas que Linux utilise un modèle d'hôte faible.Réponses:
BatchyX donne déjà de très bonnes explications sur iptables et le routage, donc je vais exercer ma paresse et aller directement au script.
Il doit NAT tout le trafic vers le port 80,443,22,4070 à 192.168.0.91. Tout le reste sera NAT jusqu'à 192.168.1.254.
Je refais mes tests et finis par suivre ce guide . Ce qui manque dans ce guide, ce sont les 3 dernières lignes de mon script. Ce que j'ai découvert depuis un autre port, mais j'ai perdu la trace de ce lien.
Il s'agit d'un script de travail testé.
Besoin d'une route par défaut
Une chose que je n'ai pas mise dans le script est la configuration de la route par défaut. Ça devrait être
Dans ce cas
route -n
, ce devrait être la seule route par défaut (Dest: 0.0.0.0)fw-router.sh
PS1: En bref,
MASQUERADE
ne fonctionne pas (dans la plupart des cas, et certainement dans votre cas) pour NAT avec plusieurs adresses IP externes qui ont besoin d'une sorte d'équilibrage de charge ou nécessitent DNAT pour gérer le trafic entrant. Vous avez besoinSNAT
d'un contrôle de direction.PS2: Pure iptables n'est pas suffisant.
la source
Remarque: je n'ai considéré que le premier script, en ignorant l'ancien.
route
etip route
. C'est du mal pur. Utilisez-leip
partout et oubliezifconfig
etroute
/etc/iproute2/rt_tables
n'est pas réinitialisé lors des redémarrages. Ajouter la même entrée encore et encore n'est pas une bonne idée, vous ne devez le faire qu'une seule fois. N'oubliez pas quert_tables
définissez simplement des alias de nom en valeurs numériques, cela ne modifie aucune configuration.Maintenant pour
iptables
: Dans votreFORWARD
chaîne, vous déposez des paquets provenant du LAN vers la 4G. C'est mauvais. leFORWARD
crochet est utilisé une fois le routage terminé. À ce stade, tout le routage des stratégies est effectué, et on sait déjà si le paquet doit être envoyé vers la 4G ou l'ADSL. Il n'y a pas de réacheminement effectué dansFORWARD
ou aprèsFORWARD
(eh bien, techniquement, le réacheminement peut être effectué aprèsPOSTROUTING
dans les cas graves, mais revenons au fait).Maintenant pour votre routage: n'oubliez pas qu'Ubuntu active le filtrage de chemin inverse par défaut. Le filtrage de chemin inverse fonctionne comme suit: Lorsque le noyau reçoit un paquet (qu'il soit transféré ou non) d'une interface A, il inversera l'adresse source et l'adresse de destination, et vérifiera si le paquet résultant doit être acheminé via l'interface A. Si ce n'est pas le cas, le paquet est abandonné en tant que tentative d'usurpation d'adresse.
Pour les paquets reçus de
eth0
, ce n'est pas un problème. Pour les paquets reçus deeth1
, ce n'est pas non plus un problème, car lors de l'inversion de l'adresse IP source et de l'adresse IP de destination, le noyau utilise la route par défaut dans le tableaumain
. Pour les paquets reçus deeth2
, que vous ne marquez pas, c'est un problème, car le noyau atteindra la route par défaut dans la tablemain
et considérera que ces paquets auraient dû être reçus deeth1
. La solution la plus simple consiste à désactiver le filtrage de chemin inverse sur eth1:la source