Edited at

CentOS 7 firewalld よく使うコマンド

CentOS 7ではファイアウォール(以下、FW)のサービスが iptables から firewalld に変わりました。

FWの設定は firewall-cmd コマンドを利用して行います。よく使うコマンドをまとめます。


サービスの起動/停止

systemctl コマンドを利用します。

サービス名は「bash-completion」がインストール済みの場合、[TAB]キーで補完可能です。

「.service」は省略可能です。


サービスの起動

# systemctl start firewalld.service



サービスの停止

# systemctl stop firewalld.service



サービスの状態確認

# systemctl status firewalld.service


# firewall-cmd --state
running


サービス自動起動の有効化/無効化

こちらも systemctl コマンドを利用します。


自動起動の有効化

# systemctl enable firewalld.service



自動起動の無効化

# systemctl disable firewalld.service



自動起動設定の状態確認

# systemctl is-enabled firewalld.service 

enabled


FW設定の状態確認

firewalld にはゾーンという概念があります。

ゾーンごとにFWの設定を行い、NICに対してそのゾーンを割り当てて管理します。

そのため、FWの設定内容を確認する際は、ゾーンを指定する必要があります。

(指定しない場合は、デフォルト値となります。)

ゾーンは標準で9つ用意されており、任意のゾーンを追加することもできます。


ゾーンの割り当て状態


アクティブゾーンの確認

--get-active-zones オプションを指定することで、現在割り当てられているゾーン(以下、アクティブゾーン)を確認できます。


アクティブゾーンの確認

# firewall-cmd --get-active-zones

public
interfaces: ens160

上記の例では、「public」ゾーンが、NIC「ens160」に、割り当てられていることが確認できます。


デフォルトゾーンの確認

--get-default-zone オプションを指定することで、デフォルトで割り当てられるゾーン(以下、デフォルトゾーン)を確認できます。

NICに対して特にゾーンの割り当てがない場合は、デフォルトゾーンが割り当てられます。

また、コマンドでゾーンの指定が明示的に存在しない場合、デフォルトゾーンの値が利用されます。


デフォルトゾーンの確認

# firewall-cmd --get-default-zone

public

特に何も設定をしなければ「public」がデフォルトゾーンかつアクティブゾーンとなります。


FWの設定内容


デフォルトゾーンのFW設定確認

--list-all オプションを指定することでデフォルトゾーンの現在のFW設定を確認できます。

ゾーンを明示的に指定しない場合は、デフォルトゾーンの設定が出力されます。


デフォルトゾーンのFW設定確認

# firewall-cmd --list-all


※デフォルトゾーンとアクティブゾーンが異なる場合はアクティブゾーンの設定を見るように促す注意書きが出力されます。

 その場合、明示的にゾーンを指定する必要があります。他のコマンドを実行する際も同様に注意書きが出力されます。


デフォルトゾーンとアクティブゾーンが異なる場合

# firewall-cmd --get-active-zones

public
interfaces: ens160
# firewall-cmd --get-default-zone
home
# firewall-cmd --list-all
You're performing an operation over default zone ('home'),
but your connections/interfaces are in zone 'public' (see --get-active-zones)
You most likely need to use --zone=public option.

home
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:


上記は、デフォルトゾーンが「home」、アクティブゾーンが「public」の例です。

現在の設定内容はアクティブゾーンである「public」を確認すべきであるため、注意書きが出力されています。


任意のゾーンのFW設定確認

--zone オプションを指定することで任意のゾーンの現在のFW設定を確認できます。


任意のゾーンのFW設定確認(homeの例)

# firewall-cmd --list-all --zone=home

home
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:


すべてのゾーンのFW設定確認

--list-all-zones オプションを指定することですべてのゾーンの現在のFW設定を確認できます。


すべてのゾーンのFW設定を確認

# firewall-cmd --list-all-zones



恒久的なFW設定の確認

--permanent オプションを指定することで、恒久的な設定をそれぞれ確認できます。

恒久的な設定とは、OS再起動後でも反映する設定のことです。

設定ファイルに記載されている設定値のイメージです。(それが現在反映されているかどうかは別)

※一時的に追加した設定は表示されないため要注意です。


デフォルトゾーンのFW設定確認(恒久的な設定のみ)

# firewall-cmd --list-all --permanent



指定したゾーンのFW設定確認(恒久的な設定のみ)

# firewall-cmd --list-all --zone=home --permanent



すべてのゾーンのFW設定確認(恒久的な設定のみ)

# firewall-cmd --list-all-zones --permanent



FWの設定


サービス

ゾーンにサービスを追加することで、そのサービス用のFW設定が反映されます。

サービスのFW設定は、XMLファイルで定義されており、以下の場所に格納されています。

/usr/lib/firewalld/services/

例えば、以下は、ftpサービスの設定内容の例です。


/usr/lib/firewalld/services/ftp.xml

# cat /usr/lib/firewalld/services/ftp.xml 

