Linux Firewalld を一から完全に理解する

Firewalld とは

Firewalld とは...なんですが、「ハマる前に理解する「Firewalld」の設定方法、「iptables」との違い (1/4)」こちらのサイトで丁寧に解説されています(丸投げ)。

要約すると以下のようになります。

  • FirewalldとはCentOS7から採用されたパケットフィルタリングの仕組み
  • Firewalldは「ゾーン」というグループ化したフィルタリングルールをインターフェース毎に割り当て、インバウンドに対する制御を行う
  • CentOS7だとデフォルトで107のサービスと9のゾーンが定義されており、ゾーンによって許可しているサービスの内容が異なる
  • ゾーンが許可しているサービスを自由に追加/削除できるし、オリジナルのゾーンを作成することもできる

@IT より引用

現在のゾーンを確認する

インターフェースがどのゾーンに属しているかを確認するには以下のコマンドを実行します。

firewall-cmd --get-active-zones

ゾーンに許可されているサービスを表示する

ゾーンがどのようなサービスを許可しているかを表示するには以下のコマンドを実行します。

firewall-cmd --list-services --zone=ゾーン

例えば、上記2つのコマンドを実行すると下図のように表示されます。

定義されているサービスの一覧を表示する

publicゾーンに許可されているサービスには「ssh」と「dhcpv6-client」がありました。これを "定義されている" サービスと表現しています(実際の中身はポート番号が書かれているだけ、などの単純なファイルです)。

定義されているサービスの一覧を表示するには以下のコマンドを実行します。

firewall-cmd --get-services

実際に実行すると下図のように表示されます。

上図のサービスを数えると全部で107存在します。CentOS7 の場合、これらの定義済みのサービスを組み合わせて Firewalld を設定していくわけです。(もしくは自身でサービスを定義することもできます)

定義済みのサービスも、実際のファイルとして存在します。場所は「/usr/lib/firewalld/services/」と「/etc/firewalld/services/」の2か所です。

後述しますが、もし「/usr/lib/firewalld/services/」と「/etc/firewalld/services」に同じ定義ファイルがあった場合では後者の設定が優先されます。「/usr/lib/firewalld/services/」をひな形として「/etc/firewalld/services/」にオリジナルの設定を加えた定義ファイルを配置することが多いようです。

実際に「firewall-cmd --get-services」と「/usr/lib/firewalld/services/」&「/etc/firewalld/services/」がリンクしていることを確認してみましょう。

下図では「firewall-cmd --get-services」の内容が「/usr/lib/firewalld/services/」と「/etc/firewalld/services/」を足した数になっていることがわかります。また、touch コマンドで空のファイルを作成しても定義されたサービスの数が増えていないことから、内容が間違っていた場合弾かれていることもわかります。

「/usr/lib/」と「/etc/」の優先度の違いを検証

「/usr/lib/firewalld/services/」と「/etc/firewalld/services/」に同じファイルがあった場合、「/etc/firewalld/services/」が優先されると先述しましたが、実際に見てみましょう。

検証では「/usr/lib/firewalld/services/」と「/etc/firewalld/services/」の両方に「ssh.xml」を用意し、それぞれポート番号を異なるものにします。ssh に成功できたポート番号の設定ファイルが、優先されたファイルです。

SSH のポート番号を変更する

まずは「/usr/lib/firewalld/services/」の ssh.xml を「/etc/firewalld/services/」にコピーします。

コピーした後に「/etc/firewalld/services/」の ssh.xml 内にある「port="22"」を「port="10022"」に変更してみます。

SSH は Firewalld の設定変更だけではダメ

ssh の xml は現在「/usr/lib/firewalld/services/ssh.xml」が「port="22"」、「/etc/firewalld/services/ssh.xml」が「port="10022"」となっています。

この状態だと、SSHが全く受け付けられなくなってしまいます

宛先ポート番号:10022

宛先ポート番号:22

なぜかというと、22番ポートは「/etc/firewalld/services/ssh.xml」で許可されていなく、10022番ポートは、そもそも ssh サービスがそのポートで待ち受けていないからです。

Firewalld はあくまでファイアウォールの設定なので、ssh 自体のポート番号が変更されるわけではありません。

sshd.config の修正

