CentOS7 firewalldの設定

スポンサーリンク

CentOS6まではLinuxサーバ上でファイアウォールを稼働さす場合、iptablesを使ったフィルタを実装するのが一般的でした。これをこのままCentOS7で利用することも可能なのですが、新たなファイアウォールとしてfirewalldというのが実装されました。

このfirewalldは内部的にiptablesを利用しているのですが、firewalldとiptablesを併用することはできません。iptablesを利用する場合はfirewalldを停止しておく必要があり、firewalldを利用する場合はiptablesを停止しておく必要があります。

このfirewalldは事前にゾーンというものを定義し、そのゾーンに対して許可するサービスを定義していきます。そして定義したゾーンをLinuxサーバ上のNICと紐付けを行います。このゾーンに関してデフォルトで以下のものが定義されています。

ゾーン 説明
block ( 変更不可 ) 全てのパケットを破棄しますが、内部から外部への戻りパケットは許可されます。 
dmz デフォルトで「ssh」のみ許可されています。
drop ( 変更不可 ) 全てのパケットを破棄します。現実的に使用されることはありません。  
external デフォルトで「ssh」のみ許可されています。IPマスカレードが有効になっています。
home デフォルトで「dhcpv6-client」、「ipp-client」、「mdns」、
「samba-client」、「ssh」が許可されています。
internal デフォルトで「dhcpv6-client」、「ipp-client」、「mdns」、
「samba-client」、「ssh」が許可されています。
public デフォルトゾーンです。デフォルトで「ssh」と「dhcpv6-client」のみ許可されています。
trusted
( 変更不可 )
全てのパケットが許可されます。
work デフォルトで「dhcpv6-client」、「ipp-client」、
「 ssh」が許可されています。


firewalldはコマンド操作で設定を変更することが可能です。但し、firewalldが有効となっている必要がありますので無効となっている場合には以下のコマンドで有効化しておきます。

# systemctl enable firewalld
# systemctl start firewalld


上記操作を行った後に、firewalldコマンドでゾーン情報を確認することができます。下記で確認できるようデフォルトはpublicゾーンにインターフェイスがアタッチされています。

# firewall-cmd --list-all
public (default, active)
  interfaces: eno1
  sources:
  services: ssh vnc-server
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

その他のゾーンも含め全てを見たい場合は以下のオプションで閲覧可能です。

# firewall-cmd --list-all-zones
block
  interfaces:
  sources:
  services:
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

dmz
  interfaces:
  sources:
  services: ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

drop
  interfaces:
  sources:
  services:
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

external
  interfaces:
  sources:
  services: ssh
  ports:
  masquerade: yes
  forward-ports:
  icmp-blocks:
  rich rules:

home
  interfaces:
  sources:
  services: dhcpv6-client ipp-client mdns samba-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

internal
  interfaces:
  sources:
  services: dhcpv6-client ipp-client mdns samba-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

public (default, active)
  interfaces: eno1
  sources:
  services: ssh dhcpv6-client
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

trusted
  interfaces:
  sources:
  services:
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

work
  interfaces:
  sources:
  services: dhcpv6-client ipp-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

以降、記載する詳細なコマンドにおいてゾーンを省略して記載した場合、デフォルトゾーンのpublicが適用されます。このデフォルトゾーンを変更することもできます。下記ではデフォルトゾーンをpublicからtrustedに変更し、インターフェイスを付け替えるコマンド例です。

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

※デフォルトゾーンの変更
# firewall-cmd --set-default-zone=external
success

※ゾーンのインターフェイスを付け替える
# firewall-cmd --zone=trusted --change-interface=eno1
success


上述したようにデフォルトでゾーンごとに許可されているサービスが異なります。大体の場合、デフォルトのままだと必要なサービスが追加されていないことは多いと思いますのでコマンドでサービスを追加する必要があります。下記がサービスの追加・削除などを行うコマンドです。下記ではいずれもゾーンを指定しておりますが、デフォルトゾーンの場合は省略可能です。


※定義されているサービス一覧 
# firewall-cmd --get-services

※publicのサービス確認
# firewall-cmd --list-service --zone=public 

※サービスを追加する
# firewall-cmd --add-service=http --zone=public

※恒久的にサービスを追加する
# firewall-cmd --add-service=http --zone=public --permanent

※サービスを削除する
# firewall-cmd --remove-service=dhcpv6-client --zone=public

また、サービスのみならず許可・拒否するICMPパケットのタイプを指定することもできます。こちらも同様にゾーンを指定しておりますが、デフォルトゾーンの場合は省略可能です。

※ICMPタイプの一覧表示
# firewall-cmd --get-icmptypes
destination-unreachable echo-reply echo-request parameter-problem redirect \
router-advertisement router-solicitation source-quench time-exceeded 

