5分でわかるファイアウォール設定ミスの防ぎ方【セキュリティインシデント防止】
隔週でエンジニアもくもく会、実践型ハンズオンを開催中!
私たちハンズオンラボでは、ファイアウォール設定ミスでヒヤッとした経験がある方、これから設定を任される方のための実践型ハンズオンを定期開催しています。
✅ 完全ハンズオン形式で実機を触りながら学べる
✅ 現役エンジニアが伴走し、失敗しても大丈夫な環境
✅ 隔週もくもく会で仲間と一緒に継続学習
「資格は取ったけど実務は不安…」「設定ミスが怖い…」という方、ぜひ一度遊びに来てください!
👉 ハンズオンラボの詳細はこちら
👉 もくもく会の参加はこちら
こんな経験、ありませんか?
- 先輩から「ファイアウォール設定しといて」と頼まれたけど、何から手をつければいいか分からない…
- iptablesとfirewalldの違いがよく分からない…
- ポート番号を間違えてWebサイトが落ちた経験がある…
- 「とりあえず動けばいいや」で0.0.0.0/0を全開放してしまった…
実は、ファイアウォール設定ミスによるセキュリティインシデントの9割は、5つのパターンに集約されるんです。
こんにちは!ハンズオンラボ運営メンバーのわたるです。
インフラエンジニア歴10年、監視オペレーターから始まり、運用・保守、設計・構築と現場を渡り歩いてきました。
正直に告白すると…私も過去にファイアウォールルールを全削除してしまい、全サービスを停止させてしまったことがあります。あの時の冷や汗は今でも忘れられません。
この記事では、私の痛い経験も含め、ファイアウォール設定ミスの5大パターンと設定ミス防止の3つの鉄則をお伝えします。
ファイアウォール設定ミス 5大パターン
1. ルール全削除による全サービス停止
症状: iptables -F コマンドで全ルールを削除→すべての通信が遮断
# 危険なコマンド例
sudo iptables -F # 全ルール削除
sudo iptables -X # ユーザー定義チェーン削除
原因: デフォルトポリシーがDROPのまま全ルール削除
防止策:
- 削除前にデフォルトポリシーをACCEPTに変更
- 必ずバックアップを取る(後述)
# 安全な削除手順
sudo iptables -P INPUT ACCEPT # デフォルトを許可に変更
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -F # ルール削除
2. ポート番号の誤設定
症状: Webサイトにアクセスできない、SSHが切れる
# よくある間違い
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT # 80番のつもりが8080番
原因: HTTPは80番、HTTPSは443番という基本を忘れる
防止策:
- 主要ポート番号を暗記する(下記参照)
- 設定後に必ず疎通確認
主要ポート番号一覧:
| サービス | ポート番号 | プロトコル |
|---|---|---|
| SSH | 22 | TCP |
| HTTP | 80 | TCP |
| HTTPS | 443 | TCP |
| MySQL | 3306 | TCP |
| PostgreSQL | 5432 | TCP |
| DNS | 53 | UDP/TCP |
| SMTP | 25 | TCP |
3. 0.0.0.0/0 での全開放
症状: セキュリティ監査で指摘される
# 危険な設定例
sudo iptables -A INPUT -p tcp --dport 22 -s 0.0.0.0/0 -j ACCEPT
# 全世界からSSHアクセス可能!
原因: 「とりあえず動けばいい」という思考
防止策:
- 必要最小限のIPアドレス範囲に限定
- 社内IPや踏み台サーバーのIPのみ許可
# 安全な設定例
sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
# 特定ネットワークのみ許可
4. ルール保存忘れ
症状: サーバー再起動後にルールが消える
# ルール設定(メモリ上のみ)
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 再起動 → ルールが消える!
原因: iptablesはデフォルトで永続化されない
防止策:
- CentOS/RHEL系:
iptables-saveで保存 - Ubuntu系:
iptables-persistentパッケージ使用 - firewalld使用時は自動保存
# CentOS/RHEL系の保存方法
sudo iptables-save > /etc/sysconfig/iptables
# Ubuntu系の保存方法
sudo apt-get install iptables-persistent
sudo netfilter-persistent save
5. ログ未確認での盲目的設定
症状: 正常な通信までブロックしてしまう
# ログを見ずにブロックルール追加
sudo iptables -A INPUT -s 203.0.113.0/24 -j DROP
# 実は社内の重要なシステムのIPだった…
原因: ログ解析を怠る
防止策:
- 設定前に必ずログ確認
- ブロック前にLOGアクション設定
# ログ設定の例
sudo iptables -A INPUT -s 203.0.113.0/24 -j LOG --log-prefix "BLOCKED: "
sudo iptables -A INPUT -s 203.0.113.0/24 -j DROP
# ログ確認
sudo tail -f /var/log/messages # CentOS/RHEL
sudo tail -f /var/log/syslog # Ubuntu
ファイアウォール設定ミス防止の3つの鉄則
鉄則1: 必ずバックアップを取る
# 現在のルールをバックアップ
sudo iptables-save > ~/iptables_backup_$(date +%Y%m%d_%H%M%S).txt
# 復元方法
sudo iptables-restore < ~/iptables_backup_20260221_143000.txt
鉄則2: 段階的に適用する
# ❌ NG例: 一気に設定
sudo iptables -A INPUT -j DROP # 全拒否!
# ✅ OK例: 段階的設定
# 1. 既存の許可ルールを確認
sudo iptables -L -n -v
# 2. 必要なルールを追加
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 3. 動作確認してから次へ
ssh user@server # 接続確認
# 4. 最後にデフォルトポリシー変更
sudo iptables -P INPUT DROP
鉄則3: テスト環境で事前検証
- 本番環境でいきなり試さない
- VirtualBoxやVagrantでローカル環境を構築
- ハンズオンラボの環境で練習する
iptables/firewalld 基本コマンド完全ガイド
iptablesコマンド
基本構文
iptables [オプション] [チェーン] [マッチング条件] [アクション]
主要オプション一覧
| オプション | 効果 | 使用例 |
|---|---|---|
-A |
ルールを末尾に追加 | iptables -A INPUT -j ACCEPT |
-I |
ルールを先頭に挿入 | iptables -I INPUT 1 -j ACCEPT |
-D |
ルールを削除 | iptables -D INPUT 1 |
-R |
ルールを置換 | iptables -R INPUT 1 -j DROP |
-L |
ルール一覧表示 | iptables -L |
-F |
全ルール削除 | iptables -F |
-X |
ユーザー定義チェーン削除 | iptables -X |
-P |
デフォルトポリシー設定 | iptables -P INPUT DROP |
-n |
名前解決せず表示(高速) | iptables -L -n |
-v |
詳細表示 | iptables -L -v |
--line-numbers |
行番号付きで表示 | iptables -L --line-numbers |
マッチング条件オプション
| オプション | 効果 | 使用例 |
|---|---|---|
-p |
プロトコル指定 |
-p tcp, -p udp, -p icmp
|
--dport |
宛先ポート番号 | --dport 80 |
--sport |
送信元ポート番号 | --sport 1024:65535 |
-s |
送信元IPアドレス | -s 192.168.1.100 |
-d |
宛先IPアドレス | -d 10.0.0.1 |
-i |
入力インターフェース | -i eth0 |
-o |
出力インターフェース | -o eth1 |
-m state |
コネクション状態マッチ | -m state --state ESTABLISHED,RELATED |
-m multiport |
複数ポート指定 | -m multiport --dports 80,443 |
-m limit |
レート制限 | -m limit --limit 5/min |
アクションオプション
| オプション | 効果 | 説明 |
|---|---|---|
-j ACCEPT |
パケット許可 | 通信を許可 |
-j DROP |
パケット破棄 | 通信を拒否(応答なし) |
-j REJECT |
パケット拒否 | 通信を拒否(エラー応答) |
-j LOG |
ログ記録 | syslogに記録 |
-j MASQUERADE |
IPマスカレード | NAT変換 |
実践コマンド例
# 1. 現在のルール確認
sudo iptables -L -n -v --line-numbers
# 2. 特定ポート許可
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 3. 特定IPからのSSH許可
sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
# 4. 複数ポート許可
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
# 5. 確立済み接続の許可
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 6. ICMP(ping)許可
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# 7. ループバック許可
sudo iptables -A INPUT -i lo -j ACCEPT
# 8. ログ付きドロップ
sudo iptables -A INPUT -j LOG --log-prefix "iptables DROP: " --log-level 4
sudo iptables -A INPUT -j DROP
# 9. ルール削除(行番号指定)
sudo iptables -D INPUT 5
# 10. 保存
sudo iptables-save > /etc/sysconfig/iptables # CentOS/RHEL
firewalldコマンド
基本構文
firewall-cmd [オプション]
主要オプション一覧
| オプション | 効果 | 使用例 |
|---|---|---|
--state |
稼働状態確認 | firewall-cmd --state |
--reload |
設定再読み込み | firewall-cmd --reload |
--list-all |
全設定表示 | firewall-cmd --list-all |
--get-active-zones |
アクティブゾーン表示 | firewall-cmd --get-active-zones |
--get-default-zone |
デフォルトゾーン表示 | firewall-cmd --get-default-zone |
--set-default-zone |
デフォルトゾーン設定 | firewall-cmd --set-default-zone=public |
--permanent |
永続化設定 | firewall-cmd --permanent --add-service=http |
--add-service |
サービス許可 | firewall-cmd --add-service=http |
--remove-service |
サービス削除 | firewall-cmd --remove-service=http |
--add-port |
ポート許可 | firewall-cmd --add-port=8080/tcp |
--remove-port |
ポート削除 | firewall-cmd --remove-port=8080/tcp |
--list-services |
許可サービス一覧 | firewall-cmd --list-services |
--list-ports |
許可ポート一覧 | firewall-cmd --list-ports |
ゾーン関連オプション
| オプション | 効果 | 使用例 |
|---|---|---|
--zone= |
ゾーン指定 | --zone=public |
--get-zones |
全ゾーン表示 | firewall-cmd --get-zones |
--new-zone |
新規ゾーン作成 | firewall-cmd --permanent --new-zone=custom |
--add-interface |
インターフェース追加 | firewall-cmd --zone=public --add-interface=eth0 |
Rich Rule オプション
| オプション | 効果 | 使用例 |
|---|---|---|
--add-rich-rule |
リッチルール追加 | 下記例参照 |
--remove-rich-rule |
リッチルール削除 | 下記例参照 |
--list-rich-rules |
リッチルール一覧 | firewall-cmd --list-rich-rules |
実践コマンド例
# 1. 稼働状態確認
sudo systemctl status firewalld
sudo firewall-cmd --state
# 2. 現在の設定確認
sudo firewall-cmd --list-all
sudo firewall-cmd --list-all --zone=public
# 3. HTTPサービス許可(一時的)
sudo firewall-cmd --add-service=http
# 4. HTTPサービス許可(永続化)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
# 5. カスタムポート許可
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
# 6. 特定IPからのSSH許可(Rich Rule)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept'
sudo firewall-cmd --reload
# 7. ポート範囲許可
sudo firewall-cmd --permanent --add-port=10000-10100/tcp
sudo firewall-cmd --reload
# 8. サービス削除
sudo firewall-cmd --permanent --remove-service=http
sudo firewall-cmd --reload
# 9. ゾーン変更
sudo firewall-cmd --set-default-zone=dmz
# 10. IPマスカレード有効化(NAT)
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --reload
iptables vs firewalld vs ufw 違いまとめ
| 項目 | iptables | firewalld | ufw |
|---|---|---|---|
| 対象OS | Linux全般 | RHEL/CentOS 7以降 | Ubuntu/Debian |
| 難易度 | 高い | 中程度 | 低い(初心者向け) |
| 永続化 | 手動保存必須 | 自動保存 | 自動保存 |
| 動的変更 | 不可(再起動必要) | 可能 | 可能 |
| ゾーン管理 | なし | あり | なし |
クラウド環境のファイアウォールとの違い
AWS Security Group
- ステートフル: 戻りトラフィックは自動許可
- デフォルト拒否: インバウンドはデフォルトで全拒否
- インスタンス単位: ENIに紐付け
Azure NSG (Network Security Group)
- 優先度設定: 100-4096の優先度で制御
- サブネット/NIC単位: 柔軟な適用範囲
- Application Security Group: アプリケーション単位のグルーピング
Linux FW(iptables/firewalld)との併用
クラウド環境でも、OS内部でiptables/firewalldを設定することで多層防御が可能です。
[インターネット]
↓
[AWS Security Group] ← 第1層(クラウド側)
↓
[EC2インスタンス]
↓
[firewalld/iptables] ← 第2層(OS側)
↓
[アプリケーション]
設定チェックリスト
設定前に必ず確認!
- 現在のルールをバックアップした
- テスト環境で事前検証した
- ポート番号が正しいか確認した
- 送信元IPアドレスが正しいか確認した
- デフォルトポリシーを確認した
- ルールの優先順位を確認した
- 設定後に疎通確認した
- ルールを永続化した
- ログで動作確認した
- 設定内容をドキュメント化した
まとめ: 失敗から学んだ3つのこと
私がこれまで10年間のインフラエンジニア人生で学んだことは:
1. ファイアウォール設定ミスの9割は「5つのパターン」に当てはまる
- ルール全削除
- ポート番号誤設定
- 0.0.0.0/0全開放
- ルール保存忘れ
- ログ未確認
これらを意識するだけで、9割のミスは防げます。
2. 設定前のバックアップと段階的な適用が鉄則
「急がば回れ」です。焦って設定すると必ず失敗します。
# この2つのコマンドを習慣化しよう
sudo iptables-save > backup.txt # バックアップ
sudo iptables -L -n -v # 設定確認
3. ハンズオンラボでFW設定を体験すれば実務で失敗しない
正直、本や資格勉強だけでは本当の意味で身につきません。
私自身、ハンズオンラボでファイアウォール設定実習を担当するようになってから、参加者の方々が「実際に手を動かして失敗する経験」を通じて、設定ミス防止の意識が劇的に向上するのを目の当たりにしてきました。
次のステップ: ハンズオンラボで実践しよう!
この記事を読んで「やってみたい!」と思った方、ぜひハンズオンラボに参加してください。
ハンズオンラボで学べること
✅ 完全ハンズオン形式
実際にLinuxサーバーでiptables/firewalldを設定
✅ 失敗OK環境
本番環境ではできない「わざと失敗する練習」ができる
✅ 現役エンジニアが伴走
分からないことはその場で質問できる
✅ 隔週もくもく会
一緒に学ぶ仲間ができる
参加方法
👉 ハンズオンラボの詳細はこちら
👉 もくもく会の参加申し込み
隔週で開催していますので、気軽に覗いてみてください!
おわりに
ファイアウォール設定は「知っている」と「できる」の差が大きい分野です。
私も最初は全然できませんでした。全サービス停止させたときは、本気で退職を考えました(笑)
でも、失敗を繰り返し、先輩に教わり、ハンズオンで練習することで、今では自信を持って設定できるようになりました。
あなたも必ずできるようになります。
まずは、この記事で紹介した5大パターンと3つの鉄則を意識することから始めてみてください。
そして、ぜひハンズオンラボで一緒に学びましょう!