LINUX.ORG.RU
ФорумAdmin

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


0

1

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

На шлюзе 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.

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

★★★

># 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



если хочешь чтобы работала маршрутизация на уровне меток, то маркировать нужно в цепочке PREROUTING таблицы mangle. и никак иначе :)

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

Продолжение проблемы: условия те же, но нужно соединения от локальных процессов на 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 показывает, что траффик всё равно идёт через первого провайдера :(

Куда копать?

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

Сразу:

ip rule add to 8.8.8.8 lookup vpn
не подходит, там правила отделения трафика более хитрые - не только по назначению, 8.8.8.8 я пробую дл примера

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

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

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