Назад | Перейти на главную страницу

Как использовать conntrack для разрешения SIP-трафика

У меня следующая проблема:

Device (eth0)----> SWITCH(trunk)+VLAN120 ---> (PC1)
                                +VLAN200 ---> (PC2)

Я могу выполнить эхо-запрос с ПК1 на ПК2, которые находятся в разных подсетях, как указано выше: Использование правил NAT в iptables, как показано ниже, поскольку они находятся в разных подсетях

iptables -t nat -A POSTROUTING -o eth0.120 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0.200 -j MASQUERADE

iptables -I FORWARD -i eth0.120 -o eth0.200 -p udp -m udp --dport 5060 -j ACCEPT
iptables -I FORWARD -i eth0.200 -o eth0.120 -p udp -m udp --dport 5060 -j ACCEPT
iptables -A FORWARD -j DROP  ---> This drops rest of the traffic.

БЕЗ последнего правила DROP в цепочке FORWARD мне удалось установить SIP-соединение.

Однако, поскольку я добавил правило DROP для исключения другого трафика, я не могу установить SIP-соединение.

Это означает, что есть другие порты, через которые общаются клиент и сервер. В дампе tcp указано 8000, иногда 5435. Этот другой порт меняется каждый раз.

Итак, я прочитал, что шлюз уровня приложения может помочь в решении этой проблемы.

Как я могу использовать ALG с iptables для разрешения динамических портов.

поэтому мне удалось заставить это работать:

Во-первых, NAT не требуется, как предлагает Майкл.

Теперь, чтобы разрешить SIP на порту 5060, я использовал следующие правила:

iptables -D FORWARD -j delegate_forward;

iptables -D FORWARD -j DROP
iptables -I FORWARD -i eth0.120 -o eth0.200 -m state --state RELATED,ESTABLISHED -j ACCEPT;
iptables -I FORWARD -i eth0.200 -o eth0.120 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD -i eth0.120 -o eth0.200 -p tcp --dport 5060 -m state --state NEW -j ACCEPT;
iptables -I FORWARD -i eth0.200 -o eth0.120 -p tcp --dport 5060 -m state --state NEW -j ACCEPT;

iptables -A FORWARD -i eth0.120 -o eth0.200 -p icmp -j ACCEPT;
iptables -A FORWARD -i eth0.200 -o eth0.120 -p icmp -j ACCEPT;

iptables -A FORWARD -j DROP;

И это работает.