LINUX.ORG.RU
ФорумAdmin

Два провайдера и непонятнки


0

0

Всем добрый день.
Помогите разобраться, что у меня не так.

У нас есть 2 линка в интернет от 2 разных провайдеров.

х.х.х.202/30 – наш IP адрес от 1-ого провайдера
х.х.х.201/30 – IP адрес шлюза от 1-ого провайдера

у.у.у.183/24 – наш IP адрес от 2-ого провайдера
у.у.у.177/24 – IP адрес шлюза от 2-ого провайдера

Есть внутренняя сеть 192.168.220.0/24 клиентов.

Нужно дать интернет клиентам по следующей схеме

192.168.220.101 чтоб ходил через 1-ого провайдера

192.168.220.141 чтоб ходил через 2-ого провайдера

Все 2 линка от провайдеров я подаю на отдельные порты cisco с вилланами (vlan101, vlan102). На 24 порту cisco сделал транк вилланов и подаю этот транк в мой сервер Linux (CentOS, 2.6) на интерфейс eth0.

На интерфейсе eth0 Линукс сервера поднял два виллана eth0.101, eth0.102.
На интерфейсе eth1 Линукс сервера поднял ip 192.168.220.1/24
Включил маршрутизацию на Линукс сервере.

Идея не новая, сделать с помощью iptables маркирование IP пакетов идущих от клиентов в интернет и в зависимости от марки пускать их на 1 или 2 провайдера. Вот как я это сделал.

Написал скрипт /etc/rc.d/rc.net, вот его текст:

#!/bin/bash

IPT=«/sbin/iptables»

service iptables restart   # на всякий случай перегрузим

$IPT -t nat -F          #очищаем таблицу nat
$IPT -t nat -X          #очищаем таблицу nat
#$IPT -t mangle -F      #очищаем таблицу mangle

#local NET
IP_LOCAL=«192.168.220.1»   # адрес нашего маршрутизатора в локальной сети.
IF_LOCAL=«eth1»         # имя интерфейса на локальную сеть
NET_LOCAL=«192.168.220.0/24»   # локальная сеть.

#Provider 1

IP_INET101=«x.x.x.202»   # наш IP в сети 1 провайдера.
IF_INET101=«eth0.101»      # имя интерфейса на 1 провайдера.
NET_INET101=«x.x.x.200/29»   # адрес сети нашего 1 провайдера.
GW101=«x.x.x.201»         # default gw 1 провайдера.

#закидываем в таблицу инфу о сети провайдера
ip route add $NET_INET101 dev $IF_INET101 src $IP_INET101 table T101

#закидываем в таблицу дефолтный гейт на первого провайдера
ip route add default via $GW101 table T101

#удаляем наше 1 правило, если они присутствуют в текущей конфигурации
ip rule delete table T101

#удаляем наши 2 правило, если они присутствуют в текущей конфигурации
ip rule delete table T101

#все пакеты от ip адреса провайдера маршрутизировать по таблице
ip rule add from $IP_INET101 table T101

#все пакеты, которые имеют метку маршрутизировать по таблице
ip rule add fwmark 101 table T101

#натим все пакеты которые имеют метку 101
$IPT -t nat -A POSTROUTING -m mark --mark 101 -o $IF_INET101 -j SNAT --to-source $IP_INET101

#Provider 2
IP_INET102=«y.y.y.183»      # наш адрес в сети 2 провайдера.
IF_INET102=«eth0.102»      # имя интерфейса 2 провайдера.
NET_INET102=«y.y.y.176/28»   # адрес сети нашего 2 провайдера.
GW102=«y.y.y.177»         # default gw 2 провайдера.

#обнуляем таблицу маршрутов
ip route flush table T102

#закидываем в таблицу инфу о сети провайдера
ip route add $NET_INET102 dev $IF_INET102 src $IP_INET102 table T102

#закидываем в таблицу дефолтный гейт на первого провайдера
ip route add default via $GW102 table T102

#заполняем основную таблицу адресов. сеть на второго провайдера
ip route add $NET_INET102 dev $IF_INET102 src $IP_INET102

#удаляем наше 1 правило, если они присутствуют в текущей конфигурации
ip rule delete table T102

#удаляем наши 2 правило, если они присутствуют в текущей конфигурации
ip rule delete table T102

#все пакеты, которые имеют метку маршрутизировать по таблице
ip rule add fwmark 102 table T102

#все пакеты от ip адреса провайдера маршрутизировать по таблице
ip rule add from $IP_INET102 table T102

#натим все пакеты которые имеют метку 102
$IPT -t nat -A POSTROUTING -m mark --mark 102 -o $IF_INET102 -j SNAT --to-source $IP_INET102

#общая таблица маршрутизации
ip route add default via $GW101

#ну и на последок очистить кеш
ip route flush cache

# и сохраним iptables
service iptables save

# END.

Далее написал скрипт etc/rc.d/rc.clients, вот его текст:

