LinuxForum.Fans
Тема

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

Автор: selivan 8 сообщений 3110 просмотров
#126775

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

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

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

Настройки PROXY:

Интерфейсы:

text

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

Правила роутинга:

text

# 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

Список маршрутов:

text

# 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 и маркировка пакетов):

text

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 в названии загружены:

text

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

Интерфейсы:

text

eth0 10.0.0.68/24
lo 127.0.0.1/8

Список маршрутов:

text

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

text

# ip route del default
# ip route add default via 192.168.1.1 dev eth1

Всё работает, и traceroute на HOST'е показывает, что пакеты идуит через 192.168.1.1.


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

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

На маркировку пакетов забей. Тебе нужно, чтобы было реализовано правило - пакеты приходящие с хоста HOST шли по маршрутам таблицы 100, по дефолту через 192.168.1.1. Вот так и определи её:

text

ip rule add from 10.10.0.68 table 100
ip route add default via 192.168.1.1  table 100

Удивишься, но оно должно заработать :)

#127051

Один хост я сделал для примера на виртуалках, реальные правила сложнее,

text

ip rule add from ...

не прокатит.

Нашёл решение: надо делать маркировку не в FORWARDING, а в PREROUTING, тогда работает :cool:
Правда не понял почему не работает в FORWARDING :o

#127055

а на фига MARK --set-mark 0 ?

#127066
Kettler написал:
а на фига MARK --set-mark 0 ?

Там роутится ещё несколько подсетей с серыми ip - чтобы они через таблицу роутинга main ходили

#127070

понял) а так норм)
Щас по лучше пригляделся к вашему скрипту и понял всё гениальное легко и просто)

#127121
selivan написал:
Один хост я сделал для примера на виртуалках, реальные правила сложнее,
text

ip rule add from ...

не прокатит.

У меня на трех виртуалках, да еще с виртуальными интерфейсами прокатывает на ура. Причем - прокатывает, как на отдачу, так и на прием трафика на сервисы, развернутые на этих виртуальных серверах.

#127141

Cruiser78:
Это пример на виртуалках, а в реале через определённого провайдера должен ходить строго определённый траффик, выбираемый ещё по другим критериям кроме ip, поэтому

text
all from ...

не подходит

Войдите или зарегистрируйтесь, чтобы ответить.