Доступ к определённым 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 входит в эту подсеть)

route add 172.17.128.1 gw 172.20.20.85 dev usb0
route add 172.17.128.2 gw 172.20.20.85 dev usb0

При этом если не указывать 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
}

Спасибо, всё замечательно заработало

Цитата:
пробовал routes_usb0 в /etc/make.conf

Естественно, я имел в виду не /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
"

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".