【丁寧解説】Linuxのファイアウォール firewalld の使い方

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

このページでは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

firewalld1-state

また

# systemctl status firewalld

firewalld2-systemctl

としても状況が確認できる。サービスの起動が確認できたはずだ。

現状の確認

取り敢えず現状がどうなっているのかを確認しよう。

# firewall-cmd --list-all

firewalld3-list-all

現在「enp0s3」に「public」ゾーンが指定されていることがわかる。

指定したゾーンの設定を確認

書式:firewall-cmd --zone=<ゾーン名> --list-all

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

firewalld4-zone=block

どのゾーンでどのサービスが有効なのかを確かめるときに使用する。「block」の場合デフォルトですべてのサービスを拒否するようになっている。

ゾーンの設定を全て確認

# firewall-cmd --list-all-zones

firewalld5-list-all-zone

9個のゾーンのステータスが表示される、スクリーンショットでは途切れているが、下に続いている。

デフォルトで設定されるゾーンの確認

# firewall-cmd --get-default-zone

firewalld6-get-default-zone

設定時に指定できるサービス一覧

# firewall-cmd --get-services

firewalld7-get-services

変更を加えてみる。

デフォルトのゾーン変更

書式:firewall-cmd --set-default-zone=<ゾーン>

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

firewalld8-set-default-zone

インターフェイスのゾーン変更

書式:firewall-cmd --zone=<ゾーン> --change-interface=<インターフェイス>

# firewall-cmd --zone=trusted --change-interface=enp0s3

firewalld9-zone-interface

例外的にインターフェイスへのゾーン割り当ては、後述する「--permanent」は意味をなさないので気を付けよう。恒久的にインターフェイスのゾーンを変更したいときは、

# vi /et/sysconfig/network-scripts/ifcfg-<インターフェイス名>

今回の場合は

# vi /et/sysconfig/network-scripts/ifcfg-enp0s3

を開き

ifcfgscript-zone

 

「ZONE」の項目を記述しよう。

ゾーンへサービスを追加してみる

書式:firewall-cmd --zone=<ゾーン> --add-service=<サービス>

Publicにhttpを追加している例

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

firewalld10-add-service

ゾーンへサービスを削除してみる

書式:firewall-cmd --zone=<ゾーン> --remove-service=<サービス>

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

firewalld11-remove-service

permanentオプション

一通り確認を終えたところで設定を行いたいが、注意点がある。

一時設定と恒久的設定についてだ。基本的になにも考えず設定しただけでは恒久的設定とならず、再起動すると元に戻ってしまう。恒久的に設定を反映させたい場合「--permanent」オプションを指定しよう。

--permanentを指定した場合は即時反映はされないので「firewall-cmd --reload」で設定を反映させよう。

例えば

一時的な設定で

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

とすると設定が即時反映されるが、サービスやマシンを再起動すると初期状態に戻ってしまう。そこで「--permanent」オプションを使用する。

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

firewalld12-permanent

とした後には

# fiewall-cmd --reload

firewalld13-reload

とする必要がある。

元のサービス定義ファイルの場所など

デフォルトで用意されているサービス一覧

基本的にxmlで記述されており、どのプロトコルでポートは何番なのかが記述されている。

# ls /usr/lib/firewalld/services/

firewalld14-services

実際に中身を見てみると以下のようになっている。

# vi /usr/lib/firewalld/services/http.xml

http-xml

 

httpの場合指定プロトコルはTCPポート番号は80番となっている。

icmpタイプ一覧

# ls /usr/lib/firewalld/icmptypes/

firewalld15-icmp

まとめ

このページではLinuxのファイアウォールであるfirewalldについてまとめてご紹介した。

参考にしていただければと思う。

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

このページの続きや関連ページは下記から一覧で確認できる。

短期間でエンジニアになる方法

・「まったくの初心者だけどエンジニアになりたい!」

・「プログラマーとして転職をしたい!」

という方はリナックスアカデミーの資料を見てみてください。短期間で未経験からエンジニアになることができるスクールとして15年間選ばれ続けてきた理由やノウハウが載った資料です。

エンジニアの入り口に立つために必要な勉強技術の最新動向本当に使えるIT資格学習に役立つ国からの奨励金などの情報が詰まっています。

無料で2,3日中にお手元にお届けします。


資料を見てみる

SNSでもご購読できます。

コメントを残す

*