firewalldを使って特定の国からのアクセスを遮断する方法

Twitterにも書きましたが、ちょっととある国からのアクセスが非常にウザくなってきたのでIPフィルタを用いてアクセスを遮断することにしました。ちなみに、4月にサーバシステムを新しくしていますが、前のサーバにはiptablesに直接フィルタ情報を書き込むタイプのスクリプトを用意して処理していたのですが、サーバが新しくなったこともあり、IPフィルタ処理がfirewalldを通して行うことが通常となってしまいましたので、そちらの方法に合わせています。ほかのサイトでも紹介されていますが、半分は自分のメモ書きのようなものです。

 

というわけで作業手順

それほど難しいものではないですが、手順としては

  1. 対象の国に属するIPのリストを取得する
  2. firewalldにIPリストを登録する
  3. firewalldの処理を有効にする

これだけです。まあ、最後にcronなどで処理を行うためのスクリプトを用意しますのでそちらをそのまま使えばOKかもしれません。

 

1.対象の国に属するIPのリストを取得する

本当ならばftpなどでリストをとってくる方法が正しいと思うのですが、この処理を組み込むために検索したときにIPリストを提示してくれるサイトとしてこちら(https://ipv4.fetus.jp/)がありましたので、私の例でもこちらを使うことにします。なお、この部分にIPリストを提示する別のサイトを使っても問題はないと思います。

このサイトではそれぞれの国に割り当てられたIPのリストについて国名(もしくは国コード)をクリックするとこのサイトからダウンロードできるアドレスが取得できます。形式もhtaccess形式やiptables形式、postfix形式など主要なサービスに対してかけられるようになっていて便利です。

ただし、firewalldでは普通にIPがずらっと書いてあるだけの形式を使うので「プレインテキスト」形式で問題ありません。対象の国のプレインテキスト形式をダウンロードできるURLを確認しておきましょう。

 

2.firewalldにIPリストを登録する

正しくはfirewalldではなくipsetという別のものを使うのですが…。ない場合はパッケージをインストールしておきましょう。私の場合はCentOS系なので

$ sudo yum install ipset

でインストールしておきましょう。

これがfirewalldに複数のIPを一括で処理させるもので、これをインストールすればこんな感じのことができます。よくスパムが来るのはこのサイトの場合はロシアやウクライナなので、ウクライナを対象にした場合はこんな感じでかけます。すでにIPリストを/tmp/ua.txtに保存してあるとすると…

$ sudo firewall-cmd --permanent --new-ipset=uk --type=hash:net
$ sudo firewall-cmd --permanent --ipset=uk --add-entries-from-file=/tmp/uk.txt

とすれば登録が完了します。

 

3.firewalldの処理を有効にする

登録が完了すれば、firewall-cmdでチェックが可能になり、

$ sudo firewall-cmd --zone=drop --list-all

というコマンドで確認すると

drop (active)
  target: DROP
  …
  sources: ipset:uk
  …

のように登録が確認できると思います。あとは

$ sudo firewall-cmd --reload

で再読込をすれば完了です。

 

で、定期的に更新するスクリプトは…

IPリストは不定期に変わりますので適当な間隔で更新していかないと思った国のIPをはじけなくなってしまいます。今のところ私はこんなスクリプトを作成しています。

#!/bin/sh

# コマンドの場所の設定
CURL = /usr/bin/curl
FIREWALL_CMD = /bin/firewall-cmd

# IPリストをダウンロード
$CURL "https://ipv4.fetus.jp/ua.txt" > /tmp/ua.txt

# firewalldに状態を設定する
$FIREWALL_CMD --permanent --delete-ipset=ua
$FIREWALL_CMD --permanent --new-ipset=ua --type=hash:net
$FIREWALL_CMD --permanent --ipset=ua --add-entries-from-file=/tmp/ua.txt
$FIREWALL_CMD --reload

# 使ったファイルを片付ける
rm /tmp/ua.txt

curlやfirewall-cmdの場所は環境によって異なると思いますので環境に合わせて変更すればOKですし、国が異なる場合はreloadの前に指定したい国の数だけ処理を追加すればOKです。最後にこれをcronで定期的に動くように設定すれば完了となります。

 

個人的には特定の国からのアクセスをはじく、とかはやりたくないが…

ちょっと目に余るアクセスがありましたのでそれに対応したものです。スパムというのも面倒なものですし、対応も面倒だな~と思いながらやっています。


コメントを残す

メールアドレスが公開されることはありません。

この記事のトラックバック用URL