【Firewalld講座 第6回】Webサーバーの鉄壁設計!「Source」機能を使って管理者だけを別扱いにする極意

「誰が来たか」で対応を変える、これぞプロの仕事

こんにちは!「リナックス先生」です。
Firewalld講座、後半戦となる第6回へようこそ。

これまでは「ポートを開ける・閉める」という単純な操作を学んできました。
しかし、実際のWebサーバー運用では、もう少し複雑なことが求められます。

  • Webサイト (http/https): 世界中の誰からでもアクセスしてほしい。
  • SSH / 管理画面: 攻撃されたくないから、自分(管理者)以外は拒否したい

この2つを両立させるにはどうすればいいでしょうか?
「SSHのポート番号を変える」のも一つの手ですが、最もスマートで強固なのは、Firewalldの「Source(接続元IPアドレス)」機能を使って、接続してくる相手によって「案内する部屋(ゾーン)」を変えてしまう方法です。

今回は、この「VIP待遇システム」を構築して、鉄壁のWebサーバーを作り上げましょう。

コウ君

先生、IPアドレス制限ってやつですね!
でも、今の設定だと public ゾーンで SSH も HTTP も全部許可しちゃってますよね。
これをどうやって「SSHだけ特定の人」に制限するんですか?

リナックス先生

良い所に気がついたわね。
実はFirewalldは、1つのインターフェース(LANケーブル)に対して、条件によって「2つのゾーン」を同時に適用できるの。
「一般人はPublicゾーンへ」「管理者はTrustedゾーンへ」という風に、入り口で振り分けるイメージね。

1. Firewalldの「優先順位」を知る

設定を始める前に、Firewalldが通信を処理する時の「判定ルール」を理解しておく必要があります。
パケットが届いた時、Firewalldは以下の順番でどのゾーンを使うかを決めます。

  1. Source(送信元IP)による判定:
    「このIPアドレスからの通信は、〇〇ゾーンを使う」という設定があるか?
    →あればそのゾーンを適用。(最優先)
  2. Interface(インターフェース)による判定:
    上記の指定がない場合、そのパケットが届いたLANポート(eth0など)が所属するゾーンを使う。
    →通常はこれで public になります。

つまり、特定のIPアドレス(あなたの自宅や会社のIP)を「Source」として登録しておけば、あなたの通信だけはインターフェースの設定を無視して、別の安全なゾーン扱いにできるのです。

2. 今回構築する設計図

今回は、AlmaLinux 9の標準構成をベースに、以下の環境を目指します。

接続元 適用ゾーン 許可するサービス
一般ユーザー
(世界中どこからでも)
public
(Interface: eth0)
http, https
(Web閲覧のみOK、SSHは拒否)
管理者(あなた)
(特定のIP: 203.0.113.5)
trusted
(Source指定)
全許可
(SSHもWebも管理ツールもOK)

こうすれば、一般ユーザーがSSHポート(22番)を叩いても、public ゾーンにはSSHの許可がないためブロックされます。
一方で、あなたがアクセスした時だけは trusted ゾーン(全許可)に誘導されるため、SSH接続が可能になります。

3. 【実践】管理者専用レーンを作る

それでは設定していきましょう。
※注意: IP制限を行う際は、自分のグローバルIPアドレスが変わると締め出される可能性があります。固定IP環境での実施を推奨します。

Step 1: 自分のIPアドレスを `trusted` ゾーンに登録する

まずは、あなたの接続元IPアドレスを調べます。
(「確認くん」などのサイトで、現在のグローバルIPを確認してください。ここでは例として 203.0.113.5 とします)

次に、そのIPアドレスを trusted(信頼)ゾーンの「Source」として登録します。

sudo firewall-cmd --permanent --zone=trusted --add-source=203.0.113.5
success

まだリロードはしません。
念のため、本当に登録されたか確認しましょう(Permanent設定を見ます)。

sudo firewall-cmd --permanent --zone=trusted --list-all

▼実行結果

trusted
  target: ACCEPT
  sources: 203.0.113.5
  services:
  ...

sources の欄にIPが入っていればOKです。

Step 2: リロードして適用する

設定を反映させます。
この時点で、あなたのPCからの通信は全て trusted ゾーン(全許可)として扱われるようになります。

sudo firewall-cmd --reload

Step 3: 自分が特別扱いされているか確認する

ここが重要です。本当に自分が trusted ゾーンに判定されているか確認します。
--get-active-zones コマンドを使います。

sudo firewall-cmd --get-active-zones

▼成功時の実行結果

public
  interfaces: eth0
trusted
  sources: 203.0.113.5

このように、public と並んで trusted が表示され、そこに自分のIPがあれば成功です!
これで「VIPレーン」が開通しました。

4. 【実践】一般レーン(Public)を制限する

管理者用の裏口を確保したので、次は表玄関(Public)のセキュリティを強化します。
一般ユーザーにはWebサイト以外触らせないようにします。

