目的
VirtualBox上で複数のネットワークインタフェース(NIC)を持つLinux環境を構築し、
firewalld を用いて ゾーンごとに通信を制御 する検証を行いました。
今回は以下の目的を中心に構成しています。
- firewalld の基本操作を理解する
- NICごとにゾーン(internal / external / maintenance)を分離する
- SSH や Web アクセスをゾーン単位で制御する
- 検証環境を何度でもリセットできるようにスクリプト化する
検証環境構成(VirtualBox)
仮想マシン構成
| 項目 | 内容 |
|---|---|
| ホストOS | Windows 11 |
| ゲストOS | AlmaLinux 9 |
| 仮想マシン数 | 2台(vm1, vm2) |
| firewalld バージョン | 1.3.4 |
| Python | 3.9.21 |
virtualBoxを使ったVMとネットワーク構成例
- vm1 も vm2と同じ構成とした。
| デバイス名 | VirtualBoxのネットワーク種別 | 用途 | firewalldゾーン |
|---|---|---|---|
enp0s3 |
内部ネットワーク(intnet_ext) | 外部システム提供向け通信 | external |
enp0s8 |
Host-Only | ホストOSとの通信用 | public |
enp0s9 |
内部ネットワーク(intnet_maint) | 保守回線用(SSH許可) | maintenance |
各デバイスとコネクション・接続プロファイルの紐づけ設定
1. NIC 状態確認
nmcli device status
ip link show
2. コネクション作成(interface-name は指定)
sudo nmcli con add type ethernet ifname enp0s3 con-name intnet_ext ipv4.addresses 10.0.10.1/24 ipv4.method manual
sudo nmcli con add type ethernet ifname enp0s9 con-name intnet_maint ipv4.addresses 10.0.20.1/24 ipv4.method manual
3. 接続プロファイルをデバイスに紐付け
sudo nmcli con mod intnet_ext connection.interface-name enp0s3
sudo nmcli con mod intnet_maint connection.interface-name enp0s9
4. 自動接続有効化
sudo nmcli con mod intnet_ext connection.autoconnect yes
sudo nmcli con mod intnet_maint connection.autoconnect yes
5. コネクション有効化
sudo nmcli con up intnet_ext
sudo nmcli con up intnet_maint
6. 接続確認
nmcli device status
ip a show enp0s3
ip a show enp0s9
firewalldのバージョン確認
firewall-cmd --version
または
sudo firewall-cmd --version
firewalld 初期設定手順
① firewalldの状態確認
sudo systemctl status firewalld
sudo firewall-cmd --state
② firewalldの有効化と自動起動設定
sudo systemctl start firewalld
sudo systemctl enable firewalld
③ 現在のゾーンと割り当て確認
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --list-all
検証用のゾーン設計
| ゾーン名 | 対象NIC | 用途 | 許可サービス |
|---|---|---|---|
public |
enp0s3 | 外部システム向け | http, https |
internal |
enp0s8 | 内部ネットワーク | ssh, cockpit |
maintenance |
enp0s9 | 保守用 | ssh のみ |
ゾーン作成と割り当て
新しいゾーンの作成
sudo firewall-cmd --permanent --new-zone=internal
sudo firewall-cmd --permanent --new-zone=maintenance
NICをゾーンに割り当て
sudo firewall-cmd --permanent --zone=internal --add-interface=enp0s8
sudo firewall-cmd --permanent --zone=maintenance --add-interface=enp0s9
ゾーンごとのサービス許可
# maintenance では ssh のみ許可
sudo firewall-cmd --permanent --zone=maintenance --add-service=ssh
設定反映
sudo firewall-cmd --reload
動作確認
Pythonの簡易Webサーバ起動(vm1側)
cd ~
python3 -m http.server 8080
ポート許可(vm1)
sudo firewall-cmd --permanent --zone=internal --add-port=8080/tcp
sudo firewall-cmd --reload
接続確認(vm2側)
curl http://10.0.10.1:8080
※通信先のIPはfirewalld設定を行う検証用サーバに向けて実行する
HTMLレスポンスが返れば、通信成功です。
初期化スクリプト(再検証用)
実行方法:
sudo bash reset_firewalld.sh
検証結果まとめ
-
firewalldのゾーンを使うことで、NICごとにセキュリティポリシーを明確化できた -
sshは保守NICのみで許可し、他ゾーンからのアクセスを防止できた - Python簡易サーバを使って通信確認を行い、正しくポート制御できることを確認
- 初期化スクリプトにより、再検証・再構築が容易になった
次のステップ
- 各サーバのNIC構成・ポート設定を変数化した「汎用firewalldセットアップスクリプト」を作成
- 設定状態を自動レポート化するスクリプトを追加(
firewall-cmd --list-all-zones整形出力) - GitHub Actionsなどを使って設定テストの自動化