Linuxでアプリケーションを非標準ポート(例:8081 / 8443 / 9000など)で公開した際、 Firewallは開いているのに接続できないというトラブルは非常に多く、 原因の大半は SELinux です。
本記事では、SELinuxがポートを制御する仕組みから、 非標準ポートを正しく使うための設定手順を実務目線で解説します。
目次
なぜ非標準ポートはSELinuxで拒否されるのか
SELinuxでは、ポート番号にも タイプ(ラベル) が割り当てられています。
例えば Webサーバーの場合、
- 80 / 443 → http_port_t
- それ以外 → 原則拒否
という扱いになります。
そのため、httpd が 8081 で LISTEN していても、 SELinuxが通信を拒否します。
よくある誤った対処
- SELinuxを無効化する
- setenforce 0 のまま運用
- 意味も分からず audit2allow を使う
これらはセキュリティ事故の原因になります。
現在許可されているポートの確認
http用ポート一覧
semanage port -l | grep http_port_t
DBやその他サービス
semanage port -l
非標準ポートを許可する正しい手順
① 使用ポートの決定
例:8081をWebアプリで使用
② SELinuxにポートを登録
semanage port -a -t http_port_t -p tcp 8081
すでに登録済みの場合は以下。
semanage port -m -t http_port_t -p tcp 8081
③ 登録確認
semanage port -l | grep 8081
firewalld / iptablesとの違い
firewalld は「ポートを開ける」だけですが、 SELinuxは「誰がそのポートを使えるか」を制御します。
両方が正しく設定されて初めて通信可能になります。
代表的なサービス別設定例
Webサーバー(httpd / nginx)
semanage port -a -t http_port_t -p tcp 8080
アプリケーションサーバー
semanage port -a -t unreserved_port_t -p tcp 9000
独自サービス
専用タイプを使うか、必要最低限の許可に留めます。
Boolean設定も忘れず確認
httpdが外部通信する場合:
setsebool -P httpd_can_network_connect on
設定後も通信できない場合のチェック
- getenforce が Enforcing か
- AVCログが出ていないか
- プロセスのドメインは正しいか
- ポート番号に誤りがないか
トラブル時の切り分けフロー
- firewalld / iptables 確認
- getenforce 確認
- AVCログ確認
- semanage port 確認
まとめ
非標準ポートを使う際のSELinuxトラブルは、 「ポート番号=許可」ではないことを理解すれば解決できます。
正しくポートタイプを登録し、 無効化せず安全に運用しましょう。
あわせて読みたい


SELinux によってファイル操作が拒否されるときの対処方法
概要 Linux サーバーでファイルの作成・移動・読み書きを行おうとした際、次のようなエラーが出ることがあります。 Permission denied mv: cannot move ‘file’ to ‘/var…
あわせて読みたい


SELinuxが原因で通信できない時の切り分け手順【Firewall正常でも要注意】
Linuxサーバーで「ポートはLISTENしている」「Firewallも開いている」 にもかかわらず通信できない場合、原因として非常に多いのが SELinux です。 本記事では、SELinux…
あわせて読みたい


firewalld でポートが開かないときの対処方法
Linux サーバでサービスを公開しようとして firewalld を設定したのに、外部からアクセスできない…。そんなときに確認すべきポイントをまとめます。 1. firewalld の基…
