The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Шлюз - 2 провайдера. настройки."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Открытые системы на сервере (Маршрутизация, NAT / Linux)
Изначальное сообщение [ Отслеживать ]

"Шлюз - 2 провайдера. настройки."  +/
Сообщение от sasku email on 04-Май-11, 19:03 
Перечитал всю инфу по данной теме. Сделал:

маршрутизация:
#!/bin/sh

IP_LOCAL="10.1.1.4" # адрес нашего маршрутизатора в локальной сети.
IP_INET1="хх.хх.хх.4" # адрес нашего маршрутизатора в сети первого провайдера.
IP_INET2="хх.хх.хх.234" # адрес нашего марщрутизатора в сети второго провайдера.

IF_LOCAL="eth3" # имя интерфейса на локальную сеть
IF_INET1="eth0" # имя интерфейса на первого провайдера.
IF_INET2="eth1" # имя интерфейса на второго провайдера.

NET_LOCAL="10.1.1.0/24" # локальная сеть.
NET_INET1="хх.хх.хх.0/29" # адрес сети в которой гейт нашего первого провайдера.
NET_INET2="хх.хх.хх.232/30" # адрес сети в которой гейт нашего второго провайдера.

GW_INET1="хх.хх.хх.1" # гейт первого провайдера.
GW_INET2="хх.хх.хх.233" # гейт второго провайдера.
IPT="/sbin/iptables"

ip rule delete table T1
ip rule delete table T2
ip route flush table T1      #обнуляем первую таблицу маршрутов
ip route flush table T2      #обнуляем вторую таблицу маршрутов
ip route del default


ip route add $NET_INET1 dev $IF_INET1 src $IP_INET1 table T1  #закидываем в первую таблицу инфу о сети первого провайдера
ip route add $NET_LOCAL dev $IF_LOCAL table T1     #закидываем в первую таблицу инфу о том, что у нас существует локальная сеть
ip route add $NET_INET2 dev $IF_INET2 table T1     #закидываем в первую таблицу инфу о том, что у нас существует еще одна сеть
ip route add 127.0.0.0/8 dev lo   table T1         #закидываем в первую таблицу инфу о существовании лупбека
ip route add default via $GW_INET1 table T1        #закидываем в первую таблицу дефолтный гейт на первого провайдера


ip route add $NET_INET2 dev $IF_INET2 src $IP_INET2 table T2   #закидываем во вторую таблицу инфу о сети второго провайдера
ip route add $NET_LOCAL dev $IF_LOCAL table T2  #закидываем во вторую таблицу инфу о том, что у нас существует локальная сеть.
ip route add $NET_INET1 dev $IF_INET1 table T2  #закидываем во вторую таблицу инфу о том, что у нас существует еще одна сеть.
ip route add 127.0.0.0/8 dev lo   table T2      #закидываем во вторую таблицу инфу о существовании лупбека.
ip route add default via $GW_INET2 table T2     #закидываем во вторую таблицу дефолтный гейт на второго провайдера

ip route add $NET_INET1 dev $IF_INET1 src $IP_INET1    #заполняем основную таблицу адресов. сеть на первого провайдера
ip route add $NET_INET2 dev $IF_INET2 src $IP_INET2    #заполняем основную таблицу адресов. сеть на второго провайдера

ip route add default via $GW_INET1    #заполняем основную таблицу адресов. дефолтный гейт.

ip rule delete table T1       #удаляем наши таблицы, если они присутсвуют в текущей конфигурации (вдруг мы просто перезапускаем скрипт?)
ip rule delete table T2       #аналогично для второй.
ip rule delete table T1       #и делаем это два раза, так как у нас два правила на каждую таблицу.
ip rule delete table T2       #аналогично для второй.

#а вот это важно для понимая! если понять что происходит в следующих строчках - то можно настраивать любые правила маршрутизации.
ip rule add from $IP_INET1 table T1    #все пакеты от ip адреса первого провайдера маршрутизировать по таблице T1
ip rule add from $IP_INET2 table T2    #все пакеты от ip адреса второго провайдера маршрутизировать по таблице T2

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

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

файрвол:
#!/bin/bash

echo "1" > /proc/sys/net/ipv4/ip_forward

# Очищаем правила файрвола
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X

# Политика по умолчанию DROP: всем всё запрещено
iptables -t filter -P INPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT
iptables -t filter -P OUTPUT ACCEPT

iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT

iptables -t filter -A INPUT  -s 10.1.1.0/14 -j ACCEPT
iptables -t filter -A OUTPUT -d 10.1.1.0/14 -j ACCEPT
iptables -t filter -A FORWARD -d 10.1.1.0/24 -j ACCEPT
iptables -t filter -A FORWARD -s 10.1.1.0/24 -j ACCEPT

iptables -t filter -A FORWARD -j ACCEPT
iptables -t filter -A INPUT  -p icmp -j ACCEPT


iptables -t mangle -A PREROUTING  -d 77.88.21.6 -j MARK --set-mark 10 # яндекс :)
iptables -t mangle -A PREROUTING  -d 77.88.21.3 -j MARK --set-mark 11 # яндекс :)

#все пакеты, которые попали в цепочку POSTROUTING таблицы nat обрабатываем по двум правилам:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

это тестовые настройки, поэтому прошу не ругать за дырявость файрвола

делаю tracert 77.88.21.6 - все нормально - идет через 1 провайдера
делаю tracert 77.88.21.3 - идет через 2 провайдеда, но после гейта (хх.хх.хх.233) никуда не идет
в чем проблема, подскажите плиз

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Шлюз - 2 провайдера. настройки."  +/
Сообщение от PavelR (??) on 04-Май-11, 20:41 
> Перечитал всю инфу по данной теме. Сделал:

http://www.opennet.me/tips/2009_policy_route_linux.shtml - это - явно не читал.


> ip route add $NET_INET1 dev $IF_INET1 src $IP_INET1 table T1  #закидываем
> в первую таблицу инфу о сети первого провайдера

[Замечание1.] Это не нужно, если до таблиц т1/т2 делать lookup в main. Ведь именно для этого у вас в скрипте и удаляется дефолтный маршрут из main и добавляется в default - чтобы сделать лукап в майн до т1/т2, и если нет в майн и не подпадает под т1/т2 - тогда ищем в default.

т.е. в таблице майн остаются только маршруты к напрямую присоединенным сетям, дефолтного маршрута там нет, и поиск маршрута пойдет по дальнейшим ip ru правилам.
Кроме того, допустим - подымете вы на этом хосте впн.... :-)
Установленные соединения, маршрут к ним также добавится только в main, а ваш скрипт ожидает что маршруты к впн-ам будут также и в Т1/Т2, что криво :-)


Т.е. последовательность поиска маршрута для пакета в таблицах:

# ip ru sh
0:      from all lookup local
1000:   from all lookup main
1005:   from all fwmark 0x1 lookup prov1
1006:   from all fwmark 0x2 lookup prov1
1010:   from 1.2.144.38 lookup prov2
1030:   from 3.4.185.33 lookup prov1
2000:   from 192.168.0.0/24 lookup peeringnets
2010:   from 192.168.0.0/24 lookup prov1
3000:   from all lookup peeringnets
32766:  from all lookup main
32767:  from all lookup default

немножко поднавороченный пример, но суть проста - используйте явное задание pref в скрипте, и думайте, как оно работает - _последовательно_ пока не найдет маршрут к пункту назначения.


> ip route add $NET_LOCAL dev $IF_LOCAL table T1    
> #закидываем в первую таблицу инфу о том, что у нас существует
> локальная сеть

[Замечание1.]

> ip route add $NET_INET2 dev $IF_INET2 table T1    
> #закидываем в первую таблицу инфу о том, что у нас существует
> еще одна сеть

[Замечание1.]

> ip route add 127.0.0.0/8 dev lo   table T1  
>       #закидываем в первую таблицу инфу
> о существовании лупбека

[Замечание1.]

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

Это единственный маршрут, который нужен в Т1.

Описание маршрутов Т2- идентичное замечание.


> ip rule delete table T1       #удаляем
> наши таблицы, если они присутсвуют в текущей конфигурации (вдруг мы просто
> перезапускаем скрипт?)
> ip rule delete table T2       #аналогично
> для второй.
> ip rule delete table T1       #и
> делаем это два раза, так как у нас два правила на
> каждую таблицу.
> ip rule delete table T2       #аналогично
> для второй.

Как с этим быть - я не знаю. как правило я стараюсь не перезапускать скрипт :-)

> #а вот это важно для понимая! если понять что происходит в следующих
> строчках - то можно настраивать любые правила маршрутизации.
> ip rule add from $IP_INET1 table T1    #все пакеты
> от ip адреса первого провайдера маршрутизировать по таблице T1
> ip rule add from $IP_INET2 table T2    #все пакеты
> от ip адреса второго провайдера маршрутизировать по таблице T2
> ip rule add fwmark 10 table T1  #все пакеты, которые имеют
> метку 10 маршрутизировать по таблице T1
> ip rule add fwmark 11 table T2  #все пакеты, которые имеют
> метку 11 маршрутизировать по таблицу T2

