Godless
@Godless

Сложная маршрутизация на linux роутере. Как правильно готовить policy based routing?

Пипл, нужна помощь с policy based routing или подсказать, что он не нужен.

Ситуация. Роутер Linux Debian 12. несколько сервисов на нем не тяжелых + NAT на другой серв разных служб.
Около 10 локальных подсетей (виланы на 1 проводе, если важно). Фаервол iptables, список правил не маленький...
1 WAN pppoe. пусть ppp0 со статикой, отдельный провод

Все себе жило было прекрасно, пока не появился еще один WAN в виде tun0.
К нему добавилась пара служб, и, что важно, bird с пачкой маршрутов в этот tun0.
В tun0 стала уходить часть исх пакетов. И все вроде гуд, пока я не заметил, что ко мне от одного из почтовиков не приходят письма на мой. А сам ящик завален сначала delayed, потом failed.

Видимо виной всему, то, что входящий пакет на 25й порт в ppp0 натится на другой серв, а потом по возвращению проходит через пачку маршрутов, находит там подсеть и уходит в tun0.

Я вроде понимаю что нужно поглубже в policy based routing, что-то маркернуть в iptables и пульнуть в отдельную таблицу, чтобы оно вернулось через ppp0. Но вообще не понимаю что именно. не весь же трафик... Прочитал статей 10, но там все как-то не то... Почти везде разруливают исходящий трафик.

В общем вопрос, как это правильно делать?
Я намеренно пока не публикую скрипты/конфиги, хочется самому допереть, поэтому если не трудно на примерах или словами. Ежели будет туго, опубликую что сам написал (не сработало, маркирнул в iptables через connmark, output не забыл, и отправил ip rule в таблицу, в которой только default dev ppp0).
  • Вопрос задан
  • 359 просмотров
Решения вопроса 1
shurshur
@shurshur
Сисадмин, просто сисадмин...
По поводу этого лучше всего начать с LARTC HOWTO.

Если кратко, маршрутищация в iproute2 устроена так. Есть несколько таблиц маршрутизации, из которых 3 есть всегда (local, main, default), но можно создать ещё. По правилам (команда ip rule) перебираются таблицы, подходящие под условия, в соответствии с приоритетами (preference, первое число в выводе команды). И в каждой таблице есть свои маршруты. Таблицу local изменять нельзя и перед ней ничего маршрутизировать нельзя (это можно обойти через nat в PREROUTING, но это уже другой вопрос).

Самый простой вариант - это source routing. Впервые мне это понадобилось, когда я подключил дома второго провайдера с внешним IP, и мне потребовалось отвечать с обоих внешних адресов со всего интернета. Делается так:

1. В /etc/iproute/rt_tables описываем псевдонимы для новых таблиц (необязательно - можно использовать числовые идентификаторы - но так удобнее). Например, 10 - isp1, 20 - isp2.

2. Задаём правила, которые приведут к выбору таблицы в зависимости от source address:

ip rule add pref 10 from IP1 lookup isp1
ip rule add pref 20 from IP2 lookup isp2

3. В каждую таблицу добавим маршрут default через нужного оператора:

ip route add default via GATEWAY1 table isp1
ip route add default via GATEWAY2 table isp2

4. В таблице main (которая используется по умолчанию, если не указать таблицу в команде явно) описываем маршрут "по умолчанию" - через того оператора, через которого будет идти исходящий трафик (не ответный на входящий), в данном случае пусть будет isp1:

ip route add default via GATEWAY1

Всё это иногда можно в той или иной степени засунуть в конфиги сети (зависит от дистрибутива Linux весьма существенно), а иногда приходится делать скриптами, в том числе, возможно, вызываемыми через hook системы инициализации сети (я, например, обновлял маршрутизацию через postup-хук dhcp-клиента и из скрипта, который поднимал pptp-vpn).

В дальнейшем всё это обросло кучей других особенностей, например, ip rule fwmark по меткам, которые ставилилсиь в iptables по connmark и иногда другим условиям, но это уже следующий уровень сложности и более специфичне задачи. И LARTC HOWTO почитать всё равно рекомендую, ибо там основа основ и все гуру по нему учились.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы