Тема: маршрутизация на двух провайдеров

Добрый день, коллеги.

Задумался по поводу поведения системы Freebsd 10.3R в такой ситуации:
Есть будущий роутер. Интерфейс в локалку, два интерфейса на двух провайдеров.
Тестирую. Правила ipfw сброшены - ipfw flush, дефолтный маршрут смотрит на провайдера isp01.
Когда я запускаю команду ping -S isp02_ip 8.8.8.8, например,  где isp02_ip это ip-адрес второго интерфейса, echo-request идут через дефолтный интерфейс, но с адресом второго интерфейса, в то время как echo-reply возвращаются на правильный интерфейс, второго провайдера.
Разумеется, при построенных правилах файрволла, с ipfw fwd и натом, всё работает правильно, но то, что до ipfw система сама выбирает маршрут для OUT - для меня кажется неправильным и не очевидным.
При этом вылазит вторая проблема - на полностью настроенной системе, с правилами ipfw fwd и так далее, оба интерфейса доступны извне - например, по ssh или для gre over ipsec туннелей, но ровно до того момента как падает дефолтный интерфейс - в тот же момент становится недоступным и второй. Очевидно, у меня проблема в настройках, но где?
Куда бежать, что делать?

2

Re: маршрутизация на двух провайдеров

Все правильно, у вас часть пакетов идет из одного интерфейса часть из другого. Я не делал никогда этого на FreeBSD, но приведу пример как это реализовано в AWS на Centos7

Описываем таблицу

# cat /etc/iproute2/rt_tables 
...
200     net_eth0
201     net_eth1

Оба интерфейса получаем по DHCP, тут не принципиально, главное что роутер по умолчанию только один, по другому никак нельзя.

# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE="eth0"
BOOTPROTO="dhcp"
ONBOOT="yes"
DEFROUTE="yes"

# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE="eth1"
BOOTPROTO="dhcp"
ONBOOT="yes"
DEFROUTE="no"

Описываем какой IP какому ID соответствует в таблице. Это и есть те IP которые мы получаем по DHCP

# cat /etc/sysconfig/network-scripts/rule-eth0
from  172.31.35.133 table 200

# cat /etc/sysconfig/network-scripts/rule-eth1
from  172.31.45.62 table 201

Описываем на какие роутеры отправлять запрос, тут они уже могут быть разные.

# cat /etc/sysconfig/network-scripts/route-eth0
default table 200 via 172.31.32.1 dev eth0

# cat /etc/sysconfig/network-scripts/route-eth1
default table 201 via 172.31.32.1 dev eth1

Что происходит, пакет приходя из вне, приходит от правильного роутера и на правильные интерфейс, это задача роутера. Система по стандарту формирует ответ от имени правильного IP, и благодаря таблице шлет его на правильные роутер через правильные интерфейс. Точно так же и со всем исходящим, при условии что вы указываете от какова IP слать запрос, все отправится как надо, в противном случае через роутер по умолчанию.

3

Re: маршрутизация на двух провайдеров

Линукс, к сожалению, отличается от freebsd в этом смысле. Например, метрик маршрута во freebsd нет, мультитаблицы маршрутизации решаются через fib. Это, может, и правильно, но неудобно.

4

Re: маршрутизация на двух провайдеров

а что в итоге хочется? Балансировка или просто резерв провайдера?

5 (22-02-2017 11:45:08 отредактировано Кручу-Верчу)

Re: маршрутизация на двух провайдеров

маршрутизация на двух провайдеров

на FreeBSD работает и поднималась через NAT, + IPFW + настройка маршрутов. Детали не знаю. Попробуйте найти на форуме подобные темы. Они есть. Делали при мне.
Доп. ссылка по маршрутизации