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


2022/12/13
2022/12/14
【VPS・Linuxサーバー入門】ConoHa VPSでDebianインスタンスの初期設定〜ユーザーの追加してみる
【VPS・Linuxサーバー入門】ip6tablesからのWebARENA IndigoのVPSへIPv6仕様のファイアウォールを設定する
蛸壺の技術ブログ|iptablesからクライアントのMACアドレスごとにConoHa VPSのファイアウォールを設定する

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

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

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

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


合同会社タコスキングダム|蛸壺の技術ブログ

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台しかない場合に、このクライアントの故障の際に復旧できなくリスクがあることを念頭に置きながら利用してください。


合同会社タコスキングダム|蛸壺の技術ブログ

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

iptablesコマンドから打ち込んだ設定は次のサーバー起動時には消えてしまうため、ファイアウォールの設定を永続化したいなら、rc.localに直接iptablesコマンドを初回実行させるのが、楽なやり方ではあります。

これだと後々になってファイアウォールのルールが複雑化するほど、自分で
rc.localのファイルの中身を細かく管理するのが大変です。

iptablesのルールの管理をしやすくするために、
「iptables-persistent」を追加で導入します。

ここでは
iptables-persistentを使って一つ一つiptablesコマンドの挙動を確認しながらファイアウォールを設定していくスタイルを取り上げます。

まずは
iptables-persistentをインストールしましょう。

            
            $ sudo apt install iptables-persistent -y
        
インストールの際に、IPv4とIPv6の設定を保存するかを個別に聞いてくるので、利用状況に併せて設定を選択します。

合同会社タコスキングダム|蛸壺の技術ブログ

と、これだけで
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サービスが起動します。


合同会社タコスキングダム|蛸壺の技術ブログ

拡張モジュール・「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アドレスは簡単に調べられるものと、隠されていて簡単にはわからないものに分かれます。

著者が自宅&出先で快適に使えて重宝している
「とくとくBB WiMAX」だと、グローバル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)をブラウザに入力します。

すると、管理者画面のログイン画面が表示されます。

合同会社タコスキングダム|蛸壺の技術ブログ

WAN側でインターネットの境界となっているネットワークインターフェースのMACアドレスは、ログインしないと見れないようになっています。

まずはログインしてから、画面下の方にある
[設定] > [情報] > [現在の状態]をたどります。

合同会社タコスキングダム|蛸壺の技術ブログ

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

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

合同会社タコスキングダム|蛸壺の技術ブログ


合同会社タコスキングダム|蛸壺の技術ブログ

まとめ

今回はiptablesコマンドからMACアドレスを使ったファイヤーウォールの仕込み手順を簡単に解説してみました。

MACアドレスでのパケットフィルタリングはかなり強力なネットワーク保護になる反面、アクセス可能なハードウェアに不具合が生じたり、紛失したりすると、VPSへのアクセスが不可能になってしまうかも知れない「諸刃の剣」かも知れません。

どのようなファイアウォールがご自身のネットワーク環境に適しているかは、よくよく熟考ください。