Tania telefonia internetowa VoIP w domu i firmie

in

Wykorzystując remont mieszkania postanowiłem rozwiązać kwestię telefonu, który do tej pory generował mi spore koszty ze względu na dużą liczbę rozmów międzynarodowych, zwłaszcza do Rosji oraz Europy Zachodniej. Założenia, którymi się posługiwałem wyglądały tak:

  • standardowe abonamenty w TPSA są dla mnie nie do zaakceptowania bo rozmowy międzynarodowe są drogie; przykład cen TPSA do krajów do których czasem dzwonię - Rosja 2 zł/min, Niemcy 1,50 zł/min, USA, Emiraty Arabskie 4,22 zł/min,
  • na koszty rozmów muszę mieć fakturę, najchętniej polską fakturę VAT,
  • muszę mieć możliwość korzystania ze zwykłego telefonu ze słuchawką, najchętniej bezprzewodowego, telefony USB i przywiązanie telefonu do komputera jest dla mnie niewygodne,
  • muszę mieć faks, ale niekoniecznie w sensie fizycznego urządzenia.

Chello/UPC

Dostęp do Internetu mam przez głównego dostawcę w okolicy czyli Chello/UPC. Mam wykupione Chello Classic 2048/384 kbit plus kablówkę za 170 zł brutto miesięcznie. Jest to znacznie więcej niż potrzeba dla VoIP. Dla zwykłego dostępu do sieci i telefonu wystarczyłoby Chello Easy 256/64 za 69 zł bez kablówki. Ale ja ze względu na specyfikę pracy mam większe potrzeby.

<

p>

Skype

Skype ma ceny do Rosji prawie trzykrotnie niższe niż IPFON. Ale tę zaletę niestety przeważają następujące wady:

  • Skype nie korzysta z SIP, tylko z własnego protokołu, który jest trudny do kontrolowania, choćby w celu zapewnienia priorytetów,
  • całe Skype jest programem dziwnym, zaciemnionym i robiącym pewne rzeczy w sposób niejawny[1]
  • do Skype nie mogę podłączyć telefonu bezprzewodowego, bo nie ma tanich bramek Skype-telefon,
  • Skype jest nierozłącznie związane z pecetem,
  • ze Skype nie dostanę polskiej faktury VAT.

W rezultacie rozważenia tych argumentów ze Skype zrezygnowłem praktycznie całkowicie. Zaciemnionym protokołom dziękujemy.

<

p>

IPFON

W rezultacie długiego przeszukiwania polskiego rynku znalazłem firmę IPFON[2], która sprzedaje cały wachlarz usług VoIP, włącznie z numerami stacjonarnymi, VoIP, IVR itd. Zalety IPFON z mojego punktu widzenia:

  • bardzo niskie ceny połączeń do krajów, do których dzwonię - Niemcy 0,11 zł/min, Rosja 0,48 zł/min, USA 0,11 zł/min, Emiraty 1,38 zł/min
  • standardowe protokoły SIP/STUN, co umożliwiło mi skorzystanie z dowolnej, taniej bramki VoIP do podłączenia stacjonarnej słuchawki bezprzewodowej,
  • jakość połączeń nieodróżnialna od telefonu TPSA,
  • faktury VAT,
  • numer stacjonarny w krakowskiej strefie,
  • numer faksu w strefie krakowskiej - przychodzi emailem, możliwe wysyłanie przez panel webowy,
  • nie trzeba podpisywać umów, system rozliczeń pre-paid,
  • dostępna usługa dialup - wdzwaniam się z z komórki na krakowski numer i dzwonię na świat ze swojego konta w IPFON,
  • normalna obsługa telefonu alarmowego (112) z podaniem lokalizacji,
  • dobry webowy panel do zarządzania usługami.

Usługi IPFON najpierw intensywnie przetestowałem klientem software'owym, dostępnym za darmo. Później zasiliłem konto 10 zł i przetestowałem na realnych połączeniach. Po sprawdzeniu, że wszystko gra zdecydowałem się ostatecznie na IPFON i przeszedłem do dalszej rozbudowy.

<

p>

Inni operatorzy

Przed wybraniem IPFON znalazłem:

Obaj mieli oferty skierowane do innego profilu klienta niż ja, więc z nich zrezygnowałem. Inni polscy operatorzy, których nie testowałem, ale zapewne przetestuję:

Poniżej strony porównujące różnych operatorów:

<

p>

IPFON w domu

Podstawowym elementem mojego domowego telefonu jest bramka SIP - Linksys/Sipura SPA 1001, kupiona od IPFON[3] za ok. 220 zł brutto. Urządzenie ma dwa porty - Ethernet do sieci i RJ11 do telefonu.

Przyszło prekonfigurowane pod IPFON (konto SIP), ale konfiguracja ustawień IP jest trywialna - albo ręcznie przez klawiaturę telefonu, albo przez DHCP, a potem wszystko przez WWW. W środku jest oprogramowanie SipuraSPA[4] z bardzo dużą ilością parametrów, podstawowe co trzeba ustawić to dane bramki SIP czyli dane serwera IPFON.

Po włączeniu do sieci i podniesieniu słuchawki telefonu usłyszałem sygnał i miałem działający telefon, bramka rejestruje się przez SIP momentalnie. Pierwsze rozmowy też zrobiły na mnie bardzo dobre wrażenie - pełna prezentacja numeru w obie strony (stacjonarnego na komórkę i komórki na stacjonarny), jakość połączenia bez echa, opóźnień i innych zjawisk o które podejrzewa się zwykle VoIP.

Testowo zmieniłem kodek na G.711a i jakość jest bardzo dobra, więc tak zostawiłem.

Od tej pory mogłem normalnie dzwonić za granicę i po Polsce z bezprzewodowej słuchawki podłączonej do Sipury schowanej z routerem na pawlaczu. Pełny dostęp faktur, billingów przez panel webowy. Aktywowałem również usługę faksu i sprawdziłem, że odbieranie działa bardzo szybko (faks przychodzi emailem jako PDF).

<

p>

Aviaa PABX

Wkrótce potem - jako dziennikarz IDG - otrzymałem od PR firmy Aviaa[5] reklamę ich nowej usługi internetowej centrali Aviaa PABX[6]. Usługa z opisu świetna, oparta o open-source soft centralowy Asterisk.

W skrócie pozwala połączyć duża liczbę kont SIP i zbudować z nich centralę telefoniczną. Zastosowania ogranicza tylko wyobraźnia projektanta, ale na ile to rozumiem chodzi o to, żeby pod jednym numerem stacjonarnym i dowolną liczbą numerów wewnętrznych było dostępnych kilkaset osób podłączonych w całym kraju po SIP. Plus IVR, plus poczta głosowa i mnóstwo innych rozszerzeń. PABX za darmo, support płatny - model biznesowy, który cenię od lat.

Bardzo ciekawa usługa, w Usenecie podpowiedziano mi wykorzystanie jej do zrobienia taniego połączenia zwrotnego - np. uruchomienia lokalnego numeru dla ludzi w Rosji do taniego dzwonienia do mnie, pod warunkiem znalezienia tam odpowiedniego operatora.

<

p>

VoipDiscount

VoipDiscount[7] to operator SIP, który oferuje tanie rozmowy na cały świat. I tutaj uwaga - do Rosji i paru innych krajów - za darmo. Nie wiem jak im się to opłaca, ale to nie mój problem.

Tutaj wychodzi ukryta dla mnie dotychczas zaleta Sipury SPA 1001, która pozwala na zarejestrowanie dwóch operatorów SIP i swobodne przełączanie między nimi ze słuchawki telefonu (haszem). Założyłem konto i przetestowałem połączenia VoipDiscount za pomocą klienta software'owego. Były zadowalające, co mogłem przetestować praktycznie bo VoipDiscount pozwala wykonać za darmo 1 min połączenie do Rosji i innych darmowych krajów. Żeby dzwonić bez ograniczeń, trzeba zasilić konto min. 10 euro.

Zatem do konfiguracji Sipury dopisałem dane serwerów SIP VoipDiscount i bramka znowu momentalnie się zarejestrowała. Po wciśnięciu na słuchawce hasza (zmiana operatora) dostałem sygnał od VoipDiscount. I faktycznie, telefon do Rosji poszedł przez VoipDiscount za darmo. Innymi słowy po początkowym zasileniu konta 10 euro mogę dzwonić za darmo bez ograniczeń. Konto trzeba zasilać co trzy miesiące, ale i tak się w moim przypadku opłaca bo 10 euro schodzą w tym czasie np. na połączenia na telefony komórkowe, które są tanie ale nie darmowe.

Brak 112 i numeru stacjonarnego powoduje, że wykorzystanie go jako jedynego numeru domowego mija się z celem, ale za to mogę teraz dzwonić ze zwykłej słuchawki do darmowych krajów po prostu wybierając przed numerem hasz - co przełącza mnie z IPFON na VoipDiscount.

<

p>

QoS dla VoIP

VoIP działa bardzo dobrze na łączu, z którego nikt nie korzysta. W momencie zapuszczenia w domowej sieci testowych sesji eMule, BitTorrenta i FTP połączenia telefonicznie oczywiście siadają.

Ze względu na asymetryczny kanał i stosunkowo wąskie wyjście, w momencie gdy wysyłam coś po FTP lub ktoś zaciąga plik po eMule/Torrencie do typowych objawów należała sytuacja, w której ja rozmówcę słyszałem świetnie, ale on krzyczał "co?! ja pana w ogóle nie rozumiem!!!". Od niego do mnie szło dobrze, ale ode mnie do niego ruch był przytykany na wąskim wyjściu.

Objaw ten był dla mnie normalną konsekwencją łączenia telefonu i Internetu na jednym łączu, więc byłem przygotowany do jego rozwiązania. Router mam postawiony na archaicznym AMD 300 MHz i na OpenBSD 3.9[8]. System ten zawsze pociągał mnie kompletnością manuali i brakiem różnych bzdurek przy prawie 100% obecności tego co jest potrzebne na routerze. Zwłaszcza podoba mi się implementacja traffic-shapingu altq[9], którą - w przeciwieństwie do linuksowego tc - da się skonfigurować po jednorazowym przeczytaniu manuala.

W chwili obecnej altq na routerze mam skonfigurowane tylko na interfejsie zewnętrznym (do Internetu) w ten sposób, że każdy ruch z Sipury (po adresie IP) ma absolutny priorytet nad każdym innym ruchem. Takie absolutne wymuszanie priorytetu, bez żadnych burstów, pożyczania itd, robi kolejka priq[10].

Poniżej fragment /etc/pf.ctl, który to robi. Proszę zauważyć, że wyjściowe bandwidth jest ustawione na trochę mniej, niż obiecywane przez UPC (384kbit), co ma zapobiegać kolejkowaniu na modemie UPC po mojej stronie. Poniżej pominięte są dodatkowe regułki filtra pakietów, NAT itd. Maszyna optimus to siedlisko P2P, bramka VoIP jest podpięta jako jedyne urządzenie na interfejsie $sip_if - powód jest taki, że wszystko inne mam podpięte po WLAN, a to jest jedyny interfejs LAN z fizycznym kablem. Jak widać, jest też zrobione kolejkowanie innych interaktywnych usług takich jak komunikatory i SSH, natomiast P2P jest zepchnięte do absolutnie najniższej kolejki.

# tutaj podpinamy kolejkę pod interfejs wyjściowy deklarując kanały PRIQ
altq on $ext_if priq bandwidth 370Kb queue { std_out, ssh_im_out, dns_out, tcp_ack_out, p2p, voip }
block log

