Вы здесь

[SOLVED] Не отрабатывает действие DNAT в iptables

Приветствую товарищи!
После недавнего обновления системы перестал работать проброс портов. Причем SNAT работает без проблем.
Откатываться не хочется, а просто хочется разобраться в чем же дело...
Скрипт настройки файерволла:
#!/bin/bash
#Clear rules
iptables -F
iptables -t nat -F
#Base rules
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
#Variable
export WAN_IP="212.192.xxx.xxx"
export LAN=eth0
export WAN=eth1
#NAT rules
iptables -A FORWARD -i ${LAN} -s 192.168.1.4 -j ACCEPT
iptables -A FORWARD -i ${WAN} -d 192.168.1.4 -j ACCEPT
iptables -t nat -A POSTROUTING -o ${WAN} -j SNAT --to-source ${WAN_IP}
#Forward ports
iptables -t nat -A PREROUTING -i ${WAN} -p tcp --dport 6884 -j DNAT --to-destination 192.168.1.4
iptables -t nat -A PREROUTING -i ${WAN} -p udp --dport 6884 -j DNAT --to-destination 192.168.1.4
iptables -t nat -A PREROUTING -i ${WAN} -p tcp --dport 80 -j DNAT --to-destination 192.168.1.4
iptables -t nat -A PREROUTING -i ${WAN} -p tcp --dport 8084 -j DNAT --to-destination 192.168.1.4
#Save rules
/etc/init.d/iptables save
/etc/init.d/iptables restart

Во всех источниках, даже вики, все описано точно так же как и у меня, вот только не работает у меня... =(
Помогите разобраться в проблеме.

echo "1" > /proc/sys/net/ipv4/ip_forward

Если человек пишет, что SNAT у него прекрасно работает, то тогда, наверно не в этом проблема ;)

Дайте

# route
# iptables -vL
# iptables -t nat -vL

SUPER pilot # route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
212.192.xxx.128 * 255.255.255.128 U 0 0 0 eth1
192.168.3.0 * 255.255.255.0 U 0 0 0 vlan1
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
loopback * 255.0.0.0 U 0 0 0 lo
default 212.192.xxx.129 0.0.0.0 UG 0 0 0 eth1

SUPER pilot # iptables -vL
Chain INPUT (policy ACCEPT 25M packets, 33G bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
16M 21G ACCEPT all -- eth0 any 192.168.1.4 anywhere
8955K 707M ACCEPT all -- eth1 any anywhere 192.168.1.4

Chain OUTPUT (policy ACCEPT 10M packets, 1100M bytes)
pkts bytes target prot opt in out source destination

SUPER pilot # iptables -t nat -vL
Chain PREROUTING (policy ACCEPT 33M packets, 2473M bytes)
pkts bytes target prot opt in out source destination
766 36852 DNAT tcp -- eth1 any anywhere anywhere tcp dpt:6884 to:192.168.1.4
21 1995 DNAT udp -- eth1 any anywhere anywhere udp dpt:6884 to:192.168.1.4
0 0 DNAT tcp -- eth1 any anywhere anywhere tcp dpt:http to:192.168.1.4
0 0 DNAT tcp -- eth1 any anywhere anywhere tcp dpt:8084 to:192.168.1.4

Chain POSTROUTING (policy ACCEPT 8585K packets, 438M bytes)
pkts bytes target prot opt in out source destination
54416 3139K SNAT all -- any eth1 anywhere anywhere to:212.192.123.254

Chain OUTPUT (policy ACCEPT 4061K packets, 261M bytes)
pkts bytes target prot opt in out source destination

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

—

Если ничего не помогает, прочти наконец инструкцию...

поставьте ferm. очень удобная штука для написания правил. примеры в комплекте есть.

—

P.S.: Linux - это красная таблетка :-) Windows - синяя...

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

—

Если ничего не помогает, прочти наконец инструкцию...

но позволяет это делать УДОБНО.

—

P.S.: Linux - это красная таблетка :-) Windows - синяя...

Я пересобрал ядро (2.6.30-r4) и iptables, но проблемма осталась...
Пробовал поставить самый последний iptables (1.4.4), но все тщетно...

—

Если ничего не помогает, прочти наконец инструкцию...

tcpdump, поднятый на внешнем и внутреннем интерфейсах покажет, доходят пакеты или нет
Недавно с таким столкнулся, оказалось пров начал фильтровать порт 7777, а я на кривой DNAT грешил (был вечер изменения маршрутизации)

tcpdump показывает что проходят только ask пакеты.... state не помогает...

—

Если ничего не помогает, прочти наконец инструкцию...

1 iptables -P FORWARD DROP замените на iptables -P FORWARD ACCEPT, угу, не будет у Вас фаервола, но Вам же проблему надо решить, а потом гайки накрутите.

2 вместо всех 4х правил оставьте только одно и чуть-чуть перепешите его:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.4

Если Вы со своего компа вместо www.ru получите "It works!", значит правило работает :)
Добавьте до:

iptables -t nat -A PREROUTING -p tcp -s ! 192.168.1.0/24 --dport 80 -j DNAT --to-destination 192.168.1.4

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

PS. Да, и главное забыл, ПЕРЕД Вашим правилом поставьте:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j LOG --log-prefix "prerouting:"
Вам будет видно что попало под Ваше условие.

—

Ёж птица гордая - пока не пнешь, не полетит!

Решил проблему самым необычным способом... Оказалось, что это мой провайдер вдруг закрыл мне входящие соединения... Короче все заработало.
Вот оптимальные правила для корректного проброса порта:
iptables -t nat -A PREROUTING --dst 212.192.xxx.xxx -p tcp --dport 6884 -j DNAT --to-destination 192.168.1.4
iptables -t nat -A POSTROUTING --dst 192.168.1.4 -p tcp --dport 6884 -j SNAT --to-source 192.168.1.1
iptables -t nat -A OUTPUT --dst 212.192.xxx.xxx -p tcp --dport 6884 -j DNAT --to-destination 192.168.1.4

Всем спасибо за помощь!

—

Если ничего не помогает, прочти наконец инструкцию...