<?xml version="1.0" encoding="utf-8"?>
<service>
<short>FTP</short>
<description>FTP is a protocol used for remote file transfer. If you plan to make your FTP server publicly available, enable this option. You need the vsftpd package installed for this option to be useful.</description>
<port protocol="tcp" port="21"/>
<module name="nf_conntrack_ftp"/>
</service>

ftpサービスを追加すると、

■TCP21番ポートの通信許可 および

<port protocol="tcp" port="21"/>

■「nf_conntrack_ftp」モジュールの有効化

<module name="nf_conntrack_ftp"/>

が反映されます。

FTPは、上記のモジュールがないと動作しないため、ftpサービスの追加が必須です。


登録可能なサービスの確認

--get-servicess オプションを指定することで登録可能なサービス名一覧を確認できます。


登録可能なサービスの確認

# firewall-cmd --get-services



現在追加されているサービスの確認

--list-services オプションを指定することで現在追加されているサービスを確認できます。

--zone オプションを省略した場合、デフォルトゾーンの設定が表示されます。

 ただし、アクティブゾーンとデフォルトゾーンが異なる場合は、注意書きが出力されます。


現在追加されているサービスの確認

# firewall-cmd --list-services --zone=public

dhcpv6-client ssh https


現在追加されているサービスの確認(恒久的な設定のみ)

# firewall-cmd --list-services --zone=public --permanent

dhcpv6-client ssh


サービスの追加

--add-service オプションを指定することでサービスを追加できます。

--zone オプションを省略した場合、デフォルトゾーンに追加されます。


サービスの追加(publicゾーンに対して、httpsを追加する例)

# firewall-cmd --add-service=https --zone=public 


恒久的な設定とする場合は、--permanent オプションを指定します。

ただし、設定を反映したい場合は設定の再読み込み(--reload オプション)が必要です。


サービスの追加(恒久的な設定とする場合)

# firewall-cmd --add-service=https --zone=public --permanent

# firewall-cmd --reload
success


サービスの削除

--remove-service オプションを指定することでサービスを削除できます。

--zone オプションを省略した場合、デフォルトゾーンから削除されます。


サービスの削除

# firewall-cmd --remove-service=https --zone=public


恒久的な設定とする場合は、--permanent オプションを指定します。

ただし、設定を反映したい場合は設定の再読み込み(--reload オプション)が必要です。


サービスの削除(恒久的な設定とする場合)

# firewall-cmd --remove-service=https --zone=public --permanent

# firewall-cmd --reload
success


ポート番号


現在追加されているポート番号の確認

--list-ports オプションを指定することで現在追加されているポート番号を確認できます。

--zone オプションを省略した場合、デフォルトゾーンの設定が表示されます。

 ただし、アクティブゾーンとデフォルトゾーンが異なる場合は、注意書きが出力されます。


現在追加されているポート番号の確認

# firewall-cmd --list-ports --zone=public



現在追加されているポート番号の確認(恒久的な設定のみ)

# firewall-cmd --list-ports --zone=public --permanent



ポート番号の追加

--add-port オプションを指定することでポート番号を追加できます。

--zone オプションを省略した場合、デフォルトゾーンに追加されます。


ポート番号の追加(デフォルトゾーンに対して、TCP8080、UDP60000の例)

# firewall-cmd --add-port=8080/tcp --zone=public

# firewall-cmd --add-port=60000/udp --zone=public

恒久的な設定とする場合は、--permanent オプションを指定します。

ただし、設定を反映したい場合は設定の再読み込み(--reload オプション)が必要です。


ポート番号の追加(恒久的な設定とする場合)

# firewall-cmd --add-port=8080/tcp --zone=public --permanent

# firewall-cmd --add-port=60000/udp --zone=public --permanent
# firewall-cmd --reload
success


ポート番号の削除

--remove-port オプションを指定することでポート番号を削除できます。

--zone オプションを省略した場合、デフォルトゾーンから削除されます。


ポート番号の削除

# firewall-cmd --remove-port=8080/tcp --zone=public

# firewall-cmd --remove-port=60000/udp --zone=public

恒久的な設定とする場合は、--permanent オプションを指定します。

ただし、設定を反映したい場合は設定の再読み込み(--reload オプション)が必要です。


ポート番号の削除(恒久的な設定とする場合)

# firewall-cmd --remove-port=8080/tcp --zone=public --permanent

# firewall-cmd --remove-port=60000/udp --zone=public --permanent
# firewall-cmd --reload
success


IPアドレス


現在追加されているIPアドレスの確認

--list-sources オプションを指定することで現在追加されているIPアドレスを確認できます。

--zone オプションを省略した場合、デフォルトゾーンの設定が表示されます。

 ただし、アクティブゾーンとデフォルトゾーンが異なる場合は、注意書きが出力されます。


現在追加されているIPアドレスの確認

# firewall-cmd --list-sources --zone=public



現在追加されているIPアドレスの確認(恒久的な設定のみ表示)

