Назад | Перейти на главную страницу

Правило iptables для установки IP-адреса источника в зависимости от локального идентификатора пользователя

У меня есть два пользователя, альфа (uid 500) и бета (uid 501), и два IP-адреса, назначенные как eth0 и eth0: 1. Я хотел бы, чтобы все исходящие пакеты, созданные процессами, запущенными пользователем alpha, были помечены исходным IP-адресом eth0, а все пакеты из пользовательских бета-процессов были помечены исходным IP-адресом eth0: 1.

Изучая доступные ответы на этом форуме и в других местах, я обнаружил, что должен сделать что-то вроде этого:

# mark packets with 11 or 12 depending which user they came from:
iptables -A OUTPUT -m owner --uid-owner 500 -j MARK --set-mark 11
iptables -A OUTPUT -m owner --uid-owner 501 -j MARK --set-mark 12

# now, for a packet having mark 11 (or 12), set source IP to  192.168.1.1 (or .2) 
iptables -t nat -I POSTROUTING -m connmark  --mark 11 -j SNAT --to-source 192.168.1.1
iptables -t nat -I POSTROUTING -m connmark  --mark 12 -j SNAT --to-source 192.168.1.2

Сработает ли вышеперечисленное? Есть ли более простая (одношаговая, а не двухшаговая) установка? Как я могу использовать tcpdump чтобы убедиться, что это действительно работает?

К сожалению, из-за способа netfilter работает, вы не можете выполнить "одноэтапную" настройку.

  • Владельцы пакетов могут быть обнаружены только в цепочке OUTPUT, но
  • SNAT может выполняться только в цепочке POSTROUTING

Тем не менее, вместо использования SNAT я рекомендую использовать комбинацию netfilter и iproute2, например:

Для netfilter:

iptables -A OUTPUT -m owner --uid-owner 500 -j MARK --set-mark 500
iptables -A OUTPUT -m owner --uid-owner 501 -j MARK --set-mark 501

Для iproute2:

ip rule add fwmark 500 table 500
ip rule add fwmark 501 table 501

ip route add default via $gateway dev eth0 src $ip_eth0   table 500
ip route add default via $gateway dev eth0 src $ip_eth0_1 table 501