# tutaj przypisujemy kanałom PRIQ konkretne priorytety (im wyższy, tym ważniejszy ruch)
queue p2p priority 0 priq(red)
queue std_out priority 1 priq(default) # 1 to priorytet domyślny ale napisałem to wprost
queue ssh_im_out priority 4 priq(red)
queue dns_out priority 5
queue tcp_ack_out priority 6
queue voip priority 10

# a tutaj przypisujemy poszczególnym klasom ruchu konkretne kolejki, wykorzystując stateful
# inspection oraz znakowanie (tag) pakietów
p2p_srv="{ 50600 50700 50900 }"
pass in on $ext_if proto tcp from any to ($ext_if) port ssh flags S/SA keep state queue(ssh_im_out)
pass in on $ext_if proto tcp from any to ($ext_if) port www flags S/SA keep state
pass in on $ext_if proto tcp from any to ($ext_if) port $p2p_srv flags S/SA keep state tag P2P
pass in on $ext_if proto udp from any to ($ext_if) port $p2p_srv keep state tag P2P

pass in on $int_if inet proto { tcp udp icmp } all keep state
pass in on $int_if inet proto { tcp udp icmp } from optimus to any keep state tag P2P
pass in on $sip_if inet proto { tcp udp icmp } all keep state tag VOIP
pass out on $ext_if inet proto { tcp udp icmp } all keep state
pass out on $ext_if inet proto { tcp udp } all tagged P2P keep state queue(p2p)
pass out on $ext_if inet proto { tcp udp } all tagged VOIP keep state queue(voip)
pass out on $int_if inet proto { tcp udp icmp } all keep state
pass out on $sip_if inet proto { tcp udp icmp } all keep state

pass out on $ext_if inet proto tcp all flags S/SA keep state queue(std_out, tcp_ack_out)
pass out on $ext_if inet proto { tcp udp } from any to any port domain keep state queue dns_out
pass out on $ext_if inet proto tcp from any to any port ssh flags S/SA keep state queue(std_out, ssh_im_out)
pass out on $ext_if inet proto tcp from any to any port $im_ports flags S/SA keep state queue(ssh_im_out, tcp_ack_out)

<

p>

Rezultat jest taki, że natychmiast w momencie wykręcenia numeru na telefonie wypełnia się kolejka VoIP, natomiast upload P2P - co widać po wykresie w eMule - spada. Na snifferze widać ruch VoIP i pojedyncze pakiety P2P. Po zakończeniu rozmowy P2P znowu powoli wraca do góry. Najważniejsze jest jednak to, że po wykręceniu numeru nie ma nawet sekundy, podczas której jakość połączenia byłaby obniżona - priq jest tutaj bezwzględne. I o to chodzi.

# pfctl -sq -v
queue p2p priority 0 priq( red )
[ pkts: 72970 bytes: 7746696 dropped pkts: 0 bytes: 0 ]
[ qlength: 0/ 50 ]
queue std_out priq( default )
[ pkts: 68699 bytes: 85157033 dropped pkts: 0 bytes: 0 ]
[ qlength: 0/ 50 ]
queue ssh_im_out priority 4 priq( red )
[ pkts: 1405 bytes: 115996 dropped pkts: 0 bytes: 0 ]
[ qlength: 0/ 50 ]
queue dns_out priority 5
[ pkts: 3851 bytes: 304997 dropped pkts: 0 bytes: 0 ]
[ qlength: 0/ 50 ]
queue tcp_ack_out priority 6
[ pkts: 12300 bytes: 666468 dropped pkts: 0 bytes: 0 ]
[ qlength: 0/ 50 ]
queue voip priority 10
[ pkts: 13787 bytes: 2803650 dropped pkts: 0 bytes: 0 ]
[ qlength: 0/ 50 ]

<

p>

<

p>

Zobacz też