LINUX.ORG.RU
ФорумAdmin

Маршрутизация, 2 прова.


1

0

Здравствуйте, уважаемые. Внизу представлен на Ваше внимание скрипт запуска маршрутизации через 2х провайдеров. Не получается настроить ответ по тому же каналу, откуда приходит пакет. Пакет всегда попадает в таблицу main и отправляется по default. Исходящие пакеты из локал сетей идут правильно, их маркировка работает. А вот пакеты приходящие на сам роутер, транзитные идут неправильно. Где у меня может быть ошибка? Особенно хотелось бы разобраться в последовательности применения и правильности команд для CONNMARK как для входящих на роутер, так и проходящих сквозь него пакетов ( Как я понимаю суть команд помечено в комментариях скрипта). Поправьте, где я ошибаюсь. СПАСИБО.

P.S. eth0 - 1 пров, eth1 - 2 пров. Маркировка 10 для 1 прова, 20 для 2-го.

#!/bin/bash
echo "1">/proc/sys/net/ipv4/ip_forward
echo "0">/proc/sys/net/ipv4/conf/all/rp_filter
iptables -t mangle -F
iptables -t nat -F
iptables -t filter -F
###---PREROUTING------
# Маркирую соединения из локальных сетей:
iptables -t mangle -A PREROUTING -s $NET_LOCAL1 -j CONNMARK --set-mark 10 # --set-mark 10 for PROV1
iptables -t mangle -A PREROUTING -s $NET_LOCAL2 -j CONNMARK --set-mark 20 # --set-mark 20 for PROV2
iptables -t mangle -A PREROUTING -s $NET_LOCAL3 -j CONNMARK --set-mark 10 # --set-mark 10 for PROV1
# Маркирую соединения с внешних интерфейсов:
iptables -t mangle -A PREROUTING -i eth0 -j CONNMARK --set-mark 10
iptables -t mangle -A PREROUTING -i eth1 -j CONNMARK --set-mark 20
# Маркирую все пакеты внутри соединений по меткам самих соединений:
iptables -t mangle -A PREROUTING -m connmark --mark 10 -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m connmark --mark 20 -j CONNMARK --restore-mark

###---FORWARD---
# Для транзитных пакетов я пока не начать разбираться, так как не заработала маршрутизация на самом роутере. 
###---INPUT---
# Устанавливаю маркировку пакетов по маркировке соединений (такое уже делается в PREROUTING, написал для контроля за счетчиками)
iptables -t mangle -A INPUT -m connmark --mark 10 -j CONNMARK --restore-mark
iptables -t mangle -A INPUT -m connmark --mark 20 -j CONNMARK --restore-mark

####--------OUTPUT----------
# В локальные сети не трогаем
iptables -t mangle -A OUTPUT -d $NET_LOCAL1 -j RETURN
iptables -t mangle -A OUTPUT -d $NET_LOCAL2 -j RETURN
iptables -t mangle -A OUTPUT -d $NET_LOCAL3 -j RETURN
# Выходящие пакеты маркируем по номерам соединений
iptables -t mangle -A OUTPUT -m connmark --mark 10 -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT -m connmark --mark 20 -j CONNMARK --restore-mark

###--------POSTROUTING----
# Здесь NAT
iptables -t nat -A POSTROUTING -s $NET_LOCAL3 -m mark --mark 10 -j ACCEPT
iptables -t nat -A POSTROUTING -s $NET_LOCAL2 -m mark --mark 20 -j ACCEPT
iptables -t nat -A POSTROUTING -m mark --mark 10 -j SNAT --to-source $IP_PROV1
iptables -t nat -A POSTROUTING -m mark --mark 20 -j SNAT --to-source $IP_NAT_PROV2

    ip route flush table T_LOCAL
    ip route flush table T_PROV1
    ip route flush table T_PROV2
    ip route add $NET_LOCAL1 dev $IF_LOCAL1 table T_LOCAL
    ip route add $NET_LOCAL2 dev $IF_LOCAL2 table T_LOCAL
    ip route add $NET_LOCAL3 dev $IF_LOCAL3 table T_LOCAL

    ip route add $NET_PROV1 dev $IF_PROV1 src $IP_PROV1 table T_PROV1
    ip route add 127.0.0.0/8 dev lo table T_PROV1
    ip route add default via $GW_PROV1 dev eth0 table T_PROV1
    
    ip route add $NET_PROV2 dev $IF_PROV2 src $IP_PROV2 table T_PROV2
    ip route add 127.0.0.0/8 dev lo table T_PROV2
    ip route add default via $GW_PROV2 dev eth1 table T_PROV2
    #заполнение таблицы main
    ip route del default
    ip route add default via $GW_PROV1
    ip rule show | grep -Ev '^(0|32766|32767):|iif lo' \
    | while read PRIO NATRULE; do
          ip rule del prio ${PRIO%%:*} $( echo $NATRULE | sed 's|all|0/0|' )
    done
    ip rule add from all lookup T_LOCAL pref 5
    ip rule add fwmark 10 table T_PROV1 pref 10
    ip rule add fwmark 20 table T_PROV2 pref 20
    ip route flush cache
