動作検証
それでは、動作検証として、以下の設定をします。
- pingの応答リクエストを無効化
- http通信の許可
- ポート8080の許可
- 特定のソースIPからの通信を遮断
- すべての通信の遮断
- すべての通信の遮断の解除
1.pingの応答リクエストを無効化
IPアドレスを確認します。
対象サーバのIPアドレスは192.168.136.138です。
クライアントPCからping応答確認します。
応答がありました。
それでは、永続的にブロックする設定をします。
# firewall-cmd --add-icmp-block=echo-request --permanent
success
# firewall-cmd --reload
success
# firewall-cmd --list-icmp-blocks
echo-request
再度確認します。
ブロックされました。
2. http通信の許可
http通信の許可をします。
※Apacheをインストールしてください。
現在の設定状況を確認します。httpサービスは許可していません。
# firewall-cmd --list-all
public target: default icmp-block-inversion: no interfaces: sources: services: dhcpv6-client ssh ports: protocols: masquerade: no forward-ports: sourceports: icmp-blocks: echo-request rich rules:
下記URLへアクセスします。
http://192.168.136.138
当然ブラウザからアクセスできません。
それでは、httpサービスを永続的に許可します。
# firewall-cmd --add-service=http --permanent
success
# firewall-cmd --reload
success
# firewall-cmd --list-all
public target: default icmp-block-inversion: no interfaces: sources: services: dhcpv6-client http ssh ports: protocols: masquerade: no forward-ports: sourceports: icmp-blocks: rich rules:
再度アクセスします。
Apacheのテストページが表示され、アクセスできました。
3.ポート8080の許可
※/etc/http/conf/httpd.confのリッスンするポートを80から8080へ変更してください。
# cp -p /etc/http/conf/httpd.conf /etc/http/conf/httpd.conf.org
# vi /etc/http/conf/httpd.conf
=============
#Listen 12.34.56.78:80
Listen 8080
=============
下記URLへアクセスします。
http://192.168.136.138:8080
タイムアウトし、表示されません。
それでは、ポート8080を永続的に許可します。
# firewall-cmd --add-port=8080/tcp --permanent
success
# firewall-cmd --reload
success
# firewall-cmd --list-all
public target: default icmp-block-inversion: no interfaces: sources: services: dhcpv6-client http ssh ports: 8080/tcp protocols: masquerade: no forward-ports: sourceports: icmp-blocks: echo-request rich rules:
再度アクセスします。
先ほど同様Apacheのテストページが表示され、アクセスできました。
1.特定のソースIPからの通信を遮断
特定のソースIPから通信を遮断します。
対象ソースはIP:192.168.136.132です。
一旦ping応答のブロックを解除します。
# firewall-cmd --remove-icmp-block=echo-request
success
# firewall-cmd --list-icmp-blocks
[何も表示されないことを確認]
IPアドレスを確認します。
ping応答も確認できます。
blockゾーンへ登録・設定します。
# firewall-cmd --add-source=192.168.136.132 --zone=block
success
# firewall-cmd --get-active-zones
block sources: 192.168.136.132
# firewall-cmd --zone=block --list-all
block (active) target: %%REJECT%% icmp-block-inversion: no interfaces: sources: 192.168.136.132 services: ports: protocols: masquerade: no forward-ports: sourceports: icmp-blocks: rich rules:
先ほどと同様にpingでアクセスします。
ブロックされていることを確認できました。
5.すべての通信の遮断
すべての通信を遮断します。
※ssh接続している場合は、セッションが遮断されますので、注意してください。
# firewall-cmd --panic-on
success
先ほどアクセスできていたブラウザのページをF5キーを押してリロードすると、アクセスできなくなっています。
localhostへのpingリクエストも遮断されています。
送受信すべてのアクセスの遮断が確認できました。
6.すべての通信の遮断の解除
送受信を含めたすべての通信の遮断を解除します。
# firewall-cmd --panic-on
success
下記の通り、アクセスできなかった通信が解除されました。
これまで設定した内容を確認します。
# firewall-cmd --list-all
You're performing an operation over default zone ('public'), but your connections/interfaces are in zone 'block' (see --get-active-zones) You most likely need to use --zone=block option. public target: default icmp-block-inversion: no interfaces: sources: services: dhcpv6-client http ssh ports: 8080/tcp protocols: masquerade: no forward-ports: sourceports: icmp-blocks: rich rules:
# firewall-cmd --get-active-zones
block sources: 192.168.136.132
例えば、ポートフォーワーディング設定など、上記以外の機能もあり、非常に拡張性が高いです。
今回はfirewalldの基本的な動作検証を行いました。
まとめ
・RHEL7以降、iptablesからfirewalldへ移行した。
・ファイアウォール設定方法は、GUI管理の「firewall-config」とCLI管理の「firewall-cmd」と2種類ある。
・firewalld の設定は、iptablesと違い、 XML ファイルで保存され、ファイルの差異を確認しているため、設定変更のたびにサービスを再起動する必要がない。
・firewalldは、「ゾーン」別にFWのフィルタ設定を定義し、各NICに割り当てることで、動作する。
参考: