非標準ポートを使う時のSELinux設定まとめ【semanage完全解説】

  • URLをコピーしました!

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ログが出ていないか
  • プロセスのドメインは正しいか
  • ポート番号に誤りがないか

トラブル時の切り分けフロー

  1. firewalld / iptables 確認
  2. getenforce 確認
  3. AVCログ確認
  4. semanage port 確認

まとめ

非標準ポートを使う際のSELinuxトラブルは、 「ポート番号=許可」ではないことを理解すれば解決できます。

正しくポートタイプを登録し、 無効化せず安全に運用しましょう。

目次