Назад | Перейти на главную страницу

Как выполнить маршрутизацию с сервера Ubuntu с двумя подключениями к интернет-провайдеру?

В офисе у нас есть сервер с одним $SERVER_IF имея локальный IP-адрес $SERVER_IP_MAIN=192.168.1.12/24 за маршрутизатором ADSL $ROUTER_MAIN со статическим внешним IP-адресом от $ISP_MAIN. Все работает нормально, входящие и исходящие соединения проходят без проблем.

Теперь у нас есть еще одна связь с другим $ISP_BACKUP для резервных целей, используя $ROUTER_BACKUP. Мне не нужна балансировка нагрузки; все исходящие соединения должны по-прежнему проходить $ISP_MAIN, Я просто хочу убедиться, что все входящие соединения через $ISP_BACKUP проходят через $ROUTER_BACKUP.

Я пытался следовать некоторым общим советам, используя ip route и ip rule, но я, должно быть, делаю что-то не так. (Мой основной источник: http://lartc.org/howto/lartc.rpdb.multiple-links.html )

Текущая настройка выглядит следующим образом:

server has:
    $SERVER_IF=eth0 with address $SERVER_IP_MAIN=192.168.1.12/24
    $SERVER_IF:0=eth0:0 with address $SERVER_IP_BACKUP=192.168.252.12/24 # pseudo interface

$ROUTER_MAIN has:
    $ROUTER_MAIN_IP=192.168.1.254/24

$ROUTER_BACKUP has:
    $ROUTER_BACKUP_IP=192.168.252.1/24

С помощью tcpdump на сервере я подтвердил, что $ROUTER_BACKUP настроен правильно, так как пакеты проходят $ISP_BACKUP доставляются в $SERVER_IP_BACKUP, но я предполагаю, что ответы проходят через $ISP_MAIN потому что я не могу установить соединение с внешним сервером:

12:54:06.950853 IP 178.128.57.39.dsl.dyn.forthnet.gr.57987 > 192.168.252.12.5631: Flags [S], seq 2240370501, win 5840, options [mss 1452,sackOK,TS val 471912856 ecr 0,nop,wscale 4], length 0
12:54:06.950903 IP 192.168.252.12.5631 > 178.128.57.39.dsl.dyn.forthnet.gr.57987: Flags [S.], seq 2209117020, ack 2240370502, win 14480, options [mss 1460,sackOK,TS val 215023497 ecr 471912556,nop,wscale 4], length 0

Обратите внимание, что $ROUTER_BACKUP не выполняет SNAT, поскольку сервер получает пакеты с исходным IP-адресом источника внешнего мира.

Как я могу реализовать то, что нужно? (т.е. соединения через $ISP_BACKUP быть направленным через $ROUTER_BACKUP)

Что ж, учитывая настройку, все, что нужно было, это:

  • добавить таблицу с именем backup в /etc/iproute2/rt_tables
  • ip route add 192.168.252.0/24 dev eth0:0 src 192.168.252.12 table backup (локальная сеть для резервных целей)
  • ip route add default via 192.168.252.1 table backup (его маршрут по умолчанию)
  • ip rule add from 192.168.252.12 lookup backup (используйте его при ответе от $SERVER_IP_BACKUP)

Должно быть, я как-то испортил последнюю строчку раньше.

После всего вышеперечисленного:

  • ip route flush table cache