Выберите шлюз на основе UID (Linux)

У меня есть два сетевых адаптера и два IP-адреса. Как настроить маршрутизацию таким образом, чтобы все отправлялось через первый IP, кроме трафика данного (локального) пользователя, чей трафик отправляется через второй IP?

Я знаю, что есть несколько HOWTO, но за последние 3 дня я не смог их использовать.

Мне больше всего понравилась эта http://www.debian-administration.org/article/379/Policy_routing статья, единственное отличие в моей ситуации в том, что я не имею дело с соединениями PPP, у меня есть два интерфейса Ethernet.

После настройки всего (?) Трафик веб-браузера данного локального пользователя можно увидеть в wireshark, SYN ACK возвращается к нужному IP-адресу и интерфейсу, но браузер не отвечает.

Пожалуйста помоги.

---ВСЯ ИСТОРИЯ---

Используя свежую установку Ubuntu 10.10 для тестирования, два подключения:

eth0: ip=192.168.168.236 gw=192.168.168.1
wlan0: ip=192.168.2.12 gw=192.168.2.1
nameserver is 192.168.168.1

Брандмауэр пуст при запуске (то есть без правил), все политики ПРИНЯТЫ.

root@kipkopp:~# ip rule list
0:  from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 
root@kipkopp:~# ip route show
192.168.2.0/24 dev wlan0  proto kernel  scope link  src 192.168.2.12  metric 2 
192.168.168.0/24 dev eth0  proto kernel  scope link  src 192.168.168.236  metric 1 
169.254.0.0/16 dev eth0  scope link  metric 1000 
default via 192.168.168.1 dev eth0  proto static 

root@kipkopp:~# cat /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0   unspec
#
# local
#
#1  inr.ruhep
100 copyofmain
101 new

(Построение таблицы copyofmain, таблица new пуста)

root@kipkopp:~# ip route show table copyofmain
192.168.2.0/24 dev wlan0  proto kernel  scope link  src 192.168.2.12  metric 2 
192.168.168.0/24 dev eth0  proto kernel  scope link  src 192.168.168.236  metric 1 
169.254.0.0/16 dev eth0  scope link  metric 1000 
default via 192.168.168.1 dev eth0  proto static 

root@kipkopp:~# iptables -t mangle -A OUTPUT -m owner --uid-owner 1001 -j MARK --set-mark 1
root@kipkopp:~# ip rule add fwmark 1 pri 100 table copyofmain
root@kipkopp:~# ip rule add from 192.168.168.236 pri 200 table copyofmain
root@kipkopp:~# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source=192.168.168.236

Пытаясь просматривать сайты как uid=1001, все в порядке.

(Buidling "новый" стол)

root@kipkopp:~# ip route show table new
192.168.2.0/24 dev wlan0  proto kernel  scope link  src 192.168.2.12  metric 1 
192.168.168.0/24 dev eth0  proto kernel  scope link  src 192.168.168.236  metric 2 
169.254.0.0/16 dev wlan0  scope link  metric 1000 
default via 192.168.2.1 dev wlan0  proto static 

root@kipkopp:~# ip rule add from 192.168.2.1 pri 200 table new
root@kipkopp:~# iptables -t nat -A POSTROUTING -o wlan0 -j SNAT --to-source=192.168.2.12

root@kipkopp:~# ip rule show
0:  from all lookup local 
100:    from all fwmark 0x1 lookup copyofmain 
200:    from 192.168.168.236 lookup copyofmain 
200:    from 192.168.2.12 lookup new 
32766:  from all lookup main 
32767:  from all lookup default 

Uid 1001 по-прежнему использует таблицу copyofmain и может выходить в сеть.

root@kipkopp:~# ip rule delete from all fwmark 0x1 lookup copyofmain
root@kipkopp:~# ip rule add fwmark 1 pri 100 table new

root@kipkopp:~# ip rule list
0:  from all lookup local 
100:    from all fwmark 0x1 lookup new 
200:    from 192.168.168.236 lookup copyofmain 
200:    from 192.168.2.12 lookup new 
32766:  from all lookup main 
32767:  from all lookup default 

Uid 1001 больше не может просматривать.

root@kipkopp:~# echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter 
root@kipkopp:~# echo 0 > /proc/sys/net/ipv4/conf/wlan0/rp_filter 

root@kipkopp:~# ip route flush cache

Без улучшения.

Я изменяю маршрут по умолчанию в основной (!) Таблице:

root@kipkopp:~# ip route delete default via 192.168.168.1 dev eth0  proto static
root@kipkopp:~# ip route add default via 192.168.2.1 dev wlan0  proto static

Uid 1001 счастлив, как и другие пользователи.

1 ответ

кажется, что использованиеip ruleпроще и работает нормально

первый

у вас есть шлюз, конечно

второй

создать пользовательскую таблицу

      echo '1000 mytable' >> /etc/iproute2/rt_tables

или используяvimбезопаснее

третий

      sudo ip rule add uidrange 1000-1000 lookup mytable
  • мы можем проверить UID, запустивidкоманда
  • число-номер — это формат, который может быть одинаковым для одного пользователя.

наконец

установить маршрут по умолчанию для этой пользовательской таблицы «mytable»

      sudo ip route add default via <gateway> dev <interface-of-gateway> proto static
Другие вопросы по тегам