The OpenNET Project / Index page

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

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

"Маршрутизация и DNAT с двумя провайдерами"  +1 +/
Сообщение от dimawar (ok) on 07-Июл-11, 17:33 
Добрый день!
У меня возникла проблема при решении следующей задачи: необходимо настроить шлюз на линуксе с 2мя провайдерами так, чтобы можно было опубликовать внутренний сервер (например веб, порт 80) сразу на 2х внешних интерфейсах и работать одновременно на 2х интерфейсах. Т.е. если пакет пришел на $IF1 интерфейс 1-го провайдера, то пробрасывается соединение по 80 порту на внутренний сервер 192.168.0.5:80 и соединение устанавливается; если пакет пришел на $IF2 интерфейс 2-го провайдера, то также пробрасывается соединение по 80 порту на внутренний сервер 192.168.0.5:80 и соединение устанавливается.
Для этого я использую iproute2 и iptables.

#первый провайдер
IP1=1.1.1.1
IF1=eth1
P1=1.1.1.2 # шлюз 1го провайдера
P1_NET=1.1.1.0/30
#второй провайдер
IP2=2.2.2.2
IF2=eth2
P2=2.2.2.2 # шлюз 2го провайдера
P2_NET=2.2.2.0/30
#локальная сеть
LOC_IP=192.168.0.1
LOC_NET=192.168.0.0/24
LOC_IF=eth0

#очистка и удаление таблиц t1 и t2
ip route flush table t1
ip route flush table t2
ip rule delete table t1
ip rule delete table t2

#сбрасываем кэш маршрутизации
ip route flush cache

ip route add $LOC_NET dev $LOC_IF scope link table t1
ip route add $P2_NET dev $IF2 scope link table t1
ip route add $P1_NET dev $IF1 scope link src $IP1 table t1
ip route add 127.0.0.0/8 dev lo scope link table t1
ip route add default via $P1 table t1
ip rule add fwmark 1 table t1
ip rule add from $IP1 table t1

ip route add $LOC_NET dev $LOC_IF scope link table t2
ip route add $P1_NET dev $IF1 scope link table t2
ip route add $P2_NET dev $IF2 scope link src $IP2 table t2
ip route add 127.0.0.0/8 dev lo scope link table t2
ip route add default via $P2 table t2
ip rule add fwmark 2 table t2
ip rule add from $IP2 table t2

#отключаем статическую антиспуфинговую фильтрацию
sysctl net.ipv4.conf.all.rp_filter=0
#включаем форвардинг
echo 1 > /proc/sys/net/ipv4/ip_forward

# Делаем NAT
iptables -t nat -A POSTROUTING -o $IF1 -j SNAT --to-source $IP1
iptables -t nat -A POSTROUTING -o $IF2 -j SNAT --to-source $IP2

# Маркируем пакеты в таблице mangle цепочки FORWARD
iptables -t mangle -A FORWARD -i $IF1 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1
iptables -t mangle -A FORWARD -i $IF2 -m conntrack --ctstate NEW -j CONNMARK --set-mark 2

# Восстанавливаем маркировку соединения
iptables -t mangle -A FORWARD -i $LOC_IF -m conntrack --ctstate RELATED,ESTABLISHED -j CONNMARK --restore-mark

# Пробрасываем порт на внутренний сервер
iptables -t nat -A PREROUTING --dst $IP1 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.5:80
iptables -t nat -A PREROUTING --dst $IP2 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.5:80

iptables -A FORWARD -i $IF1 -o $LOC_IF -d 192.168.0.5 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i $LOC_IF -o $IF1 -s 192.168.0.5 -p tcp -j ACCEPT
iptables -A FORWARD -i $IF2 -o $LOC_IF -d 192.168.0.5 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i $LOC_IF -o $IF2 -s 192.168.0.5 -p tcp -j ACCEPT


Если стоит маршрут по умолчанию, например ip route add default via $P1 , то извне, на $IP1 соединение устанавливается по 80 порту, прокинутому во внутренню сеть. А на $IP2 соединение не устанавливается. Цепочка прерывается после срабатывания правила в таблице nat цепочки PREROUTING. По идее, дальше пакет должен прийти в таблицу mangle цепочки FORWARD, но этого не происходит. Почему так происходит?
Ответить | Правка | Cообщить модератору

Оглавление

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


1. "Маршрутизация и DNAT с двумя провайдерами"  +/
Сообщение от PavelR (??) on 07-Июл-11, 21:48 

Я особо смотреть не хочу, чтобы типа просчитать как это будет.
Скажу одно, что говорю всем:

1) ip ru надо добавлять с явным указанием pref и делать это с умом
2) В форум надо показывать не какие-то куски скриптов, а результат их действий, т.е.

ip ru sh
ip ro sh table $TABLE$ по всем таблицам, имеющимся в ip ru

iptables -nvL --line -t $TABLE по всем непустыми таблицам ( nat mangle filter, raw редко кто использует )  или вывод iptables-save

А так, концептуально всё вроде верно. Ошибок в реализации - пока не искал, хочу видеть описанное выше :-)

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

2. "Маршрутизация и DNAT с двумя провайдерами"  +/
Сообщение от PavelR (??) on 07-Июл-11, 21:50 
http://opennet.ru/tips/2009_policy_route_linux.shtml
http://opennet.ru/tips/1651_route_iptables_linux_nat.shtml
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Маршрутизация и DNAT с двумя провайдерами"  +/
Сообщение от PavelR (??) on 07-Июл-11, 21:53 
# Восстанавливаем маркировку соединения
iptables -t mangle -A FORWARD -i $LOC_IF -m conntrack --ctstate RELATED,ESTABLISHED -j CONNMARK --restore-mark

Цитирую:


В нижеописанном примере обеспечение доступности сервиса по двум каналам/провайдерам
делалось для локального сервиса маршрутизатора. В связи с этим маркировка исходящих
пакетов делается в цепочке OUTPUT таблицы mangle. Для проброса порта к  серверу в локальной сети (в DMZ) проверку и восстановление маркера надо делать в цепочке PREROUTING.

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

4. "Маршрутизация и DNAT с двумя провайдерами"  +/
Сообщение от dimawar (ok) on 21-Июл-11, 09:30 
> # Восстанавливаем маркировку соединения
> iptables -t mangle -A FORWARD -i $LOC_IF -m conntrack --ctstate RELATED,ESTABLISHED -j
> CONNMARK --restore-mark
> Цитирую:
> В нижеописанном примере обеспечение доступности сервиса по двум каналам/провайдерам
> делалось для локального сервиса маршрутизатора. В связи с этим маркировка исходящих
> пакетов делается в цепочке OUTPUT таблицы mangle. Для проброса порта к  
> серверу в локальной сети (в DMZ) проверку и восстановление маркера надо
> делать в цепочке PREROUTING.

Все сделал через цепочку PREROUTING.
Заметил следующую особенность: на debian 5.06 работает, а вот на SUSE 10 sp1 не работает.
Куда теперь копать?

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

5. "Маршрутизация и DNAT с двумя провайдерами"  +/
Сообщение от PavelR (??) on 21-Июл-11, 15:09 
>[оверквотинг удален]
>> Цитирую:
>> В нижеописанном примере обеспечение доступности сервиса по двум каналам/провайдерам
>> делалось для локального сервиса маршрутизатора. В связи с этим маркировка исходящих
>> пакетов делается в цепочке OUTPUT таблицы mangle. Для проброса порта к
>> серверу в локальной сети (в DMZ) проверку и восстановление маркера надо
>> делать в цепочке PREROUTING.
> Все сделал через цепочку PREROUTING.
> Заметил следующую особенность: на debian 5.06 работает, а вот на SUSE 10
> sp1 не работает.
> Куда теперь копать?

sysctl net.ipv4.conf.all.rp_filter = 0

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

6. "Маршрутизация и DNAT с двумя провайдерами"  +/
Сообщение от dimawar (ok) on 22-Июл-11, 15:12 
> sysctl net.ipv4.conf.all.rp_filter = 0

это было изначально сделано - не работает. Сделал так:

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/$IF1/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/$IF2/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/$LOC_IF/rp_filter

заработало.

Появилась еще одна проблема: если я не указываю шлюз по умолчанию в таблице main или default, то

ping -I eth1 ya.ru
не проходит, а
ping -I eth2 ya.ru
проходит.
Причем не важно какой интерфейс по номеру, проблема с настройками провайдера где-то.
Конфиги такие:
первый провайдер:
ip-адрес 77.77.77.88
шлюз 77.77.77.65
сеть 77.77.77.64/26

второй провайдер:
ip-адрес 88.88.88.161
шлюз 88.88.88.162
сеть 88.88.88.160/30

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

ip route add default via 77.77.77.65 table default

таблица main:

#ip ro
88.88.88.160/30 dev eth2  proto kernel  scope link  src 88.88.88.161
77.77.77.64/26 dev eth1  proto kernel  scope link  src 77.77.77.88
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.1
169.254.0.0/16 dev eth0  scope link
127.0.0.0/8 dev lo  scope link

таблица t1:

#ip ro sh t t1
77.77.77.64/26 dev eth1  scope link
default via 77.77.77.65 dev eth1

таблица t2:

#ip ro sh t t2
88.88.88.160/30 dev eth2  scope link
default via 88.88.88.162 dev eth2

таблица static:

#ip ro sh t static
88.88.88.160/30 dev eth2  scope link
77.77.77.64/26 dev eth1  scope link
192.168.0.0/24 dev eth0  scope link

таблица default пустая.

правила

# ip ru
0:      from all lookup local
1000:   from all lookup static
2000:   from all fwmark 0x1 lookup t1
2010:   from all fwmark 0x2 lookup t2
3000:   from 77.77.77.88 lookup t1
3010:   from 88.88.88.161 lookup t2
32766:  from all lookup main
32767:  from all lookup default

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

7. "Маршрутизация и DNAT с двумя провайдерами"  +/
Сообщение от PavelR (??) on 22-Июл-11, 23:09 

> Появилась еще одна проблема: если я не указываю шлюз по умолчанию в
> таблице main или default, то
ping -I eth1 ya.ru
не проходит,

> а
ping -I eth2 ya.ru
проходит.

> Причем не важно какой интерфейс по номеру, проблема с настройками провайдера где-то.
> из-за чего могут не идти пинги?

А куда они, по-вашему, должны пойти, каким маршрутом?
Магией,телепатией и мистикой линукс обычно не занимается.

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

8. "Маршрутизация и DNAT с двумя провайдерами"  +/
Сообщение от dimawar (ok) on 23-Июл-11, 12:22 
> А куда они, по-вашему, должны пойти, каким маршрутом?
> Магией,телепатией и мистикой линукс обычно не занимается.

а как тогда они по второму каналу проходят?
это ответы с первого канала:

# ping -I eth1 ya.ru -c 3
PING ya.ru (213.180.204.3) from 77.77.77.88 eth1: 56(84) bytes of data.
From хххххх.ru (77.77.77.88): icmp_seq=1 Destination Host Unreachable
From хххххх.ru (77.77.77.88) icmp_seq=1 Destination Host Unreachable
From хххххх.ru (77.77.77.88) icmp_seq=2 Destination Host Unreachable
From хххххх.ru (77.77.77.88) icmp_seq=3 Destination Host Unreachable

--- ya.ru ping statistics ---
3 packets transmitted, 0 received, +4 errors, 100% packet loss, time 2014ms
, pipe 3


а это ответы со второго канала:
# ping -I eth2 ya.ru -c 3
PING ya.ru (77.88.21.3) from 88.88.88.161 eth2: 56(84) bytes of data.
64 bytes from www.yandex.ru (77.88.21.3): icmp_seq=1 ttl=57 time=73.0 ms
64 bytes from www.yandex.ru (77.88.21.3): icmp_seq=2 ttl=57 time=63.8 ms
64 bytes from www.yandex.ru (77.88.21.3): icmp_seq=3 ttl=57 time=63.8 ms

--- ya.ru ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 63.827/66.922/73.075/4.350 ms


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

9. "Маршрутизация и DNAT с двумя провайдерами"  +/
Сообщение от PavelR (??) on 23-Июл-11, 12:31 
> А куда они, по-вашему, должны пойти, КАКИМ МАРШРУТОМ?
> Магией,телепатией и мистикой линукс обычно не занимается.

Вы не указали шлюзов по умолчанию.

По какому каналу должны пойти пинги команды "ping ya.ru" ?

Ядро должно телепатически определить ваше пожелание ?

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

10. "Маршрутизация и DNAT с двумя провайдерами"  +/
Сообщение от dimawar (ok) on 23-Июл-11, 12:48 
>> А куда они, по-вашему, должны пойти, КАКИМ МАРШРУТОМ?
>> Магией,телепатией и мистикой линукс обычно не занимается.
> Вы не указали шлюзов по умолчанию.
> По какому каналу должны пойти пинги команды "ping ya.ru" ?

ни по какому, ответ такой "connect: Network is unreachable"
и это правильно.
Меня интересует другое, почему не идут пинги "ping -I eth1 ya.ru" ?

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

