2017年8月27日日曜日

automate で OpenVPN を外では自動接続/自宅では自動切断

automate という自動化アプリがあります。

自動化アプリにはほかにも Tasker(有料) や Macrodroid などがありますが、automate はフローチャートスタイルで処理ブロックを並べていくので、とてもわかり易くてフローの作り方も簡単です。




Google Play で "automate" で検索してこれをインストールします。

処理ブロックをフローに配置するのですが、必要な組み込みの Permission module の追加を要求されるので、その Permission module をインストールします。

今回紹介する事例では、Automate network permissions を必要とします。
ぜーんぶ無料ですからご安心を。
よく、本体は無料でも追加は有料、なんていうのが多いのですが、Automate はその点は安心です。



まず、WiFi に接続中か、それは自宅の WiFi (SSID) かをチェックします。

接続されていなければ、外出中とみなして OpenVPN の接続を行います。

これらの処理途中で、電波状態が不安定な状況を考慮して接続の再確認とか、再接続処理とかを行っています。

このフローの最初の画面に戻って、「Start」をタップすると、フローが自動的にスタートします。

あとは、そのときの状況(WiFi か LTE か)を判断して、外ならば OpenVPN を起動してくれます。
自宅なら OpenVPN を切断してくれます。

ソフトフォンは、WiFi 時にアクティブであれば、OpenVPN でも自宅ネットにつながって、WiFi 下にあるのと同様に、アクティブ状態は変わりません。

これにより、自宅か外かを問わず、常に自宅ネットに接続できていることになります。

ソフトフォンも Asterisk に接続された状態を保てます。


OpenVPN ですから、現時点では最強のセキュリティが保証された状態で接続でき、また L2TP/IPsec や PPTP と異なり「常時接続」ですから、外での電波の状態が不安定でも、常に接続を保とうとします。これも安心できるポイントです。

L2TP/IPsec 、PPTP は一旦接続が切れると切れたままになってしまいますが、OpenVPN はこの点が優位なところです。また使うポートも一つだけです。


OpenVPN は最初、Raspberry Pi 3 にインストールしました。

その後 ddwrt ルーターの OpenVPN 機能に、証明書や鍵ファイル等を移して、現在は ddwrt ルーターがメインルーターの直下で動いています。

Raspberry Pi 3 の OpenVPN は停止してあり Asterisk のみが動いています。  




2017年8月26日土曜日

IPアドレス詐称して ポート 53413 の脆弱性を突く試みがいまだ存在

通常は、ルーターにて spi もしくは filtering でブロックされていますから問題ないのですが、いまだにこのポートをスキャンしてきます。


これは、国内では 2015/06 から発生し始めているようです。

なぜ、このポートがとくに狙われるかといえば、JPCERT/CC の報告にあるとおりです。


 狙われた Netis製ルータの脆弱性


  既報の通り、「Netis」は中国国内で人気のネットワーク機器メーカ「Netcore」
 社の中国国外向けのブランド名です。
  ほとんどの Netis製ルータにはデフォルトで UDP の 53413 ポートが開放されて
 おり、WAN側から接続可能になっています。
  この 53413ポートはファームウェア上でハードコードされた単体のパスワードで
 「保護」されてはいますが、それこそが脆弱性の本体です。
  すでにこのパスワードは明らかになっており、パスワードを入手した人物は誰で
 も外部から Netis製ルータに接続し不正アクセスが可能です。

ということですね。

特定メーカーの特定ルーターの脆弱性のために、世界中がこのポートをスプーフィングされるという、しかも2年以上に渡ってです。

スプーフィングする側の根気強さにも呆れますが、迷惑な話しです。



ところで、自宅のルーターやサーバーの空いている(かも知れない)ポートをチェックしてみてはいかがでしょうか。

Linux ならば nmap をインストールして、

  # nmap hogehoge.com

のように、自宅のルーターの WAN 側アドレスを指定してチェックできます。

ポートはセキュリティ対策し、承知の上で開けているのならともかく、そうでなければ早急に閉じたほうが賢明です。


そのポートを開ける(待ち受ける)プログラムがいるはずですから、これを停止させるとか、filtering で閉じるとかが必要です。







バイクを車検にだしました

来月、車検切れになりますからバイク屋さんに車検をお願いしました。


先週、車検の予約でバイク屋さんに行ったときに
 「1年以上、動かしていないんですよ」
といいましたら
 「バッテリーが上がってるでしょうねぇ。それとガソリンもジェル化してエンジン
  に流すパイプが詰まってるかも知れませんよ」
ということで
 「じゃあ、エンジンかからなかったら連絡するのでピックアップにきて欲しい」

 「それでは、一応ピックアップの体制で準備しておきますから連絡ください」
というやり取りがありました。


予約日当日の朝、エンジンをかけると2、3度せき込んだ後エンジンがかかりました。しばらくアイドル状態にして、掃除もしてそのあと10kmくらい慣らし運転してバイク屋さんに持ち込みました。
 「あっ、エンジンは大丈夫だったみたいですね?」

 「そうなんです。少し走ってから持ってきました」

 「いろいろ点検してみますから、1週間ほど預からせてください」

 「まぁ、急ぎませんからじっくりと点検して車検すませてください」

 「わかりました」

ということで、無事車検点検してもらうことになりました。

9月になれば、またキャンプツーでもでかけますか?





2017年8月25日金曜日

通話履歴はどこにある?

Asterisk の通話履歴は、/var/log/asterisk/cdr-csv ディレクトリの Master.csv ファイルに csv 形式で入っています。

これの見方は、ここにあります。 


LibreOffice などをインストールしていれば、容易に開くことができます。

一番下が最新の通話履歴です。つまり一番古いものが先頭行で、新しいものが最終行ということです。

たまには、通話履歴でヘンなところへの発信記録がないかどうかくらいは確認してみてはいかがでしょうか。


ちなみに、/var/log/asterisk ディレクトリの messages というファイルには CLI メッセージが記録されていますから、おかしいな? と思ったらこれも確認してみてください。







sip.conf と extensions.conf のチョッとしたお話し

sip.conf の記述事例として多くの場合、

  [200]
  username=200
  type=friend
  secret=パスワード
  context=default
  canreinvite=no|yes
  host=dynamic
  disallow=all
  allow=ulaw
  allow=gsm
  allow=alaw
  qualify=1000

というように記述する事例がほとんどです。
また、これに対応した extensions.conf での呼び出しのエクステンションは、

  [default]
  exten => 200,1,Dial(SIP/${EXTEN})
  exten => 200,n,Hangup()

となっていますよね。

この実例のために、セキュリティの甘いサーバーが侵入されたときに容易に番号を盗まれてしまい、海外発信などの被害に遭うということもあるようです。

コワいですねぇ。

事例を記述した方はそのままそっくり流用されるなんてことは想定していないわけで、でもそのことで被害に遭われた方がいるとお気の毒、としかいいようがありません。

今回は、これに少し手を加えて、万々が一、侵入されてしまったとしても、格段に盗まれにくくする方法の一つとして紹介します。

セキュリティ問題は、ほかにもいろいろやるべきことがありますから、肝心なところを忘れおかないでください。

本来は侵入を許さないことをまずは対策するのが先ですから。
その上で以下の対策によって、より強固になるということです。


  [abcd1234efgh5678-200] ; 頭の「abcd1234defg5678-」は任意文字列
  ; username=200 ; コメントアウトする
  ; (ユーザー名は [ ] 内に記述のものが真のユーザ名です)
  type=friend
  secret=パスワード ;(なるべく長い英数大小文字、一部の記号の組み合わせ)
  context=ijkl9012mnop3456 ; 任意文字列(セクション名にあたる)
  canreinvite=no ; または yes
  host=dynamic
  disallow=all
  allow=ulaw
  allow=gsm
  allow=alaw
  qualify=1000
  cid_number=200 ; ➡ ここ大事なところ

extensions.conf の方は、default セクションではなく「ijkl9012mnop3456」セクション内に記述する

  [ijkl9012mnop3456] ; このセクション名の中に以下を記述する
  exten => 200,1,Dial(SIP/abcd1234efgh5678-${EXTEN})
  exten => 200,n,Hangup()

このようにすることで、外部からの侵入があったとしてもコンテキスト名やエクステンション名を容易にはさとらせないことが可能になります。

ソフトフォンでのユーザー名は abcd1234efgh5678-200 にします。
ただ、この場合コールした相手には、この名前が番号として表示され、そのままでは返信に困ることになります。

そこで、sip.conf に cid_number=200 とするわけです。
こうすることによって、相手には 200 が表示され、そのまま返信番号とすることが可能になります。


ちなみに、[default] セクションには何も記述せず、extensions.conf の最終行にでも空のまま置きます。

これは、侵入者からみれば既知のセクションになりますから、一番狙いやすいということです。

ですから、空っぽにしておくのです。




Asterisk は大変便利で面白いのですが、やはりよくその内容を理解して取り組むべきでしょう。

思わぬ火傷をしないためにも、このことはすごく大事なことです。




Asterisk で Fax の話し

[2017-mm-dd hh:mm:ss] NOTICE[xxxxx][C-yyyyyyyy] chan_sip.c: FAX CNG detected but no fax extension という通知メッセージが CLI コンソールにでていやらしく思ったことはありませんか?

実はこれは Fax 検出で CNG 信号を受け取ったけど、対応するエクステンションがありません、ということですが Fax の送受信は問題なく行えます。

T38 に切り替えてくれますが、そのことがメッセージ上に表記されないので、「ギョギョギョ」となるわけです。

送受信できない、という方の問題はこの点ではなく、ほかの問題であることが大半です。

エラーではなく、通知メッセージになっているのはそのためでしょう。


sip.conf の Fax 用のコンテキストに faxdetect=yes となっているとこのメッセージがでることがあります。

気持ちが悪いのであれば、faxdetect=t38 としてみてください。

国内の場合、T38 に対応したファックスが殆どですので(CNG にも対応したものがあるみたいですが)、このように記述することで冒頭の通知メッセージは出なくなります。


CNG 信号とは、受信側が、送信側にピーヒャラ信号を流し、送信側はこれを受けてネゴシエーションし、ファックスの送信を始めるのですが、このときに CNG 信号を受け取れる、といっていながら実は受け取れない、ということです。

そこで、再ネゴシエーションして T38 ならどうだ、となるわけで、それならいいよ、とファックス送信するわけですね。

ちなみに、faxdetect には cng / t38 / yes / no が選択でき、デフォルトは no です。
yes は cng と t38 の両方に対応し、cng を優先するため、こういうメッセージがでるようですね。






2017年8月22日火曜日

Zoiper LITE がアップデートされました

昨日、8月21日に Zoiper IAX SIP VOIP Softphone(ベータ版)がアップデートされました。

ベータ版テスター向けのベータ版と、ZoiperBeta のバージョンが同じになったようです。




修正されたのは以下の内容のようです。
2点目の内容が気になりますが、UI 上は対応するような設定項目が見当たりません。





バージョンは下記のように 2.2.1 ですね。





-----------  ----------  ----------  ----------

別件ですが、Grandstream Wave に IAX2 への対応依頼をしました。
あまり期待はしていませんが、一応、開発チームへ要望は伝わったとの返事をもらいました。

IAX2 は全面的に止めたわけではなく、着信時の話中や、圏外処理のためには使っています。

セキュリティ面から内線へのソトからのアクセスは止めて、OpenVPN 経由にしていますが、まだセキュリティ対策の有効性を検討継続しています。

なにしろ日本語のドキュメントがなく、英文ばかりなので意味の理解を含めると少々時間が必要です。





2017年8月20日日曜日

iax2 は結局やめました

iax2 は確かに便利ですが、セキュリティ面で不安があり、結局ソトから自宅 Asterisk サーバーに iax2 で呼制御するのは止めました。

必要な場合は、OpenVPN+内線番号でアクセスするようにしました。

ツレ用に、空いたはずのブラステル番号が復活しました。



ポート 4569/udp を Asterisk サーバーにフォワーディングするのですが、スマホに割り当たる IP アドレスは動的なので、フォワードする IP アドレスを特定できません。
つまり不特定多数からの 4569/udp が Asterisk サーバーまでフォワーディングされてしまうのです。

1週間ほど運用してみて ポート 4569 に対する iax2 を偽装する攻撃はなかったのですが、これはまだ iax2 がマイナーなおかげだということと、SIP と違いバイナリであるために VoIP だとは気付かれにくいし、偽装自体がまだできていないということかも知れません。

いずれ、侵入してくることが予想されます。

今日・明日なのか、1年後なのかわかりませんが、侵入のないうちにフォワーディングをやめるのが一番です。

CallNumber(「電番」のことではなく、Call 数のこと。区別のためか Asterisk 上は Callno と呼んでいるようです)と 暗号化でガードできそうなのですが、この Callno がいま一つ信頼性に欠ける感じがしてならないのです。

既知の IP アドレスとピアからの接続要求は、ピアごとに Callno を制限し、かつそのCallno を制限値までそのピアが使用できるとすることで(予約済のようなものかな)、ほかからの Call を制限オーバー(予約オーバーだから受けられません、というようなことみたい)で弾くということのようなのですが、常にそういう状態が保てるかどうかがハッキリしませんし、これで本当にガードできるのかがわかりません。



固定 IP アドレスならば、そのアドレスからのリクエストのみフォワーディングできるのでセキュリティは確保できるのですが、動的 IP アドレスはそういうガードはできません。