# firewall-cmd --list-sources --zone=public --permanent



IPアドレスの追加

--add-source オプションを指定することでIPアドレスを追加できます。

--zone オプションを省略した場合、デフォルトゾーンに追加されます。


アクセス許可


許可アドレスの追加

# firewall-cmd --add-source=192.168.0.0/24 --zone=public


恒久的な設定とする場合は、--permanent オプションを指定します。

ただし、設定を反映したい場合は設定の再読み込み(--reload オプション)が必要です。


ポート番号の追加(恒久的な設定とする場合)

# firewall-cmd --add-source=192.168.0.0/24 --zone=public --permanent

# firewall-cmd --reload
success


アクセス拒否

「drop」ゾーンに対してIPアドレスを登録することで拒否IPアドレスとなります。


拒否アドレスの追加

# firewall-cmd --add-source=192.168.11.0/24 --zone=drop 


恒久的な設定とする場合は、--permanent オプションを指定します。

ただし、設定を反映したい場合は設定の再読み込み(--reload オプション)が必要です。


ポート番号の追加(恒久的な設定とする場合)

# firewall-cmd --add-source=192.168.11.0/24 --zone=drop --permanent

# firewall-cmd --reload
success


IPアドレスの削除

「--remove-source」オプションを指定することでサービスを削除できます。

※「--zone」オプションを省略した場合、デフォルトゾーンに追加されます。


IPアドレスの削除

# firewall-cmd --remove-source=192.168.11.0/24 --zone=drop


恒久的な設定とする場合は、--permanent オプションを指定します。

ただし、設定を反映したい場合は設定の再読み込み(--reload オプション)が必要です。


IPアドレスの削除(恒久的な設定とする場合)

# firewall-cmd --remove-source=192.168.11.0/24 --zone=drop --permanent

# firewall-cmd --reload
success


ゾーンの変更


アクティブゾーンの変更

--change-interface オプションを指定することでアクティブゾーンを変更できます。


アクティブゾーンの変更(ens160に対する割り当てをhomeに変更する例)

# firewall-cmd --zone=home --change-interface=ens160



アクティブゾーンの変更(恒久的な設定とする場合)

# firewall-cmd --zone=home --change-interface=ens160 --permanent

# firewall-cmd --reload
success


デフォルトゾーンの変更

--set-default-zone オプションを指定することでデフォルトゾーンを変更できます。


デフォルトゾーンの変更(homeに変更する例)

# firewall-cmd --set-default-zone=home



アクセス元IPアドレスのゾーンの変更

--change-source オプションを指定することで、すでに登録済みのIPアドレスのゾーンを変更できます。

--get-zone-of-source オプションを指定することで、アクセス元IPアドレスのゾーンを確認できます。


アクセス元IPアドレスに割り当てられているゾーンの変更(dropに変更の例)

# firewall-cmd --change-source=192.168.11.0/24 --zone=drop



アクセス元IPアドレスに割り当てられているゾーンの確認

# firewall-cmd --get-zone-of-source=192.168.11.0/24

drop

恒久的な設定とする場合は、--permanent オプションを指定します。

ただし、設定を反映したい場合は設定の再読み込み(--reload オプション)が必要です。


ゾーンの変更(恒久的な設定とする場合)

# firewall-cmd --change-source=192.168.11.0/24 --zone=drop --permanent

# firewall-cmd --reload
success


サービスの新規作成

サービスは独自に作成することも可能です。

詳しくは、firewall-cmdのマニュアル(man firewalld-cmd)をご覧ください。

--permanent オプションは必須です。

--new-service オプションを指定するとサービスの設定ファイル(xml)が作成されます。

作成される場所は /etc/firewalld/services/ の配下です。


hogeサービスの作成

# firewall-cmd --permanent --new-service hoge


# cat /etc/firewalld/services/hoge.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
</service>

※/etc/firewalld/services/hoge.xml が作成されます。


既存のxmlファイルから作成する場合

# firewall-cmd --permanent --new-service-from-file=[filename] --name=[別名をつける場合]



hogeサービスの説明文追加

# firewall-cmd --permanent --service=hoge --set-description=[説明文]

# firewall-cmd --permanent --service=hoge --set-short=[短い説明文]


hogeサービスにFW設定追加の例

# firewall-cmd --permanent --service=hoge --add-port=2020/tcp

# firewall-cmd --permanent --service=hoge --add-source-port=60000-65000/udp
# firewall-cmd --permanent --service=hoge --set-destination=ipv4:192.168.0.1/24

# cat /etc/firewalld/services/hoge.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>[短い説明文]</short>
<description>[説明文]</description>
<port protocol="tcp" port="2020"/>
<source-port protocol="udp" port="60000-65000"/>
<destination ipv4="192.168.0.1/24"/>
</service>


再読み込み

# firewall-cmd --reload



hogeサービスの削除

# firewall-cmd --permanent --delete-service=hoge