exit 0

Блин, достаточно нескольких простых строчек.

Одного прова ставишь дефолтным шлюзом, для другого, (скажем, подключенного через eth1) делаешь CONNMARK и перенаправляешь его в отдельную таблицу.

# Маркируем входящие от второго прова
iptables -t mangle -I INPUT -i eth1 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1
# Для исходящих копируем маркировку соединения в маркировку пакетов
iptables -t mangle -I OUTPUT -j CONNMARK --restore-mark
# Дефолтный шлюз для соединений от второго прова
ip route add default via <адрес_шлюз_второго_прова> dev eth1 table 101
# Ну и правило для этой таблицы
ip rule add fwmark 1 table 101
# Сброс кэша маршрутов
ip route flush cache
Вроде все.

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

Зачем так извращаться с маркировками? Настрой по гиду из LARTC

Описанный там метод работает только с исходящими соединениями.
Корректно обработать входящие соединения без маркировок нельзя.

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

ip route add $P0_NET     dev $IF0 table T1
ip route add $P2_NET     dev $IF2 table T1
ip route add 127.0.0.0/8 dev lo   table T1
ip route add $P0_NET     dev $IF0 table T2
ip route add $P1_NET     dev $IF1 table T2
ip route add 127.0.0.0/8 dev lo   table T2   
Нет чтобы сделать отдельную таблицу для локалок и пропускать через нее правилом с высоким prio...

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

>Описанный там метод работает только с исходящими соединениями.

Ну вот у нас с вами была недавно дискуссия. Нормально оно пашет и для входящих.

ip rule add from $IF2 table PROV2

IF2 - IP второго (того, который НЕ примыкает к сети с main default gateway) интерфейса.

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

>ip rule add from $IF2 table PROV2

Do it works? Ко мне постоянно прибегают жаловаться, что оно не пашет, я кидаю настройку через CONNMARK, и все сразу начинает работать.

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

>Подскажите, а сама последовательность действий над пакетами, логика обработки у меня верна?

Лично я долго пытался ее понять, но так и не понял. Скажи словами, чего ты от бедной системы хочешь?

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

Хочу чтобы 3 сети, находящиеся за роутером ( одна напр. 192.168.1.0/24 , две другие с прямыми адресами, выделенными провайдерами) работали через 2 WAN соединения. Маркировка 10 используется для выхода через WAN 1, маркировка 20 для выхода через WAN 2. Для пакетов из локальной сети нужно определять канал выхода, и соответственно NATить на определенный адрес. Пакеты за роутером (есст-но) должны ходить без выхода наружу.

С некоторыми дополнениями мне удалось запустить данную маршрутизацию. Работает почти все нормально. За исключением того, что на WAN 2 теряются пакеты (ответы) от роутера при трассировке извне(traceroute) узлов с выделенными адресами. На WAN 1, маршрут через который является default, трассировка проходит нормально. Отлавливая пакеты выяснил, что при трассировке прямых адресов по каналу WAN 2, роутер всегда отправляет пакеты через default маршрут (т.е. WAN 1, пакеты не маркируются и поэтому уходят в main->default, как будто не корректно работает отслеживание соединений, и роутер не знает что соединение и пакеты нужно отправить по тому же каналу, откуда пришли пакеты traceroute).

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