動作検証
それでは、動作検証として、以下の設定をします。
- 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-allblock (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-zonesblock sources: 192.168.136.132
例えば、ポートフォーワーディング設定など、上記以外の機能もあり、非常に拡張性が高いです。
今回はfirewalldの基本的な動作検証を行いました。
まとめ
・RHEL7以降、iptablesからfirewalldへ移行した。
・ファイアウォール設定方法は、GUI管理の「firewall-config」とCLI管理の「firewall-cmd」と2種類ある。
・firewalld の設定は、iptablesと違い、 XML ファイルで保存され、ファイルの差異を確認しているため、設定変更のたびにサービスを再起動する必要がない。
・firewalldは、「ゾーン」別にFWのフィルタ設定を定義し、各NICに割り当てることで、動作する。
参考: