xtables-addons:按国家/地区过滤软件包

xtables-addons:按国家/地区过滤软件包
阻止来自某些国家/地区的流量的任务看似简单,但第一印象可能具有欺骗性。 今天我们将告诉您如何实现这一点。

史前

关于这个主题的谷歌搜索结果令人失望:大多数解决方案早已“腐烂”,有时似乎这个主题已被永远搁置并被遗忘。 我们已经查阅了大量旧记录,并准备分享现代版本的说明。

我们建议您在执行这些命令之前阅读整篇文章。

准备操作系统

将使用该实用程序配置过滤 iptables的,这需要扩展才能处理 GeoIP 数据。 该扩展可以在以下位置找到 xtables 插件。 xtables-addons 将 iptables 的扩展安装为独立的内核模块,因此无需重新编译操作系统内核。

在撰写本文时,xtables-addons 的当前版本是 3.9。 但是,在标准 Ubuntu 20.04 LTS 存储库中只能找到 3.8,而在 Ubuntu 18.04 存储库中只能找到 3.0。 您可以使用以下命令从包管理器安装扩展:

apt install xtables-addons-common libtext-csv-xs-perl

请注意,3.9 版本和项目当前状态之间存在微小但重要的差异,我们将在稍后讨论。 要从源代码构建,请安装所有必需的软件包:

apt install git build-essential autoconf make libtool iptables-dev libxtables-dev pkg-config libnet-cidr-lite-perl libtext-csv-xs-perl

克隆存储库:

git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons

cd xtables-addons-xtables-addons

xtables-addons 包含许多扩展,但我们只感兴趣 xt_geoip。 如果您不想将不必要的扩展拖到系统中,可以将它们从构建中排除。 为此,您需要编辑该文件 配置文件。 对于所有需要的模块,安装 y,并标记所有不需要的 n。 我们收集:

./autogen.sh

./configure

make

并以超级用户权限安装:

make install

在安装内核模块的过程中,可能会出现类似如下的错误:

INSTALL /root/xtables-addons-xtables-addons/extensions/xt_geoip.ko
At main.c:160:
- SSL error:02001002:system library:fopen:No such file or directory: ../crypto/bio/bss_file.c:72
- SSL error:2006D080:BIO routines:BIO_new_file:no such file: ../crypto/bio/bss_file.c:79
sign-file: certs/signing_key.pem: No such file or directory

这种情况的出现是由于无法签署内核模块,因为没有什么可签署的。 您可以通过几个命令解决这个问题:

cd /lib/modules/(uname -r)/build/certs

cat <<EOF > x509.genkey

[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts

[ req_distinguished_name ]
CN = Modules

[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid
EOF

openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pem

已编译的内核模块已安装,但系统未检测到。 让我们要求系统创建一个考虑到新模块的依赖关系图,然后加载它:

depmod -a

modprobe xt_geoip

让我们确保 xt_geoip 已加载到系统中:

# lsmod | grep xt_geoip
xt_geoip               16384  0
x_tables               40960  2 xt_geoip,ip_tables

此外,请确保扩展已加载到 iptables 中:

# cat /proc/net/ip_tables_matches 
geoip
icmp

我们对一切都很满意,剩下的就是将模块名称添加到 / etc /模块以便模块在重新启动操作系统后可以工作。 从现在开始,iptables 可以理解 geoip 命令,但它没有足够的数据可以使用。 让我们开始加载 geoip 数据库。

获取 GeoIP 数据库

我们创建一个目录,其中将存储 iptables 扩展可以理解的信息:

mkdir /usr/share/xt_geoip

在文章开头,我们提到来自源代码的版本和来自包管理器的版本之间存在差异。 最明显的区别是数据库供应商和脚本的变化 xt_geoip_dl,下载最新数据。

包管理器版本

该脚本位于路径 /usr/lib/xtables-addons 中,但是当您尝试运行它时,您将看到一个信息不多的错误:

# ./xt_geoip_dl 
unzip:  cannot find or open GeoLite2-Country-CSV.zip, GeoLite2-Country-CSV.zip.zip or GeoLite2-Country-CSV.zip.ZIP.

此前,GeoLite 产品(现称为 GeoLite Legacy)经许可分发,被用作数据库 知识共享 ASA 4.0 由公司 的MaxMind。 该产品同时发生了两个事件,“破坏”了与 iptables 扩展的兼容性。

首先是2018年XNUMX月 公布 关于终止对该产品的支持,并于2019年2月2日,从官网删除了所有下载旧版本数据库的链接。 建议新用户使用GeoLiteXNUMX产品或其付费版本GeoIPXNUMX。

其次,自2019年XNUMX月起MaxMind 关于数据库访问方面的重大变化。 为了遵守加州消费者隐私法,MaxMind 决定通过注册“覆盖”GeoLite2 的分发。

由于我们想使用他们的产品,因此我们将在此页面上注册。

xtables-addons:按国家/地区过滤软件包
然后您将收到一封电子邮件,要求您设置密码。 现在我们已经创建了一个帐户,我们需要创建一个许可证密钥。 在您的个人帐户中我们找到该项目 我的许可证密钥,然后单击按钮 生成新的许可证密钥.

创建密钥时,我们只会被问到一个问题:我们会在 GeoIP 更新程序中使用此密钥吗? 我们给出否定的回答并按下按钮 确认。 该密钥将显示在弹出窗口中。 将此密钥保存在安全的地方,因为一旦关闭弹出窗口,您将无法再查看整个密钥。

xtables-addons:按国家/地区过滤软件包
我们可以手动下载 GeoLite2 数据库,但其格式与 xt_geoip_build 脚本所需的格式不兼容。 这就是 GeoLite2xtables 脚本可以发挥作用的地方。 要运行脚本,请安装 NetAddr::IP perl 模块:

wget https://cpan.metacpan.org/authors/id/M/MI/MIKER/NetAddr-IP-4.079.tar.gz

tar xvf NetAddr-IP-4.079.tar.gz

cd NetAddr-IP-4.079

perl Makefile.PL

make

make install

接下来,我们使用脚本克隆存储库,并将之前获得的许可证密钥写入文件:

git clone https://github.com/mschmitt/GeoLite2xtables.git

cd GeoLite2xtables

echo YOUR_LICENSE_KEY=’123ertyui123' > geolite2.license

让我们运行脚本:

# Скачиваем данные GeoLite2
./00_download_geolite2
# Скачиваем информацию о странах (для соответствия коду)
./10_download_countryinfo
# Конвертируем GeoLite2 базу в формат GeoLite Legacy 
cat /tmp/GeoLite2-Country-Blocks-IPv{4,6}.csv |
./20_convert_geolite2 /tmp/CountryInfo.txt > /usr/share/xt_geoip/dbip-country-lite.csv

MaxMind 限制每天 2000 次下载,并且拥有大量服务器,并提供在代理服务器上缓存更新的功能。

请注意,输出文件必须被调用 dbip-国家/地区-lite.csv... 不幸, 20_convert_geolite2 不会产生完美的文件。 脚本 xt_geoip_build 预计三列:

  • 地址范围的开始;
  • 地址范围结束;
  • iso-3166-alpha2 中的国家/地区代码。

输出文件包含六列:

  • 地址范围的开始(字符串表示);
  • 地址范围结束(字符串表示);
  • 地址范围的开始(数字表示);
  • 地址范围结束(数字表示);
  • 国家代码;
  • 国家的名称。

这种差异至关重要,可以通过以下两种方式之一进行纠正:

  1. 规则 20_convert_geolite2;
  2. 规则 xt_geoip_build.

在第一种情况下,我们减少 的printf 到所需的格式,在第二个中 - 我们更改对变量的赋值 $抄送$行->[4]。 之后你可以构建:

/usr/lib/xtables-addons/xt_geoip_build -S /usr/share/xt_geoip/ -D /usr/share/xt_geoip

. . .
 2239 IPv4 ranges for ZA
  348 IPv6 ranges for ZA
   56 IPv4 ranges for ZM
   12 IPv6 ranges for ZM
   56 IPv4 ranges for ZW
   15 IPv6 ranges for ZW

请注意,作者 GeoLite2xtables 不认为其脚本已准备好制作并提供 遵循 用于开发原始 xt_geoip_* 脚本。 因此,让我们从源代码继续进行程序集,其中这些脚本已经更新。

源码版本

从源代码脚本安装时 xt_geoip_* 位于目录中 /usr/local/libexec/xtables-addons。 此版本的脚本使用数据库 IP 到国家精简版。 许可证是知识共享署名许可证,从现有的数据来看,有非常必要的三栏。 下载并组装数据库:

cd /usr/share/xt_geoip/

/usr/local/libexec/xtables-addons/xt_geoip_dl

/usr/local/libexec/xtables-addons/xt_geoip_build

完成这些步骤后,iptables 就可以开始工作了。

在 iptables 中使用 geoip

xt_geoip 仅添加两个键:

geoip match options:
[!] --src-cc, --source-country country[,country...]
	Match packet coming from (one of) the specified country(ies)
[!] --dst-cc, --destination-country country[,country...]
	Match packet going to (one of) the specified country(ies)

NOTE: The country is inputed by its ISO3166 code.

一般来说,为 iptables 创建规则的方法保持不变。 要使用其他模块中的键,您必须使用 -m 开关显式指定模块的名称。 例如,在所有接口上阻止端口 443 上非来自美国的传入 TCP 连接的规则:

iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROP

xt_geoip_build 创建的文件仅在创建规则时使用,但在过滤时不考虑。 因此,要正确更新 geoip 数据库,必须首先更新 iv* 文件,然后在 iptables 中重新创建所有使用 geoip 的规则。

结论

根据国家过滤数据包是一种被时间遗忘的策略。 尽管如此,用于此类过滤的软件工具正在开发中,也许很快带有新 geoip 数据提供程序的新版本 xt_geoip 将出现在包管理器中,这将大大简化系统管理员的工作。

xtables-addons:按国家/地区过滤软件包

只有注册用户才能参与调查。 登录拜托

您曾经使用过按国家/地区过滤吗?

  • 59,1%是13

  • 40,9%9号

22 位用户投票。 3 名用户弃权。

来源: habr.com

添加评论