プログラムを組んで、DNS から ddns の FQDN のアドレスを得てそれをフォワーディングするファイヤーウォールの中身を書き換えて・・・などとすればできなくもありませんが、そもそもその FQDN がそのスマホのものだという保証が微妙ですから、そこに穴が開いてしまう恐れもあります。


固定 IP のサーバー同士を接続するぶんには、セキュリティも確保できますし、すごく利便性が上がると思います。


動的 IP のデバイスと、ルーターで保護された壁の内側にあるサーバーとの間ではムリがあります。
サーバー側は ddns でアクセスできますし、スマホもいまは ddns 化できるのですが、ddns 化したところでフォワーディングする IP アドレスを特定はできません。


いろいろセキュリティの確保手段を検討しましたが、結論的にはスマホからの(動的 IP アドレスからの)要求に安全に応えることが難しいと判断しました。

Fail2ban も絶対的ではありませんし、セキュリティをある程度マシにできても「確保」するまでには至りません。



やはり OpenVPN による内部ネットへのアクセスに勝るセキュリティはないという結論です。


OpenVPN を使うならば、iax2 である必要性はありません。
SIP でかまいません。




2017年8月15日火曜日

Grandstream Wave か zoiper か

ソフトフォンアプリは何を使ったらいいのか?




多くの IP電話利用者が一番悩むポイントがこれではないかと思います。

とくにモバイルでスマホをつかっている人たちにはその悩みが多いと思います。

実際、Google 検索でもいろいろ評価が飛んでいて、しかもその評価が定まらない、というのが実情ですね。


その中で、比較的によい評価を受けているのが zoiper です。


ところがその zoiper も、わたしも悩むことになったディープスリープでの "Registration Failed" 問題があり、少なからず多くの人を悩ませているようです。

いまは Beta 版で治されているとはいえ、まだまだこのことを知らない人も多いようです。


着信失敗につながるこの問題のために、発信は zoiper、着信は CSipSimpleや Acrobits などという人もいるほどです。

消費電力問題を気にしている人もいます。

zoiper はプッシュ通知に非対応で、そのためバックグラウンドで常に動作していて着信を受ける仕組みなので、消費電力が大きくてこれがイヤだ、という方もいます。
電力消費はそれほどでもないのですけれどね。

現時点ではまだ、認知度が低いのですがお勧めは Grandstream Wave です。
もっと皆さんに使ってもらいたいと思います。

使ってよかったと実感できると信じています(別に Grandstream社のまわし者ではありません)。

zoiper に対して優れている点はいくつかあり、劣っている点は iax2 がサポートされていない、くらいでしょうか。
誰かが通話録音できない、と勘違いしていましたがそんなことはありません。
ちゃんと通話録音できます。

iax で検索すると、ほぼ zoiper 一色です(スマホ用では iax が使えるのは zoiper 以外にはいまのところ見当たらない)。

iax2 は Asterisk などの PBX サーバーを持っていて、そのサーバーで使う以外、一般の IP電話サービス事業者では意味がありませんので、普通にはなくても困らないものです。


我が家には Asterisk サーバーがありますので、内線を iax2 で設定して、ウチの中では WiFi で、ソトでは LTE に自動的に切り替わって、いつでもどこでも内線が使えるようにしてありますが、こういうことが要らない人にはどうでもいいプロトコルでしょう。


消費電力に関していえば、Grandstream Wave と zoiper を1日強ほど待受けで比較してみましたが問題にするほどではありません(moto G4 plus で両方を待受けにして比較)。

  grandstream Wave        69mAh / 28h(2%)
  zoiper                         145mAh / 28h(4%)

ほぼ2倍の差がありますが、全体からすればバッテリー全体のわずかな差1〜2% でしかありませんから、気にすることはありませんね。

通話時の消費電力は比較していませんので、なんともいえません。



--------------------◇--------------------◇--------------------◇--------------------

ソフトフォンは、わたしは Grandstream Wave、次点で zoiper と思っていますが、少し解説してみたいと思います。



【マルチデバイス】と【マルチアカウント】

まずは、マルチデバイス(複数端末)での使用です。


複数の端末に同じアカウントを設定・有効化(レジスト)しても、殆どのケースでは最後にレジストしたデバイスのみが有効です。


殆どでないのはブラステルくらいです。
ブラステルは複数端末での同時設定(レジスト)が可能です。
しかも設定したすべての端末で発着信できます。
これは、すこぶるヘンですがものすごく便利なことでもあります。

我が家の場合、イエデンに設定したブラステル番号をスマホにも設定して持ち歩いていますが、イエデンに着信があると、イエデンもスマホも着信鳴動します。
どちらかでオフフック(電話の着信を受ける)すると、他方は鳴動を中止して、オフフックしたデバイスでお話しができます。

こういう芸当(?)はブラステルならではのことで、ほかのサービス事業者の場合はできないのです。

Asterisk と一緒に使うといろいろなことができて楽しいのですが、ここでは割愛します。



同じ WiFi 下で複数端末に同じアカウントを設定する場合は、ランダムポート機能が必要な場合があります。

ランダムポート機能とは、デバイスを特定するために、レジスト先のポートとは別に端末自体のローカルポートをレジスト先のポートにかかわらず使い分けしてくれる機能です。


ルーターの NAT 機能が full cone NAT の場合で、複数端末を同じサービス事業者用に設定して使う場合は、このランダムポート機能が必要です。

詳しい説明は割愛しますが、ルーターが full cone NAT ではない、または同じサービス事業者を複数端末で使わない場合は、むしろオフにした方がいいかも知れません(STUNを使う場合はオフに)。


これはなにもブラステルのように同一電番の複数端末への設定でなくても、同じサービス事業者から複数電番を借り受け、これらを端末を分けて使うばあいにも発生しうると考えてください。


このことを理解しないと、うまく使えない、発着信がおかしい、レジストが落ちる、などということになります。


次にマルチアカウントです。
マルチアカウントに対応していないソフトフォンは使い勝手がよくないのであまりお勧めではありません。

IP電話の場合、固定電話や携帯電話と違い、利用料が安い・無料などというところは多く、また、同じサービス事業者の番号同士は通話無料が殆どですから、自分に合ったソフトフォンを見つけるためにも、いろいろ試すのに複数の電番を発行してもらってその電番間で試すのがいいからです。


Grandstream Wave や zoiper を使うにしても、設定内容によってかなりそのよさを発揮できるかどうかが左右されますから、実用に入るには試行が必要かと思います。


面倒くさいと思わずに、いろいろ試してみてください。きっといい結果を得られると思います。

こういうところは、まだ仕方がない部分だと思うことです。携帯電話と同じ、というわけにはいきません。
たとえお勧めのソフトフォンアプリでも設定の仕方次第で良くもなり、悪くもなるということです。


sip INVITE 攻撃対策もしてください。発信元不明の着信(100番とか、1000番とかで発信してくるケースが多いが、ほかの番号でもある)、これは SIP サーバーを介さずに直接、ランダムに IP アドレスを指定して、主にポート 5060 を狙って 発信をよそおってくる攻撃です。


対策の一つは、万全ではありませんがポート番号を 5063 など、5060 以外に変えることですが、サービス事業者が 5060 しか受け付けない場合はこの方法は使えません。

zoiper のコミュニティサイトでもこの件はポート番号を変えなさい、と回答しています。zoiper の場合はそれしかやりようがありません。


Grandstream Wave は有効なこの種の攻撃対策機能を持っています。
Grandstream Wave くらいしかないのも実情です。

このブログの「ホーム」タグの隣のページに記載しているので、そちらを参考ください。





2017年8月14日月曜日

IP電話普及がいま一つな理由?

たぶん、050 サービス事業者のご推奨もしくはバンドルされたアプリがよくないのが一番の理由ではないかと、最近つくづく思っている。

どれもこれもアプリがよくありませんね。

サービスとして比較的に良好なブラステルでさえ、050 Free というアプリはチャージ残額表示以外にとるべきよいところはありません。


私が下記のようなソフトフォンアプリ、サービス事業者のアプリを使ってみたところでは、

  Acrobits
  Adore Mobile
  AGEphone
  Cloud Softphone
  CSipSimple
  Grandstream Wave
  MizuDroid
  zoiper
  

  050 Free
  IP-Phone Smart

Grandstream Wave と zoiper くらいが使えるレベルでほかは使う気にもなれないほどよくない。

これら以外は試していないのですが、ネットなどの評判でも肯定的評価よりも、なにか問題ありながらやむなく使っている、という感じを受けます。

これが、普及を妨げている最大の問題ではないかとさえ思えます。

その昔、Biglobe フォンモバイルというのも使ってみたことがありますが、これなどは「酷い」のひとことで、Biglobe は SIP 接続情報出してくれないし、ほかのアプリを試すこともできなかったことがあります。


本気でサービスするつもりがあるのかも疑問に思えてきます。


いろいろやってきて、いまは Grandstream Wavezoiper (Beta) に落ち着いていますが、どうしたものでしょうか?

Google Play で検索すると、大変多くのソフトフォンアプリがヒットしてどれを使えばいいのか、ものすごく悩んでしまいます。

まだ知らない隠れた優れもののソフトフォンアプリがあるかも知れませんが、普通の人たちには敷居が高すぎますよね。


いろいろご意見をくださればありがたく思います。







2017年8月13日日曜日

ブラステル番号が一つ空いた

ローカル DNS(DNSMasq)を設定したので、Asterisk の内線はプロトコルを sip ではなく iax2 に設定すれば、モバイルでも自宅 WiFi でも使えるようになりましたから、ツレ専用内線を追加しました。

おかげで、これまでツレ専用に使っていたブラステル番号が空きました。

ローカル DNS のおかげで、iax2 の内線をいくつでも作成でき、それらはモバイルか自宅かを問わずに発着信できます。

我が家の場合、現時点ではひかり電話がまだ、ブラステル電話との移行並行期間として残っていますので、ひかり電話着信は新イエデン(私のスマホにも設定)に転送設定していますから、転送のための G/W 番号も必要ですが、ひかり電話廃止後はこれも要らなくなりそうです。


内線追加でできるなら、帰省した娘一家も一人一人、自分の内線番号を持てて内外線問わず発着信できるようになります。


IP電話の品質や性能が一昔前に比して格段によくなってきており、普通に固定電話並みにモバイルでも使えています。

以前はとても実用に耐えられるものではなかったのが、実感して使えることがわかってくると、従来型の携帯電話や固定電話が馬鹿らしくなってきます。


自分でソフトウェアPBX や、ローカル DNS などを立てたりとか、誰でもというわけにはいきませんが、一通りパッケージングすれば、線を繋いで、若干の設定で使えるようにできそうです。




DNSMasq を使う

前回、Asterisk を iax2 でウチ/ソトからアクセスする で、インターネット側(LTE接続時)からのアクセスに際して、DDNSサービスを利用して我が家のグローバル IP アドレスの FQDN をサーバーアドレスとして設定する、としました。

この設定の場合、WiFi に戻ったときに名前解決ができないため接続エラーになってしまいます。

今回これを回避するための、ローカルアドレスをローカル DNS で名前解決し、それ以外は上位のグローバル DNS(例えば Google の 8.8.8.8)でこれまでどおり名前解決する、というものです。

幸い、DD-WRT ルーターがありますので、これにもともと搭載済みの簡易 DNS サーバー機能である DNSMasq を使うことにしました。


【これまで】
1. デフォルト G/W は VDSL ルーター
2. DHCP サーバーは VDSL ルーター
3. VDSL ルーターの DNS は 8.8.8.8/8.8.4.4 を設定
4. dd-wrtルーター(ブリッジ使用)は
  ・ OpenVPNサーバー、第二 DDNS(第一 DDNS は No-IP)、ハブとして使用
  ・ DNS サーバー / DHCP サーバー はオフ


【これから】
1. VDSL ルーターがデフォルト G/W は変わらず
2. VDSL ルーターの DHCP サーバー機能はオフ
3. VDSL ルーターの DNS は 8.8.8.8/8.8.4.4 設定で変更なし
4. dd-wrt ルーター(ブリッジ使用)の
  ・ LAN 側 DNS を VDSL ルーターから dd-wrt ルーター自身に設定
  ・ OpenVPN(現在未使用だがそのまま)、第二 DDNS、ハブとして使用は変わらず
  ・ 第二 G/W の役割を持たせる
  ・ DHCP サーバー機能をオン、DNSMasq に Asterisk サーバーのローカルアドレスを DDNS 名で設定(第一 DDNS でも第二 DDNS でもOK)
5. 無線LAN は親機も子機もデフォルト G/W を dd-wrt ルーターに向ける


これによって、hogehoge.ddns.com のアドレスは、

  モバイル時(LTE) : 我が家のグローバル IP アドレス
  自宅ネット(WiFi): Asterisk サーバーのローカル IP アドレス

に変換されますので、ソフトフォンのサーバーアドレス設定を hogehoge.ddns.com にしておけばアドレス解決できますから、ウチ/ソトのどちらの環境でもサーバーに接続(レジスト)できます。



ソフトフォンは、メイン使用は GS Wave ですが、内線○○/iax2 は zoiper Beta を使っています。

zoiper は iax2 でのみの使用なので sip INVITE 攻撃の対象になりません。


これでホントにウチ/ソト環境になりました。




2017年8月10日木曜日

Asterisk を iax2 でウチ/ソトからアクセスする

iax2 は sip と違い、ポート 4569 で呼接続も通話ストリームも流し、かつバイナリなので非常にコンパクトなやりとりができて遅延もその分少ない、といい事ずくめなプロトコルです。

初代は iax(iax1) でしたが、いまは iax2 に進化しています。これに伴いポート番号も 5036 から 4569 に変わっています。

これを使えば、VPN を張らなくてもソトから内線にアクセスする環境を作れます。

ウチでは家族も自分用のブラステル番号を持っているので、わざわざソトから内線にアクセスするなんてことは必要ないといえばないのですが、例えば、留守電を聞く/聞いたら削除する、とかに利用できます。

そんなに面倒ではありません。

sip.conf の [general] セクション内に以下を追記する

externhost=DDNS名(IPアドレスが固定IPではないときFQDNで記述)
;IPアドレスが固定アドレスの場合は、次のように記述
;externip=aaa.bbb.ccc.ddd
localnet=192.168.xxx.0/255.255.255.0 ; お使いのプライベートIP空間とマスク


iax.conf に以下を追記


[general]
minregexpire=60  グローバル空間とプライベート空間に切り替え時、この時間で切り替わる(大きくするとそれだけ切り替え時間が長くなる)


[4444] ; 4444は例(使いたい番号を記述)
; 内線4444 : モバイル網で接続時に使う内線番号
type=friend
username=4444 ;(内線番号と同じ番号でよい)
secret=pass   ; パスワード (なるべく長い英数記号文字列)
canreinvite=yes
host=dynamic
dtmfmode=rfc2833
disallow=all
allow=ulaw
allow=ilbc
allow=gsm
allow=alaw
qualify=10000


extensions.conf に追記

exten => 4444,1,Dial(IAX2/${EXTEN},30)
exten => 4444,n,Hangup()


Asterisk 側の設定は以上です。

sip.conf の [general] セクションに記述するグローバルIPアドレスは、固定IPでない場合は、No-IP などの DDNS サービスで FQDN をもらってください。

No-IP の場合、3つまで無料で貰えます(ただし、30日ごとに modify が必要ですが、概ね1週間前に「期限が切れますよ」というメールが届きますから、これが届いてから modify すれば継続して使用できます)。

設定が終わったら reload または、Asterisk の再起動をして設定内容を反映させます。


次に、ルーターの設定です。

我が家の場合は 光ルーターですので、静的IPマスカレードでポート 4569(iax2 のポート)を Asterisk サーバーに通してやります。



図のように、設定します。「宛先IPアドレス」に Asterisk サーバーのアドレスを記入して、下の「設定」をクリックすると即座に反映されます。

ルーターの設定はこれだけです。


次に、クライアント側の設定です。


iax が使用できるソフトフォンならば、どれでもいいのですが、zoiper (Beta) が使えますので、これに設定します。

  Settings → Account → IAX タブをタップ

➕をタップして、ユーザー名/パスワードを入力します。前述の iax.conf の例では、ユーザー名: 4444 / パスワード: pass です。Login をタップします。

ホスト名を入力する画面になりますから、固定IP ならば、aaa.bbb.ccc.ddd を入力し、そうでなければ FQDN 名を入力します。

右下の「Next」をタップするとダイヤログ画面が出ますから、「Use anyway」をタップします。
次の画面は右下の「Skip」をクリックします。SIP TLS 〜〜 IAX UDP のリストが出て、右の赤いバーIAX UDP のところで緑色になり「Found」となれば、ユーザー名/パスワード、IPアドレスが正しく設定された状態です。

間違いがあれば、バーは赤いままで「Not Found」となりますから、あとで修正してください。「Finish」をタップしてアカウントの設定は終了です。


あと少し設定があります。

当該アカウントの内容を少し設定します。

  Account Name : 任意
  Host : IPアドレスまたはFQDN名(間違った場合はここで修正します)
  User Name : 4444
  Password : pass
  CallerID : 4444(なぜかバグがあり、発信者番号が相手先に表示されないのでここに記述します)
  Caller Number : 4444(同上)
  Ringtone : お好みで選択してください
  Network Settings → Registration Expiry Time : 60(初期値が60。これは、iax.conf の[general] セクションの minregexpire=60 に合わせる)
  Audio Codec Settings : uLaw iLBC30 GSM aLaw を選択しこの順序にする

以上です。

戻れば、当該アカウントが緑色になっていると思います。
(WiFi ではなく、モバイルに接続して設定ください)

グローバルIPからグローバルIPへの接続になるので、空間を合わせる必要があります。

当然、WiFi 下では接続エラーになります(プライベート空間でグローバルIPからグローバルIPに接続しようとしますのでエラーになります)。


ソトからウチの Asterisk サーバーを使えればいいのですから、これで問題はありません。

ウチにいれば、ウチからウチの Asterisk サーバーを利用するのですからいくらでもやりようはあります。


なお、zoiper はグローバル空間ではやはり sip INVITE 攻撃を受けますが、iax2 はプロトコルが異なりますから sip 攻撃とは無縁です。

sip の場合はポートを 5060 に固定しないことです。
5060 以外を使うようにします。
完璧ではないのですが、やらないよりは攻撃は減ると思います。


  
iax2 の使用に際してチョッとした失敗がありました。ポート 4569 の udp がどうしても Asterisk サーバーに行かないのです。

実は、Asterisk サーバーのファイヤーウォールにひかかっていました。
自分で設定したファイヤーウォールなのにトホホです。

4569 を通してやるとちゃんと IAX クライアントはレジストされました。

たったこれだけのことに丸一日費やしてしまいました。

でも、それだけにクライアントがレジストできたときの感激もひとしおでしたけど。


iax2 は、拠点にそれぞれ Asterisk サーバーを設置して、拠点間を VPN なしに接続して自由に内線でのやりとりをするために使われる事例が殆どのようです。

これはこれでアリかと思います。
Asterisk 運用の幅が広がるわけですから。



2017年8月7日月曜日

ブラステルの留守電を考える -- その後

ブラステルの留守電を考える の中で、Dial(IAX2/11) エクステンションで、内線11 がアクティブでないと、スマホは着信可能でも即時に「圏外」になってしまうので、もう少し工夫が要る。

とりあえずは、WiFi 専用のデバイスには、常に内線11 を受けられるようにしてあるので、意図したとおりに動作はしてくれますが、デ-アクティブの場合を想定した処理も考えなくては....

ちなみに、WiFi 専用のデバイスは当然 IAX でアカウント設定が必要ですので、zoiper Beta を使うことになります。GS Wave には IAX でのアカウント設定はありませんから。


と、いうことで最初の3つの exten 行を以下の exten 行で置き換えます。

exten => 2000,1,Dial(IAX2/11,40,tT) ;
exten => 2000,n,Set(FOOEXTENNUM=11)
exten => 2000,n,Goto(2900,1)
;
;
exten => 2900,1,Set(FOOSTAT=${IAXPEER(${FOOEXTENNUM},status)})
exten => 2900,n,GotoIf($["${FOOSTAT:0:2}"="OK"]?foostat-ok) ; アクティブPeer?
exten => 2900,n,Wait(40)         ; "デ・アクティブPeer" : 40秒スマホ側のフックオフを待つ
exten => 2900,n(foostat-ok),NoOp(${FOOSTAT})
;
exten => 2900,n,NoOp(${DIALSTATUS}) ; ← 優先番号「1」を「n」に置き換え


これは、IAXPEER ファンクションで iax2 のピア(本例では内線11)の状況をチェックします。
ピアがレジスト状態なら status は「OK (45 ms)」のようになります。先頭の2文字の「OK」か否かを判断します。
レジストされていないときは、「UNKNOWN」となります。

これにより、"chanunavail" 時に即時に切断するのではなく、40秒間、スマホ側での受話を待ちます。それでも取られなかったら、本来の処理に移ります。





2017年8月6日日曜日

zoiper "Registration Failed" はなくなったみたい

公式 Beta もテスター用 Beta のどちらも、ディープスリープ時にレジストが外れる問題はないみたいです。

何回かディープスリープ状態で試してみましたが、レジストエラーもなく、ちゃんと着信するようです。

アカウントの Network Settings → Keep Alive Time-Out は Disabled で問題ないみたいです。

また、Connectivity → Stay Awake もチェックオフでいいみたいです。

この二つはよくわからないパラメータです。どういう動きでどういう効果があるのかがわかりません。

現在の設定はブラステルの場合、次のようにしています。

SIP Account
  Account Name : 任意文字列(わたしの場合はブラステル番号を設定)
  Host : softphone.spc.brastel.ne.jp(ポートは設定せず)
  Username : ブラステルのユーザー名(8桁の番号)
  Password : 〃パスワード(8桁の英数字)
  Enable On Start : ✔
  Audio Codec : uLaw, iLBC30, Opus wide, GSM, aLaw をこの順で✔
  Network Settings → Registration Expiry Time : 60(デフォルト)
                             → Keep Alive Time-Out : disabled
                             → Transport Type : UDP
                             → Use STUN : No
                             → Use RPORT For Signalling : オフ
                             → Use RPORT For Media : オフ
  Features → DTMF Style : Inband

Audio
  Keypad Tones : ✔
  Incoming Call Vibration : ✔
  Speaker Gain : +4db
  ほかはオフ

Connectivity
  Keep Alive WiFi : ✔
  Stay Awake : オフ
  Run In Background : ✔
  Listening Ports → すべてオフ。ポート番号は変更。

Advanced
  Show Account Status Notification と Integrate With Native Call Log のみ✔
  ほかはオフ、またはデフォルトのまま


以上です。

ダイレクトIP による SIP INVITE 攻撃(100番とか、1000番とかの番号で呼び出してくる)のこともあり SIP Port を 5060 以外、RTP Port を 8000 以外にしていますが、本質的対策ではありません。

これは GrandStream Wave のようなきちんとした対策が求められます。

通常はポートを開けることもないと思いますし、UPnPも設定しなければ大丈夫なはずなんですが、コミュニティサイトを見る限りでは攻撃実例があるようです。




2017年8月5日土曜日

zoiper Beta は2種類ある?

zoiper サポートからメールがきて、zoiper Free版のプレミアム Gold版を引き継ぐには Beta ユーザーになる手続き後、Beta版にアップデートすると、プレミアム Gold を引き継げる、というのです。

やってみると、確かに引き継げました。

ところが、この Updated Beta と、Google Play の zoiper Beta はバージョンが違うのです。

前者は v2.0.58 (lib: 2.8.38-mod) で、後者は v2.1.8 (lib: 2.8.38-mod) となっています(2017/08/15現在は v2.2.1 「未知とみなされるコールへの部分サポートが追加」とありますが、よくわかりません)。

また、後者はプレミアム Gold の Purchase を引き継げません。

なんかややこしくて非常にわかりにくい。


ライブラリバージョンはともに 2.8.38-mod なので、根幹部分は同じようですが、Long Sleep 時の Registration Failed が、果たして直っているかです。


また、zoiper からはログを採取して問題があれば、これを送付して欲しいということも書かれていました。

それによると、zoiper の debug log にそのやり方が記述してあるそうです。

こんな特番があるとは知りませんでした。最初からそういってくれればいいのに。


現在は、Updated Beta は廃止されていますので Beta は一つしかありません。






ブラステルの留守電を考える

ブラステルは接続が切れている場合、発信者には「おかけになった電話番号は現在使われておりません」というメッセージが流れてしまいます。

これでは、発信者に誤認を与えてしまいます。

正しくは「圏外にあるか、電源が切れているためかかりません」とするべきです。
ブラステルのサーバーが正しくメッセージを流してくれれば問題はありませんが、これは今現在は仕方ありません。

そこで Asterisk で、これを構成してみることにしました。

そのために、余っているスマホに内線設定します。例えば内線11を与えます。

このときに、同じ SIP を使用すると、スマホからレジストしたブラステル番号と Asterisk からレジストしたブラステル番号の SIP着信で衝突し、「話中」扱いになってしまいます。

そこで、Astersk 着信専用の内線は、IAX2 を使います。
これにより、SIP 着信(スマホ)と IAX2 着信(Asterisk)で衝突が回避できます。

iax.conf に sip.conf と同様の記述形式で、内線11 のコンテキストを定義します。


着信時に以下のような振る舞いをさせます。

sip.conf/iax.conf は割愛(ブログのほかのページを参考ください)

以下は、extensions.conf の抜粋 :;
;
;着信時の処理の仕方
; ブラステル番号の内線11(iax.conf にコンテキストを定義)← ここ重要
;
; 着信時、スマホでとらないか圏外のとき、40秒間 子機が鳴動後、
;  1.電話にでなかった
;   「ただいま電話にでることができません」
;  2.ピアがいずれもアクティブでなかった (鳴動を待たずに即時に)
;   「おかけになった電話は圏外にあるか、電源が切れているためかかりません」
;  3.話中だった (即時に)
;   「ただいまお話し中ですので電話にでることができません」
;  4.回線混雑中だった (おそらく即時に)
;   「回線が混み合っております」
;  のいずれかの状態に応じたメッセージを流して、留守電になる
;
;  ブラステル番号の sip.conf でのレジストは、2000番で受ける
;
exten => 2000,1,Dial(IAX2/11,40) 
exten => 2000,n,Goto(2900,1)
;
exten => 2900,1,NoOp(${DIALSTATUS}) 
exten => 2900,n,GotoIf($["${DIALSTATUS}" = "NOANSWER"]?${EXTEN},to-noanswer)
exten => 2900,n,GotoIf($["${DIALSTATUS}" = "CHANUNAVAIL"]?${EXTEN},to-chanunavail)
exten => 2900,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?${EXTEN},to-busy)
exten => 2900,n,GotoIf($["${DIALSTATUS}" = "CONGESTION"]?${EXTEN},to-congestion)

exten => 2900,n(to-noanswer),Answer()    ; "無応答タイムアウト時"
exten => 2900,n,Wait(1)
exten => 2900,n,Playback(vm-nobodyavail) ;「電話にでることができません」
exten => 2900,n,Goto(to-exit)            ; 留守電を受ける: へ飛ぶ

exten => 2900,n(to-chanunavail),NoOp()   ; "アクティブPeerなし"
exten => 2900,n,Ringing()       ; Ringing() のあと2秒以上の空きがないとRinging失敗
exten => 2900,n,Wait(2)
exten => 2900,n,Answer()       ; 着信を受ける(メッセージを流し留守電受けのため)
exten => 2900,n,Wait(1)
exten => 2900,n,Playback(dengen-off)     ;「県外か電源オフ」
exten => 2900,n,Goto(to-exit)            ; 留守電を受ける: へ飛ぶ

exten => 2900,n(to-busy),Answer()        ; "話中時"
exten => 2900,n,Playtones(busy)          ; ビジー音設定
exten => 2900,n,Playback(hanashicyuu)    ;「ほかの電話と話し中」
exten => 2900,n,Busy(2)                  ; ビジー音2秒
exten => 2900,n,Goto(to-exit)            ; 留守電を受ける: へ飛ぶ

exten => 2900,n(to-congestion),Answer()  ; "輻輳時"
exten => 2900,n,Playtones(congestion)    ; PlaytonesとCongestionはIAX2の場合は両方必要。
exten => 2900,n,Playback(komiatteiru)    ; 片方だけだと、シグナルを失う。SIPはPlaytonesは
exten => 2900,n,Congestion(10)           ; なくてもいい。()内のcongestionは標準的な輻輳音。
exten => 2900,n,Hangup()                 ; Congestion(10)はこの時間を経過後に次のextenを実行
;                                        ; する。Playtonesの前にAnswerで着信を受けること。
;                                        ; そうでないとソフトフォンから切断ができなくなってしまう。
;
exten => 2900,n(to-exit),Voicemail(777)  ; "留守電を受ける"
exten => 2900,n,Hangup()
;

なお、Playtones の音は Playtones(400*20/1000,0/2000) のように編集することもできます。

Playback アプリケーションで再生するメッセージは作成したものを使っています。
777番に留守電し、メールで添付ファイルしてメインスマホにメール着信させます。
内線からは、888番で留守電を聞くこともできます。


これで、冒頭の問題はなくなりました。


もっとも、イエデンは HT701 でアナログ電話で受けていますので、HT701 のレジストが外れていなければアナログ電話が鳴動し、一定時間鳴動後アナログ電話の留守電に録音できるので、実際に問題にはなりません。


ただ、家族に持たせたイエデンとは異なるブラステル番号の場合、圏外などがあり得ますので、そのために設定しました。





2017年8月1日火曜日

GrandStream Wave の最新の設定

いろいろ、使ってみて分かったこととか、マニュアルの意味を解釈しつつ、最新の設定がどうなったかについて、メモ代わりに記します。

ソフトフォンアプリは沢山ありますが、使ってみた限りでは GrandStream Wave と zioper が2大ソフトフォンであると思います。

これら以外は一長一短ありますし、安定性や着信性(とくに long sleep 時)、遅延などに難点があります。

現時点では、zoiper よりも GS Wave に一票、という感じです。
使い勝手や安定性などはほぼ同等ですが、とくにマニュアルの有無は大きい差です。


【Settings】

【Account Settings】
 わたしの場合はブラステルのアカウント設定をしています。

 アカウントをクリックするとそのアカウントの詳細設定になります。
 
 GENERAL SETTINGS
  Activate Account : ✔(右にスライド)
  Set as Default : デフォルトアカウントに✔
  Edit Account :
   Activate Account : ✔
   Account Name : わたしの場合、電番を設定(任意文字列でよい)
   SIP Server : softphone.spc.brastel.ne.jp
   SIP User ID : ブラステルの場合8桁の数字
   SIP Authentication ID : 空白設定しても SIP User ID が自動設定される
   Password : ブラステルの場合8桁の英数字
   Voicemail UserID : 未設定
   Display Name : 未設定
  Delete Account : タップしないこと(設定したアカウントを削除時に使用)

 CALL SETTINGS
  Ringtone : 任意に好みで選択(デフォルトは "Titania")
  DialPlan : オフ
  Use # as Dial Key : オフ("#"はダイヤルの入力完了とみなす設定)
  Call Forward : オフ
  Auto Answer : No

 SIP SETTINGS
  Enable Session Expiration : オフ(2018/05/29 オフ設定に変更)

  Session Expiration Settings : ---(初期値のまま)
  SIP Port : 5060
  Transmission Protocol : UDP
  Unregister Before New Registration : "Unregister Single"(デフォルト)
  Register Expiration (m) : 2(分)
   ブラステルの場合、大きい値を設定してもサーバー側は 数秒〜100 秒に
   書き換えますので、意味がありません(デフォルト値でもかまいません)。
  Only Accept SIP Requests from Known Server : ✔
   (ダイレクトIPによる攻撃防止)
  Check SIP User ID for Incoming INVITE : ✔
   (ダイレクトIPによる攻撃防止)

 NETWORK SETTINGS
  Proxy-Require : 未設定
  Outbound Proxy : 未設定(通常は未設定で OK)
   私の場合は、ここには現在ブラステルの IP アドレス xxx.yyy.zzz.181 を設定して
   います。
   これは OpenVPN 時にもレジストできるようにするためです。
  Secondary Outbound Proxy : 未設定
  NAT Traversal : "Keep-Alive"    注: UPnP/Auto は設定を避けた方がいい
                    ダイレクトIPのよる攻撃を受ける恐れ有り
  DNS Mode : "A Record"(デフォルト)
  DTMF : "RFC2833"(デフォルト)  注: "SIP INFO"とは排他使用のこと
  Preferred Vocoder : コーデック設定のこと
   WiFi/2G/3G/4G すべて同じに設定
   PCMU (G.711μ)/GSM/iLBC/OPUS/G729 (G.729) をこの順で設定

  これ以降の各項目は初期設定のまま


【Advanced Settings】

 GENERAL SETTINGS
  Edit Before Dial : オフ
   オンはダイヤル前に番号編集できるが電番にハイフンが含まれるとエラーになる
   オフは電番にハイフンが含まれてもエラーにならずに発信してくれる
  Default Account Registration Notification : ✔(通知領域にデフォルトアカウントのレジスト状態を表示)
  Vibrate When Ringing : ✔
  Start on Boot : ✔ またはオフ(デバイスのブート時に自動起動なら✔オン)

 CALL SETTINGS
  DND : オフ(夜間など時間帯で着信うけたくないときは設定)
  Use hard encoder : ✔

 AUDIO SETTINGS
  Noise Reduction Level : "Low"(デフォルトは "Middle")
  Speaker Gain : 0db(デフォルト)デバイス受話音量で調整
  Microphone Gain : 0db(デフォルト)デバイス送話音量で調整

 NETWORK SETTINGS
  Network : デフォルトのまま(2G/3G/4G/WiFi すべて✔)
  Only Use This WiFi to Register Account : オフ
  (特定 WiFI でのみ使いたいとき、現在接続されている WiFi の SSID が使用される)
  STUN Server Settings : stun.ipvideotalk.com(デフォルト: GS Wave のSTUN)
  (設定するなら Google がよい "stun.l.google.com:19302")
  QoS Settings : デフォルトのまま
  Random Port : ✔またはオフ
  (full cone NAT 配下で複数デバイスを使用時は必須。それ以外はオフでよい。
   ルーターが full cone NAT のみサポートというのは相当昔のルーターです)

 ADDITIONAL SETTINGS

  すべてデフォルトのまま。


【Custom Settings】

  Color/Theme/Language についてお好みで設定(Language に日本語はありません)


【About】

  何も設定しなくてもいいです。Check Updates で最新版かどうかをチェックできますが、Google Play でアップデートは通知されます。


【Record】

  通話録音した時に、ここに録音された一覧が格納されています。当該録音を再生できます。


【Debug】

  デバッグ用のレポートを Grandstream 社に送付するかどうか、
  SIP メッセージをトレースのためにログするかどうか、ログの場合の保存期間を指定します。
  通常は、デフォルトのままで触らなくてもいいでしょう。


【Exit】

  GrandStream Wave を終了するときにタップします。


以上です。


  
  

 
 

  


zoiper にマニュアルの件で問い合わせてみた

zoiper からは、ベータテスト中の zoiper 5 では完全なマニュアルを提供する、といってきたが、いまのバージョンに対する答えはなかった。

zoiper は PC用(Windows、Mac、Linux)と、スマホ用(iPhone、Android)があるが、PC用に簡単なチュートリアルがあるのみで、ましてやスマホ用はない。

マニュアルがないことへの後ろめたさはあるのか、問い合わせに謝罪の一文があった。

しかしながら、次期バージョン(zoiper 5 はPC用と思われる)がスマホ用にアレンジされるのか、そうであるならばスマホ用マニュアルも用意されるのか、いまの zoiper Beta との関係はどうなのか、一切わからずじまい。



zoiper でとくに疑問に思っている Configuration は以下の項目です。

Settings ➡ SIP Account ➡ [対象のアカウント] ➡ Network Settings
 Registration Expiry Time :
  サーバーとの継続的な再登録の際の最大時間(秒)を定義。
  zoiper はネットワーク遅延や再伝送を考慮して10%早く再登録処理する、とあ
  る。

  ほかの SIP アプリでは、設定値の半分の経過時点で再登録処理するものもある。

  例えば、3600秒に設定の場合、再登録は10%早くということは、3240秒後に
  行う、と読み取れる。

  Registration Expiry Time の SIP プロトコル上は「レジスト有効期限」なの
  で、再登録処理はこの時間経過時に行う(通常は早めに)。
  10%早く行うのは理に叶ってはいる。

  Android zoiper の場合、デフォルト値は 60 秒であるが、PC用は 3600 秒の
  よう。
  ルーターの UDP タイムアウト時間や、Android のハートビートとも関係する
  が、いくら位が適正値かはわからない。試行錯誤するしかないのか?

 Keep Alive Time-Out :
  デフォルトは "Default" であるが、なにがデフォルトかわからない。
  タイムアウトまでの時間がデフォルトで決まっているのか、そうだとしたらそれ
  は何秒なのか?
  Keep Alive すること自体がデフォルトなのか、そうだとしたら何秒間隔で
  Keep Aliveするのか?
  また、”Disable" は何が無効設定なのか?
  Keep Alive をするしないの Disable なのか、Time-Out すること自体が無効な
  のか?

  通常、SIP では登録状態を保持するのに、空の SDP をサーバーに一定間隔で投
  げます。これに対する 200OK で登録状態が保持されているとみなします。
  ここで、タイムアウトすれば、SIP 登録情報が無効になっていると判断し、再登
  録をしますが、このあたりの言及がありません。
  これに対するバグの件で zoiper には問い合わせていますが、まだ回答はありま
  せん。

 Rport :
  Rport RFC に基づく NAT 操作をするかしないか、TCP/TLS の場合にお勧め。
  ということは理解した。

Settings ➡ Connectivity
 Keep Alive WiFi :
  Android の WiFi sleep policy の書き換えはできない、とある。
  であれば、Android の WiFi 設定が「スリープ時に WiFi を切断」のときにの
  み有効に思えるが、そもそも、これも Seep policy なので、意味がないのではな
  いか?
  そもそも、WiFi の Keep Alive って何をするの?
 Stay Awake :
  バックグラウンドモードでの着信許可のオプションで、UDP のときは電池消費
  に影響するからお勧めしない、とある。TCP で使うようにともある。
  何をどう処理しているから、電池処理に影響するのかがわからない。
  Keep Alive との関係もわからない。
 Listening Port :
  Local SIP/IAX/RTP/TLS のそれぞれのポートに関して Random なポートを使
  用するかどうかの指定であることはわかるが、何のためかの言及がない。

  同様の機能は Grandstream Wave にもある。
  GS Wave の場合は、複数のデバイス(スマホ)が同じ full cone NAT 配下にあ
  るときに、デバイスを特定するために指定する、とあり、これはこれで納得でき
  る。

  おそらく、zoiper も同じと思えるが、このことへの言及がない。


  なお、GS Wave には、ダイレクト IP による SIP INVITE 攻撃の防止策として
  "Only Accept SIP Requests from Known Servers" と、"Check SIP User 
  ID for Incoming Invite" があるが、zoiper にはこれに相当する機能はありませ
  ん。


以上、ザーッと疑問な点を挙げました。

逆に、これら以外は、バグとかは別にして概ね理解したつもりです。



ちなみに、GS Wave のマニュアルは下記に pdf ファイルがあります。

GrandStream Wave Manual for Android

これの、Settings 部分のみ翻訳したものを保有しています。