10.

CentOS / RHEL でのポート開放完全手順(firewalld / iptables / SELinux /

編集
この記事の要点
  • CentOS 7+ / RHEL 7+ は firewalld が標準。firewall-cmd --add-port=8080/tcp --permanent--reload
  • 一時的なら --permanent を外す(再起動で消える)。確認は firewall-cmd --list-all
  • iptables 派の場合 iptables -A INPUT -p tcp --dport 8080 -j ACCEPTiptables-save
  • SELinux もポート許可が必要なケースあり: semanage port -a -t http_port_t -p tcp 8080
  • AWS / GCP / Azure ではさらにSecurity Group / Firewall ルールでも開放が必要
  • 開放後の確認は ss -tlnp | grep 8080 + 外部マシンから nc -zv host 8080

firewalld を使う方法(CentOS 7+ / RHEL 7+ 標準)

1. firewalld の状態確認

# サービス状態
sudo systemctl status firewalld

# 起動していなければ起動
sudo systemctl start firewalld
sudo systemctl enable firewalld

# デフォルトゾーン確認
sudo firewall-cmd --get-default-zone
# public

# 現在のルール一覧
sudo firewall-cmd --list-all

2. ポートを開ける(基本)

# TCP 8080 を恒久的に許可
sudo firewall-cmd --add-port=8080/tcp --permanent

# 設定反映
sudo firewall-cmd --reload

# 確認
sudo firewall-cmd --list-ports
# 8080/tcp

# 詳細表示
sudo firewall-cmd --list-all

3. ポートを閉じる

sudo firewall-cmd --remove-port=8080/tcp --permanent
sudo firewall-cmd --reload

4. サービス名で開ける(推奨)

HTTP/HTTPS など定義済みサービスを使うと意図が明確になります:

# 利用可能なサービス一覧
sudo firewall-cmd --get-services

# HTTP (80) と HTTPS (443) を許可
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --add-service=ssh --permanent
sudo firewall-cmd --reload

# 確認
sudo firewall-cmd --list-services
# dhcpv6-client http https ssh

5. 範囲指定 / プロトコル指定

# UDP ポート
sudo firewall-cmd --add-port=53/udp --permanent

# 範囲指定(8000-8010)
sudo firewall-cmd --add-port=8000-8010/tcp --permanent

# 特定の IP からのみ許可(rich rule)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port=8080 protocol=tcp accept'

# 特定 IP を拒否
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.5" drop'

sudo firewall-cmd --reload

6. 一時開放(再起動で消える)

# --permanent を外すと、設定ファイルに書かれず、firewalld 再起動で消える
sudo firewall-cmd --add-port=8080/tcp

# テスト後、不要なら
sudo firewall-cmd --remove-port=8080/tcp

# あるいは reload するだけで消える
sudo firewall-cmd --reload

iptables を使う方法(旧来 / RHEL 6 以前)

# firewalld を停止して iptables 派にする場合
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo yum install iptables-services
sudo systemctl enable iptables
sudo systemctl start iptables

# ルール追加
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT

# 確認
sudo iptables -L -n -v

# 行番号付きで確認
sudo iptables -L INPUT --line-numbers

# 削除(行番号指定)
sudo iptables -D INPUT 3

# 永続化(CentOS 7+ では別途インストールが必要)
sudo service iptables save
# または
sudo iptables-save > /etc/sysconfig/iptables

SELinux のポート許可

SELinux が enforcing の場合、特定サービス(Apache / Nginx 等)が標準外ポートを使うと拒否されます:

# 現在の SELinux 状態
getenforce
# Enforcing

# Apache (httpd) が 8080 を使うのを許可
sudo semanage port -l | grep http_port_t
# http_port_t  tcp  80, 81, 443, 488, 8008, 8009, 8443, 9000

sudo semanage port -a -t http_port_t -p tcp 8080

# 確認
sudo semanage port -l | grep http_port_t
# http_port_t  tcp  8080, 80, 81, 443, 488, 8008, 8009, 8443, 9000

# semanage が無い場合
sudo yum install policycoreutils-python-utils

# 削除
sudo semanage port -d -t http_port_t -p tcp 8080

# 緊急時の一時無効化(非推奨)
sudo setenforce 0    # permissive に
# 戻す
sudo setenforce 1

AWS Security Group との関係

EC2 では OS のファイアウォール + AWS Security Group両方 で許可が必要です:

レイヤ対応
AWS Security GroupEC2 のセキュリティグループ inbound に TCP 8080 を追加
OS の firewalldfirewall-cmd --add-port=8080/tcp --permanent
SELinux必要なら semanage port -a
アプリ0.0.0.0:8080 でリッスン(127.0.0.1 だと外から見えない)
# AWS CLI でセキュリティグループにルール追加
aws ec2 authorize-security-group-ingress \
    --group-id sg-0123456789abcdef0 \
    --protocol tcp \
    --port 8080 \
    --cidr 0.0.0.0/0

動作確認

# サーバ側: そもそも 8080 で待機しているか
sudo ss -tlnp | grep 8080
# LISTEN 0 128 *:8080 *:* users:(("python3",pid=1234,fd=3))

# 旧: netstat(CentOS 7 まで)
sudo netstat -tlnp | grep 8080

# サーバ側からローカル接続
curl http://localhost:8080
nc -zv localhost 8080

# クライアント側から外部接続
nc -zv 203.0.113.45 8080
# Connection to 203.0.113.45 port 8080 [tcp/http-alt] succeeded!

curl -v http://203.0.113.45:8080

# Linux 経由で外部のポート開放をスキャン
nmap -p 8080 203.0.113.45

CentOS 7 / 8 / 9 でのコマンドの違い

OSファイアウォールパッケージ管理
CentOS 7firewalld(標準) or iptablesyum
CentOS 8 / 9 / Streamfirewalld(nftables バックエンド)dnf
Rocky / Alma 8/9firewallddnf

コマンド自体は firewall-cmd で共通。CentOS 8+ では裏側が nftables になっていますが、利用方法は変わりません。

FAQ

Q: firewalld を停止してもポートが開かない
A: AWS / Azure / GCP は OS の外側にもファイアウォールがある。クラウドのコンソール側 Security Group を確認。

Q: 80 番を開けてもブラウザで繋がらない
A: Apache / Nginx 等が起動していない、または 127.0.0.1 限定でリッスンしている。ss -tlnp で確認。Listen 800.0.0.0:80 に。

Q: firewall-cmd: command not found
A: 古い CentOS 6 系。iptables を使う。または yum install firewalld

Q: 開けたいポートが多くて毎回 --permanent + --reload が面倒
A: 設定スクリプト化:

for port in 80 443 8080 8443; do
    sudo firewall-cmd --add-port=${port}/tcp --permanent
done
sudo firewall-cmd --reload
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. tomcatインストール(CentOS)
  2. WARファイルのAutoDeploy設定
  3. tomcatの起動/停止(Linux, Mac)
  4. JRE(JVM)のJavaのバージョン確認方法
  5. エラー一覧
  6. CATALINA_HOMEの確認方法(Linux, Mac)
  7. 管理画面の開き方
  8. tomcatの起動確認方法
  9. tomcatの起動/停止ログとcatalina.log/catalina.outの違い
  10. CentOSにおけるポート開放方法
  11. Javaのバージョン変更方法(Mac編)