[firewalld]特定のIPアドレスを接続拒否する方法


今日の午後、あるIPアドレスから https://nullpopopo.blogcube.info/favicon.ico 目掛けて秒間3アクセスくらいの頻度でSPAMが。。。nginxで拒否しようかと思ったのですが、これ403を返すだけでリクエスト受けちゃうから、いよいよ真面目にfirewalldで拒否するしかないかなー、と。firewalldのまとまった情報はいくつかあったのですが、基本的な設定や理論が中心なので、今回やった、特定のIPアドレスを拒否する方法をメモしておきます。muninのConnections through firewallとNginx requestsのグラフがぴこーんと目立ってたので気が付きました。

20150126_fw_conntrack-day

20150126_nginx_request-day

■ firewalldのゾーンについて

firewalldが司るゾーンはいくつかあり、その一覧は「firewall-cmd --get-zones」で確認することができます。

# firewall-cmd --get-zones
block dmz drop external home internal public trusted work

デフォルトで用意されているゾーンのうち、drop(ゾーンそのものの設定変更不可。すべてを拒否する設定。)に対して、拒否したいIPアドレスやサブネットを追加してやるのがセオリーのようです。なお、今までのようにiptablesコマンドで拒否設定をしても設定が保存されないので、firewall-cmdコマンドで永続的に設定を行うことにします。

■ 特定のIPアドレスをfirewall-cmdで拒否する

ある特定のIPアドレスをdropゾーンに突っ込むことで、そこからのアクセスを拒否することができます。今回は例として192.168.0.0から192.168.0.254までを拒否することにします。

# firewall-cmd --zone=drop --add-source=192.168.0.0/24
# firewall-cmd --zone=drop --permanent --add-source=192.168.0.0/24

上記コマンドの最初の行で現在の設定が変更され、2行目のように「--permanent」をつけることにより、永続的に設定が保存され、firewalld起動時に読み込まれます。または

# firewall-cmd --zone=drop --permanent --add-source=192.168.0.0/24
# systemctl restart firewalld.service

のように、永続的な拒否設定をした後にfirewalldを再起動しても構いません。私は再起動なしで即設定が反映される前者が好みですが。

■ 拒否対象のIPアドレスがdropゾーンにいることを確認する

拒否対象のIPアドレスがdropされているかは「firewall-cmd --get-active-zones」で確認できます。

# firewall-cmd --get-active-zones
dmz
  interfaces: eth1
drop
  sources: 192.168.0.0/24
public
  interfaces: eth0
trusted
  interfaces: eth2

ちなみにですが、iptablesコマンドでsaveした後にできる設定ファイルのようなものがどこにあるかと言いますと、 /etc/firewalld/zones ディレクトリの中になります。今回追加したのはdropゾーンなので、drop.xmlに設定が書き込まれています。

# cat /etc/firewalld/zones/drop.xml 
<?xml version="1.0" encoding="utf-8"?>
<zone target="DROP">
  <short>Drop</short>
  <description>Unsolicited incoming network packets are dropped. Incoming packets that are related to outgoing network connections are accepted. Outgoing network connections are allowed.</description>
  <source address="192.168.0.0/24"/>
</zone>

■ 一度拒否したIPアドレスの設定を解除する

これが海外のIPアドレスだったら拒否した後は大体放置するのですが、今回は国内のIPアドレスかつ動的IPアドレスっぽいので、ほとぼりが冷めた頃に拒否設定を解除しようと思います。やり方としては、先ほどdropゾーンに突っ込んだのをfirewall-cmdで削除してあげることにします。

# firewall-cmd --zone=drop --remove-source=192.168.0.0/24
# firewall-cmd --zone=drop --permanent --remove-source=192.168.0.0/24

先ほど、拒否対象のIPアドレスをdropゾーンに追加したときは、「--add-source」で追加しましたが、反対に削除するときは「--remove-source」を実行します。設定の永続化は、--add-sourceしたときと同様「--permanent」をつけてやります。それでは確認してみましょう。

# firewall-cmd --get-active-zones
dmz
  interfaces: eth1
public
  interfaces: eth0
trusted
  interfaces: eth2

いかがでしょうか?取っつきにくい印象のあるfirewalldですが、最低限これだけの運用を覚えれば当面困ることは少ないはずです。よいサーバー運用ライフを!

[amazonjs asin="484433753X" locale="JP" title="CentOS 7実践ガイド"]