【VPS・Linuxサーバー入門】iptablesからクライアントのMACアドレスごとにConoHa VPSのファイアウォールを設定する


※ 当ページには【広告/PR】を含む場合があります。
2022/12/13
2022/12/14
【VPS・Linuxサーバー入門】ConoHa VPSでDebianインスタンスの初期設定〜ユーザーの追加してみる
【VPS・Linuxサーバー入門】ip6tablesからのWebARENA IndigoのVPSへIPv6仕様のファイアウォールを設定する
【個人的VPS運用日記】ConoHaのお誕生日クーポンを受け取ったときのお話
蛸壺の技術ブログ|iptablesからクライアントのMACアドレスごとにConoHa VPSのファイアウォールを設定する



前の回では、ConoHa VPSのDebianインスタンスを起動させてから管理ユーザーでSSH接続をさせてみるところまで説明しました。

合同会社タコスキングダム|蛸壺の技術ブログ
【VPS・Linuxサーバー入門】ConoHa VPSでDebianインスタンスの初期設定〜ユーザーの追加してみる

『ConoHa VPS』で立ち上げたのDebianベースのVPSインスタンスにroot以外のユーザーを追加する手順を解説します。



今回はConoHa VPSに限らず他のVPSサービスでも使えそうな、Linuxインスタンスのネットワークセキュリティ強化の施策として有効なファイアウォールを
「iptables」 を利用して、クライアントデバイスのMACアドレスで構築してみようかと思います。


ConoHa VPS

MACアドレスを利用したファイアウォールの構築の基礎




VPSインスタンスに設定するファイアウォールでよく見かける設計パターンは、主にアクセス可能なネットワークポートをウェルノウンポート番号以外に制限する、といった考え方です。
例えば、SSH用に
22222 を開放するのは、INPUTチェーンに以下のようなフィルターを作成しているパターンです。

            $ sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 22222 -j ACCEPT
...

        

これで、SSHに対してのウェルノウンポートである
22 の攻撃を回避して、攻撃者の分かりづらい 22222 という番号に変更した分だけリスクが減ります。
さらにパケット送信元の(グローバル)IPアドレスが静的に固定されている場合には、もっと強力にこのフィルターを強化することもできます。

            $ sudo iptables -A INPUT -p tcp -s [送信者のIPアドレス] --dport 22222 -j ACCEPT

        

ただしこの方法ではVPSサービスを利用したSSH接続では、インターネットを介したやり取りを行う必要があり、クライアント側に、静的なグローバルIPアドレスで固定されている必要があるかと思います。
しばしば、静的なグローバルIPアドレスの取得は有料になるので、IP固定だけにクライアント一つにグローバルIPアドレスの割当サービスを購入するのは少しためらわれると感じます。
そこで、グローバルIPアドレスの代わりに、ネットワークインターフェース固有のMACアドレスを使って、フィルターを指定することを考えてみましょう。
先んじて注意事項を挙げると、
MACアドレスでのファイアウォールが限定的すぎるので、接続したクライアント以外では接続できなくなってしまう という、若干“諸刃の剣”的な設定になります。
つまり、ファイアウォールで許可したMACアドレスを持つマシーンが何らかの理由でお亡くなりになると、もうVPSインスタンスに接続できる方法を失ってしまうので、最悪VPSインスタンスをまるごと破棄しなくてはいけない危険をはらんでいます。
これを回避するためには、接続できるマシーンのMACアドレスを同時に2つ以上登録しておくと、どれか一つが使用不能になっても、最悪他の個体でカバーできるようにできます。
MACアドレス指定のファイアウォールは、サーバーに接続できるクライアントが1台しかない場合に、このクライアントの故障の際に復旧できなくリスクがあることを念頭に置きながら利用してください。


ConoHa VPS

iptables-persistentでファイアウォールを管理する



iptablesコマンドから打ち込んだ設定は次のサーバー起動時には消えてしまうため、ファイアウォールの設定を永続化したいなら、
rc.local に直接iptablesコマンドを初回実行させるのが、楽なやり方ではあります。
これだと後々になってファイアウォールのルールが複雑化するほど、自分で
rc.local のファイルの中身を細かく管理するのが大変です。
iptablesのルールの管理をしやすくするために、
「iptables-persistent」 を追加で導入します。
ここでは
iptables-persistent を使って一つ一つiptablesコマンドの挙動を確認しながらファイアウォールを設定していくスタイルを取り上げます。
まずは
iptables-persistent をインストールしましょう。

            $ sudo apt install iptables-persistent -y

        

インストールの際に、IPv4とIPv6の設定を保存するかを個別に聞いてくるので、利用状況に併せて設定を選択します。
783x632
合同会社タコスキングダム|蛸壺の技術ブログ


と、これだけで
iptables-persistent の実質的な実行プログラムである netfilter-persistent コマンドが利用できるようになります。
使い方は簡単で、現在のファイアウォールを保存したい場合には、

            $ sudo netfilter-persistent save
#👇IPv4用Netfilterルール
run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
#👇IPv6用Netfilterルール
run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save

        

で、設定の永続化ができます。
既存のルールを一旦すべてクリアしたい場合には、

            $ sudo netfilter-persistent flush

        

を利用します。
もしも誤って
netfilter-persistent flush をしてしまった場合や、ルールを追加したあとで挙動がおかしく繋がらなくなったときには、焦らずに、

            $ sudo netfilter-persistent reload

        

としてあげると、前回の
netfilter-persistent save した設定までやり直すことができるので、「復元ポイント」まで巻き戻せるように使えて便利です。

netfilter-persistent の実体は、systemdに登録されるデーモンプログラムです。
iptables-persistentをインストールすると、OS起動時に自動で
netfilter-persistent start が実行され、ルールが自動でリストアされるようになっています。

            $ sudo systemctl status netfilter-persistent
