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 個の依存関係のパッケージ)