前言:
境外肉鸡攻击有点多,并业务无境外访问需求,IDC机房网络防火墙无法实现8K多条的china大陆地址导入;为实现仅china大陆地址访问,在业务入口主机(DNAT端口映射或DNAT端口转发),使用iptables防火墙+ipset过滤实现访问控制,对于访问量不大的业务可考虑使用。
如需简单快捷的方式,搜本博“以错误路由方式禁止境外IP来访”篇 (缺点:主机也无法主动请求境外目标了)
创建一个ipset
ipset create whitelist hash:net maxelem 1000000
加入一个名单ip
ipset add whitelist 9.9.9.9
查看已经ipset配置内容
ipset list
Name: whitelist
Type: hash:net
Revision: 3
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16816
References: 0
Members:
9.9.9.9
将ipset规则保存到文件
ipset save whitelist -f whitelist.txt
查看备份内容
more whitelist.txt
create whitelist hash:net family inet hashsize 1024 maxelem 1000000
add whitelist 9.9.9.9
下载china大陆地址集合并处理格式
curl -# -O http://ftp.apnic.net/stats/apnic/delegated-apnic-latest
cat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print $4 "/" 32-log($5)/log(2)}'|cat >ip.txt
head -n 2 ip.txt
1.0.1.0/24
1.0.2.0/23
设置符合ipset备份文件格式
sed 's/^/&add whitelist /g' ip.txt > add-ip.txt
cat add-ip.txt >> whitelist.txt; cp whitelist.txt china_whitelist.txt
head -n 4 china_whitelist.txt
create whitelist hash:net family inet hashsize 1024 maxelem 65536
add whitelist 9.9.9.9
add whitelist 1.0.1.0/24
add whitelist 1.0.2.0/23
先删除前面创建的ipset
ipset destroy whitelist
导入ipset规则
ipset restore -f china_whitelist.txt
查看目前应用的ipset内容
ipset list | head -n 12
Name: whitelist
Type: hash:net
Revision: 3
Header: family inet hashsize 2048 maxelem 1000000
Size in memory: 126736
References: 0
Members:
202.118.64.0/18
223.212.0.0/15
103.217.56.0/22
150.242.184.0/22
43.246.76.0/22
去除名单ip
ipset del whitelist 9.9.9.9
禁用centos7firewalld,安装iptables
systemctl stop firewalld
systemctl disable firewalld
yum -y install iptables-services
systemctl start iptables
systemctl enable iptables
操作
service iptables status
service iptables stop
service iptables restart
iptables -F
先放行SSH,以免无法远程
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
service iptables save
修改内核参数,开启转发功能
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf && sysctl -p
开启DNAT
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.53.22:80
iptables -t nat -L -n
(后端主机看实际情况做返程路由,这里不做赘述,当然阿里云等不适用自建DNAT端口映射,可改用DNAT的端口转发,主要看后端有没获取客户端源IP需求)
应用ipset规则实现白名单,禁止境外ip
在dnat的端口用FORWARD链
iptables -t filter -I FORWARD -m set --match-set whitelist src -p tcp --dport 80 -j ACCEPT
iptables -t filter -A FORWARD -p tcp --dport 80 -j DROP
iptables -L -n
使用国内与境外地址分别测试通达性
curl -I http://ip+端口
如实现预期,保存规则永久生效
service iptables save
reboot重启ipset集合消失,并且导致iptables启动失败
因创建的 ipset 存于内存中
解决:
yum -y install ipset-service
systemctl enable ipset
ipset restore -f china_whitelist.txt
service ipset save
sed -i 's/IPSET_SAVE_ON_STOP="no"/IPSET_SAVE_ON_STOP="yes"/' /etc/sysconfig/ipset-config
带时间的玩法
创建默认ip生效时间为1天的ipset集合
ipset create timeout_list hash:net timeout 86400
ipset add timeout_list 1.9.9.9 #继承集合默认生存时间
ipset add timeout_list 2.9.9.9 timeout 3600 #生存时间为1小时
ipset add timeout_list 3.9.9.9 timeout 0 #生效时间无限
查看
ipset list timeout_list
Name: timeout_list
----
Header: family inet hashsize 1024 maxelem 65536 timeout 86400
----(像redis一样显示时间倒计时)
1.9.9.9 timeout 86372
3.9.9.9 timeout 0
2.9.9.9 timeout 3572
关于删除ipset和DNAT
因地址条目过多索引过大,带来的删除ipset和DNAT失败
删除DNAT异常
iptables -t nat -L -n --line-numbers
iptables -t nat -D POSTROUTING 号
报iptables: Index of deletion too big.
删除ipset异常
ipset destroy whitelist
ipset v7.1: Set cannot be destroyed: it is in use by a kernel component
尝试清空ipset的ip条目再删除
ipset flush
结果也是一样
尝试关闭iptables再删除ipset
service iptables stop
ipset destroy whitelist
随后发现service iptables restart失败 ,提示找不到whitelist,需要导入回去再重启恢复。
ipset restore -f china_whitelist.txt
service iptables restart
最终的清理方式
iptables -F
ipset destroy whitelist
service iptables save
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
service iptables save
添加连续ip范围到集合
ipset add a_list 1.1.2.1-1.1.2.64
ipset list a_list
Name: a_list
Members:
1.1.2.2/31
1.1.2.1
1.1.2.16/28
1.1.2.32/27
1.1.2.64
1.1.2.8/29
1.1.2.4/30