Страницы

понедельник, 26 марта 2012 г.

Microserver SIP port forwarding. Перенаправление портов для Ekiga

Понадобилось настроить SIP клиента на домашнем компьютере.
Выяснилось, что автоматического прохождения NAT не случается, по причине отсутствия UPnP на сервере.
Пришлось действовать по старинке - пробросить порт к клиентскому приложению.
Приложение - Ekiga. Ekiga находится в домашней сети за шлюзом.

SIP протокол использует различные схемы прохождения NAT, но в этом случае не случилось.

5060 - основной порт SIP, сигнальный порт, для установления связи.


Protocols Ports Types Descriptions
SIP 5000 to 5100 UDP SIP signalling, listen port: 5060
STUN 3478 to 3479 UDP Outgoing traffic to the STUN server
H323 1720 TCP H323 listen port

Надо сделать так, чтобы порт 5060 слушался на сервере и перенаправлялся к клиенту.
Помимо этого, надо настроить DHCP-сервер на выдачу всегда одного и того же IP-адреса клиентскому компьютеру, чтобы перенаправление работало.
Выдачу IP-адрес привяжем к mac-адресу сетевой карты домашнего компьютера.
$ sudo stop isc-dhcp-server
$ sudo nano /etc/dhcp/dhcpd.conf
$ sudo start isc-dhcp-server

При редактировании dchpd.conf внесем:

host mir.home {
 option host-name="mir.home";
 hardware ethernet 00:19:00:00:00:00;
 fixed-address 192.168.3.x;
}




Проброс портов осущесвляется с помощью утилиты iptables, в таблице nat, цепочках PREROUTING для входящих пакетов из Интернета и POSTROUTING для исходящих пакетов.
Следующее выражение понимаю так: прибыл пакет, из Интернета, через интерфейс ppp8, на любой порт из диапазона 5000-5100 шлюза, а шлюз возьми да и подмени адрес пакету на адрес внутренней машины и ядро, как ни в чем не бывало, его туда отправляет "роутит". Эту пакость делает DNAT.

$iptables -t nat -A PREROUTING -i ppp8 -p udp -m udp --dport 5000:5100 -j DNAT --to-destination 192.168.3.5



Следующее выражение понимаю так: пакет от внутренней машины, уже содержит глобальный адрес назначения, вот только в адресе отправителя записан внутренний ip-адрес и с ним надо что-то делать, SNAT т.е. менять (nat) адрес отправителя (s - значит source). Правило более уточненное.
$ iptables -t nat -A POSTROUTING -p udp -s 192.168.3.5/32 --dport 5000:5100 -j SNAT --to-source xxx.xxx.xxx.xxx
где, xxx.xxx.xxx.xxx - публичный IP-адрес шлюза

Всё, это хорошо. Оно позволило Ekiga нормально зарегистрироваться, у нее появилась возможность звонка на прямую, по указанному ip-адресу. Но!
Т.к. ip-адрес шлюза динамический и после каждого переподключения связи, он меняется. Соответственно надо менять правила "проброса" портов.
Итак, нужна автоматизация.
Основная трудность - это передача вновь полученного ip-адреса интерфейса ppp8 в скрипт правил, а с этим трудности. Откуда взять ip-адрес?

Создадим две "работы" Upstart (см. в блоге), назовем их ekiga-on.conf, и ekiga-off.conf разместим в /etc/init/
$ sudo nano /etc/init/ekiga-on.conf

author "gimmor.blogspot.com"
description "Проброс портов для SIP-клиента Ekiga"
task


script
echo "Пробрасываем порты для SIP-клиента Ekiga" >> /var/log/syslog
EXTIP=`/sbin/ifconfig ppp8 | grep inet | sed s/^.*addr:// | sed "s/ .*$//"`
iptables -t nat -A PREROUTING -i ppp8 -p udp -m udp --dport 5000:5100 -j DNAT --to-destination 192.168.3.5
iptables -t nat -A POSTROUTING -p udp -s 192.168.3.5/32 --dport 5000:5100 -j SNAT --to-source $EXTIP
end script


# Сигналом запуска задачи будет поднятие интерфейса ppp8 (L2TP), а также альт. ppp9 (PPTP)

start on net-device-up IFACE=ppp8
#start on net-device-up IFACE=ppp9




$ sudo nano /etc/init/ekiga-off.conf

author "gimmor.blogspot.com"
description "Отключение проброса портов для SIP-клиента Ekiga"
task


script
echo "Отключаем порты для SIP-клиента Ekiga" >> /var/log/syslog

EXTIP=`/sbin/ifconfig ppp8 | grep inet | sed s/^.*addr:// | sed "s/ .*$//"`
iptables -t nat -D PREROUTING -i ppp8 -p udp -m udp --dport 5000:5100 -j DNAT --to-destination 192.168.3.5
iptables -t nat -D POSTROUTING -p udp -s 192.168.3.5/32 --dport 5000:5100 -j SNAT --to-source $EXTIP


end script


# Сигналом запуска задачи будет опускание интерфейса ppp8 (L2TP), а также альт. ppp9 (PPTP)

start on net-device-down IFACE=ppp8
#start on net-device-down IFACE=ppp9


Для тестирования в задачах прописать строфу: manual, означающую ручное управление
Задачи рассчитаны только на запуск, остановка не имеет смысла.

В принципе все.




Ресурсы
- Порты, используемые программой Ekiga. http://wiki.ekiga.org/index.php/Internet_ports_used_by_Ekiga


2 комментария:

Jon Harrison комментирует...

Здорово! Но есть вопрос: Настроил проброс. С сетки звонить можно, ты не слышишь ни гудка ни голоса, Тебе дозвониться тоже нельзя. Т.Е. в сетку ничего не проходит. Как быть. rtp тоже указаны от 9000:30000 на всякий случай. Как быть? Очень надо.

Dmitriy комментирует...

Если нет звука, то надо ещё и порты RTP пробрасывать, т.к. протокол поддерживает 2 потока (сигнальный и речевой).
Ekiga,NAT - сложная отладка всего этого добра.