※禁止されているICMPタイプを表示
# firewall-cmd --list-icmp-blocks --zone=public

※禁止されているICMPタイプに追加
# firewall-cmd --add-icmp-block=echo-request --zone=public

※恒久的に禁止されているICMPタイプに追加 
# firewall-cmd --add-icmp-block=echo-request --zone=public --permanent

※禁止されるICMPタイプから削除
# firewall-cmd --remove-icmp-block=echo-request

※恒久的に禁止されるICMPタイプから削除 
# firewall-cmd --remove-icmp-block=echo-request --permanent

送信元アドレスやサービス、ポート番号など細かいところまで指定して定義するrich ruleというのもあります。以下は追加・削除の記載例です。

※特定送信元からhttpsを許可ルールを追加
# firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 \
  service name=https accept" --permanent 

※特定送信元からtcp/22(ssh)を許可ルールを追加
# firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.1.0/24 \
  port protocol=tcp port=22 accept" --permanent 

※特定送信元からhttpsを許可ルールを削除
# firewall-cmd --remove-rich-rule="rule family=ipv4 source address=192.168.2.0/24 \ 
service name=https accept" --permanent

DDoS対策で一定時間内に一定回数しかパケットを受信しないという設定も可能です。

※特定送信元から1分間に60回までtcp/22(ssh)を許可ルールを追加
# firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.1.0/24 \
  port protocol=tcp port=22 accept limit value=60/m" --permanent --zone=public

現在定義されているrich rulesを確認するコマンドは以下となります。

# firewall-cmd --list-rich-rule

リアルタイムに設定が反映されるコマンドと恒久的に設定を変更するコマンド(–permanent)の両方を指定する方法がありますが、恒久的にのみ変更しFirewallを再起動して変更する方法もあります。その場合の再起動コマンドが以下となります。

# firewall-cmd --reload

なお、設定ファイルは/etc/firewalld/zones/public.xmlであり、上記の再起動時にはこのファイルを読み込むという動作になります。そのためコマンドで操作しても良いですし、上記ファイルを直接編集するやり方でも変更は可能ということになります。

サービスやICMPタイプはデフォルトで定義されているものが多数あるのですが、独自に追加したい場合は以下のディレクトリにファイルを追加することになります。デフォルトで用意されているものは全て以下のディレクトリに保存されています。

※サービス一覧
# ls /usr/lib/firewalld/services/
amanda-client.xml      ipp-client.xml   mysql.xml       rpc-bind.xml
bacula-client.xml      ipp.xml          nfs.xml         samba-client.xml
bacula.xml             ipsec.xml        ntp.xml         samba.xml
dhcp.xml               kerberos.xml     openvpn.xml     smtp.xml
dhcpv6-client.xml      kpasswd.xml      pmcd.xml        ssh.xml
dhcpv6.xml             ldap.xml         pmproxy.xml     telnet.xml
dns.xml                ldaps.xml        pmwebapi.xml    tftp-client.xml
ftp.xml                libvirt-tls.xml  pmwebapis.xml   tftp.xml
high-availability.xml  libvirt.xml      pop3s.xml       transmission-client.xml
http.xml               mdns.xml         postgresql.xml  vnc-server.xml
https.xml              mountd.xml       proxy-dhcp.xml  wbem-https.xml
imaps.xml              ms-wbt.xml       radius.xml

※ICMPタイプ一覧
# ls /usr/lib/firewalld/icmptypes/
destination-unreachable.xml  parameter-problem.xml     router-solicitation.xml
echo-reply.xml               redirect.xml              source-quench.xml
echo-request.xml             router-advertisement.xml  time-exceeded.xml

 


上記まではコマンド操作でfirewalldを操作する方法ですが、GUIで設定できるツールも用意されており、こちらを使ったほうが直感的でわかりやすいです。以下のコマンドでツールを起動します。

# firewall-config

以下のような設定画面が起動します。この際、$LANG変数が日本語となっていると正常に設定できなかったので英語表記となるような設定にしおく必要があり ( export LANG=C ) 注意が必要です。

画面左上のConfigurationのところで現在動いているConfig ( Runtime ) なのか起動時に読み込むConfig( Permanent ) なのか選択する箇所があります。Permanentを選択し設定を変更した場合はOptionsメニューからReload Firewalldを選択してfirewalldを再起動する必要があります。

送信元IPアドレスを絞りたい場合や許可はするけども一定時間内に一定数までしか許可しないといった高度な設定をRich Ruleのところから行うことができます。

Addボタンで新規ルールを追加します。ここで送信元やサービス、プロトコルなどを指定することができます。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする