本記事では Firewalld の機能を簡潔に説明します。Firewalld の知識がゼロという方は、まず以下の記事に目を通していただけると理解が早いのかと思います。
Firwalld の設定を行う前に、現在のゾーンの状態とゾーンで許可されているサービスを確認するコマンドを紹介します。
firewall-cmd –get-active-zone //現在のゾーンを確認する
firewall-cmd –list-service –zone=public //publicゾーンで許可されているサービスを確認する
現在のゾーンと許可されているサービスがわかったところで、早速 Firewalld の設定をいじっていきましょう。
なお、表示されている gif は実際にコマンドを入力した際のものです。
Contents
ゾーンの作成とサービスの追加
まずはゾーンを作成します。CentOS 7 の場合、デフォルトで9つのゾーンがあるのでそこからゾーンを選んで自分の好みにサービスと追加していってもいいんですが、ゾーンを作成した方が個人的にわかりやすいのでゾーンを作成しています。
ゾーンの作成は以下のコマンドで実行します。
cp /usr/lib/firewalld/zones/public.xml /etc/firewalld/zones/ゾーン名 //public.xml をひな形としてゾーンを作成する
不要なサービスをゾーンから削除する
オリジナルのゾーンが作成できたので、不要なサービスを削除します。
public ゾーンはデフォルトで「ssh」と「dhcpv6-client」が許可されていますが、「dhcpv6-client」を削除してみましょう。
firewall-cmd –remove-service=dhcpv6-client –permanent –zone=作成したゾーン名 //dhcpv6-client を永続的に削除する
dhcpv6-client は本当に不要?
dhcpv6-client を拒否しても dhcpv4 は拒否されません。IPv6 を使用していない環境の場合だと必要ないこともあるでしょう。今回は検証のため削除しましたが、実際は削除する必要もないと思います。
what is dhcpv6-client service in firewalld, and can i safely remove it?
デフォルトゾーンを変更する
毎回「–zone=作成したゾーン名」をオプションに加えないといけないのは辛いですね。デフォルトゾーンを変更することで省略時に暗黙的に指定されるゾーンを変更することができます。初期値はpublicです。
firewall-cmd –set-default-zone=作成したゾーン名 //指定したゾーンをデフォルトゾーンに設定する
ゾーンにサービスを追加する
ゾーンにサービスを追加するには、まずどんなサービスがあるかを理解する必要がありますね。以下のコマンドで確認することができます。
firewall-cmd –get-service //サービスを一覧で表示する
サービスがわかったら実際にゾーンにサービスを追加します。以下のコマンドです。
firewall-cmd –add-service=サービス名 –permanent //デフォルトゾーンにサービスを永続的に追加する
サービスのポート番号を変更する
サービスを追加したものの、そのサービスのポート番号を初期値から変更した場合は Firewalld のサービスに定義されているポート番号も変更する必要があります(もしくはポート番号を直接許可する)。
実際のサービスの定義ファイルは「/usr/lib/firewalld/services/」にありますが、直接編集するとオリジナルのファイルを汚してしまうことになります。なので、できるだけ「/etc/firewalld/services/」にコピーしたうえでファイルを編集しましょう。
なお、「/usr/lib/firewalld/services/」と「/etc/firewalld/services/」内に同じファイル名のサービスがあった場合は「/etc/firewalld/services/」の設定が優先されます。
cp /usr/lib/firewalld/services/サービス.xml /etc/firewalld/services/ //サービスの xml ファイルをコピーする
vi /etc/firewalld/services/サービス.xml //サービスの xml ファイルを編集する
ポート番号・IPアドレスを使ったゾーン制御
先ほどはサービスの xml ファイルを直接編集しましたが、それだと困る場合があります。
サービスファイルは全てのゾーンで共有されるものなので、「このゾーンでは ssh は 22」「このゾーンでは ssh は10022」などの使い分けができません。
そういった場合はゾーンファイルに直接ポート番号を追加しましょう。
ポート番号で直接制御する
許可するポート番号をゾーンファイルに直接追加するには以下のコマンドを実行します。
firewall-cmd –add-port=10022/tcp –permanent //デフォルトゾーンにポート番号10022(TCP)の通信を許可するルールを永続的に追加する
送信元 IP アドレスで制御する
特定の送信元 IP アドレスからの通信を許可することもできます。
その場合は以下のコマンドを実行してください。
firewall-cmd –add-source=IPアドレス/プレフィックス –permanent //指定したIPアドレスからの通信を永続的に許可する
ゾーンの定義ファイルを編集する
ゾーンの定義ファイルは以下のディレクトリにコピーしたものをオリジナルとして使っていましたね。
/etc/firewalld/zones/作成したゾーン名
このファイルは public からコピーしたものなので、description などが public のままです。そのままだと分かり辛いので適切なものに変更しましょう。
ゾーン.xml ファイルを直接編集する
変更する場所は主に「<short>簡潔な説明文</short>」と「<description>説明文</description>」です。以下のコマンドを実行して、実際にファイルにアクセスして変更しましょう。
vi /etc/firewalld/service/作成したゾーン名 //ゾーン.xml を vim で開く
番外編:ICMP を制御する
ところで、CentOS 7 をインストールした際のデフォルトの Firwalld のゾーンは public なんですが、public では「ssh」と「dhcpv6-client」の2つのサービスが許可されていました。
でも CentOS 7 ってインストール直後から ping が通りますよね?実は、ICMP は別枠なんですよね。例えば ping を拒否する場合は以下のコマンドを実行します。
firewall-cmd –add-icmp-block=echo-request –permanent //ICMP エコー要求を永続的に拒否する
本記事での紹介はここまでですが、まだまだ設定できることは多いので気になる人は調べてみてくださいね。