Step 4: Publicから SSH を削除する

【警告】 Step 3の確認を行わずにこのコマンドを実行すると、もしSource設定が間違っていた場合、SSH接続が切断されて二度と入れなくなります。
必ず「自分がtrustedにいること」を確認してから実行してください。

sudo firewall-cmd --permanent --zone=public --remove-service=ssh
sudo firewall-cmd --permanent --zone=public --remove-service=cockpit

(※cockpitなど不要な管理ツールがあれば一緒に消します)

Step 5: Publicに HTTP/HTTPS を追加する

逆に、Webサイトは見れるようにしなければなりません(第4回のおさらいです)。

sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https

Step 6: 最終リロードと確認

最後に設定を反映させます。

sudo firewall-cmd --reload

現在の public ゾーンの状態を確認してみましょう。

sudo firewall-cmd --list-all --zone=public

▼理想的な実行結果

public (active)
  target: default
  interfaces: eth0
  services: dhcpv6-client http https  <-- sshがない!
  ports:
  ...

services から ssh が消えていれば完成です!

コウ君

おお…!
これなら、世界中のハッカーがSSHポート(22)を攻撃してきても、そもそも public ゾーンには穴がないから弾かれるわけですね。
でも僕は trusted だから、変わらずSSHでログインできると。完璧じゃないですか!

5. 「Source」利用時の注意点

非常に便利なSource機能ですが、いくつか運用上の注意点があります。

注意点①:IPアドレスが変わったら?

自宅のネット回線などは、ルーターを再起動するとグローバルIPが変わることがあります。
IPが変わった瞬間、あなたは trusted から外れ、public(SSH禁止)に放り込まれるため、SSH接続ができなくなります(締め出し)

【対策】
VPSの「コンソール機能(ブラウザ操作)」は、ネットワークを経由しないためFirewalldの影響を受けません。
締め出された場合はコンソールからログインし、新しいIPを add-source し直してください。

注意点②:CloudflareなどのCDNを使う場合

Cloudflareなどを通すと、Webサーバーへのアクセス元IPがすべて「CloudflareのIP」になってしまいます。
この場合、Source制限を行うと「Cloudflareからのアクセス」として一括りで扱われてしまうため、Webサーバー側(Nginx/Apache)でのログ設定など、別の工夫が必要になります。

6. 応用:管理用ゾーンを自作する

今回は既存の trusted を使いましたが、セキュリティポリシーとして「全許可は怖い」という場合もあるでしょう。
その場合は、独自の「admin」ゾーンを作って、そこに必要なサービスだけを入れることも可能です。

簡単に手順だけ紹介します。

# 新しいゾーンを作成
sudo firewall-cmd --permanent --new-zone=admin

# 設定をリロード(ゾーンを認識させる)
sudo firewall-cmd --reload

# SSHをadminゾーンに追加
sudo firewall-cmd --permanent --zone=admin --add-service=ssh

# 自分のIPをadminゾーンに追加
sudo firewall-cmd --permanent --zone=admin --add-source=203.0.113.5

# リロード
sudo firewall-cmd --reload

こうすれば、「管理者IPからはSSHだけ許可(HTTPは見れない)」といった、より細かな制御も可能です。

まとめ:2つの顔を持つサーバーを作ろう

第6回では、Webサーバー構築におけるセキュリティ設計の要、「Source機能」を使ったアクセス制御を学びました。

  • Source(送信元IP) の設定は、Interfaceの設定よりも優先される。
  • 自分のIPを trusted ゾーンのSourceに登録することで、自分だけ「全許可」にできる。
  • その状態で public からSSHを削除すれば、外部からの攻撃を完全に遮断できる。
  • IPが変わった時のために、VPSのコンソール操作手段を確保しておく。

この構成は、企業のWebサーバーなどでも実際に使われている鉄板の構成です。
これでWebサーバーの基本設計は完了しました。

次回(第7回)は、もう一つの主要なサーバー用途である「メールサーバー(SMTP/IMAP/POP3)」の設計に入ります。
メールはWeb以上に攻撃を受けやすいサービスです。スパムの踏み台にされないためのポート制御をしっかり学びましょう!

▼固定IPが使いやすいVPS

今回の「Source制限」を安全に運用するには、接続元のIPアドレスが変わらない環境や、緊急時にブラウザから操作できるコンソール機能が充実したVPSが必須です。AlmaLinux 9対応のおすすめはこちら。

【2026年最新】Linuxサーバー構築におすすめのVPS比較3選!現役エンジニアが速度とコスパで厳選
Linuxの勉強、まだ「自分のPC」でやって消耗していませんか?「Linuxを覚えたいけど、環境構築でエラーが出て先に進めない…」「VirtualBoxを入れたらパソコンが重くなった…」これは、Linux学習を始める9割の人がぶつかる壁です...

コメント