前回に引き続き、firewalldについての解説を行います。
今回は、ポート指定及びポートフォワーディングの設定と複雑なルール設定(リッチルール)についての解説がメインとなります。
ポートの公開設定について
firewall-cmdにサービスが登録されていない場合には、ポート番号とプロトコル(TCP/UDP)を指定して、ポートを公開する設定を行う必要があります。
ポートの公開設定
書式 firewall-cmd [–permanent] [–zone=(zone)] –add-port=(portid)/(protocol) [–timeout=(seconds)]
ポートを公開する場合には、”–add-port”オプションを使います。”–zone”オプションを使って、どのゾーンに対して設定を行うのか指定します。
ゾーンを指定しなかった場合には、デフォルトゾーンに対して設定が行われます。(portid)にはポート番号または/etc/servicesに登録されているサービス名を指定します。
8001-8010のように、ポートの範囲で指定することもできます。なお、プロトコルは、tcp,udpのどちらかです。
“–permanent”を指定しない場合、設定は一時的に行われます。再起動すると設定が失われますので、注意が必要です。さらに、”–timeout”オプションを付けると、指定した時間の間だけサービスが公開されます。
“–permanent”オプションを付けた場合には、すぐには設定が反映されません。設定を反映させるためには、firewalldに設定を再読み込みさせる必要があります。
TCPの8001~8010番ポートと、POP3ポートを公開する場合の設定例がこちらです。
1 2 3 4 5 6 |
・TCPの8001~8010番ポートと、POP3ポートを公開する # firewall-cmd --permanent --add-port=8001-8010/tcp # firewall-cmd --permanent --add-port=pop3/tcp # firewall-cmd --reload |
ポートの公開停止
書式 firewall-cmd [–permanent] [–zone=(zone)] –remove-port=(portid)/(protocol)
ポートの公開を停止するには、”–remove-port”オプションを使います。”–zone”オプションを使って、どのゾーンに対しての設定を行うのか指定します。ゾーンを指定しなかった場合には、デフォルトゾーンに対して設定が行われます。
“–permanent”を指定しない場合、設定は一時的に行われます。再起動すると設定が失われますので、注意が必要です。
TCPの8001~8010番ポートの公開を停止する場合の設定例がこちらです。
1 2 3 4 5 6 |
・TCPの8001~8010番ポートと、POP3ポートの公開を停止する。 # firewall-cmd --permanent --remove-port=8001-8010/tcp # firewall-cmd --permanent --remove-port=pop3/tcp # firewall-cmd --reload |
ポートの公開状態の表示
ゾーンで、どのポートが公開されているかを調べるには、”–list-ports”オプションを使います。デフォルトゾーン以外のゾーンを表示したい場合には、”–zone”オプションを使って、どのゾーンに対して表示を行うのかを指定します。
1 2 3 4 5 |
公開されているポートを調べる # firewall-cmd --permanent --list-ports 結果 8001-8010/tcp pop3/tcp |
ポートフォワーディングの設定について
ポートフォワーディングは、特定のポートで受け取ったパケットを、別のポートや別のホストへ転送する機能です。firewalldでは、ポートフォワーディングの設定も柔軟に行うことができます。
ポートフォワーディングの設定
書式 firewall-cmd [–permanent] [–zone=(zone)] –add-forward-port=(expression) [–timeout=(seconds)]
ポートフォワーディングの設定は、”–add-forward-port”オプションで行います。(expression)には、次のような書式で転送元のポートとプロトコル、転送先のアドレスとポートを指定します。
expressionの書式 port=(portid):proto=(protocol)[:toaddr=(address)][:toport=(portid)]
(portid)には、8001-8080のようにポートの範囲で指定することもできます。プロトコルはtcp、udpのどちらかです。
TCPの10022番ポートで受け取った通信を、192.168.1.2 の22番ポートへ転送する設定の追加例がこちらです。
1 2 3 4 |
TCP 10022ポートを転送する # firewall-cmd --permanent --add-forward-port="port=10022:proto=tcp:toaddr=192.168.1.2:toport=22" # firewall-cmd --reload |
ポートフォワーディングの停止
書式 firewall-cmd [–permanent] [–zone=(zone)] –remove-forward-port=(expression)
ポートフォワーディングの設定を停止するには、”–remove-forward-port”オプションで行います。(expression)は、”–add-forward-port”と同じ書式で指定します。
TCPの10022番ポートで受け取った通信を、192.168.1.2の22番ポートへ転送する設定を停止する場合の例がこちらです。
1 2 3 4 5 |
TCP 10022ポートへの転送を停止する # firewall-cmd --permanent --remove-forward-port="port=10022:proto=tcp:toaddr=192.168.1.2:toport=22" # firewall-cmd --reload |
ポートフォワーディングの表示
書式 firewall-cmd [–permanent] [–zone=(zone)] –list-forward-ports
現在設定されているポートフォワーディングの設定を表示するには、”–list-forward-ports”オプションを使います。デフォルトゾーン以外のゾーンを表示したい場合には、”–zone”オプションを使って、どのゾーンに対して表示を行うのかを指定します。次はその実行例です。
1 2 3 4 5 |
ポートフォワーディングの状態を表示する # firewall-cmd --permanent --list-forward-ports 結果 port=10022:proto=tcp:toport=22:toaddr=192.168.1.2 |
複雑なルール設定(リッチルール)
ここまで解説した”–add-service”や”–add-port”の設定では、非常に簡単にサービスやポートの通信を許可することができます。しかし特定のホストからの通信だけを許可したり、反対に特定のホストの通信だけを
拒否したりする設定を行うことはできません。
そこでそのような詳細な設定を行いたい場合に使うのが、リッチルールです。リッチルールの設定方法について説明します。
リッチルールの追加
書式 firewall-cmd [–permanent] [–zone=(zone)] -add-rich-rule=(rule) [–timeout=(seconds)]
リッチルールを追加する場合には、”–add-rich-rule”オプションを使います。”–zone”オプションを使って、どのゾーンに対して設定を行うのかを指定します。ゾーンを指定しなかった場合には、デフォルトゾーンに対して設定が行われます。
“–permanent”を指定しない場合、設定は一時的に行われます。再起動すると設定が失われますので、注意が必要です。さらに、”–timeout”オプションを付けると、指定した時間の間だけサービスが公開されます。
△ルールの書式
1 2 3 4 5 6 7 8 9 10 11 |
(rule)には、次のような書式で詳細に設定を行うことができます。 ①rule family=(ipv4/ipv6) ② [ source address =(souce address)[/mask] [invert="true"] ] ② [ destination address =(souce address)[/mask] [invert="true"] ] ③ [ service name=(service) ] ③ [ port port=(portid) protocol=(protocol) ] ③ [ forward-port port=(portid) protocol=(protocol) to-port=(portid) to-addr=(address) ] ④ [ log [ prefix=(prefix) ] [ level=(loglevel) ] [ limit value=(rate)/(duration) ] ⑤ [ masquerade ] ⑥ [ accept|reject|drop ] |
△パケットの特定ルール
①”family”では、IPv4またはIPv6のどちらかを必ず指定します。
②”source address”,”destination address”では、それぞれ送信元IPアドレス、宛先IPアドレスを指定することができます。invert=trueを指定すると、指定したホスト以外という意味になります。
③”service”では、公開するサービスを指定します。また、”port”を使って、ポートを指定することもできます。(service)、(portid)、(protocol)の指定方法は、”–add-service”、”–add-port”のオプションの指定の場合と同じです。
“forward-port”を指定すると、ポートフォワーディングの設定を行うことができます。
△ログ
④”log”を指定すると、特定のパケットを受け取ったことをログに記録することができます。(prefix)は、ログに記録するときに先頭に付与される文字列です。levelではsyslogのレベルを指定することができます。
(loglevel)には、emerg、alert、crit、error、warning、notice、info、debugが指定できます。limitでは、ログに記録することができる最大数を指定することができます。(rate)には数値を、(duration)には期間を指定します。
△アクション
⑤”masquerade”を指定すると、IPマスカレードが有効になります。
⑥最後の”accept”、”reject”、”drop”は、特定したパケットをどうするのかの指定です。”accept”の場合にはパケットを受け取ります。”reject”の場合には受け取りを拒否してICMPメッセージを返却します。”drop”は単純にパケットを破棄します。
△ルールの適用例
vnc-serverサービスへのアクセスを192.168.3.5からだけ許可する場合の設定例がこちらです。
1 2 3 4 |
特定のサービスへの特定のホストからの通信を許可する # firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="192.168.3.5" service name=vnc-server accept' # firewall-cmd --reload |
特定のポートを特定のエリアからだけ許可する場合の設定例がこちらです。
1 2 3 4 |
特定のサービスへの特定のホストからの通信を許可する # firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="192.168.3.0/24" port port=pop3 protocol=tcp accept' # firewall-cmd --reload |
リッチルールの表示
書式 firewall-cmd [–permanent] [–zone=(zone)] –list-rich-rules
ゾーン設定されているリッチルールを調べるには、”–list-rich-rule”オプションを使います。デフォルトゾーン以外のゾーンを表示したい場合には、”–zone”オプションを使って、どのゾーンに対して表示を行うのかを指定します。
1 2 3 4 5 6 |
リッチルールの状態を表示する # firewall-cmd --permanent --list-rich-rules 結果 rule family="ipv4" source address="192.168.3.0/24" port port="pop3" protocol="tcp" accept rule family="ipv4" source address="192.168.3.5" service name="vnc-server" accept |
リッチルールの削除
書式 firewall-cmd [–permanent] [–zone=(zone)] –remove-rich-rule=(rule)
リッチルールを削除する場合には、”–remove-rich-rule”オプションを使います。”–zone”オプションを使って、どのゾーンに対して設定を行うのかを指定します。ゾーンを指定しなかった場合には、デフォルトゾーンに対して設定が行われます。”–permanent”を指定しない場合、設定は一時的に行われます。再起動すると設定が失われますので、注意が必要です。(rule)の指定方法は、リッチルールの登録時と同じです。
リッチルールの削除は、指定する内容が長いため、”–list-rich-rules”で表示した内容をそのまま指定するのが良いでしょう。
1 2 3 4 5 6 7 8 |
# firewall-cmd --permanent --list-rich-rules rule family="ipv4" source address="192.168.3.0/24" port port="pop3" protocol="tcp" accept rule family="ipv4" source address="192.168.3.5" service name="vnc-server" accept # firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="192.168.3.0/24" port port="pop3" protocol="tcp" accept' # firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="192.168.3.5" service name="vnc-server" accept' # firewall-cmd --reload |
GUIによるパケットフィルタリング設定
CentOSには、GUIでパケットフィルタリング設定を行うためのソフトウェアが付属しています。GUIから設定を行うと、簡単に条件を設定することができるので便利です。
GUI管理ツールの導入
GUIでのパケットフィルタリング設定の機能は、firewall-configパッケージをインストールすることで使用可能になります。ただし、GUIの管理ツールを使うためにはデスクトップ環境をインストールしている必要があります。
1 2 3 4 5 |
GNOME Desktopをインストールする # yum groupinstall "GNOME Desktop" firewall-configをインストールする # yum install firewall-config |
GUI管理ツールの利用
パケットフィルタリング用のGUIの管理ツールは、デスクトップにログインし、GNOMEデスクトップメニューのアプリケーション→諸ツール→ファイアウォールから起動します。
起動すると、認証画面が表示されますのでユーザのパスワードを入力し、「認証する」をクリックします。すると、下図のような画面が表示されます。
ファイアウォールの設定画面
設定は、次のような流れで行います。
①画面上部の「設定」のメニューから「実行時」または「永続」を選びます。
②画面左側のゾーンの一覧から設定を行うゾーンを選びます。
③「サービス」「ポート」「ポート転送」「高度なルール」などのタブを選択します。
④設定を変更します。
⑤①で「実行時」を選んだ場合には、設定は即時反映されます。「永続」を選んだ場合には、「オプション」→「firewalldの再読み込み」を選択し、設定を反映します。
「サービス」「ポート」「ポート転送」「高度なルール」などのタブでは、firewall-cmdと同様の設定項目を設定することができます。
今回のfirewalldの解説はここまでとなります。
firewalldとiptablesの違い
firewalldとiptables/ip6tablesとの違いは大きく2つあります。1つは「ゾーン」という新しい概念が導入されたこと。そしてもう1つは動的にファイアウォールのポリシーを変更出来るようになったことです。
「ゾーン」により使い分けが用意になったことは確かに歓迎すべきポイントではありますが、動的に既存のIP接続を切断することなく、ルールを追加・変更できるようになったのが一番の違いでありメリットだと言えます。
firewalldも仕組み的に裏ではiptablesが動いていることもあり、できることに大差はないように思えてしまいますが、クラウドコンピューティングや仮想化された環境では、firewalldのようなダイナミックファイアウォールが不可欠になっているようです。
まとめ
全2回でfirewalldの解説を行いましたが、いかがでしたでしょうか?
サービスやポートを指定したルールに比べると最後に紹介したリッチルールは書式がやや複雑で使いこなすことが難しいと感じる方もいらっしゃるかと思います。
そんなときにオススメしたいのが、比較的分かりやすいGUIで設定を行った上で
# firewall-cmd –permanent –list-rich-rulesを使って設定内容を確認する方法です。
この方法であればリッチルールの書式に慣れていない場合でも確実に設定を行うことができるので便利です。
今後に備えてCentOS7で標準のファイアウォールとなったfirewalldをまずは一度使ってみるところから初めてもらえればと思います。
最後にfirewalldについてより理解を深めたい方は、こちらのサイトがオススメです。