Понадобилось настроить 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
# Сигналом запуска задачи будет поднятие интерфейса ppp8 (L2TP), а также альт. ppp9 (PPTP)
start on net-device-up IFACE=ppp8
#start on net-device-up IFACE=ppp9
Ресурсы
- Порты, используемые программой Ekiga. http://wiki.ekiga.org/index.php/Internet_ports_used_by_Ekiga
Выяснилось, что автоматического прохождения 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
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 комментария:
Здорово! Но есть вопрос: Настроил проброс. С сетки звонить можно, ты не слышишь ни гудка ни голоса, Тебе дозвониться тоже нельзя. Т.Е. в сетку ничего не проходит. Как быть. rtp тоже указаны от 9000:30000 на всякий случай. Как быть? Очень надо.
Если нет звука, то надо ещё и порты RTP пробрасывать, т.к. протокол поддерживает 2 потока (сигнальный и речевой).
Ekiga,NAT - сложная отладка всего этого добра.
Отправить комментарий