🐧 Linux 総合学習プラットフォーム
セキュリティ/権限強化 ・ 中級

ファイアウォール(firewalld / nftables)

ファイアウォールは、どの通信を通し、どれを遮断するかを決める「関所」です。必要なポートだけを開け、それ以外を閉じることで攻撃の入口を減らします。RHEL/MiracleLinux系では firewalld が標準で、firewall-cmd を使ってサービスやポートの許可を設定します。firewalld は内部で nftables を使って実際のルールを組み立てます。設定は --permanent を付けて保存し、--reload で反映させるのが基本の流れです。

サーバには、外から接続させたいサービスと、外に開ける必要のないものが混在している。前者は Webなら80・443番、SSHなら22番などだ。

では、意図せず開いたままになっているポートがあったら、どうなるか。それは攻撃の足がかりになりかねない。

この出入りを検査し、「どれを通し、どれを遮断するか」を決める関所が、ファイアウォール(firewall)だ。

💡
ポイントファイアウォールの基本方針は「必要なポートだけを開け、それ以外はすべて閉じる」。開いた入口が少ないほど安全になる。

基本方針は明快で、「必要なポート(port)だけを開け、それ以外はすべて閉じる」こと。

外からの接続関所firewallサーバ22 / 80 / 443許可ポート 22/80/443 → 通すそれ以外のポート → 遮断

開いている入口が少ないほど、攻撃対象となる面(アタックサーフェス)が小さくなり、安全になる。

Linuxではカーネル内のパケット処理機構がこの取捨選択を担う。ユーザはそこにルールを与えて振る舞いを決める。

では、そのルールを私たちはどうやって与えるのか。RHEL/MiracleLinux系での主役を見ていこう。

🧩 firewalld と nftables の関係

RHEL/MiracleLinux系では firewalld というサービスが標準のファイアウォール管理ツールだ。

🔗
たとえfirewalld は窓口(フロントエンド)、nftables は実際にパケットを捌く下層。窓口の指示を下層のルールに翻訳する分担だ。

ただし firewalld 自体は窓口(フロントエンド)にすぎない。与えられた設定をもとに、実際のパケット制御を行う下層の nftables のルールを組み立てる役だ。

少し前までは下層が iptables だったが、現在は nftables に置き換わっている。

私たちが firewall-cmd で「このサービスを許可」と指示すると、firewalld がそれを nftables の具体的なルールへ翻訳してくれる。そういう分担になっている。

直接 nftables のルールを書くこともできる。だが firewalld を使えばサービス名で分かりやすく管理でき、設定の保存や再読み込みも整理された形で行える。まずは firewalld の操作を覚えるのが実務的だ。

firewalld が動いているかは `systemctl status firewalld` で確認できる。

その firewalld には、設定をぐっと扱いやすくする独特の考え方がある。

🗂 ゾーンという考え方

firewalld の特徴に「ゾーン(zone)」がある。これはネットワーク接続の信頼度に応じた設定の束だ。

たとえば public ゾーンは「信頼できない公衆ネットワーク向け」の控えめな既定、trusted ゾーンは「すべて許可」といったように、あらかじめ何種類か用意されている。

各ネットワークインターフェース(有線・無線など)をどのゾーンに割り当てるかで、その経路に適用されるルールが決まる。

コツ多くのサーバは既定の public ゾーンをそのまま使い、そこに必要なサービスを足していく運用で十分だ。

多くのサーバでは、既定の public ゾーンをそのまま使い、そこに必要なサービスを足していく運用で十分だ。

firewall-cmd --get-active-zones で割り当てを、firewall-cmd --list-all で今の許可内容を確認する。

現在の状態は2つのコマンドで確かめられる。`firewall-cmd --get-active-zones` で割り当てを、`firewall-cmd --list-all` で今のゾーンの許可内容(開いているサービスやポート)をまとめて確認できる。

では、そのゾーンに「このサービスを通す」と書き込むには、どう操作するのか。

⌨ firewall-cmd の基本操作

設定は firewall-cmd コマンドで行う。

firewall-cmd --add-service=http / --add-service=ssh ……サービス単位で開ける。番号なら --add-port=8080/tcp。

サービス単位で開けるのが分かりやすい。`firewall-cmd --add-service=http` で Web(80番)を、`firewall-cmd --add-service=ssh` で SSH を許可できる。

番号で直接指定したいときは `firewall-cmd --add-port=8080/tcp` のようにポートとプロトコルを書く。

つまずき--permanent なしの指定は一時的で、再起動すると消える。「昨日は通ったのに今日は通らない」の原因はこれだ。

ここで最重要なのが、これらの指定はそのままでは一時的で、再起動すると消えてしまうという点だ。

設定を恒久化するには `--permanent` を付け、`firewall-cmd --permanent --add-service=http` とする。

ただし --permanent を付けた変更は「保存はされるが今すぐには効かない」。だから最後に `firewall-cmd --reload` を実行して反映させる。

firewall-cmd --permanent --add-service=http の後に 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 を忘れると「保存したのに今は効かない」状態に。両者の役割を分けて覚える。

逆に --permanent だけ付けて --reload を忘れると「保存したのに今は効かない」状態になる。両者の役割を分けて覚えておこう。

もうひとつ注意したいのが、SSH 経由で作業しているときにファイアウォールを強くいじる場面だ。

つまずきSSH 経由で誤って ssh サービスを閉じると、その瞬間に自分が締め出されて手も足も出なくなる。

誤って ssh サービスを閉じると、その瞬間に自分が締め出されて手も足も出なくなる。

コツリモートで危ない変更をするときは安全網を張る。一定時間後に自動で元へ戻す機能や、コンソールアクセスの確保が有効だ。

リモートで危ない変更をするときは、安全網を張る。一定時間後に自動で設定を元へ戻す機能を使う、`firewall-cmd --runtime-to-permanent` を使う前に動作確認する、コンソールアクセスを確保しておく、といった手だ。

なお、ufw は Ubuntu系で使われる別のファイアウォール管理ツールで、RHEL/MiracleLinux系では使わない。系統が違っても「不要なポートを閉じる」という目的は同じだ。

こうした注意を踏まえると、ファイアウォールは単体で完結する守りではないことが見えてくる。

🛠 実務の使いどころ

実務では、ファイアウォールは単体ではなく多層防御の一枚として位置づける。

まずサーバ構築時に、提供するサービスのポートだけを --permanent で開け、それ以外は閉じておく。

SSH は開けつつ、可能なら接続元のIPアドレス範囲を絞る(firewalld のリッチルールで送信元を限定する)と、より安全だ。

クラウド上のサーバなら、OS内の firewalld に加えてクラウド側のセキュリティグループでも同様に絞り、二重に守るのが定石になる。

そして「とりあえず全部開ける」誘惑に抗い、必要になったポートをそのつど最小限だけ開ける。この最小権限の発想をネットワークにも適用することが、長く安全に運用するための基本姿勢になる。

この項目に出てくる用語

ファイアウォールファイアウォール
通すべき通信と遮断すべき通信を選別する、ネットワークの関所。
ポートポート
通信の宛先サービスを区別する番号。例: SSHは22、HTTPは80。

関連コマンド

firewall-cmdufw

▶ 学習アプリでこの続きを学ぶ・演習する