firewalldの基本的な操作方法

シェアする

CentOSではバージョン7以降で使われるようになった「firewalld」ですが、とりあえず、知っておいた方がいいだろうと思われるものを纏めてみました。

インストール直後のfirewalld

サービス状態

CentOS7.4を最小限インストールした状態で、firewalldのサービスは有効となっています。

# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
 Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
 Active: active (running) since Mon 2018-03-19 08:49:33 JST; 15min ago
 Docs: man:firewalld(1)
 Main PID: 647 (firewalld)
 CGroup: /system.slice/firewalld.service
 mq647 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Mar 19 08:49:23 centos74 systemd[1]: Starting firewalld - dynamic firewall daemon...
Mar 19 08:49:33 centos74 systemd[1]: Started firewalld - dynamic firewall daemon.
Mar 19 08:49:39 centos74 firewalld[647]: WARNING: ICMP type 'beyond-scope' is not supported by the kernel for ipv6.
Mar 19 08:49:39 centos74 firewalld[647]: WARNING: beyond-scope: INVALID_ICMPTYPE: No supported ICMP type., ignoring for run-time.
Mar 19 08:49:39 centos74 firewalld[647]: WARNING: ICMP type 'failed-policy' is not supported by the kernel for ipv6.
Mar 19 08:49:39 centos74 firewalld[647]: WARNING: failed-policy: INVALID_ICMPTYPE: No supported ICMP type., ignoring for run-time.
Mar 19 08:49:39 centos74 firewalld[647]: WARNING: ICMP type 'reject-route' is not supported by the kernel for ipv6.
Mar 19 08:49:39 centos74 firewalld[647]: WARNING: reject-route: INVALID_ICMPTYPE: No supported ICMP type., ignoring for run-time.

上記のとおり、「systemctl status」コマンドで状態を表示すると、下記のメッセージが出力されています。
「WARNING: ICMP type ‘xxxx’ is not supported by the kernel for ipv6.」

このメッセージが出力されているのは、バグ(Bug 1479951)ということで、次のマイナーバージョンであるRHEL7.5で修正が予定されているとのこと。

もし、諸般の事情で、出力されるメッセージを抑止したい場合、RHEL7.5にアップデートするまで、下記の方法で抑止が可能です。
ちなみに、私の場合、変更を加えず、出力されるメッセージを、無視しています。

# cd /usr/lib/firewalld/icmptypes
# mv beyond-scope.xml beyond-scope.xml.original
# mv failed-policy.xml failed-policy.xml.original
# mv reject-route.xml reject-route.xml.original
# systemctl restart firewalld
# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
 Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
 Active: active (running) since Mon 2018-03-19 10:48:57 JST; 8s ago
 Docs: man:firewalld(1)
 Main PID: 1686 (firewalld)
 CGroup: /system.slice/firewalld.service
 mq1686 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Mar 19 10:48:56 centos74 systemd[1]: Starting firewalld - dynamic firewall daemon...
Mar 19 10:48:57 centos74 systemd[1]: Started firewalld - dynamic firewall daemon.

設定状態

「firewall-cmd」コマンドでfirewalldの設定に関する操作を行ないます。firewalldには、zone(ゾーン)という概念があり、利用するzoneに対して、設定を行ないます。初期の状態では、publicというzoneがActive状態となっています。

# firewall-cmd --list-all-zone
block
  target: %%REJECT%%
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


dmz
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


drop
  target: DROP
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


external
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: yes
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


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


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


public (active) <= ゾーン名(現在の有効なゾーン)
  target: default <= ゾーンによって動作が変わる(publicの場合はREJECT)
  icmp-block-inversion: no <= icmp-blocksに記述されたICMPタイプを拒否(yesで逆の動作)
  interfaces: eth0 <= ゾーンに属するインターフェース
  sources: <= 送信元のIPアドレスもしくはネットワークアドレスを全て許可する
  services: ssh dhcpv6-client <= サービス単位で許可する
  ports: <= ポート単位で許可する
  protocols: <= プロトコル単位で許可する
  masquerade: no <= IPマスカレード(NAPT)をするかどうか
  forward-ports: <= 待ち受けてるポートとプロトコルで受信した時に送信元のポートとIPアドレスを変換する
  source-ports: <= 送信元ポートで許可する
  icmp-blocks: <= icmp-block-inversionで指定した動きに従うICMPタイプを指定する
  rich rules: <= リッチなルール(細かいルール)を指定する


trusted
  target: ACCEPT
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


work
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


target: default

default
利用するゾーンによって、ACCEPT,DROP,REJECTの動作となる。(publicはREJECTの動作)

ACCEPT
すべてが許可となる。

DROP
拒否されたルールに従い通信を遮断し、通信は破棄される。(何も応答を返さない)

REJECT
拒否されたルールに従い通信を遮断し、ICMPのタイプ3コード10を返す。

icmp-block-inversion: no

no
icmp-blocksに記述されたICMPのタイプのみを拒否する。

yes
icmp-blocksに記述されたICMPのタイプのみを許可する。

interfaces: eth0

このゾーンを適用するインターフェース名を指定する。

services: ssh dhcpv6-client

許可したいサービスを指定する。「firewall-cmd –get-services」で指定できるサービスを確認できる。また、サービスごとの定義ファイルは、「/usr/lib/firewalld/services/*.xml」に、XMLファイルとしてあります。

masquerade: no

no
IPマスカレード(NAPT)を無効にする

yes
IPマスカレード(NAPT)を有効にする

firewalldの設定方法

サービス単位もしくはポート単位で、通信の許可を行なう方法となります。
そのほかの設定については、必要となった時に、別記事で書こうと思います。

サービス単位

# firewall-cmd --permanent --add-service=ntp <= ntpサービスを許可する
success
# firewall-cmd --reload <= 再読み込み
success
# firewall-cmd --list-all
public (active)
 target: default
 icmp-block-inversion: no
 interfaces: eth0
 sources:
 services: dhcpv6-client ssh ntp
 ports:
 protocols:
 masquerade: no
 forward-ports:
 source-ports:
 icmp-blocks:
 rich rules:

# firewall-cmd --permanent --remove-service=ntp <= ntpサービスを拒否する
success
# firewall-cmd --reload <= 再読み込み
success
# firewall-cmd --list-all
public (active)
 target: default
 icmp-block-inversion: no
 interfaces: eth0
 sources:
 services: dhcpv6-client ssh
 ports:
 protocols:
 masquerade: no
 forward-ports:
 source-ports:
 icmp-blocks:
 rich rules:


# cat /usr/lib/firewalld/services/ntp.xml <= サービス単位のXMLファイル
<?xml version="1.0" encoding="utf-8"?>
<service>
 <short>Network Time Protocol (NTP) Server</short>
 <description>The Network Time Protocol (NTP) allows to synchronize computers to a time server. Enable this option, if you are providing a NTP server. You need the ntp or chrony package installed for this option to be useful.</description>
 <port protocol="udp" port="123"/>
</service>

ポート単位

# firewall-cmd --permanent --add-port=123/udp
success
# firewall-cmd --reload
success
# firewall-cmd --list-all
public (active)
 target: default
 icmp-block-inversion: no
 interfaces: eth0
 sources:
 services: dhcpv6-client ssh
 ports: 123/udp
 protocols:
 masquerade: no
 forward-ports:
 source-ports:
 icmp-blocks:
 rich rules:

# firewall-cmd --permanent --remove-port=123/udp
success
# firewall-cmd --reload
success
# firewall-cmd --list-all
public (active)
 target: default
 icmp-block-inversion: no
 interfaces: eth0
 sources:
 services: dhcpv6-client ssh
 ports:
 protocols:
 masquerade: no
 forward-ports:
 source-ports:
 icmp-blocks:
 rich rules: