このページではLinux(CentOS)のファイアウォールfirewalldについてまとめてご紹介した。
CentOS6まではiptablesを利用していたが、CentOS7からfirewalldというものも利用できるようになっている。
こちらも含め紹介していこう。
目次
CentOS7のファイアウォール firewalld
firewalld
CentOS6までは高機能なパケットフィルタとしてiptablesを使用していたが、CentOS7では新しく「firewalld」というのもが実装された。
サービス単位でのfirewalldとiptablesの共存は出来ないようになっている。
firewalldを無効化してからiptablesを使用することも出来るようになっているが、CentOS7ではfirewalldがデフォルトで稼動するようになっているので、そちらを使用したほうがいいだろう。
iptablesとの関係
firewalldは実のところ、内部ではiptablesを使用しているものの一緒には使えない。
firewalldはiptablesの代替ではなくiptablesをより柔軟に活用するための新規フロントエンドとしてとらえるとよいだろう。ネットワークインターフェイス毎に設定を付与出来るのが特徴となっている。
実際にfirewalldを操作するには、管理コマンドである「firewall-cmd」を使用する。firewall-cmdはsystemctlやjounalctlなどとならんで、CentOS7で導入された新規コマンドとなる。将来にむけてじっくりと血肉にしてゆこう。
ちなみにiptablesに関しては下記で詳しく説明している。
firewalldが必要になった理由
このページ読んでいるあなたは、もしかしたら他のディストリビューションを使用していて「別にiptablesだけでも運用できるのではないか?」と思われるかもしれない。
実際のところ内部でiptablesを使用しているのは事実だ。
しかし、昨今Linuxネットワーク事情は仮想化などの流れにより非常に複雑になってきている。頻繁に設定を変更することになるそうなると手動でiptablesを編集するだけでは対応しにくくなってしまっている。
またiptablesで設定した内容と、アプリケーションが設定する内容がちぐはぐになってしまうなど、管理が混沌としてしまう場合がある。
それを回避、統一管理するためにfirewalldが用意された形になる。
firewalldはlinux上のfirewallを抽象化し設定の整合性を保ちながら、動的に設定を変更できるようになっている。今後管理者はiptablesコマンドではなくfirewall-cmdを使用してパケットフィルタを統合管理することになる。
ゾーンという概念
firewalldではゾーンという概念がある。言わばある程度のカテゴリとテンプレートだと思えばよいだろう。このゾーンをNIC毎に適応して運用することになる。デフォルトでは9種類のゾーンが存在している。
- drop 全てのパケットを破棄する。内部から外部へのパケットは許可されるが、返信されてきたパケットも破棄してしまうので実質的に通信不可となる。
- block 外部からのパケットは基本的に破棄される。内部からの通信パケットの返信は許可されるようになっている。
- public デフォルトでは「ssh」と「dhcpv6-client」のみ許可されている。
- external デフォルトでは「ssh」のみ許可される。ipマスカレードが有効になる。
- dmz デフォルトでは「ssh」のみ許可されている。
- work デフォルトでは「dhcpv6-client」と「ipp-client」、「 ssh」が許可される。
- home デフォルトでは「dhcpv6-client」と「ipp-client」と「mdns」と「samba-client」、「ssh」が許可される。
- internal デフォルトでは「dhcpv6-client」と「ipp-client」と「mdns」と「samba-client」、「ssh」が許可される。
- trusted 全てのパケットが許可される。
実際にfirewalldを操作してみよう
なにはともあれ実際に操作してみよう。
サービスの有効化と起動の確認
基本的にデフォルトで有効になっているはずだが、何かしらの理由でfirewalldを無効にしていた場合に、以下のコマンドを入力すれば有効化できる。
# systemctl enable firewalld
# systemctl start firewalld
ただしiptablesとの同時起動は出来ないので気をつけよう。firewalldの動作状況を確認しよう
# firewall-cmd --state
また
# systemctl status firewalld
としても状況が確認できる。サービスの起動が確認できたはずだ。
現状の確認
取り敢えず現状がどうなっているのかを確認しよう。
# firewall-cmd --list-all
現在「enp0s3」に「public」ゾーンが指定されていることがわかる。
指定したゾーンの設定を確認
書式:firewall-cmd --zone=<ゾーン名> --list-all
# firewall-cmd --zone=block --list-all
どのゾーンでどのサービスが有効なのかを確かめるときに使用する。「block」の場合デフォルトですべてのサービスを拒否するようになっている。
ゾーンの設定を全て確認
# firewall-cmd --list-all-zones
9個のゾーンのステータスが表示される、スクリーンショットでは途切れているが、下に続いている。
デフォルトで設定されるゾーンの確認
# firewall-cmd --get-default-zone
設定時に指定できるサービス一覧
# firewall-cmd --get-services
変更を加えてみる。
デフォルトのゾーン変更
書式:firewall-cmd --set-default-zone=<ゾーン>
# firewall-cmd --set-default-zone=block
インターフェイスのゾーン変更
書式:firewall-cmd --zone=<ゾーン> --change-interface=<インターフェイス>
# firewall-cmd --zone=trusted --change-interface=enp0s3
例外的にインターフェイスへのゾーン割り当ては、後述する「--permanent」は意味をなさないので気を付けよう。恒久的にインターフェイスのゾーンを変更したいときは、
# vi /et/sysconfig/network-scripts/ifcfg-<インターフェイス名>
今回の場合は
# vi /et/sysconfig/network-scripts/ifcfg-enp0s3
を開き
「ZONE」の項目を記述しよう。
ゾーンへサービスを追加してみる
書式:firewall-cmd --zone=<ゾーン> --add-service=<サービス>
Publicにhttpを追加している例
# firewall-cmd --zone=public --add-service=http
ゾーンへサービスを削除してみる
書式:firewall-cmd --zone=<ゾーン> --remove-service=<サービス>
# firewall-cmd --zone=public --remove-service =http
permanentオプション
一通り確認を終えたところで設定を行いたいが、注意点がある。
一時設定と恒久的設定についてだ。基本的になにも考えず設定しただけでは恒久的設定とならず、再起動すると元に戻ってしまう。恒久的に設定を反映させたい場合「--permanent」オプションを指定しよう。
--permanentを指定した場合は即時反映はされないので「firewall-cmd --reload」で設定を反映させよう。
例えば
一時的な設定で
# firewall-cmd --zone=public --add-service=http
とすると設定が即時反映されるが、サービスやマシンを再起動すると初期状態に戻ってしまう。そこで「--permanent」オプションを使用する。
# firewall-cmd --zone=public --add-service=http --permanent
とした後には
# firewall-cmd --reload
とする必要がある。
元のサービス定義ファイルの場所など
デフォルトで用意されているサービス一覧
基本的にxmlで記述されており、どのプロトコルでポートは何番なのかが記述されている。
# ls /usr/lib/firewalld/services/
実際に中身を見てみると以下のようになっている。
# vi /usr/lib/firewalld/services/http.xml
httpの場合指定プロトコルはTCPポート番号は80番となっている。
icmpタイプ一覧
# ls /usr/lib/firewalld/icmptypes/
まとめ
このページではLinuxのファイアウォールであるfirewalldについてまとめてご紹介した。
参考にしていただければと思う。
とてもわかり易かったです。
permanentオプションの項のリロードのコマンドの綴りが間違っています。
# fiewall-cmd --reload
は
# firewall-cmd --reload
rが抜けているみたいです。
いつもご愛読ありがとうございます。
記事に反映させていただきました。
ご指摘ありがとうございました。