カテゴリー
【VPS・Linuxサーバー入門】iptablesからクライアントのMACアドレスごとにConoHa VPSのファイアウォールを設定する
※ 当ページには【広告/PR】を含む場合があります。
2022/12/13
2022/12/14

前の回では、ConoHa VPSのDebianインスタンスを起動させてから管理ユーザーでSSH接続をさせてみるところまで説明しました。
今回はConoHa VPSに限らず他のVPSサービスでも使えそうな、Linuxインスタンスのネットワークセキュリティ強化の施策として有効なファイアウォールを
MACアドレスを利用したファイアウォールの構築の基礎
VPSインスタンスに設定するファイアウォールでよく見かける設計パターンは、主にアクセス可能なネットワークポートをウェルノウンポート番号以外に制限する、といった考え方です。
例えば、SSH用に
22222
$ 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アドレスを持つマシーンが何らかの理由でお亡くなりになると、もうVPSインスタンスに接続できる方法を失ってしまうので、最悪VPSインスタンスをまるごと破棄しなくてはいけない危険をはらんでいます。
これを回避するためには、接続できるマシーンのMACアドレスを同時に2つ以上登録しておくと、どれか一つが使用不能になっても、最悪他の個体でカバーできるようにできます。
MACアドレス指定のファイアウォールは、サーバーに接続できるクライアントが1台しかない場合に、このクライアントの故障の際に復旧できなくリスクがあることを念頭に置きながら利用してください。
iptables-persistentでファイアウォールを管理する
iptablesコマンドから打ち込んだ設定は次のサーバー起動時には消えてしまうため、ファイアウォールの設定を永続化したいなら、
rc.local
これだと後々になってファイアウォールのルールが複雑化するほど、自分で
rc.local
iptablesのルールの管理をしやすくするために、
ここでは
iptables-persistent
まずは
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
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アドレスとは、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に接続する際には
最終的にご自宅のネットワークから外部に出るのは、ブロードバンドルーターのような機器ですが、これは契約ごとに事情が異なるので、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アドレスは簡単に調べられるものと、隠されていて簡単にはわからないものに分かれます。
著者が自宅&出先で快適に使えて重宝している「
まず、WiMAX内のローカルネットワーク内の適当なクライアントからpingしてLOGを残るようにルールを追加しておきます。
$ sudo iptables -A INPUT -p imcp -j LOG --log-macdecode
ポイントは、
--log-macdecode
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アドレスの調べ方②〜ブロードバンドルーターの設定画面で調べる
おおよそ市販されているブロードバンドルーターに用意されている
先程のようにLOGターゲットで確認するほうが確実かもしれませんが、グローバルMACアドレスの確認手段として知っておくと良いと思います。
こちらも手持ちの
取説等に書かれているように、管理者画面へアクセスするURL(
http://192.168.*.1
すると、管理者画面のログイン画面が表示されます。
600x577

WAN側でインターネットの境界となっているネットワークインターフェースのMACアドレスは、ログインしないと見れないようになっています。
まずはログインしてから、画面下の方にある
[設定] > [情報] > [現在の状態]
700x773

そこで、
装置情報
MACアドレス(ETHERNET)
これはあくまで「
まとめ
今回はiptablesコマンドからMACアドレスを使ったファイヤーウォールの仕込み手順を簡単に解説してみました。
MACアドレスでのパケットフィルタリングはかなり強力なネットワーク保護になる反面、アクセス可能なハードウェアに不具合が生じたり、紛失したりすると、VPSへのアクセスが不可能になってしまうかも知れない「諸刃の剣」かも知れません。
どのようなファイアウォールがご自身のネットワーク環境に適しているかは、よくよく熟考ください。
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー