11:28

[ok]

Подскажите, кто настраивал маршрутизацию под линуксом.

Есть сервер (почтовик и шлюз в интернет) на asplinux (дистр выбирал не я). К нему подключили второй канал. Задача - пустить NAT из локалки через этот второй канал, а соединение самого сервера (почтовика) с интернетом оставить на прежнем канале.

Получается, нужно сделать маршрутизацию через разные каналы в зависимости от источника.

В разных howto под ядром 2.4 это решается просто - ip rule add from xxx.xxx.xxx.xxxx nat yyy.yyy.yyy.yyy
Но с ядром 2.6 теперь он пишет "route NAT is deprecated".

Просто с помощью route нельзя сделать зависимость от источника.

На форумах советуют не париться и использовать для настройки iptables, но у меня не работает действие -j ROUTE
возвращает ошибку iptables v1.3.5: Couldn't load target `ROUTE':/lib/iptables/libipt_ROUTE.so
(этого файла там действительно нет)

Исходников ядра (и текущего конфига) в этой сборке нет. Качать исходники, писать конфиг и пересобирать пока опасаюсь. Есть ли способ настроить такую маршрутизацию с помощью iproute2, или тут без пересборки ядра не обойтись?

@темы: Сети и серверы

Комментарии
10.12.2008 в 13:04

именно айпирутом это и делается. такие вещи называются policy-based routing, гугл мгновенно находит приличный хауту.
10.12.2008 в 13:05

я в гугле нашёл как раз про ip route add... nat..., но поискав чуть больше узнал что в 2.6 убрали поддержку оного route nat
10.12.2008 в 13:10

не понял зачем тебе этот самый nat. с точки зрения роутинга никакого ната вообще не существует.
10.12.2008 в 13:12

Как это "зачем nat"? В пакетах из локалки адрес отправителя стоит 192.168..., и отправляясь в интернет он должен заменяться на внешний адрес шлюза. Что-то я не понял вопроса.
10.12.2008 в 13:15

чувак, чувак! быстро, решительно выпей кофе!

адрес переписывает таргет айпитейблс (SNAT или MASQUERADE), его никуда никто не убирал и не уберёт. дальше пакет с переписанным адресом должен уйти на шлюз.

блин. вообще ничего не нужно же. просто переписывай адреса на тот интерфейс, который смотрит в новый канал и всё.

пример показать, или понял?
10.12.2008 в 13:21

Лучше конечно с примером, ибо я так и пробовал настроить, но интернет не заработал.

в айпитейблс там есть правило:
iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o eth0 -j SNAT --to-source xxx.xxx.(тут айпишник шлюза)
eth0 - соотв. интерфейс в инет. eth1 - в локалку. eth2 - к новому прову

я добавил правило
iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o eth2 -j SNAT --to-source yyy.yyy.(тут второй айпишник шлюза)

и включил
ip rule add from 192.168.0.0/24 table MGTS

при этом в таблице MGTS (второй пров) записано -
ip route add default via zzz.zzz(тут шлюз от второго айпишника) dev eth2 table MGTS


Не работает :nope: Пойду за кофе.
10.12.2008 в 13:33

слишком сложно для твоей задачи (пустить NAT из локалки через этот второй канал).

короче, сносишь все таблицы роутинга, вообще не трогаешь айпирут, ставишь шлюзом по умолчанию адрес гв старого канала. далее #iptables -t nat -A POSTROUTING -j SNAT --to-source

если я ничего не путаю, это всё что тебе нужно, потому что в цепочку POSTROUTING не попадают пакеты от самого хоста, только идущие транзитом. соответственно, их адрес будет переписан на адрес в новой сети и они уйдут на...

а, чёрт, нет, теперь нужно сказать куда их посылать.

ну короче, дальше с помощью айпирута делаешь правило типа "все пакеты с адреса такого-то роутить на такой-то шлюз".

должно работать.

попробую сделать так сам вечером есичо.
10.12.2008 в 14:28

Ну тогда и с моими правилами должно было заработать... Хм. Попробую тогда в следующий раз там глянуть tcpdump'ом, что за пакеты уходят и куда.
10.12.2008 в 15:56

тут нужно узнать что происходит в каком порядке. если адреса переписываются до роутинга, то:

1.
iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o eth0 -j SNAT --to-source xxx.xxx
iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o eth2 -j SNAT --to-source yyy.yyy

второе правило не поймает ни одного пакета, потому что сфигали -o eth2? у тебя дефолтный шлюз на eth0, туда пакеты и заворачиваются.

