Всем доброго времени суток!
Ещё раз извиняюсь перед модераторами, за создание новой темы после сбоя 6.11.2015, не заметил.
И так, проблема: непонятки с iptables и DNAT.
В Linux я до сих пор многое не понимаю. Столкнулся со странной проблемой.
Система Debian Wheezy i386. Хост является шлюзом пользователей в интернет.
Для начала вводные данные:
в интернет смотрит - eth0, в локалку - eth1
на интернет интерфейсе внешний ip-адрес, назовём его: xxx.xxx.xxx.xxx
на внутреннем интерфейсе адрес: 192.168.1.1
В локалке есть АТС, у которой ip-адрес управляющего модуля: 192.168.5.55, адрес voip-платы: 192.168.5.56
В области интернета есть некий ip:
www.www.www.www, который является voip-шлюзом провайдера телефонии.
Для корректного выхода в город, АТС использует UDP порт 5588 и ещё целую кучу разных UDP портов + небольшая пачка TCP портов.
В iptables было прописано DNAT правило:
iptables -t nat -I PREROUTING -i eth0 -s
www.www.www.www -d xxx.xxx.xxx.xxx -p udp -m multiport --dport 5588 -j DNAT --to-destination 192.168.5.56
iptables -I FORWARD -i eth0 -s
www.www.www.www -d 192.168.5.56 -p udp -m multiport --dport 5588 -j ACCEPT
iptables -I FORWARD -i eth1 -s 192.168.5.56 -d
www.www.www.www -p udp -m multiport --sport 5588 -j ACCEPT
Всё работало хорошо, пока в один прекрасный момент, в офисе не отрубился выход в город.
В ходе разбирательств, провайдер попросил перенаправить порт 5588 с 192.168.5.56 на 192.168.5.55
В связи с чем, было удалено предыдущее правило с помощью "iptables -t nat -D PREROUTING <номер_правила>" и вместо него
было написано:
iptables -t nat -I PREROUTING -i eth0 -s
www.www.www.www -d xxx.xxx.xxx.xxx -p udp -m multiport --dport 5588 -j DNAT --to-destination 192.168.5.55
а так же были добавлены соответствующие форвардинги.
И случилась очень странная штука:
Делаю "tcpdump -i eth1 -n port 5588", и вижу постоянные повторения следующей картины:
13:51:25.722436 IP
www.www.www.www.5588 > 192.168.5.56.5588: UDP, length 36
13:51:25.962251 IP 192.168.5.56.5588 >
www.www.www.www.5588: UDP, length 36
посмотрел "netstat-nat -Nn | grep 5588":
udp
www.www.www.www:5588 xxx.xxx.xxx.xxx:5588 192.168.5.56:5588 ASSURED
очень странно, до сих пор 5.56...
посмотрел "cat /proc/net/ip_conntrack | grep 5588":
udp 17 177 src=www.www.www.www dst=xxx.xxx.xxx.xxx sport=5588 dport=5588 src=192.168.5.56 dst=www.www.www.www sport=5588 dport=5588 [ASSURED] mark=0 use=2
Почему на 5.56, когда уже прописано на 5.55?
перепроверил себя, посмотрел "iptables -t nat -L -n -v | grep 5588":
0 0 DNAT udp -- eth0 *
www.www.www.www xxx.xxx.xxx.xxx multiport dports 5588 to:192.168.5.55
Всё правильно в таблице iptables, стоит нужный нам 5.55, других правил DNAT с портом 5588 или с перекрывающими диапазонами адресов или портов в таблице нет.
Гуглил на тему: "Как удалить залипший DNAT маппинг портов?", но что-то пока ничего не нашёл.
Всё везде указывает на то, что при применении правил iptables, всё само где надо отваливается и всё самое где надо добавляется.
Банальное echo 0 > /proc/net/ip_conntrack пишет "write error: Input/output error"
Как делать специально Flush для этой таблицы - не знаю к сожалению.
Инет-шлюзу ребут сделать проблематично, т.к. очень много людей через него работают.
В общем, вопрос: Залип DNAT-маппинг? Как такое может быть? Как уничтожить в памяти этот залипший маппинг? Или я чего-то не понимаю? Может это баги ядра в Debian 7.1 i386? Система давно не обновлялась.