У меня есть два пользователя, альфа (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
работает, вы не можете выполнить "одноэтапную" настройку.
Тем не менее, вместо использования 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