Как использовать 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 для разрешения динамических портов.

1 ответ

Решение

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

Прежде всего, 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;

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

Другие вопросы по тегам