Мой домашний сервер имеет два основных интерфейса eth1
(стандартное подключение к Интернету) и tun0
(туннель OpenVPN). Я хотел бы использовать iptables
для принудительного завершения всех пакетов, сгенерированных локальным процессом, принадлежащим UID 1002tun0
, и всех других пакетов для выхода 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 можно игнорировать - это сетевые адаптеры, которые в настоящее время не используются):
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
подтверждает, что пакеты соответствуют правилу маркировки, но они не соответствуют правилу маршрутизации.
РЕДАКТИРОВАТЬ: я провел много времени на это, и хотя это все еще не работает, я думаю, что я немного ближе.
Правило iptables должно быть в mangle
цепочке OUTPUT таблицы. Я думаю, что мне также нужно правило nat
MASQUERADE в цепочке POSTROUTING таблицы, чтобы установить адрес источника. Однако повторная маршрутизация, которая происходит после искажения OUTPUT, работает неправильно.
Я потратил 5 часов на это сейчас, поэтому я делаю перерыв и, возможно, вернусь к нему сегодня вечером или завтра.
man iptables
: он должен использоваться только с динамически назначаемыми IP-соединениями (dialup): если у вас статический IP-адрес, вы должны использовать цель SNAT. Маскарадинг эквивалентен указанию сопоставления с IP-адресом интерфейса, из которого выходит пакет, но также имеет эффект того, что соединения теряются при отключении интерфейса. Вы правы, но, поскольку мой IP-адрес никогда не изменится, я решил использовать SNAT в соответствии с рекомендациями на странице руководства.PREROUTING
цепочку кDNAT
правильному адресу источника (в соответствии с вашим шлюзом по умолчанию).Я решил это. Проблема заключалась в правилах маршрутизации, приведенных в таблице 11. Таблица 11 была повреждена, но правила маршрутизации делают ее неработоспособной. Этот скрипт - то, что я сейчас использую, и он, кажется, работает хорошо (хотя он, очевидно, специфичен для моей установки). Также я создал новую таблицу 21, посвященную основному каналу связи (eth1).
источник
Я думаю, что вы хотите:
http://lartc.org/howto/lartc.netfilter.html
Но я не проверял выше.
источник
default
ключевого слова.Это можно сделать без команды iptables. Выполнить простую команду ip.
Для UID 1002:
Добавьте маршрут по умолчанию для таблицы 502 через интерфейс, который вы хотите сказать
источник
Error: argument "uidrange" is wrong: Failed to parse rule type