iptables 只允许来自一个国家的流量

ter*_*ran 5 firewall iptables

我想只允许来自一个国家的流量。

我在网上看到和阅读了多种方式,但其中大多数已经过时(使用 Xtables 插件),另一半展示了如何将不喜欢的 IP 列入黑名单。

然而,这是一种错误的做法,将所有内容一一列入黑名单。一个更好的方法是做一个白名单,这样除了白名单之外的所有东西都将被阻止。

我在法国;我只想允许法国客户/用户访问服务器。

我制定的 iptables 规则是

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination xx.xx.xx.xx:80
Run Code Online (Sandbox Code Playgroud)

只是转发流量。

Phi*_*ing 4

我并不是说这是最好的选择,但如果您找不到另一个有效的选择,那么您可以使用可下载的 GeoIP 数据库和ipset工具“推出您自己的”。

例如,下载CSV 格式的Geolite2 数据库国家。下载并解压文件:

wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country-CSV.zip
unzip GeoLite2-Country-CSV.zip
cd GeoLite2-Country-CSV_20190430
Run Code Online (Sandbox Code Playgroud)

查找法国的 id 并过滤法国网络的所有记录:

grep France GeoLite2-Country-Locations-en.csv
3017382,en,EU,Europe,FR,France,1

awk -F, '$2 == 3017382 {print $1}' > french_networks.txt
Run Code Online (Sandbox Code Playgroud)

构建一个包含法国网络的 ipset,名为france

ipset create france hash:net
while read network ; do 
    ipset add france $network; 
done < french_networks.txt
Run Code Online (Sandbox Code Playgroud)

使用 ipset 创建一条iptables规则,删除任何非法国的内容。请注意,您可能需要添加额外的规则以确保本地网络不会被丢弃:

iptables -A INPUT -m set ! --match-set france src -j DROP
Run Code Online (Sandbox Code Playgroud)