Доступ к определённым IP-адресам в обход основной таблицы маршрутизации. [РЕШЕНО]
Объясню на конкретном примере - локальная сеть на работе:
- диапазон IP-адресов машин - 172.17.x.y, где x невелико (<127)
- локальный DNS-сервер/шлюз - 172.17.0.2
Обычная настройка машины: 172.17.x.y netmask 255.255.0.0 broadcast 172.17.255.255
При таких настройках сеть работает хорошо, в сети видны все windows-машины, можно получить доступ к машинам по имени (не только адресу).
Когда захотелось настроить себе мобильный интернет, столкнулся с тем, что DNS-адреса мобильного интернет-провайдара - 172.17.128.1 и 172.17.128.2. То есть они лежат в том же диапазоне, что адреса в локальной сети. Поэтому соединение хотя и устанавливается, но естественно, внешние адреса не резолвятся, так как по сути не получается соединиться с DNS-серверами провайдера.
Частично проблема решилась переходом на следующие настройки: 172.17.x.y netmask 255.255.128.0 broadcast 172.17.255.255, так что IP DNS-серверов мобильного оператора и локальных машин лежат в разных подсетях. Но при этом не удаётся получить список машин в сети, нельзя зайти на машину по имени (только по IP).
В общем, есть ли способ оставить старые настройки для нормальной работы, но при этом любой запрос на 172.17.128.1 и 172.17.128.2 пропускать не через eth0 интерфейс, а через ppp0 (или usb0)?
- Для комментирования войдите или зарегистрируйтесь

route add -host 172.17.128.1
route add -host 172.17.128.1 dev usb0
route add -host 172.17.128.2 dev usb0
Частично сработало
Вот что имеется на данный момент. Исходное состояние - мобильный телефон не подключен.
wiselord wiselord # cat /etc/resolv.conf wiselord wiselord # cat /etc/conf.d/net config_eth0=( "172.17.4.13 netmask 255.255.0.0 broadcast 172.17.255.255" ) routes_eth0=( " default via 172.17.0.2 172.17.255.255 gw 172.17.0.2 132.147.0.0/16 gw 172.17.0.2 " ) dns_servers_eth0=( "172.17.0.2" ) config_usb0=( "dhcp" ) wiselord wiselord # route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.17.0.2 255.255.255.255 UGH 2 0 0 eth0 172.17.255.255 172.17.0.2 255.255.255.255 UGH 2 0 0 eth0 132.147.0.0 172.17.0.2 255.255.0.0 UG 2 0 0 eth0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 127.0.0.0 127.0.0.1 255.0.0.0 UG 0 0 0 lo wiselord wiselord # ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:0d:61:cc:af:7c inet addr:172.17.4.13 Bcast:172.17.255.255 Mask:255.255.0.0 inet6 addr: fe80::20d:61ff:fecc:af7c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1060510 errors:0 dropped:0 overruns:0 frame:0 TX packets:1072402 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:197417234 (188.2 MiB) TX bytes:1137957673 (1.0 GiB)Локальная сеть работает нормально, интернета пока нет. Подключаю мобильный телефон к кабелю. Телефон определяется как usb0 сетевая карта (Sony Ericsson k800i), и получает настройки согласно /etc/conf.d/net по dhcp:
wiselord wiselord # route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.17.0.2 255.255.255.255 UGH 2 0 0 eth0 172.17.255.255 172.17.0.2 255.255.255.255 UGH 2 0 0 eth0 172.20.20.80 0.0.0.0 255.255.255.240 U 3 0 0 usb0 132.147.0.0 172.17.0.2 255.255.0.0 UG 2 0 0 eth0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 127.0.0.0 127.0.0.1 255.0.0.0 UG 0 0 0 lo 0.0.0.0 172.20.20.85 0.0.0.0 UG 3 0 0 usb0 wiselord wiselord # ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:0d:61:cc:af:7c inet addr:172.17.4.13 Bcast:172.17.255.255 Mask:255.255.0.0 inet6 addr: fe80::20d:61ff:fecc:af7c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1070886 errors:0 dropped:0 overruns:0 frame:0 TX packets:1080176 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:199960251 (190.6 MiB) TX bytes:1144908362 (1.0 GiB) wiselord wiselord # ifconfig usb0 usb0 Link encap:Ethernet HWaddr 02:80:37:19:03:00 inet addr:172.20.20.87 Bcast:172.20.20.95 Mask:255.255.255.240 inet6 addr: fe80::80:37ff:fe19:300/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:9 errors:0 dropped:0 overruns:0 frame:0 TX packets:10 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1201 (1.1 KiB) TX bytes:1836 (1.7 KiB)То есть провайдер выдал IP 172.20.20.87 через шлюз 172.20.20.85. При этом DNS адреса находятся в диапазоне локальной сети, поэтому делаю согласно подсказке выше (честно говоря, я раньше думал что это будет конфликтовать с уже имеющейся настройкой
172.17.0.0 mask 255.255.0.0 dev eth0, но видимо роут на отдельный IP приоритетнее роута на подсеть, даже если этот IP входит в эту подсеть)При этом если не указывать gw, то ничего не работает (даже если не указывать в /etc/conf.d/net default для eth0).
Написал небольшой скрипт:
#/bin/bash usbroute=$(route -n | grep ^0.0.0.0 | grep usb0 | xargs | cut -d ' ' -f2) route add 172.17.128.2 gw ${usbroute} dev usb0 route add 172.17.128.2 gw ${usbroute} dev usb0Вопрос: Как добавлять эти два маршрута автоматически (пробовал routes_usb0 в /etc/make.conf, но не работает, видимо эта опция не для dhcp), при этом надо учитывать что адрес шлюза при каждом новом подключении разный?
Если это нельзя, как можно вызывать вышеупомянутый скрипт автоматически при поднятии usb0?
> пробовал routes_usb0 в
> пробовал routes_usb0 в /etc/make.conf,
так его надо пихать в файл /etc/conf.d/net.usb0 в функцию
postup()
{
usbroute=$(route -n | grep ^0.0.0.0 | grep usb0 | xargs | cut -d ' ' -f2)
route add 172.17.128.2 gw ${usbroute} dev usb0
route add 172.17.128.2 gw ${usbroute} dev usb0
}
Спасибо, всё замечательно заработало
Естественно, я имел в виду не /etc/make.conf, а /etc/conf.d/net, просто опечатался.
Всё замечательно заработало, после приведения /etc/conf.d/net к следующему виду:
config_eth0=( "172.17.4.13 netmask 255.255.0.0 broadcast 172.17.255.255" ) routes_eth0=( " default via 172.17.0.2 172.17.255.255 gw 172.17.0.2 132.147.0.0/16 gw 172.17.0.2 " ) dns_servers_eth0=( "172.17.0.2" ) config_usb0=( "dhcp" ) postup() { if [ "${IFACE}" = "usb0" ] then usbgw=$(route -n | grep ^0.0.0.0 | grep usb0 | xargs | cut -d ' ' -f2) route add 172.17.128.1 gw ${usbgw} dev usb0 route add 172.17.128.2 gw ${usbgw} dev usb0 fi }Про postup{} читал в /etc/conf.d/net.example, но подумал что это только для init-скриптов.
Всем спасибо за помощь.
>routes_usb0 в
>routes_usb0 в /etc/make.conf, но не работает
так и не должно ;)
пример /etc/conf.d/net:
routes_usb0="
112.0.0.0/8
64.63.100.0/24
1.0.0.0/8
"