Мій домашній сервер має два основних інтерфейси eth1
(стандартне підключення до Інтернету) та tun0
(тунель OpenVPN). Я б хотів використати, iptables
щоб змусити всі пакети, згенеровані локальним процесом, що належить UID 1002, вийти через tun0
, а всі інші пакети - вийти через eth1
.
Я можу легко позначити збігаються пакети:
iptables -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 11
Тепер я хотів би встановити якесь правило у ланцюжку POSTROUTING (ймовірно, таблиці mangle), щоб відповідати пакетам, позначеним 11, і відправити їх tun0
, а потім правилом, яке відповідає всім пакетам та надсилати їх eth1
.
Я знайшов ціль ROUTE, але це, здається, лише переписало джерело інтерфейсу (якщо я не читаю його неправильно).
Чи здатні на це iptables? Чи потрібно замість цього возитися із таблицею маршрутизації (через ip route
або лише застарілі route
команди)?
Редагувати: Я думав, що, можливо, я повинен надати більше інформації. Інших правил iptables в даний час у мене немає (хоча я можу створити деякі правила для виконання незв'язаних завдань у майбутньому). Також вихід ip route
:
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
Я не торкнувся таблиці маршрутизації - саме так вона є в даний час (хоча це виглядає досить брудно). Вибачте, але у мене не встановлена застаріла route
команда на цій машині.
І вихід ip addr
(звичайно, eth0 та eth2 можна ігнорувати - це NIC, які зараз не використовуються):
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
Редагувати: я щось почав працювати, але відмічені пакети не пересилають до tun0. В основному я додав таблицю (11) і використав:
ip route add table 11 via 10.32.0.49 dev tun0
ip rule add priority 10000 fwmark 11 table 11
Коли я просто sudo -u user1000 wget -qO- whatismyip.org
отримую зовнішню IP-адресу свого будинку, але якщо це зробити sudo -u user1002 wget -qO- whatismyip.org
, я також отримую IP-адресу свого будинку (але я повинен отримувати IP на іншому кінці тунелю OpenVPN).
Запуск iptables -vL
підтверджує, що пакети узгоджуються з правилом маркування, але, здається, вони не відповідають правилу маршрутизації.
EDIT: Я давно витрачав на це питання, і хоча це все ще не працює, я думаю, що я трохи ближче.
Правило iptables повинно знаходитись у mangle
ланцюзі вихідних даних таблиці. Я думаю, що мені також потрібне правило MASQUERADE у nat
ланцюжку розсилки таблиці, щоб встановити адресу джерела. Однак перенаправлення, що виникає після виходу з ладу OUTPUT, працює неправильно.
Я витратив на це зараз 5 годин, тож я роблю перерву і, ймовірно, повернусь до неї пізніше сьогодні ввечері або десь завтра.