Locked

CentOS_TIPS_004

iptables Xtables-Addons を使用した GeoIP によるフィルタリング

GeoIP/国別データを iptables の制御(アクセス制限)に使用します。

ソースコードや設定例等は、以下のサイトから入手出来ます。

  • ソースコード

カーネルバージョンの関係から、1.x系を使用します。
http://sourceforge.net/projects/xtables-addons/files/Xtables-addons/

  • 参考URL

http://www.howtoforge.com/xtables-addons-on-centos-6-and-iptables-geoip-filtering

バージョン情報

ここでは、以下のバージョンについて記載しています。
IPv6(デュアルスタック)対応及び、比較的新しいバージョンのCentOS6に適用する場合はこちらの記述までご確認ください。

xtables-addons Version 1.47.1 (Modified 2012-10-15)

$ uname -a
Linux nazx.jp 2.6.32-279.5.2.el6.x86_64 #1 SMP Fri Aug 24 01:07:11 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

$ iptables -V
iptables v1.4.7

インストール

epelからperl-Text-CSV_XSをインストールしておきます。

# yum --enablerepo=epel install perl-Text-CSV_XS

xtables-addonsについてはパッケージを作成してインストールします。
tar ballを展開して ./configure && make && sudo make install でもインストール可能ですが、一部カーネルモジュールとしてインストールされるため、運用体制に合わせて追加処理が必要です。

1. カーネルを更新しない
/etc/yum.confにexcludeの設定を追加します。

--- a/yum.conf
+++ b/yum.conf
@@ -10,6 +10,7 @@
 installonly_limit=5
 bugtracker_url=http://bugs.centos.org/set_project.php?project_id=16&ref=http://bugs.centos.org/bug_report_page.php?category=yum
 distroverpkg=centos-release
+exclude=kernel* xtables-addons* kmod-xtables-addons*

 #  This is the default, if you make this bigger yum won't see if the metadata
 # is newer on the remote and so you'll "gain" the bandwidth of not having to

2. カーネル更新に追従する
specファイル内の%postセクションと同じ処理を実行します。

  • CentOS6用specファイル

https://nazx.jp/o/SPECS/xtables-addons.spec

カーネルバージョンの違い等、適宜修正してください。

GeoIPデータ取得/展開

MaxMind社のGeoLite Countryデータを使用します。
http://dev.maxmind.com/geoip/legacy/geolite/

ファイルを取得します。

$ mkdir /var/tmp/geoip
$ cd /var/tmp/geoip
$ /usr/libexec/xtables-addons/xt_geoip_dl

直接外部から取得出来ない構成の場合は、別途、zipファイルを取得して展開してください。
http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip

$ /usr/libexec/xtables-addons/xt_geoip_build GeoIPCountryWhois.csv

# mkdir -p /usr/share/xt_geoip/
# cp -r {BE,LE} /usr/share/xt_geoip/

ルールセット

動作確認。ブロック/制限する際にはジャンプ先(-j RETURN)をDROPに置き換える等してください。

# iptables -N GEOIP
# iptables -A GEOIP -m geoip --src-cc JP -j RETURN
# iptables -A GEOIP -m geoip --src-cc CN,KR -j RETURN
# iptables -I INPUT nn(任意の行) -j GEOIP

# iptables -L GEOIP -nv
Chain GEOIP (1 references)
 pkts bytes target     prot opt in     out     source               destination

   84  7560 RETURN      all  --  *      *       0.0.0.0/0            0.0.0.0/0
          Source country: JP
    1    40 RETURN      all  --  *      *       0.0.0.0/0            0.0.0.0/0
          Source countries: CN,KR

CentOS6.5/kernel-2.6.32-431 以降を使用する場合

CentOS release 6.5(カーネルバージョン 2.6.32-431) 以降、make に失敗するようになります。

$ make
Xtables-addons 1.47.1 - Linux 2.6.32-431.1.2.0.1.el6.x86_64
if [ -n "/lib/modules/2.6.32-431.1.2.0.1.el6.x86_64/build" ]; then make -C /lib/modules/2.6.32-431.1.2.0.1.el6.x86_64/build M=/mockbuild/rpms/SOURCES/xtables-addons-1.47.1/extensions modules; fi;
make[1]: ディレクトリ `/usr/src/kernels/2.6.32-431.1.2.0.1.el6.x86_64' に入ります
CC [M] /mockbuild/rpms/SOURCES/xtables-addons-1.47.1/extensions/compat_xtables.o
/mockbuild/rpms/SOURCES/xtables-addons-1.47.1/extensions/compat_xtables.c: In function ‘xtnu_ipv6_find_hdr’:
/mockbuild/rpms/SOURCES/xtables-addons-1.47.1/extensions/compat_xtables.c:633: error: too few arguments to function ‘ipv6_find_hdr’
make[2]: *** [/mockbuild/rpms/SOURCES/xtables-addons-1.47.1/extensions/compat_xtables.o] エラー 1
make[1]: *** [_module_/mockbuild/rpms/SOURCES/xtables-addons-1.47.1/extensions] エラー 2
make[1]: ディレクトリ `/usr/src/kernels/2.6.32-431.1.2.0.1.el6.x86_64' から出ます
make: *** [modules] エラー 2

原因は、カーネルバージョン 2.6.32-431 より ipv6_find_hdr の定義が変わったためです。

$ diff -urN /usr/src/kernels/2.6.32-358.23.2.el6.x86_64/include/linux/netfilter_ipv6/ip6_tables.h /usr/src/kernels/2.6.32-431.el6.x86_64/include/linux/netfilter_ipv6/ip6_tables.h
--- /usr/src/kernels/2.6.32-358.23.2.el6.x86_64/include/linux/netfilter_ipv6/ip6_tables.h 2009-12-03 12:51:21.000000000 +0900
+++ /usr/src/kernels/2.6.32-431.el6.x86_64/include/linux/netfilter_ipv6/ip6_tables.h 2013-11-11 11:53:25.000000000 +0900
@@ -317,9 +317,6 @@

/* Check for an extension */
extern int ip6t_ext_hdr(u8 nexthdr);
-/* find specified header and get offset to it */
-extern int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset,
- int target, unsigned short *fragoff);

extern int ip6_masked_addrcmp(const struct in6_addr *addr1,
const struct in6_addr *mask,


$ diff -urN /usr/src/kernels/2.6.32-358.23.2.el6.x86_64/include/net/ipv6.h /usr/src/kernels/2.6.32-431.el6.x86_64/include/net/ipv6.h
--- /usr/src/kernels/2.6.32-358.23.2.el6.x86_64/include/net/ipv6.h 2013-09-14 17:53:12.000000000 +0900
+++ /usr/src/kernels/2.6.32-431.el6.x86_64/include/net/ipv6.h 2013-11-11 11:53:25.000000000 +0900
@@ -73,7 +73,6 @@
#define IPV6_ADDR_SCOPE_MASK 0x00f0U

#define IPV6_ADDR_MAPPED 0x1000U
-#define IPV6_ADDR_RESERVED 0x2000U /* reserved address space */

/*
* Addr scopes
@@ -259,6 +258,15 @@

extern int ipv6_opt_accepted(struct sock *sk, struct sk_buff *skb);

+static inline bool ipv6_accept_ra(struct inet6_dev *idev)
+{
+ /* If forwarding is enabled, RA are not accepted unless the special
+ * hybrid mode (accept_ra=2) is enabled.
+ */
+ return idev->cnf.forwarding ? idev->cnf.accept_ra == 2 :
+ idev->cnf.accept_ra;
+}
+
int ip6_frag_nqueues(struct net *net);
int ip6_frag_mem(struct net *net);

@@ -574,6 +582,16 @@

extern int ipv6_ext_hdr(u8 nexthdr);

+enum {
+ IP6_FH_F_FRAG = (1 << 0),
+ IP6_FH_F_AUTH = (1 << 1),
+ IP6_FH_F_SKIP_RH = (1 << 2),
+};
+
+/* find specified header and get offset to it */
+extern int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset,
+ int target, unsigned short *fragoff, int *fragflg);
+
extern int ipv6_find_tlv(struct sk_buff *skb, int offset, int type);

/*

IPv6への対応を無効とすることが、安全かと思います。
以下はコメントアウト後の内容です。

# vi /usr/src/kernels/{kernelversion}/include/linux/autoconf.h
...
/* #define CONFIG_IP6_NF_IPTABLES_MODULE 1 */
  • 参考URL

http://qiita.com/biatunky/items/0dda947c4804f2b6d71f

https://www.howtoforge.com/xtables-addons-on-centos-6-and-iptables-geoip-filtering

一応、以下のパッチでIPv6有効のままmake出来ます。
公式の方が更新されることが望み薄のようなので、パッチ+SPECファイルを公開します。
なお、動作は全くの未保証です。ご容赦ください。

https://nazx.jp/o/SPECS/xtables-addons-1.47.1_compat_xtables.patch.bz2

https://nazx.jp/o/SPECS/xtables-addons_2.6.32-431-later.spec

CentOS7で使用する場合

Luxリポジトリにバージョン2.xパッケージが作成されているため、こちらを利用するのが良いでしょう。

# yum install http://repo.iotti.biz/CentOS/7/noarch/lux-release-7-1.noarch.rpm
...
================================================================================
 Package           アーキテクチャー
                                バージョン  リポジトリー                   容量
================================================================================
インストール中:
 lux-release       noarch       7-1         /lux-release-7-1.noarch        22 k

トランザクションの要約
================================================================================
インストール  1 パッケージ

Luxリポジトリを有効にしておくとyum update時にカーネル他、幾つかのパッケージが更新される可能性があります。

# yum check-update
...
kernel.x86_64                         3.10.0-514.21.1.el7.centos.plus        lux
kernel-devel.x86_64                   3.10.0-514.21.1.el7.centos.plus        lux
kernel-headers.x86_64                 3.10.0-514.21.1.el7.centos.plus        lux
kernel-tools.x86_64                   3.10.0-514.21.1.el7.centos.plus        lux
kernel-tools-libs.x86_64              3.10.0-514.21.1.el7.centos.plus        lux
perf.x86_64                           3.10.0-514.21.1.el7.centos.plus        lux
postfix.x86_64                        2:2.10.1-6.el7.lux.1                   lux
ppp.x86_64                            2.4.5-33.el7.lux.1                     lux
python-perf.x86_64                    3.10.0-514.21.1.el7.centos.plus        lux
yum-plugin-fastestmirror.noarch       1.1.31-40.el7.lux.lux                  lux
yum-plugin-priorities.noarch          1.1.31-40.el7.lux.lux                  lux
yum-utils.noarch                      1.1.31-40.el7.lux.lux                  lux

通常時は使用しないようにしておいた方が良いかもしれません。

# yum-config-manager --disable lux
...
================================== repo: lux ===================================
[lux]
...
enabled = 0
...

xtables-addonsのインストール。

# yum install --enablerepo=lux xtables-addons
...
================================================================================
 Package             アーキテクチャー
                            バージョン                                リポジトリー
                                                                           容量
================================================================================
インストール中:
 xtables-addons      x86_64 2.12-1.el7.lux                            lux  93 k
依存性関連でのインストールをします:
 kmod-xtables-addons x86_64 2.12-1.el7.lux.3.10.0_327.36.2.el7.centos.plus.x86_64
                                                                      lux  64 k

トランザクションの要約
================================================================================
インストール  1 パッケージ (+1 個の依存関係のパッケージ)