ファイアウォール(firewalld / nftables)
ファイアウォールは、どの通信を通し、どれを遮断するかを決める「関所」です。必要なポートだけを開け、それ以外を閉じることで攻撃の入口を減らします。RHEL/MiracleLinux系では firewalld が標準で、firewall-cmd を使ってサービスやポートの許可を設定します。firewalld は内部で nftables を使って実際のルールを組み立てます。設定は --permanent を付けて保存し、--reload で反映させるのが基本の流れです。
サーバには、外から接続させたいサービスと、外に開ける必要のないものが混在している。前者は Webなら80・443番、SSHなら22番などだ。
では、意図せず開いたままになっているポートがあったら、どうなるか。それは攻撃の足がかりになりかねない。
この出入りを検査し、「どれを通し、どれを遮断するか」を決める関所が、ファイアウォール(firewall)だ。
基本方針は明快で、「必要なポート(port)だけを開け、それ以外はすべて閉じる」こと。
開いている入口が少ないほど、攻撃対象となる面(アタックサーフェス)が小さくなり、安全になる。
Linuxではカーネル内のパケット処理機構がこの取捨選択を担う。ユーザはそこにルールを与えて振る舞いを決める。
では、そのルールを私たちはどうやって与えるのか。RHEL/MiracleLinux系での主役を見ていこう。
🧩 firewalld と nftables の関係
RHEL/MiracleLinux系では firewalld というサービスが標準のファイアウォール管理ツールだ。
ただし firewalld 自体は窓口(フロントエンド)にすぎない。与えられた設定をもとに、実際のパケット制御を行う下層の nftables のルールを組み立てる役だ。
少し前までは下層が iptables だったが、現在は nftables に置き換わっている。
私たちが firewall-cmd で「このサービスを許可」と指示すると、firewalld がそれを nftables の具体的なルールへ翻訳してくれる。そういう分担になっている。
直接 nftables のルールを書くこともできる。だが firewalld を使えばサービス名で分かりやすく管理でき、設定の保存や再読み込みも整理された形で行える。まずは firewalld の操作を覚えるのが実務的だ。
firewalld が動いているかは `systemctl status firewalld` で確認できる。
その firewalld には、設定をぐっと扱いやすくする独特の考え方がある。
🗂 ゾーンという考え方
firewalld の特徴に「ゾーン(zone)」がある。これはネットワーク接続の信頼度に応じた設定の束だ。
たとえば public ゾーンは「信頼できない公衆ネットワーク向け」の控えめな既定、trusted ゾーンは「すべて許可」といったように、あらかじめ何種類か用意されている。
各ネットワークインターフェース(有線・無線など)をどのゾーンに割り当てるかで、その経路に適用されるルールが決まる。
多くのサーバでは、既定の public ゾーンをそのまま使い、そこに必要なサービスを足していく運用で十分だ。
現在の状態は2つのコマンドで確かめられる。`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 に加えてクラウド側のセキュリティグループでも同様に絞り、二重に守るのが定石になる。
そして「とりあえず全部開ける」誘惑に抗い、必要になったポートをそのつど最小限だけ開ける。この最小権限の発想をネットワークにも適用することが、長く安全に運用するための基本姿勢になる。