firewalldコマンドでLinuxのファイアウォールを設定する方法|ポート開放やゾーン設定も

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)【Linux入門】初心者のための基礎知識・講座 > firewalldコマンドでLinuxのファイアウォールを設定する方法|ポート開放やゾーン設定も
「firewalldでポートを開放したはずなのに、外からアクセスできない」
「iptablesとfirewalldの違いがよく分からず、どちらを使えばいいのか迷っている」

Linuxサーバーを運用する以上、ファイアウォールの設定は避けて通れません。ネットで断片的な情報をコピペしただけでは、なぜその設定が必要なのかが分からず、トラブル時に手も足も出なくなります。

この記事では、RHEL/CentOS/AlmaLinux/Rocky Linuxで標準採用されている firewalld の実践的な使い方を解説します。
基本的なポート開放やサービスの許可から、ゾーンの仕組み、リッチルールを使った細かいアクセス制御、そしてよくあるトラブルの対処法まで、現場で必要な知識を網羅しました。

※firewalldの操作には root 権限(または sudo)が必要です。以降のコマンド例は全て root 権限で実行するものとします。

実行環境:RHEL 9.4 / Rocky Linux 9.4 / AlmaLinux 9.4 で動作確認済み
この記事のポイント
・firewall-cmd --list-all で現在の設定を一目で確認できる
・--permanent を付けないと再起動で設定が消える(永続化後は --reload で反映する)
・ポート開放は --add-port、サービス追加は --add-service が基本コマンド
・ゾーンでNIC単位のアクセス制御を柔軟に設計する方法
・Ubuntu/Debian系はUFWが標準。allow・deny・reject の3段階でルールを管理できる

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

なぜファイアウォール設定が必要なのか


サーバーをインターネットに公開すると、SSHへの不正ログイン試行、ポートスキャンなど、外部からの攻撃は日常的に発生します。ファイアウォールは「必要な通信だけを許可し、それ以外は全て遮断する」ための仕組みです。

イメージとしては、サーバーへの入り口に立つ「門番」です。この門番は「許可リストに載っている通信だけを通す」という仕組みで動いています。HTTPの通信ポート(80番)やHTTPSの通信ポート(443番)も、最初から許可されているわけではありません。設定で明示的に「このポートは通してよい」と指定して初めて、外からアクセスできるようになります。

よく使うポートのデフォルト状態を把握しておくと、「なぜ繋がらないのか」の原因切り分けが素早くできます。

ポート番号 用途 デフォルト状態
22 SSH接続(リモート操作) 開放済み(デフォルト許可)
80 HTTP(Webサイト表示) 閉じている(要開放)
443 HTTPS(SSL付きWeb) 閉じている(要開放)
3306 MySQL 閉じている(要開放)
8080 Webアプリ(開発用) 閉じている(要開放)

「Webサーバーを立てたのにブラウザで表示されない」というトラブルのほとんどは、このデフォルト状態の認識不足が原因です。

ファイアウォールのルールには、通信を「通す(allow)」「ドロップする(drop)」「拒否して相手に通知する(reject)」の3種類があります。外部からの不審なアクセスには drop(相手に応答しない)が一般的です。状況に応じて使い分けられるよう、概念として覚えておきましょう。

たとえばWebサーバーであれば、HTTP(80番ポート)とHTTPS(443番ポート)だけを開放し、それ以外のポートへのアクセスは拒否するのが基本です。この「必要最小限だけ開ける」という考え方を最小権限の原則と呼び、サーバーセキュリティの基本中の基本です。

firewalldの基本(ゾーンとサービス)


iptablesとの違い


RHEL 6以前は iptables でファイアウォールを直接管理していました。RHEL 7以降では firewalld が標準となっています。両者の違いを整理します。

比較項目 iptables firewalld
設定単位 チェイン+ルール番号 ゾーン+サービス/ポート
永続化 iptables-save firewall-cmd --permanent
設定反映 即時(save別途) --permanentはfirewall-cmd --reloadが必要
管理ツール iptables / ip6tables firewall-cmd / firewall-config
reload時の挙動 ルール全体を再読み込み(一瞬遮断のリスク) アクティブな接続を切断しない

