LINUX.ORG.RU
ФорумAdmin

2 isp и 2 dnat - голова уже пухнет


0

0

очень прошу помощи в вопросе
http://www.opennet.ru/openforum/vsluhforumID1/69133.html
пост мой.

суть вопроса в следующем

- два провайдера с разными сетями;
- primary mx (серый ip);
- secondary mx (серый ip);
- шлюз с 4-мя интерфейсами

на шлюзе, к которому заведены оба провайдера, smtp трафик пробрасывается с помощью dnat.
правила абсолютно идентичные, за исключением, конечно имен интерфейсов и ip адресов шлюза и ip адресов mx-ов.

первый набор правил работает отлично.
$IPTABLES -t nat -A PREROUTING -i $IF1 -p tcp -d $IP1 --dport $SMTP_PORT -j DNAT --to-destination $MX1_IP

$IPTABLES -A FORWARD -i $IF1 -p tcp -m state --state NEW -d $MX1_IP --dport $SMTP_PORT -j ACCEPT


аналогичное правило для интерфейса второго провайдера ни в какую не хочет тарахтеть.

счетчики цепочек показывают, что dnat отрабатывает, а в правиле форвардинга по нулям.
т.е. меняется адрес назначения, а дальше пакет пропадает.


сделал совсем радикально, в самом начале FORWARD я поставил правило LOG(на все что форвардится со второго интерфейса в локальную сеть) - ни одного пакета.


Маршруты ко всем этим сетям есть.
В чем еще может быть дело, ума не приложу.


Заранее спасибо за советы.

anonymous

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

так и есть iproute2 применяется для настройки маршрутов.

на шлюзе четыре интерфеса.
eth0 - локальная сеть (серые ip)
eth1 - локальная сеть еще одной организации (серые ip)
eth2 - сеть провайдера 1 (реальный ip)
eth3 - сеть провайдера 2 (реальный ip)

маршрутизация посредствам iproute2

1)

provider_net1 - сеть первого провайдера
provider_net2 - сеть второго провайдера

real_ip1 - 1-й реальный ip шлюза
real_ip2 - 2-й реальный ip шлюза

provider_gw1 - шлюз первого провайдера
provider_gw2 - шлюз второго провайдера

/sbin/ip route show

помимо маршрутов на серые сети
.....
provider_net1 dev eth3 proto kernel scope link src real_ip1
provider_net2 dev eth2 proto kernel scope link src real_ip2
...
default via provider_gw2 dev eth2 src real_ip2


2) правила для выбора адреса источника и интерфейса

0: from all lookup local
32764: from real_ip2 lookup T2
32765: from real_ip1 lookup T1
32766: from all lookup main
32767: from all lookup default


3) таблицы T1 и T2

/sbin/ip route show table T1
provider_net1 dev eth3 scope link src real_ip1
default via provider_gw2 dev eth3


/sbin/ip route show table T2
provider_net2 dev eth2 scope link src real_ip2
default via provider_gw1 dev eth2

только что следил за dnat-нутыми пакетами - после действия dnat в prerouting пакет не появляется в forward.

если dnat не делать, в input пакеты замечательно приходят.

странно, что правило для первого провайдера работает, а для второго - нет.
смотрел настройки sysctl для двух интерфейсов - абсолютно одинаковые.


cat /etc/sysctl.conf

.....
net.ipv4.ip_forward = 1

net.ipv4.conf.default.rp_filter = 1

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.icmp_echo_ignore_broadcasts = 0
net.ipv4.icmp_ignore_bogus_error_responses = 0

net.ipv4.ip_local_port_range = 1024 65000

net.ipv4.tcp_rmem=4096 87380 174760
net.core.rmem_max = 110592
net.core.rmem_default = 110592
net.ipv4.tcp_wmem = 4096 16384 131072
net.core.wmem_max = 110592
net.core.wmem_default = 110592

net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.eth1.rp_filter = 1
net.ipv4.conf.eth2.rp_filter = 1
net.ipv4.conf.eth3.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.all.arp_filter = 1
net.ipv4.conf.eth0.arp_filter = 1
net.ipv4.conf.eth1.arp_filter = 1
net.ipv4.conf.eth2.arp_filter = 1
net.ipv4.conf.eth3.arp_filter = 1
net.ipv4.conf.default.arp_filter = 1

net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.eth1.accept_source_route = 0
net.ipv4.conf.eth2.accept_source_route = 0
net.ipv4.conf.eth3.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0


net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth1.accept_redirects = 0
net.ipv4.conf.eth2.accept_redirects = 0
net.ipv4.conf.eth3.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

net.ipv4.conf.eth0.log_martians = 1
net.ipv4.conf.eth1.log_martians = 1
net.ipv4.conf.eth2.log_martians = 1
net.ipv4.conf.eth3.log_martians = 0

net.ipv4.ip_no_pmtu_disc = 0
....

anonymous
()

> $IPTABLES -t nat -A PREROUTING -i $IF1 -p tcp -d $IP1 --dport $SMTP_PORT -j DNAT --to-destination $MX1_IP

> $IPTABLES -A FORWARD -i $IF1 -p tcp -m state --state NEW -d $MX1_IP --dport $SMTP_PORT -j ACCEPT

Скорее уж

IPTABLES -t nat -A PREROUTING -i $IF1 -p tcp -d $IP1 -m state --state NEW --dport $SMTP_PORT -j DNAT --to-destination $MX1_IP

$IPTABLES -A FORWARD -i $IF1 -p tcp -d $MX1_IP --dport $SMTP_PORT -j ACCEPT

$IPTABLES -A FORWARD -i $IF1 -p tcp -s $MX1_IP -m state --state RELATED,ESTABLISHED --sport $SMTP_PORT -j ACCEPT

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

RELATED,ESTABLISHED - у меня выше пропускаются.
понятно что без этого никак.

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

1. Вычистить все! таблицы (и простые, и натовские) и цепочки (ин, аут, форвард, пре/пост-рутинг), правила по-умолчанию поставить акцепт. Дальше свои правила накатывать. Может что-то зависло в цепочках.

2. В начало и в конец всех цепочек добавить по -j LOG --log-prefix "if-table-chain" и искать где оно дропается.

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

цепочки я уже наизусть помню :)
правила там простые довольно.


по счетчикам правило dnat отрабатывает.
в самом начале форварда я ставил LOG, и писал без всяких условий. пакета , который в prerouting-е прошел по dnat в логе нет.
также побовал его метить mark-ом, тоже в forward не наблюдается.

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

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