11. "Маршрутизация и DNAT с двумя провайдерами"  +/
Сообщение от PavelR (??) on 23-Июл-11, 12:55 
>>> А куда они, по-вашему, должны пойти, КАКИМ МАРШРУТОМ?
>>> Магией,телепатией и мистикой линукс обычно не занимается.
>> Вы не указали шлюзов по умолчанию.
>> По какому каналу должны пойти пинги команды "ping ya.ru" ?
> ни по какому, ответ такой "connect: Network is unreachable"
> и это правильно.
> Меня интересует другое, почему не идут пинги "ping -I eth1 ya.ru" ?

а, так это мне не по глазам...

стоит попробовать:

ping -I 1.2.3.4 ya.ru

mtr --address 1.2.3.4 ya.ru

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

12. "Маршрутизация и DNAT с двумя провайдерами"  +/
Сообщение от PavelR (??) on 23-Июл-11, 12:59 
>[оверквотинг удален]
>>>> Магией,телепатией и мистикой линукс обычно не занимается.
>>> Вы не указали шлюзов по умолчанию.
>>> По какому каналу должны пойти пинги команды "ping ya.ru" ?
>> ни по какому, ответ такой "connect: Network is unreachable"
>> и это правильно.
>> Меня интересует другое, почему не идут пинги "ping -I eth1 ya.ru" ?
> а, так это мне не по глазам...
> стоит попробовать:
> ping -I 1.2.3.4 ya.ru
> mtr --address 1.2.3.4 ya.ru

ну и промониторить правильность прохождения пакетов по интерфейсам через tcpdump.

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

13. "Маршрутизация и DNAT с двумя провайдерами"  +/
Сообщение от dimawar (ok) on 23-Июл-11, 13:04 
> стоит попробовать:
> ping -I 1.2.3.4 ya.ru

сделал "ping -I 77.77.77.88 ya.ru"
работает, а если указать интерфейс "eth1", то не работает. Почему?
Особенность какая-то или я допустил где-то ошибку, либо провайдер?

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

14. "Маршрутизация и DNAT с двумя провайдерами"  +/
Сообщение от PavelR (??) on 23-Июл-11, 14:45 
>> стоит попробовать:
>> ping -I 1.2.3.4 ya.ru
> сделал "ping -I 77.77.77.88 ya.ru"
> работает, а если указать интерфейс "eth1", то не работает. Почему?
> Особенность какая-то или я допустил где-то ошибку, либо провайдер?

Об этом нам расскажет tcpdump. =)

Я сталкивался, разбираться в деталях не стал.

можно наверное попробовать strace ping -I eth1 ya.ru
и глянуть чего оно там творит.

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

15. "Маршрутизация и DNAT с двумя провайдерами"  +/
Сообщение от dimawar (ok) on 23-Июл-11, 15:12 
> Об этом нам расскажет tcpdump. =)

вот что он рассказывает:
если выполнять "ping -I eth1 ya.ru", то видны только такие запросы:

19:07:36.985650 arp who-has www.yandex.ru tell xxxxxx.ru

и все.
А если со второго интерфейса "ping -I eth2 ya.ru", то
19:06:52.338591 arp who-has www.yandex.ru tell хххххх.ru
19:06:52.342411 arp reply www.yandex.ru is-at 00:0b:45:b3:01:40 (oui Unknown)
19:06:52.342419 IP хххххх.ru > www.yandex.ru: ICMP echo request, id 3412, seq 1, length 64

почему ARP ответы не приходят? провайдер виноват?

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

16. "Маршрутизация и DNAT с двумя провайдерами"  +/
Сообщение от PavelR (??) on 23-Июл-11, 15:39 
>[оверквотинг удален]
> вот что он рассказывает:
> если выполнять "ping -I eth1 ya.ru", то видны только такие запросы:
>
19:07:36.985650 arp who-has www.yandex.ru tell xxxxxx.ru

> и все.
> А если со второго интерфейса "ping -I eth2 ya.ru", то
>
19:06:52.338591 arp who-has www.yandex.ru tell хххххх.ru 
> 19:06:52.342411 arp reply www.yandex.ru is-at 00:0b:45:b3:01:40 (oui Unknown)
> 19:06:52.342419 IP хххххх.ru > www.yandex.ru: ICMP echo request, id 3412, seq 1,
> length 64

> почему ARP ответы не приходят? провайдер виноват?

Видимо, потому что такой вариант использования (-I eth0) для другого случая. "не делайте так" )
Используйте -I 1.2.3.4 =)

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

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

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




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

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