Проблема: iproute2 и подключение через двух провайдеров

Есть и такой ОС.

Модератор: weec

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
selivan
проходил мимо
Сообщения: 7
Зарегистрирован: 2011-01-26 21:16:22

Проблема: iproute2 и подключение через двух провайдеров

Непрочитанное сообщение selivan » 2011-02-08 19:48:01

Реальные конфиги очень большие и тяжёлые, поэтому смоделировал проблему на виртуалках и пробую решить её там.

На шлюзе PROXY есть два подключения к интернету: eth1 и eth2. В качестве PROXY использовались Debian Lenny и CentOS 5.5, результат одинаковый.

Задача: выпускать компьютер HOST(10.10.0.68) в интернет через второе подключение, остальные компьютеры - через первое.

Настройки PROXY:

Интерфейсы:

Код: Выделить всё

lo 127.0.0.1/8
eth0 10.10.0.2/24     # локальная сеть
eth1 192.168.1.252/24 # провайдер, default gw 192.168.1.1
eth2 10.0.0.61/24     # провайдер, default gw 10.0.0.2
Правила роутинга:

Код: Выделить всё

# ip rule list
0:    from all lookup 255
100:    from all fwmark 0x2 lookup 100
32766:    from all lookup main
32767:    from all lookup default
Список маршрутов:

Код: Выделить всё

# ip route list
10.0.0.0/24 dev eth2 proto kernel scope link src 10.0.0.61 # интерфейс в интернет
92.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.252
10.10.0.0/24 dev eth0 proto kernel scope link src 10.10.0.2
default via 10.0.0.2 dev eth2

# ip route list table 100
192.168.1.0/24 dev eth1 scope link src 192.168.1.252
default via 192.168.1.1 dev eth1
Настройка iptables(SNAT и маркировка пакетов):

Код: Выделить всё

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

# NAT
# выпускаем локалку в интернет
iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o eth2 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o eth1 -j MASQUERADE

# ROUTING

ip route flush table 100
ip route add 192.168.1.0/24 dev eth1 src 192.168.1.252 table 100
ip route add default via 192.168.1.1  dev eth1 table 100

ip rule del pri 100
ip rule add fwmark 2 lookup 100 pri 100

# MARK RULES
iptables -t mangle -A FORWARD -s 10.10.0.68 -j MARK --set-mark 2
iptables -t mangle -A FORWARD -s 10.10.0.68 -d 127.0.0.0/8 -j MARK --set-mark 0
iptables -t mangle -A FORWARD -s 10.10.0.68 -d 10.0.0.0/8 -j MARK --set-mark 0
iptables -t mangle -A FORWARD -s 10.10.0.68 -d 192.168.0.0/16 -j MARK --set-mark 0
iptables -t mangle -A FORWARD -s 10.10.0.68 -d 172.16.0.0/12 -j MARK --set-mark 0

# COUNT RULES
iptables -t mangle -A POSTROUTING -m mark --mark 2 -j ACCEPT

ip route flush cache
Последнее правило заведено для проверки работы маркировки. Действительно, при прохождении пакета на внешние хосты его счётчик увеличивается, то есть маркировка выставлется верно.

Все возможные модули со словом mark в названии загружены:

Код: Выделить всё

#lsmod | grep -i mark
xt_connmark             6209  0
xt_CONNMARK             6465  0
xt_CONNSECMARK          6465  0
xt_SECMARK              6852  0
xt_mark                 5953  1
xt_MARK                 6465  5
ip_conntrack           53281  8 xt_connmark,xt_CONNMARK,xt_CONNSECMARK,ipt_MASQUERADE,iptable_nat,ip_nat,ip_conntrack_netbios_ns,xt_state
x_tables               17349  14 xt_connmark,xt_CONNMARK,xt_CONNSECMARK,xt_SECMARK,xt_mark,xt_MARK,ipt_MASQUERADE,iptable_nat,ipt_REJECT,xt_state,ip_tables,ip6t_REJECT,xt_tcpudp,ip6_tables

Настройки HOST(10.10.0.68):

Интерфейсы:

Код: Выделить всё

eth0 10.0.0.68/24
lo 127.0.0.1/8
Список маршрутов:

Код: Выделить всё

#ip rule list
0:    from all lookup 255
32766:    from all lookup main
32767:    from all lookup default
Проверяем - не работает:

Запуск traceroute на HOST показывает, что трафик до 8.8.8.8(гуглёвский бесплатный DNS) всё равно идёт через 10.10.0.2 и потом 10.0.0.2, то есть через первого провайдера.

Проверяем работу второго провайдера:

Меняем на PROXY маршрут по-умолчанию на 192.168.1.1:

Код: Выделить всё

# ip route del default
# ip route add default via 192.168.1.1 dev eth1
Всё работает, и traceroute на HOST'е показывает, что пакеты идуит через 192.168.1.1.


В чём может быть проблема? Весь гуг облазил - вроде всё правильно. :( :( *смайлик, бьющийся головой об стену*

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

blade_007
ст. прапорщик
Сообщения: 571
Зарегистрирован: 2010-03-12 12:59:08
Контактная информация:

Re: Проблема: iproute2 и подключение через двух провайдеров

Непрочитанное сообщение blade_007 » 2011-02-08 20:36:35

ip rule add from IP_TO_PROV2 table 100

blade_007
ст. прапорщик
Сообщения: 571
Зарегистрирован: 2010-03-12 12:59:08
Контактная информация:

Re: Проблема: iproute2 и подключение через двух провайдеров

Непрочитанное сообщение blade_007 » 2011-02-08 20:48:02

также добавить
ip route add 10.10.0.0/24 dev eth0 table 100

blade_007
ст. прапорщик
Сообщения: 571
Зарегистрирован: 2010-03-12 12:59:08
Контактная информация:

Re: Проблема: iproute2 и подключение через двух провайдеров

Непрочитанное сообщение blade_007 » 2011-02-08 21:03:02

маркировать пакеты только от нужного вам хоста, также лучше это делать в цепочке PREROUTING.

selivan
проходил мимо
Сообщения: 7
Зарегистрирован: 2011-01-26 21:16:22

Re: Проблема: iproute2 и подключение через двух провайдеров

Непрочитанное сообщение selivan » 2011-02-09 12:24:57

Код: Выделить всё

ip rule add from IP_TO_PROV2 table 100
не совсем то, один хост я взял для примера на виртуалках, реальные правила сложнее.
А вот про маркировку в PREROUTING всё правильно. Теперь работает :Yahoo!: Спасибо :)

З.Ы. Интересно, почему не работает маркировка в FORWARD? Ведь потом есть ещё один routing decision:
Вложения
tables_traverse.jpg

selivan
проходил мимо
Сообщения: 7
Зарегистрирован: 2011-01-26 21:16:22

Re: Проблема: iproute2 и подключение через двух провайдеров

Непрочитанное сообщение selivan » 2011-02-09 16:57:41

Продолжение проблемы: условия те же, но нужно соединения от локальных процессов на PROXY к некоторым хостам пускать через второго провайдера. Для примера пусть это будет тот же гуглёвский DNS 8.8.8.8. Показываю настройки реальной машины, на виртуалке это работает.

Настройки:

Код: Выделить всё

#ip route list
... 
...
...                          # тут куча всего, не суть дело важно
default dev ppp0  scope link # первый провайдер

#ip route list table vpn
192.168.1.0/24 dev tap0  scope link  src 192.168.1.252
default via 192.168.1.1 dev tap0  # второй провайдер

#ip rule list
0:      from all lookup local
100:    from all fwmark 0x1 lookup vpn
32766:  from all lookup main
32767:  from all lookup default

#iptables -t mangle -A OUTPUT -d 8.8.8.8/32 -j MARK --set-mark 1

#ip route flush cache
traceroute до 8.8.8.8 показывает, что траффик всё равно идёт через первого провайдера

Куда копать? :st:

blade_007
ст. прапорщик
Сообщения: 571
Зарегистрирован: 2010-03-12 12:59:08
Контактная информация:

Re: Проблема: iproute2 и подключение через двух провайдеров

Непрочитанное сообщение blade_007 » 2011-02-09 18:24:25

ip route add 127.0.0.1/8 dev lo в таблицу vpn
добавьте в таблицу default ip route 8.8.8.8/32 via PROV2
Здесь идет роутинг сначала, а потом маркировка

selivan
проходил мимо
Сообщения: 7
Зарегистрирован: 2011-01-26 21:16:22

Re: Проблема: iproute2 и подключение через двух провайдеров

Непрочитанное сообщение selivan » 2011-02-10 12:25:41

Заработало :Yahoo!: Даже в моём варианте, но tracert почему-то прокидывает один хост при трассировке с PROXY, хотя трассировка с компов локальной сети идёт как надо. Видимо, какие-то хитрости TTL

Спасибо :)