サーバーに余分なポートが開いたままになっていると、ポートスキャンや不正アクセスの標的になりやすくなります。用途が決まっているサーバーであれば、使うポートだけを外部に開放し、それ以外は遮断するのが基本的な構成です。このページでは、ファイアウォールを使ったポート制御の手順を、RHEL 系(firewalld)と Ubuntu 系(ufw)に分けて紹介します。
現在どのポートが開いているかを確認する
設定を変更する前に、現状を把握しておくことが重要です。サーバー上でリッスンしているポートは次のコマンドで確認できます。
ss -tlnp
-t は TCP、-l はリッスン中のソケット、-n はポート番号を数字で表示、-p はプロセス名を表示するオプションです。LISTEN 状態のポートと、それを使っているプロセスが一覧で表示されます。
ここで表示されるのはサーバー内側からの情報です。ファイアウォール側で実際に外部へ開放しているポートは、後述の各ツールのコマンドで別途確認してください。
firewalld で必要なポートだけ開放する(RHEL 系)
RHEL・CentOS・Rocky Linux・AlmaLinux などでは、firewalld が標準のファイアウォール管理ツールです。
現在のゾーン設定を確認する
どのサービスやポートが開放されているかは次のコマンドで確認できます。
firewall-cmd --list-all
services: の行に登録済みのサービス名、ports: の行に直接指定したポート番号が表示されます。
不要なサービスをゾーンから削除する
使っていないサービスは削除します。たとえば dhcpv6-client がデフォルトで登録されていることがありますが、サーバー用途では不要な場合があります。
firewall-cmd --permanent --remove-service=dhcpv6-client
--permanent を付けることで、再起動後も設定が保持されます。
必要なポートだけ開放して設定を反映する
SSH・HTTP・HTTPS だけを外部に開放する場合の手順は次のとおりです。
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
サービス名ではなくポート番号で指定することもできます。
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
設定後に firewall-cmd --list-all を再度実行して、意図したサービスとポートだけが表示されているかを確かめてください。
ufw で必要なポートだけ開放する(Ubuntu 系)
Ubuntu では ufw(Uncomplicated Firewall)が標準で用意されています。初期状態では無効になっているため、有効化と合わせて設定します。
必ず SSH を許可してから有効化してください。順序を誤ると SSH が遮断されてリモートからログインできなくなります。
# デフォルトポリシーを設定する
ufw default deny incoming
ufw default allow outgoing
# 必要なポートを先に許可する
ufw allow ssh
ufw allow http
ufw allow https
# ufw を有効化する
ufw enable
# 状態を確認する
ufw status verbose
default deny incoming を設定することで、明示的に許可したポート以外の受信通信はすべて遮断されます。ufw status verbose の出力で、意図したルールだけが列挙されているかを確かめてください。
外部からポートの開閉を確認する
サーバー内からの確認だけでは、ファイアウォールの外側から見た状態は分かりません。別のホストから nc(netcat)や nmap を使って疎通を確認できます。
# 別ホストから実行する(nc の場合)
nc -zv <サーバーのIPアドレス> 22
nc -zv <サーバーのIPアドレス> 80
nc -zv <サーバーのIPアドレス> 3306
接続できれば succeeded、遮断されていれば refused またはタイムアウトが返ります。
# nmap を使う場合
nmap -p 22,80,443,3306 <サーバーのIPアドレス>
結果の STATE 列に open・closed・filtered のいずれかが表示されます。開放しているつもりのポートが遮断されていないか、逆に不要なポートが開いていないかを、外部の視点から確かめられます。
よくあるつまずきと注意点
- SSH を閉じてリモートログインできなくなる:ファイアウォールを有効化する前に SSH を許可しておくのが基本です。ufw の場合は
ufw enableより前にufw allow sshを実行してください。変更作業中は既存のセッションを切断せず、別ターミナルで接続を維持したまま作業するとリスクを減らせます。 --permanentを付け忘れて再起動後にルールが消える(firewalld):firewall-cmdはオプションなしだと実行時設定のみに反映されます。恒久的に設定するには--permanentを付けたうえで--reloadしてください。- クラウドのセキュリティグループと二重管理になっている:AWS・GCP・Azure などのクラウド環境では、OS のファイアウォールとは別にセキュリティグループやネットワーク ACL が存在します。OS 側でポートを開けても、クラウド側で閉じていれば外部からは届きません。両方を合わせて確認が必要です。
- IPv6 を考慮し忘れる:IPv4 のルールだけ設定しても、IPv6 経由で通信が届く場合があります。firewalld と ufw はどちらも IPv4・IPv6 をまとめて管理しますが、iptables を直接操作している場合は ip6tables も別途設定が必要です。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
