ファイアウォール(firewalld / nftables)
ファイアウォールは、どの通信を通し、どれを遮断するかを決める「関所」です。必要なポートだけを開け、それ以外を閉じることで攻撃の入口を減らします。RHEL/MiracleLinux系では firewalld が標準で、firewall-cmd を使ってサービスやポートの許可を設定します。firewalld は内部で nftables を使って実際のルールを組み立てます。設定は --permanent を付けて保存し、--reload で反映させるのが基本の流れです。
ファイアウォール(firewall)は、コンピュータやネットワークに出入りする通信を検査し、「どれを通し、どれを遮断するか」を決める関所です。サーバには本来、外から接続させたいサービス(Webなら80・443番、SSHなら22番など)と、外に開ける必要のないものが混在しています。何も対策しなければ、意図せず開いているポート(port)が攻撃の足がかりになりかねません。ファイアウォールの基本方針は「必要なポートだけを開け、それ以外はすべて閉じる」こと。開いている入口が少ないほど、攻撃対象となる面(アタックサーフェス)が小さくなり、安全になります。Linuxではカーネル内のパケット処理機構がこの取捨選択を担い、ユーザはそこにルールを与えて振る舞いを決めます。
firewalld と nftables の関係
RHEL/MiracleLinux系では firewalld というサービスが標準のファイアウォール管理ツールです。firewalld 自体は窓口(フロントエンド)で、与えられた設定をもとに、実際のパケット制御を行う下層の nftables のルールを組み立てます。少し前までは下層が iptables でしたが、現在は nftables に置き換わっています。私たちが firewall-cmd で「このサービスを許可」と指示すると、firewalld がそれを nftables の具体的なルールへ翻訳してくれる、という分担です。直接 nftables のルールを書くこともできますが、firewalld を使えばサービス名で分かりやすく管理でき、設定の保存や再読み込みも整理された形で行えるため、まずは firewalld の操作を覚えるのが実務的です。firewalld が動いているかは `systemctl status firewalld` で確認できます。
ゾーンという考え方
firewalld の特徴に「ゾーン(zone)」があります。これはネットワーク接続の信頼度に応じた設定の束で、たとえば public ゾーンは「信頼できない公衆ネットワーク向け」の控えめな既定、trusted ゾーンは「すべて許可」といったように、あらかじめ何種類か用意されています。各ネットワークインターフェース(有線・無線など)をどのゾーンに割り当てるかで、その経路に適用されるルールが決まります。多くのサーバでは既定の public ゾーンをそのまま使い、そこに必要なサービスを足していく運用で十分です。現在の状態は `firewall-cmd --get-active-zones` で割り当てを、`firewall-cmd --list-all` で今のゾーンの許可内容(開いているサービスやポート)をまとめて確認できます。
firewall-cmd の基本操作
設定は firewall-cmd コマンドで行います。サービス単位で開けるのが分かりやすく、`firewall-cmd --add-service=http` で Web(80番)を、`firewall-cmd --add-service=ssh` で SSH を許可できます。番号で直接指定したいときは `firewall-cmd --add-port=8080/tcp` のようにポートとプロトコルを書きます。ここで最重要なのが、これらの指定はそのままでは一時的で、再起動すると消えてしまうという点です。設定を恒久化するには `--permanent` を付け、`firewall-cmd --permanent --add-service=http` とします。ただし --permanent を付けた変更は「保存はされるが今すぐには効かない」ため、最後に `firewall-cmd --reload` を実行して反映させます。つまり実務の定番の流れは、`firewall-cmd --permanent --add-service=http` のあとに `firewall-cmd --reload`、という二段構えです。設定後は `firewall-cmd --list-all` で意図どおり開いたかを必ず確認します。逆に閉じるときは --add を --remove に置き換え(`firewall-cmd --permanent --remove-service=http`)、同じく --reload します。
よくある失敗とセキュリティ上の注意
つまずきの筆頭が、--permanent と --reload の付け忘れです。--permanent なしで開けたサービスは再起動で消え、「昨日は通ったのに今日は通らない」と混乱します。逆に --permanent だけ付けて --reload を忘れると「保存したのに今は効かない」状態になります。両者の役割を分けて覚えておきましょう。もうひとつ注意したいのが、SSH 経由で作業しているときにファイアウォールを強くいじる場面です。誤って ssh サービスを閉じると、その瞬間に自分が締め出されて手も足も出なくなります。リモートで危ない変更をするときは、一定時間後に自動で設定を元へ戻す機能(`firewall-cmd --runtime-to-permanent` を使う前に動作確認する、コンソールアクセスを確保しておく等)で安全網を張ります。なお、ufw は Ubuntu系で使われる別のファイアウォール管理ツールで、RHEL/MiracleLinux系では使いません。系統が違っても「不要なポートを閉じる」という目的は同じです。
実務の使いどころ
実務では、ファイアウォールは単体ではなく多層防御の一枚として位置づけます。まずサーバ構築時に、提供するサービスのポートだけを --permanent で開け、それ以外は閉じておく。SSH は開けつつ、可能なら接続元のIPアドレス範囲を絞る(firewalld のリッチルールで送信元を限定する)と、より安全です。クラウド上のサーバなら、OS内の firewalld に加えてクラウド側のセキュリティグループでも同様に絞り、二重に守るのが定石です。そして「とりあえず全部開ける」誘惑に抗い、必要になったポートをそのつど最小限だけ開ける——この最小権限の発想をネットワークにも適用することが、長く安全に運用するための基本姿勢になります。