思路
代码在下一段
- 使用
iptables
和ipset
来解决问题,本人使用ubuntu20.04
,默认开启ufw
,在下个ipset
即可。 - 获取国区ip段。
- 生成一份添加
ip
段到ipset
的脚本,并加入私有网络ip。 - 使用
ipset
生成存放国区ip
段的set
,并执行步骤3生成的脚本,将ip
塞入set
。 - 接下来就和
iptables
玩一下,把该匹配规则塞入input
链里即可。
小意外?
针对步骤5,塞入input
链有个前提,你的服务监听的网络接口是公网对应的网络接口,比如eth0
,如果你的服务是docker
,那么请放到forward
里。
代码
- 创建可执行命令的脚本
addchina.ipset.sh
。
echo "#!/bin/bash" > addchina.ipset.sh
# 将私有网络网段写入, -exist作用:如果存在该地址不提示
echo "ipset add -exist china 10.0.0.0/8" >> addchina.ipset.sh
echo "ipset add -exist china 172.16.0.0/12" >> addchina.ipset.sh
echo "ipset add -exist china 192.168.0.0/16" >> addchina.ipset.sh
# 下载国区ip段。这里的-#是进度条,美观点
curl -# -O http://www.ipdeny.com/ipblocks/data/countries/cn.zone
# 将国区ip段写入
for i in `cat cn.zone`; do echo "ipset -exist add -exist china $i" >>addchina.ipset.sh; done
# 给个执行权限
sudo chmod +x addchina.ipset.sh
- 安装、配置
ipset
。
apt install ipset -y
- 创建一个
set
存放网段
ipset create china hash:net hashsize 10000 maxelem 100000
如果不想存放 ip
段,想写 ip
,比如做个白名单:ipset create whitelist hash:ip
。
- 运行添加脚本。
bash addchina.ipset.sh
-
ipset
查看。
# 查看全部set
ipset list -t
# 查看指定set
ipset list china -t
# 需要看set里的具体ip,就把 -t 给去了
- 把我们的规则插入到
input
链的第一条,只要不满足ipset.china
的全部丢掉。
iptables -I INPUT -m set ! --match-set china src -j DROP
如果想了解下 iptables
的一些简单指令请看这里。