Добавить явное указание pref, добавить перед поиском в таблицах т1/т2 - поиск в main.
В майн не должно быть маршрута по умолчанию, что естественно :-)

В общем и целом всё верно.


> # Политика по умолчанию DROP: всем всё запрещено
> iptables -t filter -P INPUT ACCEPT
> iptables -t filter -P FORWARD ACCEPT
> iptables -t filter -P OUTPUT ACCEPT

теперь политика по умолчанию - всем всё разрешено :-)

> iptables -t mangle -A PREROUTING  -d 77.88.21.6 -j MARK --set-mark 10
> # яндекс :)
> iptables -t mangle -A PREROUTING  -d 77.88.21.3 -j MARK --set-mark 11
> # яндекс :)

ну типа верно.

> #все пакеты, которые попали в цепочку POSTROUTING таблицы nat обрабатываем по двум
> правилам:
> iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
> iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

мне как-то больше по душе явное указание -j SNAT --to-source, но...

> это тестовые настройки, поэтому прошу не ругать за дырявость файрвола
> делаю tracert 77.88.21.6 - все нормально - идет через 1 провайдера
> делаю tracert 77.88.21.3 - идет через 2 провайдеда, но после гейта (хх.хх.хх.233)
> никуда не идет
> в чем проблема, подскажите плиз

Это можно посмотреть в tcpdump - правильно ли идет, по ожидаемому ли интерфейсу и с какими адресами летит пакет.

кроме того, нужно посмотреть, чего скрипт натворил:

ip ru sh + ip ro sh по всем таблицам.

Подумать над выводом :-)


//в некоторых особо клинических случаях - может быть тупняк дистрибутива. Замечено было на убунте, установленной вместо предпочитаемого и порекомендованного мной дебиана, вылечилось переустановкой на что-то другое.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Шлюз - 2 провайдера. настройки."  +/
Сообщение от sasku email on 07-Май-11, 00:55 
>> Перечитал всю инфу по данной теме. Сделал:
> http://www.opennet.me/tips/2009_policy_route_linux.shtml - это - явно не читал.

почитал, спасибо.

сделал так:

ip route del default
add default via $GW_INET1

ip route add default via $GW_INET1
ip route add $NET_LOCAL dev $IF_LOCAL table LOCALNET

ip route add $NET_INET1 dev $IF_INET1 table T1
ip route add default via $GW_INET1 table T1

ip route add $NET_INET2 dev $IF_INET2 table T2
ip route add default via $GW_INET2 table T2

ip rule add from $IP_LOCAL lookup LOCALNET pref 1000
ip rule add from $IP_INET1 lookup T1 pref 3000.
ip rule add from $IP_INET2 lookup T2 pref 3010.

ip rule add fwmark 11 lookup T2 pref 2001
ip ru add from 10.1.1.22 lookup T2 pref 2000
iptables -t mangle -A PREROUTING  -d 77.88.21.3 -j MARK --set-mark 11


маршрутизация от источника (последнее правило) работает отлично.
Но маршрутизация для маркированных пакетов так само не работает

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Шлюз - 2 провайдера. настройки."  +/
Сообщение от sasku email on 07-Май-11, 01:14 
попробовал пример от сюда: http://lartc.org/lartc.html#LARTC.RPDB.MULTIPLE-LINKS

iptables -A PREROUTING -i $IF_LOCAL -t mangle -p tcp --dport 22 -j MARK --set-mark 11
ip route del default
ip route add default via $GW_INET1
ip rule add fwmark 11 table T2
/sbin/ip route add default via $GW_INET2 dev ppp0 table T2

проблема таже: дальше шлюза пакеты не идут
может это важно: Fedora 14 стоит
ща ставлю Debian - буду там пробовать

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

5. "Шлюз - 2 провайдера. настройки."  +/
Сообщение от PavelR (??) on 07-Май-11, 09:53 

net.ipv4.conf.eth0.rp_filter = 0

проверь/исправь по всем интерфейсам

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

6. "Шлюз - 2 провайдера. настройки."  +/
Сообщение от sasku email(ok) on 07-Май-11, 22:37 
> net.ipv4.conf.eth0.rp_filter = 0
> проверь/исправь по всем интерфейсам

Спасибо большое - именно это и помогло

Всем спасибо - все заработало.

ЗЫ: все вышеприведенные настройки - правильные и рабочие. Только надо добавить net.ipv4.conf.eth0.rp_filter = 0

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру