Hestia control panel
VPS で Asterisk を動かし、IP-PBX として使っているのですが、SIPの標準ポート(5060番)を開けているので、それはそれは認証を試みるアタックが多くて困っていました。もちろん、お約束の fail2ban で対応しているのですが、BAN リストが日によっては1,000個を超えてくるので、なんとか送信元 IP アドレスを国別というか、日本 only(海外からの通信をフィルタ)にしようと、ネットを彷徨っていると…

Hestia で国別のIP許可やブラックリスト機能が楽すぎ!今までの苦労はなんだったんだ…

というブログに出会うことができました。

この Hestia というコントロールパネルによって、日本国内からの接続だけを許可する&ブラックリストに記載されている怪しいアドレスからは拒否する が実現し、効果は素晴らしいというか、もうトレビアン♪と言った感じで、さすが ダンまちの女神さま と、感激しています。

IPset という機能を使う為に、Hestia のインストールと、その IPset の設定について簡単にご紹介します。今回は、コントロールパネルという本来の機能は殆ど使わず、Asterisk の為にファイアーウォールを主に使うという、一般的な利用方法とは異なるので、ご注意ください。

私が調べた限り、一度インストールした Hestia を簡単にアンインストールする方法を見つけることが出来ませんでした。
万が一、アンインストールが出来なかった時に備えて、Hestia のインストール前に、スナップショットや仮想イメージの保存等、何らかのバックアップを取得した後、作業を続ける事をお勧めします。
James porter Bridges
James porter Bridges

今回 Asterisk が動いているマシンは、Debian 11 bullseye です。このマシンに Hestia をインストールします。
まずは、インストール用のスクリプトが用意されているので、/root に持ってきます。

wget https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh

次にこのスクリプトに実行権限を付けます。

chmod 755 hst-install.sh

Hestia control panel のインストールスクリプトは、独自に各種サービスをインストールし、セットアップを自動で行います。また、ファイアーウォールに連動して fail2ban を使うので、スクリプトを実行する前に、現在稼働中の fail2ban を 一旦 remove します。

apt remove fail2ban

それでは、Hestia のインストールですが、今回はファイアーウォールの機能しか使わないので、必要のないサービスのインストールはしません。その為、スクリプトに渡すパラメータは次の様になります。

./hst-install.sh -a no -w no -o no -v no -j no -m no -g no -z no -x no -k no

一般的に MTA には、Postfix が使われている事が多いと思いますが、Hestia ではデフォルトの MTA が Exim なので、明示的にインストールを禁止しないと、Postfix を削除し、Exim をインストールしますので、ご注意ください。インストールオプションの詳細は こちら をご覧下さい。

しばらく待つと、このような画面が表示され、インストールの準備完了です。

Y を入力し、管理者のメールアドレスを入力すると、インストールが始まります。途中経過が全く表示されないので、ちょっと不安になりますが、じっと待っていると…

上記のメッセージが表示されれば、Hestia のインストールは完了です。画面に表示されるパスワードを必ずメモをとるか、テキストファイルとして保存してください。
パスワードはこの場でしか確認できません。

画面の指示に従い、何かキーを押すと、自動的に reboot(システム全体の再起動)を行い、起動後は Hestia control panel の管理画面へ、ブラウザからアクセスできるようになります。

ファイアーウォールの設定画面

ファイアーウォールの設定画面

管理画面はとてもよく出来ていて、直感的に操作できます。home 画面の右上にある歯車マークから設定画面を呼び出し、ファイアーウォールの設定を行います。

IPset の追加画面

IPset の追加画面

ここで国別IPアドレスを使った IPset の設定を行うのですが、なんとプルダウンメニューには日本(Japan)がありません。
URLを入力する画面なので、プルダウンメニューに存在する他国のURLを注意深く見ると…

カナダ
https://raw.githubusercontent.com/ipverse/rir-ip/master/country/ca/ipv4-aggregated.txt

中国
https://raw.githubusercontent.com/ipverse/rir-ip/master/country/cn/ipv4-aggregated.txt

ロシア
https://raw.githubusercontent.com/ipverse/rir-ip/master/country/ru/ipv4-aggregated.txt

