Mon serveur domestique a deux interfaces principales, eth1
(une connexion Internet standard) et tun0
(un tunnel OpenVPN). Je voudrais utiliser iptables
pour forcer tous les paquets générés par un processus local appartenant à l'UID 1002 à quitter tun0
, et tous les autres paquets à quitter eth1
.
Je peux facilement marquer les paquets correspondants:
iptables -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 11
Maintenant, je voudrais mettre une règle dans la chaîne POSTROUTING (probablement de la table mangle) pour faire correspondre les paquets marqués de 11 et les envoyer à tun0
, suivie d'une règle qui correspond à tous les paquets et les envoyer à eth1
.
J'ai trouvé la cible ROUTE, mais cela ne semble que réécrire l'interface source (sauf si je ne la lis pas correctement).
Iptables en est-il capable? Dois-je jouer avec la table de routage (via ip route
ou simplement les route
commandes héritées ) à la place?
Edit: je pensais que je devrais peut-être fournir plus d'informations. Je n'ai pas d'autres règles iptables à l'heure actuelle (bien que je puisse créer des règles pour effectuer des tâches non liées à l'avenir). De plus, la sortie de ip route
est:
default via 192.168.1.254 dev eth1 metric 203
10.32.0.49 dev tun0 proto kernel scope link src 10.32.0.50
85.17.27.71 via 192.168.1.254 dev eth1
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.73 metric 203
Je n'ai pas touché à la table de routage - c'est comme ça à l'heure actuelle (même si elle a l'air assez sale). Je suis désolé, mais je n'ai pas route
installé la commande héritée sur cette machine.
Et la sortie de ip addr
(bien sûr, eth0 et eth2 peut être ignorée - ce sont des cartes réseau qui ne sont pas utilisées actuellement):
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 1c:6f:65:2a:73:3f brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:1b:21:9d:4e:bb brd ff:ff:ff:ff:ff:ff
inet 192.168.1.73/24 brd 192.168.1.255 scope global eth1
inet6 fe80::21b:21ff:fe9d:4ebb/64 scope link
valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 00:1b:21:6a:c0:4b brd ff:ff:ff:ff:ff:ff
5: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
link/none
inet 10.32.0.50 peer 10.32.0.49/32 scope global tun0
Edit: J'ai obtenu quelque chose qui fonctionne, mais il ne transfère pas les paquets marqués vers tun0. Fondamentalement, j'ai ajouté un tableau (11) et utilisé:
ip route add table 11 via 10.32.0.49 dev tun0
ip rule add priority 10000 fwmark 11 table 11
Quand je viens sudo -u user1000 wget -qO- whatismyip.org
, j'obtiens l'adresse IP externe de mon domicile, mais si je le fais sudo -u user1002 wget -qO- whatismyip.org
, j'obtiens également l'adresse IP de mon domicile (mais je devrais obtenir l'adresse IP à l'autre extrémité du tunnel OpenVPN).
L'exécution iptables -vL
confirme que les paquets sont mis en correspondance par la règle de marquage, mais ils ne semblent pas suivre la règle de routage.
EDIT: J'ai passé beaucoup de temps là-dessus, et bien que cela ne fonctionne toujours pas, je pense que je suis un peu plus proche.
La règle iptables doit être dans la mangle
chaîne OUTPUT de la table. Je pense que j'ai également besoin d'une règle MASQUERADE dans la nat
chaîne POSTROUTING de la table, pour définir l'adresse source. Cependant, le réacheminement qui se produit après le mangle de OUTPUT ne fonctionne pas correctement.
J'ai passé 5 heures là-dessus maintenant, donc je fais une pause et j'y reviendrai probablement plus tard ce soir ou demain.