#!/bin/bash

IPT=«/sbin/iptables»

service iptables restart

$IPT -t mangle -F #очищаем таблицу mangle
$IPT -t mangle -X #очищаем таблицу mangle

#убить всех неверных
#все пакеты которые идут от данного MAC адреса маркируем меткой 666
$IPT -t mangle -A PREROUTING -i eth1 -j MARK --set-mark 666

# клиент 192.168.220.101 с его макадресом 00:1D:BA:69:57:75 маркируем
# меткой 101
$IPT -t mangle -A PREROUTING –i eth1 –s 192.168.220.101/32 -d ! 192.168.220.0/24 -m mac --mac-source 00:1D:BA:69:57:75 -j MARK --set-mark 101

# клиент 192.168.220.141 с его макадресом 00:1F:C6:E4:EC:39 маркируем
# меткой 102
$IPT -t mangle -A PREROUTING –i eth1 –s 192.168.220.141/32 -d ! 192.168.220.0/24 -m mac --mac-source 00:1F:C6:E4:EC:39 -j MARK --set-mark 102

ip route flush cache

# END.

Теперь я могу добавлять в скрипт rc.clients еще клиентов и пускать их через первого или второго провайдера.

Но появился такой непонятный глюк, попробую описать.

Глюк №1:
Допустим клиент 192.168.220.101 (назовем его 101) настроен на 101 линк. На машине 101 клиента запускаю пинг до www.ru. Все работает, пинги отвечают. Теперь, не останавливая пинг на машине клиента 101 до www.ru, на сервере перенастраиваю клиента 101 чтоб он бегал в инет через 102 линк. У клиента 101 пинги пропадают. Останавливаю пинг на машине клиента 101 до www.ru и запускаю пинг до www.hp.ru – пинги побежали нормально. Пробую опять пинг до www.ru не идут!!! Но через минуты две-три пинги начинают бегать до www.ru.

Глюк №2.
Оба клиента 101 и 102 запустили на своих машинах пинг до www.ru. Пинги идут и все хорошо.

На сервере даю команду:
iptables –t mangle –nvxL –Z

и получаю вот такой ответ:

808 202K MARK all  — eth1 * 0.0.0.0/0 0.0.0.0/0 MARK set 0x29a

12 1152   MARK all  — * * 0.0.0.0/0 !192.168.220.0/24 MAC 00:1D:BA:69:57:75 MARK set 0x65
3 180 MARK all  — * * 0.0.0.0/0 !192.168.220.0/24 MAC 00:1F:C6:E4:EC:39 MARK set 0x6C

Почти сразуже даю команду:
iptables –t nat –nvxL –Z

и получаю вот такой ответ:

1 96 SNAT all  — * eth0.101 0.0.0.0/0 0.0.0.0/0 MARK match 0x65 to:x.x.x.202
2 192 SNAT all  — * eth0.102 0.0.0.0/0 0.0.0.0/0 MARK match 0x66 to:y.y.y.183

РАЗНИЦА В КОЛИЧЕСТВЕ ПРОМАРКИРОВАННЫХ И ПРОНАТЕННЫХ ПАКЕТОВ ОЧЕВИДНА, но при этом ни один пакет из пингов ни на одной из машин клиентов не потерян.

Вот и сформировались два вопроса:
Первый вопрос – что происходит с таблицей маршрутизации ip?
Второй вопрос – куда деваются пакетики?

>Останавливаю пинг на машине клиента 101 до www.ru и запускаю пинг до www.hp.ru – пинги побежали нормально. Пробую опять пинг до www.ru не идут!!! Но через минуты две-три пинги начинают бегать до http://www.ru.

ip route flush cache спасет отца русской демократии

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

Но ведь в скрипте rc.clients cамой последней строкой идет именно эта команда

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

трасировку не делали, зато делали так
tcpdump -i eth0.102 proto ICMP -nnn

почемуто ICMP пакеты с адресом х.х.х.202 пытаются вылететь с линка 102

chemuchka ()

Дело в системе conntrack, которая выполняет отслеживание соединений обеспечивает для них NAT. ICMP пакеты одного типа, интервалы между которыми меньше 30 секунд, рассматриваются как одно соединение и натятся всегда одинаково.

Также тебе бы не помешало знать, что под правило NAT подпадает только первый пакет в соединении, а все ESTABLISHED,RELATED пакеты натятся всегда _точно так же_, как и первый, и правилом не учитываются.

Решения два:
1. Добавить в конце скрипта conntrack -F, обеспечивающий сброс таблицы соединений. Все установленные соединения должны прерваться (если фильтрация в FORWARD настроена нормально).
2. Заменить MARK на CONNMARK, чтобы при перенастройке на новый шлюз существующие соединения продолжали работать по старому шлюзу.

Если тебя интересуют именно пинги, уменьшай sysctl net.netfilter.nf_conntrack_icmp_timeout.

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