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