firewalldは内部的にnftables(RHEL 8以降)またはiptablesをバックエンドとして使っています。つまり、firewalldは「iptables/nftablesを人間にとって扱いやすくするフロントエンド」という位置づけです。

現在のRHEL系ディストリビューションを使っているなら、firewalldを使ってください。iptablesを直接操作する必要はほとんどありません。

ゾーン(zone)とは


ゾーンは「ネットワークインターフェースに適用するセキュリティレベルのテンプレート」です。firewalldにはあらかじめ複数のゾーンが用意されています。

ゾーン名 用途 デフォルトの許可
drop すべて破棄(応答なし) なし
block すべて拒否(ICMP応答あり) なし
public 公開ネットワーク(デフォルト) ssh, dhcpv6-client
external 外部ネットワーク(NAT用) ssh
dmz DMZ(非武装地帯)向け ssh
work 職場ネットワーク ssh, cockpit, dhcpv6-client
home 自宅ネットワーク ssh, cockpit, dhcpv6-client, mdns, samba-client
internal 内部ネットワーク homeと同じ
trusted すべて許可 全通信

実務で最もよく使うのは public ゾーンです。特に指定しなければ、このゾーンが適用されます。

サービス(service)とは


サービスは「ポート番号とプロトコルの組み合わせに名前を付けたもの」です。たとえば http というサービスは「TCP 80番ポート」、https は「TCP 443番ポート」を意味します。

ポート番号を直接指定するよりも、サービス名で管理した方が設定の見通しがよくなります。firewalldに定義済みのサービスは以下のコマンドで一覧表示できます。

# 利用可能なサービス一覧を表示 # firewall-cmd --get-services RH-Satellite-6 RH-Satellite-6-capsule amanda-client amanda-k5-client amqp amqps apcupsd ... http https imap imaps ipp ipp-client ipsec ... mysql nfs nfs3 nmea-0183 nrpe ntp ... postgresql proxy-dhcp radius rdp redis rpc-bind ... samba samba-client samba-dc smtp smtp-submission smtps snmp ... ssh syncthing syslog telnet tftp ...

http、https、mysql、postgresql、samba、smtpなど、主要なサービスが定義されています。

基本的な使い方


1. 現在の状態を確認する


まずはfirewalldが動作しているか、現在どのような設定になっているかを確認しましょう。

# firewalldの動作状態を確認する # firewall-cmd --state running

running と表示されれば正常に動作しています。

現在のゾーンに適用されている設定の全体像を確認するには、--list-all を使います。

# デフォルトゾーンの設定を一覧表示する # firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens192 sources: services: cockpit dhcpv6-client ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: rich rules:

この出力から、現在 public ゾーンが ens192 インターフェースに適用されていて、sshdhcpv6-clientcockpit のサービスが許可されていることが分かります。

サーバーを引き継いだときは、まずこのコマンドで現在の状態を確認するのが鉄則です。

2. ポートを開放する


特定のポート番号を直接指定して開放する方法です。たとえば、TCP 8080番ポートを開放するには以下のように実行します。

# TCP 8080番ポートを開放する(即時反映・一時的) # firewall-cmd --add-port=8080/tcp success

開放されたポートを確認するには --list-ports を使います。

# 開放中のポートを確認する # firewall-cmd --list-ports 8080/tcp

ポートを閉じるには --remove-port を使います。

# TCP 8080番ポートを閉じる # firewall-cmd --remove-port=8080/tcp success

重要:上記の設定は「ランタイム(一時的)」な変更です。firewalldを再起動したり、サーバーを再起動すると設定が消えます。永続化する方法はこの後のセクションで解説します。

3. サービスを許可する


ポート番号を直接指定する代わりに、サービス名で許可する方法です。Webサーバーを公開する場合は以下のように設定します。

# HTTPサービス(TCP 80番ポート)を許可する # firewall-cmd --add-service=http success # HTTPSサービス(TCP 443番ポート)を許可する # firewall-cmd --add-service=https success

現在許可されているサービスの一覧を確認するには --list-services を使います。

# 許可済みサービスの一覧を表示する # firewall-cmd --list-services cockpit dhcpv6-client http https ssh

サービスを削除するには --remove-service を使います。
不要なサービスは閉じておくのがセキュリティの基本です。特にcockpitは、使っていない場合は削除しましょう。

# cockpitサービスの許可を取り消す # firewall-cmd --remove-service=cockpit success

4. サービスの詳細情報を確認する


サービスがどのポートを使うか確認するには、--info-service を使います。

# httpサービスの定義内容を確認 # firewall-cmd --info-service=http http ports: 80/tcp protocols: source-ports: modules: destination: includes: helpers:

「このサービスを許可すると、具体的にどのポートが開くのか」を把握しておくことは、セキュリティ管理の基本です。

5. 設定を永続化する(--permanent)


firewalldの設定には「ランタイム(実行中のみ有効)」と「永続(再起動後も有効)」の2種類があります。

永続的な設定を行うには、コマンドに --permanent オプションを付けます。

# HTTPサービスを永続的に許可する # firewall-cmd --permanent --add-service=http success

ここが落とし穴です。--permanent を付けた設定は、永続設定ファイルに書き込まれるだけで、実行中のfirewalldにはすぐに反映されません。反映するには --reload が必要です。

# 永続設定をランタイムに反映する # firewall-cmd --reload success

現場でおすすめの手順は以下の通りです。

手順1:まず --permanent なしで設定を追加し、即座に動作確認する
手順2:動作に問題がなければ --permanent 付きで同じコマンドを実行する
手順3:--reload で永続設定を反映する

この手順なら、設定ミスがあっても firewalld を reload すれば永続設定(=変更前の状態)に戻せます。

6. ゾーンを確認・変更する


デフォルトゾーンを確認するには --get-default-zone を使います。

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

デフォルトゾーンを変更するには --set-default-zone を使います。

# デフォルトゾーンを internal に変更する # firewall-cmd --set-default-zone=internal success

NICが複数ある場合、外向きはpublic、内向きはtrustedのように分けるのが一般的です。特定のインターフェースに対してゾーンを指定するには --zone オプションを使います。

# ens224をtrustedゾーンに割り当てる # firewall-cmd --zone=trusted --change-interface=ens224 --permanent success # 設定を反映する # firewall-cmd --reload success

全てのゾーンのアクティブ状態を確認するには --get-active-zones が便利です。

# アクティブなゾーンとインターフェースの割り当てを確認する # firewall-cmd --get-active-zones public interfaces: ens192 trusted interfaces: ens224

特定のゾーンの設定を確認するには、--zone オプションを付けて --list-all を実行します。

# trustedゾーンの設定を表示 # firewall-cmd --zone=trusted --list-all trusted (active) target: ACCEPT icmp-block-inversion: no interfaces: ens224 sources: services: ports: protocols: forward: yes masquerade: no forward-ports: source-ports: rich rules:

全ゾーンの設定を一覧で確認するには以下のコマンドが便利です。

# 全ゾーンの設定を表示する # firewall-cmd --list-all-zones

応用・実務Tips


リッチルールで細かいアクセス制御


リッチルール(rich rule)は、単純なサービス許可やポート開放では対応できない、より詳細な条件を指定するための仕組みです。

たとえば「特定のIPアドレスからのSSH接続だけを許可する」といった設定が可能です。

# 192.168.1.100 からのSSH接続のみ許可する # firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept' success

逆に、特定のIPアドレスからの全通信を拒否することもできます。

# 10.0.0.50 からの全通信を拒否する # firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.50" drop' success

設定済みのリッチルールを確認するには --list-rich-rules を使います。

# リッチルールの一覧を表示する # firewall-cmd --list-rich-rules rule family="ipv4" source address="192.168.1.100" service name="ssh" accept

リッチルールを削除する場合は --remove-rich-rule で、追加時と同じルール文字列を指定します。

# リッチルールを削除する # firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept' success # 設定を反映する # firewall-cmd --reload success

特定のIPアドレスだけ許可する


「社内ネットワークからのみ管理画面にアクセスさせたい」という要件は実務で頻繁に出てきます。リッチルールを使って、特定のネットワークからだけポートを開放する方法を紹介します。

# 192.168.1.0/24 のネットワークからのみ TCP 3306(MySQL)を許可する # firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept' success # 設定を反映する # firewall-cmd --reload success

このように設定すれば、データベースポートを全世界に開放することなく、社内ネットワークだけに限定できます。

設定変更前にバックアップを取る


ファイアウォール設定のミスはサーバーへの接続が切れる原因になります。
変更前に現在の設定をファイルに保存しておきましょう。

# 現在の設定をバックアップ # firewall-cmd --list-all > ~/firewall-backup-$(date +%Y%m%d).txt # 全ゾーンの設定をバックアップ # firewall-cmd --list-all-zones > ~/firewall-zones-backup-$(date +%Y%m%d).txt

リモートサーバーで作業する場合は、万が一SSH接続が切れても復旧できるように、コンソールアクセスの手段を確保してから作業してください。

ファイアウォールのログを有効化する


「ポートを開放したはずなのに繋がらない」という問題のトラブルシュートに、ログが非常に役立ちます。firewalldには拒否したパケットをログに記録する機能があります。

--set-log-denied で、拒否されたパケットの記録レベルを設定できます。

# 拒否されたパケットをすべてログに記録する # firewall-cmd --set-log-denied=all success # 現在のログ設定を確認する # firewall-cmd --get-log-denied all # journaldでブロックされたパケットのログを確認する # journalctl -k | grep -i "REJECT\|DROP" | tail -20 # または /var/log/messages で確認する(RHEL系) # grep -i "reject\|drop" /var/log/messages | tail -20

ログを確認することで、「どのIPからのどのポートへのアクセスがブロックされているか」が分かります。問題の切り分けに役立ててください。

ログレベルの選択肢は以下の通りです。

all:全てのプロトコルの拒否パケットを記録
unicast:ユニキャストパケットのみ記録
broadcast:ブロードキャストパケットのみ記録
off:ログ記録を無効化(デフォルト)

本番環境では大量のログが出る可能性があるため、問題調査時だけ all に設定し、解決後は off に戻す運用が現実的です。

トラブルシュート・エラー対処


「FirewallD is not running」が出た場合


firewall-cmd を実行した際に以下のエラーが出ることがあります。

# firewall-cmd --state not running

このエラーはfirewalldサービスが停止している状態です。以下の手順で起動してください。

# firewalldを起動する # systemctl start firewalld # 動作確認 # firewall-cmd --state running # サーバー再起動時にも自動起動するようにする # systemctl enable firewalld Created symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service -> /usr/lib/systemd/system/firewalld.service. Created symlink /etc/systemd/system/multi-user.target.wants/firewalld.service -> /usr/lib/systemd/system/firewalld.service.

もし systemctl start firewalld でエラーが出る場合は、iptablesサービスと競合している可能性があります。

「ALREADY_ENABLED」が表示された場合


すでに同じ設定が存在しています。エラーではなく警告です。
firewall-cmd --list-all で現在の設定を確認してください。

--permanentを付けたのに設定が反映されない


--permanent は永続設定ファイルに書き込むだけで、ランタイム(現在動作中のルール)には反映しません。
以下のどちらかで対応してください。

firewall-cmd --reload で永続設定をランタイムに読み込む
--permanent なしで同じコマンドを実行してランタイムにも即時反映する

iptablesとfirewalldが競合する場合


RHEL 9系でiptablesサービスとfirewalldを同時に動かすと予期しない動作になります。
どちらか一方だけを有効にしてください。

# iptablesサービスが動いていないか確認する # systemctl status iptables # 動いている場合は停止して無効化する # systemctl stop iptables # systemctl disable iptables # systemctl mask iptables # firewalldが動作していることを確認 # firewall-cmd --state running

systemctl mask を実行すると、iptablesサービスが手動でも起動できなくなります。firewalldに完全に移行する場合に使ってください。

ポートを開放したのにアクセスできない時の確認手順


「firewall-cmdでポートを開けたのに、外部からアクセスできない」というトラブルは非常に多いです。以下の手順で原因を切り分けてください。

1. firewalldの設定を再確認する


まずは本当にポートが開放されているか確認します。

# 現在の設定を確認する # firewall-cmd --list-all

--permanent で追加した後に --reload を忘れていないか、ゾーンが正しいかを確認してください。

2. サービスがポートをリッスンしているか確認する


ファイアウォールでポートを開放しても、そのポートで待ち受けるサービスが起動していなければアクセスできません。

# 指定ポートでサービスが待ち受けているか確認する # ss -tlnp | grep 8080

何も表示されなければ、対象のサービスが起動していないか、別のポートでリッスンしています。

3. SELinuxが通信をブロックしていないか確認する


RHEL系ではSELinux(Security-Enhanced Linux)が有効になっていることが多く、firewalldとは別にアクセスをブロックする場合があります。

# SELinuxの状態を確認する # getenforce Enforcing # SELinux の拒否ログを確認する # ausearch -m AVC --start recent

SELinuxが原因の場合は、semanage port コマンドでポートにラベルを付与する必要があります。

# SELinuxで HTTP用ポートとして 8080 を許可する # semanage port -a -t http_port_t -p tcp 8080

semanage がインストールされていない場合は dnf install policycoreutils-python-utils でインストールしてください。

4. クラウド環境のセキュリティグループを確認する


AWS・Azure・GCPなどのクラウド環境では、OS上のfirewalldとは別にクラウド側のセキュリティグループ(またはネットワークセキュリティグループ)でも通信を制御しています。firewalldで開放してもクラウド側で許可していなければアクセスできません。

VPSやクラウドサーバーを使う際は、「OSのfirewalld」と「クラウド側のファイアウォール(セキュリティグループ)」の2段階で確認する習慣をつけてください。ConoHaやさくらのVPS、AWS EC2など、管理画面側でのポート開放設定も忘れずに確認してください。

5. ファイアウォールログでブロック原因を特定する


上記の手順で原因が特定できない場合は、ファイアウォールのログを有効化して確認します。

# ログ記録を有効化する(問題調査中のみ) # firewall-cmd --set-log-denied=all success # journaldでブロックされたパケットを確認する # journalctl -k | grep -i "REJECT\|DROP" | tail -30 # 調査後はログを無効化する # firewall-cmd --set-log-denied=off success

ログにアクセス元のIPアドレスとポート番号が記録されるので、「どの通信がブロックされているのか」を特定できます。

Ubuntu系(UFW)でのポート開放方法


Ubuntu・Debian系のLinuxでは、firewalldの代わりにUFW(Uncomplicated Firewall)が使われることが多いです。基本的な考え方はfirewalldと同じですが、コマンドが異なります。

操作 firewalld(RHEL/Rocky/Alma系) UFW(Ubuntu/Debian系)
有効化 systemctl start firewalld ufw enable
状態確認 firewall-cmd --state ufw status verbose
HTTP開放(永続) firewall-cmd --permanent --add-service=http ufw allow 80/tcp
ポート番号で開放(永続) firewall-cmd --permanent --add-port=8080/tcp ufw allow 8080/tcp
設定の反映 firewall-cmd --reload(必要) 不要(即時反映)
ポートを閉じる firewall-cmd --permanent --remove-port=8080/tcp ufw delete allow 8080/tcp

0. UFWのインストール状況を確認する


作業を始める前に、UFWがインストールされているか確認しましょう。

# UFWのバージョンを確認する $ ufw version ufw 0.36.2 Copyright 2008-2023 Canonical Ltd.

上記のように表示されればインストール済みです。「command not found」と表示された場合は apt でインストールしてください。

# UFWをインストールする $ sudo apt update $ sudo apt install ufw

1. SSHを許可してから有効化する(順番が重要)


注意:UFWを有効化すると、デフォルトでは全ての受信接続がブロックされます。SSHでリモート接続している状態で、SSH許可ルールを追加せずに ufw enable を実行すると、自分の接続まで切断されます。必ずSSHを許可してから有効化してください。

# 1. まずSSHを許可する(有効化の前に実行すること) $ sudo ufw allow ssh Rules updated Rules updated (v6) # または22/tcpで直接指定する $ sudo ufw allow 22/tcp # 2. UFWを有効化する $ sudo ufw enable Command may disrupt existing ssh connections. Proceed with operation (y|n)? y Firewall is active and enabled on system startup # 3. 状態を確認する $ sudo ufw status Status: active To Action From -- ------ ---- 22/tcp ALLOW Anywhere 22/tcp (v6) ALLOW Anywhere (v6)

「Rules updated」と「Rules updated (v6)」の2行が表示されれば、IPv4とIPv6の両方でルールが追加されたことを意味します。
「Firewall is active and enabled on system startup」と表示されれば、UFWの有効化完了です。サーバーを再起動してもUFWは自動で起動します。

※ SSHのポートをデフォルト(22番)から変更している場合は、実際に使っているポート番号を指定してください。例:sudo ufw allow 2222/tcp

2. allow・deny・rejectの3種類の使い分け


UFWは3種類のルールアクションを持ちます。

allow:接続を許可する
deny:接続をドロップする(パケットを黙って破棄。相手に応答しない)
reject:接続を拒否する(相手にICMPエラーを返す。「繋がらない」と相手がすぐ分かる)

外部からの不正アクセス対策には deny(サイレントドロップ)が一般的です。内部ネットワークで「接続不可」を明示したい場合は reject を使います。

# 80番ポートを許可する $ sudo ufw allow 80/tcp # 443番ポートを許可する $ sudo ufw allow 443/tcp # サービス名で許可する(/etc/services の登録名が使える) $ sudo ufw allow http $ sudo ufw allow https # 23番ポート(telnet)をドロップする $ sudo ufw deny 23 # 25番ポートをrejectする(接続不可を相手に通知) $ sudo ufw reject 25

3. 送信元IPやサブネットを指定したルール設定


「特定のIPアドレスからのSSHのみ許可する」「社内ネットワーク全体からのDB接続を許可する」といった細かい制御が可能です。

# 特定IPからのSSHのみ許可する $ sudo ufw allow from 203.0.113.10 to any port 22 # サブネット全体(192.168.1.0/24)からSSHを許可する $ sudo ufw allow from 192.168.1.0/24 to any port 22 # 特定IPからMySQL(3306)への接続を許可する $ sudo ufw allow from 192.168.1.10 to any port 3306 # 特定IPからの全通信を拒否する $ sudo ufw deny from 198.51.100.50

自分のPCのグローバルIPアドレスを確認するには、自分のPC上で次のコマンドを実行してください(Linux / WSL2 の場合)。

$ curl -s ifconfig.me

※ 自宅の回線は固定IPでないことが多いため、IPが変わると接続できなくなる点に注意してください。その場合は sudo ufw allow ssh(全IPからのSSH許可)の方が実用的です。

4. ポート範囲でルールを設定する


複数の連続したポートをまとめて開放したい場合は、ポート範囲を指定できます。

# 6000~6007番ポートをTCPで許可する $ sudo ufw allow 6000:6007/tcp # 同じ範囲をUDPで許可する $ sudo ufw allow 6000:6007/udp

5. ルールを番号で確認・削除する


設定したルールを削除する際は、番号指定が便利です。

# 番号付きでルール一覧を確認する $ sudo ufw status numbered Status: active To Action From -- ------ ---- [ 1] 22/tcp ALLOW IN Anywhere [ 2] 80/tcp ALLOW IN Anywhere [ 3] 443/tcp ALLOW IN Anywhere [ 4] 22/tcp (v6) ALLOW IN Anywhere (v6) [ 5] 80/tcp (v6) ALLOW IN Anywhere (v6) [ 6] 443/tcp (v6) ALLOW IN Anywhere (v6) # 番号指定でルールを削除する(2番のルールを削除する例) $ sudo ufw delete 2 Deleting: allow 80/tcp Proceed with operation (y/n)? y Rule deleted # ルール内容で直接削除する $ sudo ufw delete allow 80/tcp

UFWはfirewall-cmdと違って --reload が不要です。ufw allow を実行した時点で即座に反映されます。

UFW利用時のよくあるトラブル


SSH接続ができなくなった場合:
UFW有効化前にSSHの許可を忘れると、SSHでサーバーにつながらなくなります。VPS管理画面の「コンソール機能」や「VNC接続」でサーバーに直接ログインして対処してください。

# コンソール上でSSHを許可してからUFWを再起動する $ sudo ufw allow ssh $ sudo ufw reload

「ERROR: Problem running ufw-init」が出た場合:
WSL2(Windows Subsystem for Linux)環境ではiptablesモジュールが利用できず、このエラーが出ることがあります。WSL2はホストのWindowsファイアウォールが保護しているため、UFWはWSL2では機能しません。UFWはVPS・クラウドサーバー・実機サーバー向けのツールです。

「ufw: command not found」が出た場合:
UFWがインストールされていない状態です。

$ sudo apt update && sudo apt install ufw

本記事のまとめ


firewall-cmdの操作を一覧にまとめます。

やりたいこと コマンド
firewalldの状態を確認する firewall-cmd --state
現在の設定を一覧表示する firewall-cmd --list-all
ポートを開放する(一時的) firewall-cmd --add-port=ポート番号/tcp
ポートを開放する(永続的) firewall-cmd --permanent --add-port=ポート番号/tcp
ポートを閉じる(永続的) firewall-cmd --permanent --remove-port=ポート番号/tcp
サービスを許可する firewall-cmd --add-service=サービス名
サービスを許可する(永続的) firewall-cmd --permanent --add-service=サービス名
サービスを削除する(永続的) firewall-cmd --permanent --remove-service=サービス名
サービスの詳細を確認する firewall-cmd --info-service=サービス名
永続設定を反映する firewall-cmd --reload
デフォルトゾーンを確認する firewall-cmd --get-default-zone
デフォルトゾーンを変更する firewall-cmd --set-default-zone=ゾーン名
NICのゾーン割り当て firewall-cmd --zone=ゾーン名 --change-interface=NIC名 --permanent
アクティブゾーンを確認する firewall-cmd --get-active-zones
リッチルールでIP制限する firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="IPアドレス" service name="サービス名" accept'
定義済みサービス一覧を確認する firewall-cmd --get-services
拒否パケットのログを有効化する firewall-cmd --set-log-denied=all
firewalldを起動する systemctl start firewalld
firewalldを自動起動に設定する systemctl enable firewalld

firewalldは「--permanentを付けて--reloadする」が基本のワークフローです。
慣れないうちは、変更前に firewall-cmd --list-all で現状を確認し、設定のバックアップを取る習慣をつけてください。

ゾーンを使いこなせるようになると、NIC単位の柔軟なアクセス制御が実現できます。
まずはpublicゾーンの設定をしっかり把握するところから始めましょう。

ファイアウォールの設定ミスで、冷や汗をかいたことはありませんか?

firewalldのポート開放やゾーン設定は、一つ間違えるとサーバーへの接続が完全に切れます。ネットの断片的な情報をつなぎ合わせるのではなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。