ssh のポート番号を変更する為には sshd.config を修正しなくてはなりません。場所は「/etc/ssh/sshd.config」です。

sshd.config の「Port=22」となっている箇所を「Port=10022」に変更します。

Port=10022 に変更

これで ssh のポート番号の修正は完了です。

SELinux の設定

ポート番号を修正後、ssh サービスを restart すると以下のエラーになるかもしれません。これは SELinux の設定と不一致が発生していることによるエラーです。

実は「sshd.config」の「Port=xx」と書かれている行の上に "変更した場合は このコマンドを実行してください" という旨が記載されています。ssh のポート番号を変更した場合はこの SELinux のポート番号を変更するコマンドまで実行する必要があります。

ただし、実際に「semanage port -a -t ssh_port_t -p tcp 10022」と入力しても「コマンドが見つかりません」となります。これは SELinux の設定変更コマンドがデフォルトでインストールされていないからです。設定変更コマンドは「yum install policycoreutils-python」でインストールすることができます。

インストール後であれば「semanage port -a -t ssh_port_t -p tcp 10022」が実行できます。ちなみに、「semanage port -l | grep ssh」で実際に変更されているか確認することができます。

「/usr/lib/」と「/etc/」どちらが優先されたか

結果は、やはり「/etc/firewalld/services/ssh.xml」に設定したポート番号10022でのみ接続ができました。

念の為、今度は逆にして設定してみましょう。一度「/usr/lib/firewalld/services/ssh.xml」と「/etc/firewalld/services/ssh.xml」のポート番号を22番にします。

コピーすることでリセット

今回は「/usr/lib/firewalld/services/ssh.xml」のポート番号を22にします。

やはり、「/etc/firewalld/services/ssh.xml」のポート番号22が優先されるため10022では接続ができません。

「/etc/firewalld/services/ssh.xml」を削除してみます。

「/usr/lib/firewalld/services/ssh.xml」しか存在しない状況だと10022で接続することができるようになりました。

ゾーンの変更とゾーンへのサービスの追加、ゾーンの作成方法

ゾーンの変更

ゾーンを変更するには以下のコマンドを実行します。

nmcli con mod インタフェース connection.zone ゾーン

ゾーンを変更することで、許可されているサービスが public と比較して増えていることがわかります。ちなみに、「firewall-cmd」コマンドは「--zone=ゾーン」オプションを省略すると public が指定されていることになります。ゾーンが public でないにも関わらず ゾーンを省略すると下図のように助言してくれます。

ゾーンへ許可するサービスを追加する

ゾーンへ許可するサービスを追加するには以下のコマンドを実行します。

firewall-cmd --add-service=サービス --zone=ゾーン

ゾーンで許可されたサービスを削除するには以下のコマンドを実行します。

firewall-cmd --remove-service=サービス --zone=ゾーン

実際に追加と削除を行うとこんな感じ

再起動すると追加したサービス設定が消える

ゾーンへ許可するサービスを追加した後に再起動してみます。

そうすると、下図のように追加したはずの「ftp」がなくなっています。

再起動後も設定を保持する場合、firewall-cmd は「--permanent」オプションを付与しなければなりません。また、「--permanent」オプションを付与した場合は設定が即座に反映されません。

設定が反映されないので再起動

下図のように、再起動後も設定が残っていることがわかります。

ゾーンの作成

ゾーンは作成することも出来ます。やり方は簡単で、「/usr/lib/firewalld/zones/」にあるゾーンの xml ファイルを「/etc/firewalld/zones/」にひな形としてコピーし、名前を変更するだけです。コピー後は一度 firewalld を reload する必要があります。

まとめ

  • 現在のゾーンを確認する「firewall-cmd –get-active-zones」
  • ゾーンに許可されているサービスを表示する「firewall-cmd –list-services –zone=ゾーン」
  • ゾーンの変更「nmcli con mod インタフェース connection.zone ゾーン」
  • ゾーンへ許可するサービスを追加する「firewall-cmd –permanent –add-service=サービス –zone=ゾーン」
  • サービスファイルの場所「/usr/lib/firewalld/services/」、「/etc/firewalld/services/」(優先)
  • ゾーンファイルの場所「/usr/lib/firewalld/zones/」、「/etc/firewalld/zones/」

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)