LINUX.ORG.RU
ФорумAdmin

Debian + 2 провайдера на шлюзе, запутался в маршрутизации

 , ,


2

3

Добрый день всем!

Имею шлюз на Debian 8.2, двух провайдеров, локальную сеть и NAT. Второй провайдер используется в качестве резервного (распределение нагрузки не используется).

Для маршрутизации прописываю следующее:

ip route add $out dev eth0 src $out_ip table T1
ip route add default via $out_gate table T1
ip route add $out_res dev eth1 src $out_ip_res table T2
ip route add default via $out_gate_res table T2
ip rule add from $out_ip table T1
ip rule add from $out_ip_res table T2
ip route add default via $out_gate metric 10
ip rule add fwmark 0x1/0x3 table T1
ip rule add fwmark 0x2/0x3 table T2

Все правила для iptables приводить, думаю, не имеет смысла, приведу только имеющие отношение к маршрутизации:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

iptables -t nat -A POSTROUTING -s $local -o $out_int -j MASQUERADE
iptables -t nat -A POSTROUTING -s $local -o $out_int_res -j MASQUERADE

iptables -t mangle -N out-marking
iptables -t mangle -A PREROUTING -m connmark ! --mark 0x0/0x3 -j out-marking
iptables -t mangle -A out-marking -i $local_int -j CONNMARK --restore-mark --mask 0x3
iptables -t mangle -N in-marking
iptables -t mangle -A PREROUTING -m conntrack --ctstate NEW -j in-marking
iptables -t mangle -A in-marking -i $out_int -j CONNMARK --set-xmark 0x1/0x3
iptables -t mangle -A in-marking -i $out_int_res -j CONNMARK --set-xmark 0x2/0x3

iptables -A INPUT -p all -i $local_int -j ACCEPT
iptables -A OUTPUT -p all -o $local_int -j ACCEPT
iptables -A FORWARD -i $local_int -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

Всё прекрасно работает. Пакеты приходят и уходят на правильные интерфейсы. Кроме одного момента - при попытке получить доступ к внешним ip адресам шлюза из локальной сети получаю затык. Сам себя шлюз пингует, с одного провайдера на другого тоже без проблем, а форвардить - никак. Буду благодарен, если подскажете, что куда прописать надобно, я что то уже в тупик зашёл.

Ответ на: комментарий от svr4

Проброс разрешён. Конкретно вот вывод:

net.ipv4.ip_forward = 1
net.ipv4.ip_forward_use_pmtu = 0
eol3000 ()

Детально вчитываться лениво но предполагаю что нужно добавить oif к этим командам ip rule add from $out_ip table T1

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

Да, спасибо, стал отвечать и пускать на себя, но проброс портов не делает. К примеру должен пробрасывать 8080 порт на внутренний сервер, так снаружи работает, а изнутри нет

eol3000 ()
Ответ на: комментарий от anc

Вот таким образом:

iptables -t nat -A PREROUTING --dst $out_ip -p tcp --dport 8080 -j DNAT --to-destination ip_address:8080
iptables -t nat -A PREROUTING --dst $out_ip_res -p tcp --dport 8080 -j DNAT --to-destination ip_address:8080

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

Смотрите, вот здесь у вас указан интерфейс -i $out_int, а для внутреннего трафика он не будет входящим интерфейсом.

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

Неправ, посмотрел только на последнее сообщение :)
Нескромный вопрос, а оно у вас вообще работало? Я к тому что дело совсем не в сабже, если и клиент и кому перенаправлено в одной подсети, то клиент ответ будет получать ответ напрямую, минуя роутер. Если такое надо, маскарадинг поможет.

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

Если вы спрашиваете, работал ли проброс из локальной сети обратно в локальную через шлюз до того, как добавил oif - нет, не работал. Собственно, именно поэтому и поднял тему. Для нас самих этот момент не слишком принципиальный, главное, что снаружи всё работает, но начальство переживает по этому поводу.))

А вот что куда замаскарадить надо - не совсем понял.

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

Смотрите как получается:
Предположим локалка это 192.168.0.0, внешний ip 1.1.1.1, комп в локалке на который переадресует iptables 192.168.0.20.
Клиент в локалке с адреса 192.168.0.30 отправляет запрос на 1.1.1.1:8080 тот переадресует его на 192.168.0.20:8080. Получается 192.168.0.20 получил пакет от адреса 192.168.0.30 который в его же локалке и он отправит ответ напрямую на 192.168.0.30. Вот и вся магия :)
Можно прописать что-то типа такого:
-t nat -A POSTROUTING -s 192.168.0.0/24 -d 192.168.0.20 -p tcp --dport 8080 -j MASQUERADE
Тогда пакеты полетят с ip роутера и будет работать.

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

Да! Спасибо большое за подсказку, всё стало работать. Немного видоизменил правда правило, чтобы пускало с любого адреса на любой и по любым портам. Думаю, не должно на безопасность повлиять:

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 192.168.0.0/24 -j MASQUERADE
eol3000 ()

Порекомендуй плиз где и что почитать по iproute и нескольких провайдеров на одном тазике. Желательно как можно подробней.

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

В гугле по запросу «iproute два/несколько провайдеров». Да даже на этом форуме за последний год полно тем.

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