LINUX.ORG.RU
решено ФорумAdmin

2 провайдера + nat + проброс портов


1

2

Добрый день. Столкнулся с небольшой проблемой. Тема уже поднималась и неоднократно, однако я не вижу способа побороть проблему. Прочитал http://www.opennet.ru/docs/RUS/LARTC/ не помогло(( Имею шлюз со статическими ip-адресами от двух различных провайдеров и один интерфейс для локальной сети. Внутри локальной сети имеется сервер который надо опубликовать наружу через 2-х провайдеров. Написал скрипт для изменения маршрутов:

#!/bin/env bash

# Интерфейс внутренней сети 
IP_LOCAL="a.a.a.15"
IF_LOCAL="eth0"
NET_LOCAL="a.a.a.0/24"

# Интерфейс внешней сети от провайдера 1
IP_INET1="x.x.x.157"
IF_INET1="eth1"
NET_INET1="x.x.x.152/29"
GW1="x.x.x.153"

# Интерфейс внешней сети от провайдера 2
IP_INET2="y.y.y.180"
IF_INET2="eth3"
NET_INET2="y.y.y.176/28"
GW2="y.y.y.177"

ip route flush table P1 
ip route flush table P2
ip rule delete table P1
ip rule delete table P2

ip route add $NET_INET1 dev $IF_INET1 src $IP_INET1 table P1
ip route add $NET_LOCAL dev $IF_LOCAL table P1
ip route add $NET_INET2 dev $IF_INET2 table P1
ip route add 127.0.0.0/8 dev lo table P1
ip route add default via $GW1 table P1

ip route add $NET_INET2 dev $IF_INET2 src $IP_INET2 table P2
ip route add $NET_LOCAL dev $IF_LOCAL table P2
ip route add $NET_INET1 dev $IF_INET1 table P2
ip route add 127.0.0.0/8 dev lo table P2
ip route add default via $GW2 table P2

ip route del default
ip route add default via $GW2

ip rule add from $IP_INET1 table P1
ip rule add from $IP_INET2 table P2

ip route flush cache
В iptables: iptables -t nat -A PREROUTING -d $IP_INET1 -p tcp --dport 443 -j DNAT --to-destination a.a.a.5:443

iptables -t nat -A PREROUTING -d $IP_INET2 -p tcp --dport 443 -j DNAT --to-destination a.a.a.5:443

Внутренний ресурс доступен только с первого провайдера

недавно настраивал такую штуку, завелось после добавления CONNMARK в iptables. на входе на внешних интерфейсах выставляете марки, далее по этим маркам раскидываете трафик по таблицам маршрутизации. на входе локалки эти марки восстанавливаете.

выглядит это так:

iptables -t mangle -A PREROUTING -i $EXT_IF1 -p tcp --dst $EXT_IP1 -m state --state NEW,RELATED -j CONNMARK --set-mark 10
iptables -t mangle -A PREROUTING -i $EXT_IF2 -p tcp --dst $EXT_IP2 -m state --state NEW,RELATED -j CONNMARK --set-mark 11
iptables -t mangle -A PREROUTING -i $INT_IF -m state --state ESTABLISHED -j CONNMARK --restore-mark

в скрипте настройки роутинга добавить:

ip rule add iif $IF0 fwmark 10 table $TBL1
ip rule add iif $IF0 fwmark 11 table $TBL2

после этого пакеты забегали как надо

Apollyon ()
ip route flush cache

Так уже не нужно.. нету кэшей маршрутов начиная с Linux 3.6...

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

Добавил к себе в конфиг выше, Изменил синтаксис, так как вместо state надо делать conntrack + ctstate. Оставил проброс портов через DNAT. Все равно где-то косяк.

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

Запустите на всех трёх интерфейсах tcpdump и смотрите, что происходит с пакетом, приходящим от второго провайдера. Когда будет понятно, теряется ли пакет или уходит не туда, тогда и можно думать, а так может быть что угодно, может пакет не пускает провайдер, может грохает rp_filter.

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

mky ★★★★★ ()

а нельзя ли в данном случае rinetd заюзать?

Komintern ★★★★★ ()

Оффтоп

Я очень извиняюсь, но, случайно, здесь кто-нибудь знает как сделать тоже самое, только с DDwrt или OpenWrt?

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

Есть ли какие-либо другие способы проверки через какие цепочки и таблицы идет трафик? А то я уже себе всю голову сломал как пробросить эти чертовы порты *(

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

Если вам нужно смотреть, как пакет идёт по цепочкам iptables, то "-j TRACE", правда, там нужны дополнительные движения: http://serverfault.com/questions/385937/how-to-enable-iptables-trace-target-o... .

Но, я говорил про tcpdump именно с целью определения, что пакеты есть, именно чтобы определиться, что проблема именно в linux-маршрутизаторе, а не где-то ещё.

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

Проблема именно в маршрутизации. Решил вставить rp_filter = 2 для всех интерфейсов. После этого заработало. Это нормально или все же нет?

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

Разумеется, общеизвестно, что сложная маршрутизация и rp_filter =1 вещи не совместимые. Лично я вобще отключаю (rp_filter = 0), ИМХО, если уж очень захочется проверять src-адрес входящих пакетов, лучше делать это правилами iptables, может это и не так эффективно, зато правила прописаны в явном виде и у них есть счётчики срабатываний.

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