2.
ip rule add from 192.168.0.0/24 table MGTS

есть мнение, что это правило также работать не будет, потому что к этому времени в пакетах адрес отправителя уже переписан.


Если же наоборот, то действительно непонятно почему не работает. таблицу FILTER покажи чтоли.
10.12.2008 в 16:12

ах йопт, я тупло! завтра буду исправлять

а фильтр там большой, да и не в нём дело, судя по всему
10.12.2008 в 16:28

сфигали -o eth2? у тебя дефолтный шлюз на eth0, туда пакеты и заворачиваются.

ну так потом же было добавлено:
ip route add default via zzz.zzz(тут шлюз от второго айпишника) dev eth2 table MGTS



что происходит в каком порядке

так вот ведь - iptables-tutorial.frozentux.net/chunkyhtml/imag...
10.12.2008 в 16:48

мне было лень искать, а запомнить я это ни в жизнь не смогу. =) хотя внезапно стало понятно почему PREROUTING и POSTROUTING называются именно так. =)

ну значит что у нас получается.

1. прежде всего необходимо убедиться что в фильтре нет правил, дропающих нужный трафик. (например вида !eth0).
2. очевидно нас интересует нижный routing decision -- собственно само решение должно приниматься на основе правил айпирута.
3. после этого в таблице нат мы переписываем адреса только тех пакетов, которые пришли из локалки.

в принципе это у тебя и было. должно работать, отлаживай. убей всё лишнее для начала, типа первого правила SNAT (влиять оно ни на что не должно, но создаёт информационный мусор).
10.12.2008 в 17:06

Угу, завтра так и попробую.
11.12.2008 в 21:34

хренотень какая-то...

после выполнения команды
ip route add default via 62..(тут адрес второго шлюза) dev eth2 table MGTS

пропадает как интернет так и связь с сервером через SSH. Почему??? ведь я из внутренней сети к sshd подключаюсь, т.е. ничего рутить он не должен. даже если правило написано неверно, на связь с сервером из локалки это влиять не должно
11.12.2008 в 21:54

пропадает как интернет так и связь с сервером через SSH

tcpdump -i eth2 показал, что в этом случае сервер пытается слать ответные пакеты клиентам в локалке именно через eth2

не понимаю, почему. он же должен их не маршрутизировать, а слать напрямую с интерфейса eth1 (который смотрит в 192.168.0.0)
11.12.2008 в 23:57

сраная диарея схавала камент блджад

короче, покажи вывод ip route show table MGTS
12.12.2008 в 12:26

там только одна строчка:
default via 62...(ип шлюза) dev eth2

по ходу кроме default туда надо ещё и маршрут в 192.168.0.0/24 добавить

я чё-та думал что он из таблицы main возьмётся
12.12.2008 в 12:28

вот-вот. локальный трафик шлётся напрямую не потому что стек об этом заранее знает, а потому что в таблице маршрутизации есть соответствующая запись. то есть должна быть, а её нет. =)
12.12.2008 в 13:12

не потому что стек об этом заранее знает, а потому что в таблице маршрутизации есть соответствующая запись

Это я понимаю. Говорю же - ступил и подумал, что возьмётся запись из таблицы main, а оказалось он её скипит.
12.12.2008 в 13:17

ну так что, заработало в результате?
12.12.2008 в 13:22

Сегодня попробую. Сейчас через сервер работают, не хотелось бы мешать если что-то окажется не так.
12.12.2008 в 13:24

ваще в качестве роутера я дичайше котирую бздю например. особенно опёнка.
12.12.2008 в 17:34

Что-то я себя совсем тупым почувствовал. Сейчас попробовал с двумя маршрутами в MGTS... Теперь связь с сервером не пропадает, пропадает только интернет. Может, я ещё чего забыл? :upset:
12.12.2008 в 17:46

добавь третью запись, с внешней сетью =)
12.12.2008 в 18:19

эээ... :upset: в смысле? роутинг вовне? это ж default и есть. Или куда?
12.12.2008 в 18:43

чтобы выслать пакет шлюзу, до него должен существовать маршрут. сетевухи у тебя две? почему тогда локальная запись одна? =)
12.12.2008 в 18:56

бля! :weep2: :wdpkr:
12.12.2008 в 19:38

Вот теперь всё получилось. В таблице filter ещё надо было разрешить форвард.
12.12.2008 в 19:44

в FORWARD не имеет особого смысла ставить policy DROP

ну то есть можно, но тогда надо про это помнить
12.12.2008 в 20:04

Логично. Но это от предыдущего админа остался дроп по дефолту в FORWARD.