という内容でしたので、ひょっとして
https://raw.githubusercontent.com/ipverse/rir-ip/master/country/jp/ipv4-aggregated.txt

…と、マニュアルで入力すると、URLが指示した先にファイルが存在したようで、無事日本用 IPset の設定ができました。

IPset の設定画面

IPset の設定画面

次に、ファイアーウォールの設定で Asterisk が使う、UDP 5060, 10000-20000 や、TCP 5060, 5061 に、この日本用 IPset を適用させれば作業は終了です。

自宅や事務所の IP 電話機であれば、この設定で問題なく稼働しますが、スマホにインストールしてある IP 電話のソフトフォンでは、これだけではうまく動きませんでした(具体的には外部からの着信を受け取れない)。調べてみると、最近のソフトフォンは、待ち受け時にアプリがバックグラウンドで起動していると、バッテリーを無駄に消費するので、プッシュサーバからの通知でアプリが起動する造りになっています。

つまり、ソフトフォンが起動していると、ソフトフォンが直接 IP-PBX へ接続する状態になりますが、待ち受け時にはプッシュサーバが IP-PBX へ接続し、呼び出しを待機するような動作になります。

私が使っているソフトフォンは、CounterPath 社の Bria teams というアプリなのですが、このアプリでは以下のプッシュサーバを使っているようです。
詳細はこちら…
https://docs.counterpath.com/docs/AndUG/clients/UserGuides/Mobile/Reference/mobBriaPushService.htm
https://support.counterpath.com/hc/en-us/articles/115004151013-Bria-Mobile-Push-Checklist

https://push.softphone.com	216.93.246.120
https://push-as.softphone.com	35.185.177.49
https://push-as3.softphone.com	35.240.151.194
https://push-au.softphone.com	35.189.7.217
https://push-au2.softphone.com	35.244.85.149
https://push-eu.softphone.com	35.195.163.239
https://push-eu2.softphone.com 	34.89.45.1
https://push-ue.softphone.com	216.93.246.120
https://push-ue3.softphone.com	35.230.185.25
https://push-uw.softphone.com	35.197.16.246
https://push-uw3.softphone.com	35.247.85.64
https://push-uc.softphone.com	35.239.221.102
https://push-za.softphone.com	102.133.161.81
https://push-jp.softphone.com	104.198.91.17

Asterisk のコマンドで確認すると、接続しに来ているプッシュサーバは、35.185.177.49 でした。この IP アドレスは日本の IP アドレスリストには含まれていないので、iptables で拒否されてしまいます。

その為、上記リストの URL より見当を付け、push-as, push-as3 の IP アドレスを個別に許可ルールに入力しました。この状態で、しばらく様子を見ようと思います。
※push-as (35.185.177.49), push-as3 (35.240.151.194) はシンガポール、push-jp は日本国内のIPアドレスでした。

現在稼働中の iptables のリストを掲示します(iptables -nL の表示結果)。Chain INPUT (policy DROP) という記述(1行目)から、デフォルトが deny(拒否)という事がわかります。また、Japan-ipv4 というのが、私が日本用 IPset に付けた名前です。

8083 は Hestia control panel のアクセス用、4949 は Munin-node、123 は chrony(ntpd の代わり)、あとセカンダリの権威 DNS サーバーを動かしているので、53 は開けています。

Hestia をインストールしてから数日たちますが、Asterisk のログを見る限り、アタックに類するログは何も見当たりません。
もちろん、連日、多数のアタックは来ているのでしょうが、IPset + iptables で海外からのパケットは全て落としてくれる為、ログ上はいかにも平和に見えます。

Hestia 本来の使用法とはちょっと違いますが、国別IPアドレスリストによってアクセス制限したい という用途には、インストール後の運用がとにかく楽なのでお勧めです。また、IPset で使っている国別 IP アドレスリストは、cron で毎日更新しているようで、このようなシステムが無料で使えると言うのは本当にありがたいです。

 References

  1. Hestia で国別のIP許可やブラックリスト機能が楽すぎ!今までの苦労はなんだったんだ…
  2. Hestia control panel
  3. Welcome to Hestia Control Panel’s documentation!
  4. Getting Started with Asterisk