1 комп, 2 cоединения с инетом
Здравствуйте.
У меня на одном компе работает много пользователей. На этом компе
есть два сетевых интерфейса с интернетом eth0 (192.168.7.7/24 gw 192.168.7.1)
и tap0 (10.1.0.2/24 gw 10.1.0.1). Интернет от разных провайдеров.
Если ставить поочередно default route через 192.168.7.1 и 10.1.0.1 - интернет работает, канал меняется.
Но задача такая: нужно чтобы некоторые пользователи ходили через eth0,
а некоторые через tap0. Я расскажу что я сделал для достижения своей цели. Во первых для начала я решил
пустить пользователя user через tap0, а всез остальных через eth0. Тут то и начались проблемы.
1. Пометил все пакеты от пользователя user в iptables:
iptables -t mangle -A OUTPUT -m owner --uid-owner user -j MARK --set-mark 0x1
2. Добавил в табличку маршрутизации 'adsl' default route через одного
провайдера:
ip ro add default via 10.1.0.1 ta adsl
3. Добавил в табличку маршрутизации 'knet' default route через другого
провайдера:
ip ro add default via 192.168.7.1 ta knet
4. Удалил из таблички 'main' default route:
ip ro del default ta main
5. Привел ip ru sh к такому виду:
0: from all lookup local
10: from all lookup main
32764: from all fwmark 0x1 lookup adsl
32765: from all lookup knet
32766: from all lookup main
32767: from all lookup default
Сейчас у всех кроме пользователя user есть интернет.
А я хочу чтобы у всех был интернет через 192.168.7.1, а у user через 10.1.0.1.
Вот что есть в табличках main, adsl и knet:
cafe ~ # ip ro sh ta main
192.168.7.0/24 dev eth0 proto kernel scope link src 192.168.7.7
192.168.50.0/24 dev eth1 proto kernel scope link src 192.168.50.1
10.1.0.0/24 dev tap0 proto kernel scope link src 10.1.0.2
127.0.0.0/8 dev lo scope link
cafe ~ # ip ro sh ta adsl
default via 10.1.0.1 dev tap0
cafe ~ # ip ro sh ta knet
default via 192.168.7.1 dev eth0
Вот что показывает сниффер на tap0, когда я от имени user выполняю
соединение с каким-нибудь компом из инета
(я делаю user@cafe ~ $ telnet 94.100.176.20 25):
Это когда в arp нет информации о 10.1.0.1
----------------------------------------------------------------
cafe ~ # tshark -i tap0
Running as user "root" and group "root". This could be dangerous.
Capturing on tap0
0.000000 00:ff:28:82:a1:ac -> Broadcast ARP Who has 10.1.0.1? Tell 192.168.7.7
0.999483 00:ff:28:82:a1:ac -> Broadcast ARP Who has 10.1.0.1? Tell 192.168.7.7
1.999155 00:ff:28:82:a1:ac -> Broadcast ARP Who has 10.1.0.1? Tell 192.168.7.7
----------------------------------------------------------------
А это когда есть:
----------------------------------------------------------------
cafe ~ # tshark -i tap0
Running as user "root" and group "root". This could be dangerous.
Capturing on tap0
0.000000 192.168.7.7 -> 94.100.176.20 TCP 51318 > smtp [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=57466008 TSER=0 WS=7
3.000071 192.168.7.7 -> 94.100.176.20 TCP 51318 > smtp [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=57466909 TSER=0 WS=7
4.996708 00:ff:28:82:a1:ac -> 00:ff:79:83:6b:e4 ARP Who has 10.1.0.1? Tell 10.1.0.2
4.997122 00:ff:79:83:6b:e4 -> 00:ff:28:82:a1:ac ARP 10.1.0.1 is at 00:ff:79:83:6b:e4
9.003380 192.168.7.7 -> 94.100.176.20 TCP 51318 > smtp [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=57468709 TSER=0 WS=7
21.000047 192.168.7.7 -> 94.100.176.20 TCP 51318 > smtp [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=57472309 TSER=0 WS=7
----------------------------------------------------------------
Как видно, пакеты посланные user'ом попадают в tap0, но адрес источника
почемуто стоит 192.168.7.7. При этом сниффер запущенный на eth0 вот так:
tshark -i eth0 host 94.100.176.20 вообще молчит.
Если из таблички knet удалить default route, то интернет пропадает у
всех, включая user'а.
Что я делаю не так?
Спасибо. Пожалуйста. Ок.