LINUX.ORG.RU
ФорумAdmin

Advanced routing

 , , , ,


0

1

Добрый день. Помогите пожалуйста разобраться с маршрутизацией на шлюзе.

Стоит 2 сетевые карты. поднято 5 интерфейсов (далее ip выдуманые для удобства)

на eth0 поднято 4 vlan. к провайдерам через свитч.(4 access порта в провайдерские сети, 1 trunk пропускающий четыре vlanа идет к моему шлюзу).

eth2 - 192.168.0.1/24 - локальная сеть
eth0.10 - 192.168.1.2/24 - провайдер 1
eth0.20 - 192.168.2.2/24 - провайдер 2
eth0.30 - 192.168.3.2/24 - провайдер 3
eth0.40 - 192.168.4.2/24 - провайдер 4

Создал 4 таблицы маршрутизации(соответсвенно на каждого провайдера)
Таблица MAIN:

192.168.1.0/24 dev eth0.10  scope link  src 192.168.1.2 
192.168.2.0/24 dev eth0.20  scope link  src 192.168.2.2 
192.168.3.0/24 dev eth0.30  scope link  src 192.168.3.2 
192.168.4.0/24 dev eth0.40  scope link  src 192.168.4.2 
192.168.0.0/24 dev eth2  proto kernel  scope link  src 192.168.0.1 


Таблица 10:

default via 192.168.1.1 dev eth0.10 
127.0.0.0/8 dev lo  scope link 
192.168.1.0/24 dev eth0.10  proto static  scope link 
192.168.0.1 dev eth2  scope link 


Таблица 20:

default via 192.168.2.1 dev eth0.20 
127.0.0.0/8 dev lo  scope link 
192.168.2.0/24 dev eth0.20  proto static  scope link 
192.168.0.1 dev eth2  scope link 


Таблица 30:

default via 192.168.3.1 dev eth0.30 
127.0.0.0/8 dev lo  scope link 
192.168.3.0/24 dev eth0.30  proto static  scope link 
192.168.0.1 dev eth2  scope link 


Таблица 40:

default via 192.168.4.1 dev eth0.40 
127.0.0.0/8 dev lo  scope link 
192.168.4.0/24 dev eth0.40  proto static  scope link 
192.168.0.1 dev eth2  scope link 


Вывод команды «ip rule show»

0:      from all lookup local 
32763:  from 192.168.1.2 lookup PROVIDER1
32764:  from 192.168.2.2 lookup PROVIDER2
32765:  from 192.168.3.2 lookup PROVIDER3
32766:  from 192.168.4.2 lookup PROVIDER4
32767:  from all lookup main 
32768:  from all lookup default

Задача состоит в том. чтобы через все четыре линка была возможность доступа в интернет. Хочу таким образом реализовать резервирование каналов и проверку работоспособности. Тоесть добавить правило например «ip rule add from 192.168.0.0/24 table PROVIDER1» чтобы пустить весь трафик из локальной сети на первого провайдера. По крону запустить скрипт проверки всех каналов и в случае падения основного канала переключать на другого правилом «ip rule add from 192.168.0.0/24 table PROVIDER2», плюс оповещать о работоспособности каналов.

В таблице MAIN не задан маршрут по умолчанию. Но он задан в таблицах для провайдеров. В чем и заключаеться проблема. когда пингую по интерфейсу ping 8.8.8.8 -I eth0.10

PING 8.8.8.8 (8.8.8.8) from 192.168.1.2 eth0.10: 56(84) bytes of data.
From 192.168.1.2 icmp_seq=1 Destination Host Unreachable

хотя подразумеваю, что ядро должно смотреть в таблицу PROVIDER1 и вытягивать оттуда гейтвей, так как есть правило «from 192.168.1.2 lookup PROVIDER1» Добился только того что шлюз доступен из вне по всем 4 интерфейсам, и ответ уходит туда окуда пришел запрос, тоесть на свой гейтвей.

Можно добавить правило ip route add default scope global nexthop via $P1 dev $IF1 weight 1 nexthop via $P2 dev $IF2 weight 1 и т.д. тогда все каналы как раз работают, но идет балансировка. а мне нужно чтобы интерфейс смотрел в свою таблицу и оттуда брал свой шлюз. Прошу у Вас помощи разобраться.

какая-то странная схема...

ip route add default scope global nexthop via $P1 dev $IF1 weight 1 nexthop via $P2 dev $IF2 weight 1

Для резервирования скорее есть смысл использовать разные веса...

Но не в этом суть
Как ты думаешь, куда пойдёт пакет в ответ на запрос, пришедший, скажем на eth0.20 и почему?

zolden ★★★★★ ()
Ответ на: комментарий от zolden

Разные веса непойдет потому, как каналы будут использоваться, что нежелательно потому что они как раз на резерв. и качество связи у них не ахти.(спутник, adsl) С правилом «ip rule add from 192.168.0.0/24 table PROVIDER1» поспешил. думаю лучше ставить дефолтный маршрут в таблицу MAIN. потому что на сервак из сети попасть нельзя. трафик транзитом проходит.

Ответы на запросы уходят нормально. Создаю коннект из вне по провадеру2 пусть src 192.168.2.1 dst 192.168.2.2 Дефолтный маршрут в MAIN стоит шлюз PROVIDER 1 (192.168.1.1). Необходимо теперь ответить ip 192.168.2.1. Формируеться ответный пакет, ядро смотрит что src 192.168.2.2 и определяет что нужно смотреть в таблицу маршрутизации PROVIDER2. и отправляет пакет шлюзу PROVIDER2 from 192.168.2.2 lookup PROVIDER2

iceangel ()
Ответ на: комментарий от iceangel

iptables - маркирируй новые соединения которые пролитают с интерфейсов провайдеров и раскидуй потом уже по таблицам для корректного ответа

Tok ★★ ()
Ответ на: комментарий от iceangel

Полагаю, потому что на момент применения ip rule при ping 8.8.8.8 -I eth0.10 никакого source IP у исходящего пакета еще нет. А вот если указать его явно, то есть.

Задача маршрутизации - определить выходной интерфейс. Сопутствующая задача - определить source IP, если локальный процесс не задал его явно. Судя по всему, последнее происходит уже после применения ip rule.

rubic ()
Ответ на: комментарий от rubic

Спасибо за подсказку. Работает так, пусть работает, раз другого решения нет. Вот бы еще одну вещь подсказали. Дело в том что, 2 провайдера отдают настройки сети по dhcp и один для подключения использует pppoe. Чтобы все это дело автоматизировать хочу написать скрипт, но незнаю как вытняуть настройки dhcp. нехотелось бы парсить dhclient.leasess. Может можно как то dhclint-ом вытянуть их и в переменные засунуть?

iceangel ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.