Linux サーバでサービスを公開しようとして firewalld
を設定したのに、外部からアクセスできない…。
そんなときに確認すべきポイントをまとめます。
目次
1. firewalld の基本確認
まずは firewalld が有効かどうかを確認します。
systemctl status firewalld
firewall-cmd --state
running
であれば有効not running
の場合、ルールは適用されていません
2. ゾーン設定の確認
症状
firewall-cmd --list-ports
で追加したのに、アクセスできない
原因
- インターフェースが別のゾーンに紐づいている
public
に開けたつもりが、実際はexternal
ゾーンで動いている
解決方法
- 現在のゾーンを確認:
firewall-cmd --get-active-zones
- 該当インターフェースに設定されているゾーンを確認し、そのゾーンにルールを追加する:
firewall-cmd --zone=public --add-port=8080/tcp
3. permanent オプション適用忘れ
症状
- 再起動後に設定が消える
原因
- 一時的な設定(
--add-port
)しかしていない
解決方法
- 設定を恒久化して、リロードする:
firewall-cmd --zone=public --add-port=8080/tcp --permanent firewall-cmd --reload
4. サービス名の指定間違い
firewalld では --add-service=http
のようにサービス名で追加できます。
ただし、firewall-cmd --get-services
に載っていない名前を指定しても反映されません。
- 確実なのは ポート番号で指定する方法
firewall-cmd --add-port=443/tcp
5. SELinux の影響
症状
- firewalld の設定は正しいのに、依然としてアクセスできない
原因
- SELinux がポリシーで制限している
解決方法
- SELinux の状態確認:
getenforce
Enforcing
の場合、サービスごとのポリシーを見直す
例:HTTPD でポート 8080 を使うときsemanage port -a -t http_port_t -p tcp 8080
6. ネットワーク側の制約
- クラウド環境(AWS, GCP, Azure)では セキュリティグループやVPCファイアウォール 側で制限されている可能性があります。
- firewalld の前に、ネットワークポリシーを確認することも重要です。
まとめ
firewalld でポートが開かないときの確認ポイント:
- firewalld が有効か確認
- 正しいゾーンにルールを追加しているか
--permanent
と--reload
を忘れていないか- サービス名指定よりもポート番号指定を優先
- SELinux が制御していないか
- クラウドのセキュリティ設定も確認