● netfilter-persistent.service - netfilter persistent configuration
     Loaded: loaded (/lib/systemd/system/netfilter-persistent.service; enabled; vend>
    Drop-In: /etc/systemd/system/netfilter-persistent.service.d
             └─iptables.conf
     Active: active (exited) since Mon 2022-12-12 16:00:17 JST; 34min ago
       Docs: man:netfilter-persistent(8)
   Main PID: 543099 (code=exited, status=0/SUCCESS)
      Tasks: 0 (limit: 528)
     Memory: 0B
        CPU: 0
     CGroup: /system.slice/netfilter-persistent.service


        


サービスの停止したい時には、

            $ sudo netfilter-persistent stop

        

を使います。
再度手動で、

            $ sudo netfilter-persistent start

        

とすると、
netfilter-persistent サービスが起動します。


ConoHa VPS

拡張モジュール・「mac」でフィルターを構築する



別のブログで、iptablesで利用できる
macモジュール を取り上げていましたので、詳しいことがそちらを参照してください。
一般的にMACアドレスとは、Linuxだと
ipコマンド で確認できます。
各ネットワークインターフェースごとにMACアドレスが存在し、
link/ether の値に表示されます。

            $ ip addr | grep ether
    #...
    link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff
    #...

        

一例として、送信元MACアドレスが
00:11:22:33:44:55 であることが分かります。
iptablesコマンドのmacモジュールは、指定した送信元MACアドレスのパケットのみを通過させる条件をINPUTチェーンに対して設定することで利用できます。
ここでは、

            $ sudo iptables -A INPUT \
    -m mac --mac-source 00:11:22:33:44:55 \
    -j ACCEPT

        

とするとINPUTチェーンが、MACアドレス・
00:11:22:33:44:55 のパケットを通過させてくれます。
ただし、リモートでVPSに接続する際には
WAN側で最終的にインターネット接続しているインターフェースのMACアドレス を利用します。
最終的にご自宅のネットワークから外部に出るのは、ブロードバンドルーターのような機器ですが、これは契約ごとに事情が異なるので、MACアドレスの調べ方は別途製品マニュアルなどを読んでみると良いと思います。
ということで、ここではファイアウォールの一例をiptablesコマンドを実行させながら確認していくと、

            #👇ループバックからの入力は常に許可
$ sudo iptables -A INPUT -i lo -j ACCEPT
#👇既に接続したことのある外部への通信(応答)を許可
$ sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#👇MACアドレス・00:11:22:33:44:55(👈現在のWAN接続されている機器)からの外部入力は許可
$ sudo iptables -A INPUT -m mac --mac-source 00:11:22:33:44:55 -j ACCEPT
#👇利用できるならば、別のMACアドレス・11:22:33:44:55:66(👈保険のクライアント)からの外部入力は許可
$ sudo iptables -A INPUT -m mac --mac-source 11:22:33:44:55:66 -j ACCEPT

#👇上記の設定ルールに該当しないパケットで、INPUTアクセスは破棄
$ sudo iptables -A INPUT -j DROP
#sudo iptables -P INPUT DROP でポリシーごと書き換えても可

#👇上記の設定ルールに該当しないパケットで、FORWARDアクセスは破棄
$ sudo iptables -A FORWARD -j DROP
#sudo iptables -P FORWARD DROP でポリシーごと書き換えても可

#👇上記の設定ルールに該当しないパケットで、OUTPUTは許可
$ sudo iptables -A OUTPUT -j ACCEPT
#sudo iptables -P OUTPUT ACCEPT でポリシーごと書き換えても可

        

これで、基本的に個人で所有しているネットワーク機器でしかVPSに繋げないというファイヤーウォールが完成しました。
設定したファイヤーウォールに問題がなさそうなら、

            $ sudo netfilter-persistent save

        

で永続化して完了です。
MACアドレスをファイヤーウォールに登録したマシーンからVPSインスタンスにpingしてみると、

            $ ping -c 4 <VPSのIPアドレス>
#...接続可能

        

対して、MACアドレスを登録していないマシーンでは

            $ ping -c 4 <VPSのIPアドレス>
#...接続不可

        

ということで設定を確認できればファイヤーウォールが機能していることになります。

グローバルMACアドレスの調べ方①〜LOGターゲットを利用する



先ほどの内容でも少し言及したように、ローカルネットワークで使っている個別のマシーンが複数台あっても、インターネットを通じて外部にパケットを送り出す際に、最終的にWANのMACアドレスに置き換わってしまうので、リモートのVPSインスタンスが受け取るMACアドレスとは、ブロードバンドルーターのMACアドレス(
グローバルMACアドレス )になってしまいます。
このグローバルMACアドレスは簡単に調べられるものと、隠されていて簡単にはわからないものに分かれます。
著者が自宅&出先で快適に使えて重宝している「
GMOとくとくBB
」だと、グローバルMACアドレスが分かりにくくされているようで、iptablesのmacモジュールでフィルタするのも少しコツがいります。
まず、WiMAX内のローカルネットワーク内の適当なクライアントからpingしてLOGを残るようにルールを追加しておきます。

            $ sudo iptables -A INPUT -p imcp -j LOG --log-macdecode

        

ポイントは、
--log-macdecode オプションで通常ログに残るMACアドレスはエンコード形式で記録されるものを、デコード表示してくれるようになります。
ping後のログ(ここでは
/var/log/kern.log のファイル)を確認すると、

            $ sudo cat /var/log/kern.log
...
Dec 12 20:32:23 xxx-xxx-xxx-xxxx kernel: [2849028.102048] IN=eth0 OUT= 🌟MACSRC=xx:xx:xx:xx:xx:xx MACDST=00:00:00:00:11:22 MACPROTO=0800 SRC=yyy.yyy.yyy.yyy DST=zzz.zzz.zzz.zzz LEN=36 TOS=0x00 PREC=0x00 TTL=241 ID=2089 DF PROTO=ICMP TYPE=8 CODE=0 ID=18 SEQ=17006

        


という情報が記録されており、特にアクセス履歴にある
MACSRC (🌟の箇所)が、アクセス元のグローバルMACアドレスということになります。

グローバルMACアドレスの調べ方②〜ブロードバンドルーターの設定画面で調べる



おおよそ市販されているブロードバンドルーターに用意されている
「管理画面」 のようなダッシュボードが、ブラウザから操作できるようになっていると思います。
先程のようにLOGターゲットで確認するほうが確実かもしれませんが、グローバルMACアドレスの確認手段として知っておくと良いと思います。
こちらも手持ちの
「とくとくBB WiMAX」 を例にグローバルMACアドレスを探してみます。
取説等に書かれているように、管理者画面へアクセスするURL(
http://192.168.*.1 のようなプライベートIP)をブラウザに入力します。
すると、管理者画面のログイン画面が表示されます。
600x577
合同会社タコスキングダム|蛸壺の技術ブログ


WAN側でインターネットの境界となっているネットワークインターフェースのMACアドレスは、ログインしないと見れないようになっています。
まずはログインしてから、画面下の方にある
[設定] > [情報] > [現在の状態] をたどります。
700x773
合同会社タコスキングダム|蛸壺の技術ブログ


そこで、
装置情報 にある MACアドレス(ETHERNET) の値がグローバルMACの値になります。

これはあくまで「
GMOとくとくBB
」の例ですが、他のブロードバンドルーター商品も同じような感じの手順でMACアドレスを探せると思います。


ConoHa VPS

まとめ



今回はiptablesコマンドからMACアドレスを使ったファイヤーウォールの仕込み手順を簡単に解説してみました。
MACアドレスでのパケットフィルタリングはかなり強力なネットワーク保護になる反面、アクセス可能なハードウェアに不具合が生じたり、紛失したりすると、VPSへのアクセスが不可能になってしまうかも知れない「諸刃の剣」かも知れません。
どのようなファイアウォールがご自身のネットワーク環境に適しているかは、よくよく熟考ください。