原创

通过iptables限制Linux源站仅允许CDN回源IP访问

最近分析后台日志,发现有两条记录没有经过CDN转发,直接将请求发到了源站:

在百度搜了一下对应的IP,发现该IP被标记为异常风控IP:

说明源站IP可能已经泄露了,对方已经绕过了CDN的白名单防护,所以我们需要加固一下源站的安全防护。加固方法为限制源站服务器仅允许CDN的回源IP段访问。

1.获取CDN回源IP列表

我们使用的CDN是阿里云的边缘安全加速ESA,开启ESA提供的源站防护功能就可以获取到回源IP列表,其他CDN可以根据官方提示获取回源IP:

开启后会在回源列表中看到所有的回源IP,点击复制按钮将回源IP列表复制下来备用:

注意:回源IP列表会定时更新,列表更新后需要手动确认后才会启用新的回源IP。

如果列表更新后未手动确认,阿里云ESA不会启用新的回源IP列表。


2.通过iptables配置源站防火墙

iptables是Linux上常用的防火墙软件,可以配置Linux内核中netfilter框架的包过滤规则。我们这次使用iptables为源站配置防火墙规则。

防火墙配置规则如下:

  • 允许本地回环地址访问
  • 允许已建联的相关IP访问
  • 允许白名单IP访问
  • 允许CDN网段访问
  • 拒绝其他所有IP访问

具体配置命令如下:

#允许本地回环地址访问
iptables -A INPUT -i lo -j ACCEPT

#允许已建联的相关IP访问
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#允许白名单IP访问
iptables -A INPUT -s 10.0.8.5 -j ACCEPT

#允许CDN网段访问
iptables -A INPUT -s 117.49.26.96/27 -j ACCEPT
iptables -A INPUT -s 221.215.47.0/26 -j ACCEPT

#拒绝其他所有IP访问
iptables -A INPUT -j DROP

注1:必须要配置允许本地访问和已建联的IP访问,不然可能会导致本地127.0.0.1/8网络不通,同时服务器将不能访问外部网络,包括ping、wget、curl等命令返回的数据包将无法进入服务器。

注2:iptables是按照规则链内从上到下的顺序匹配执行,所以需要将拒绝的规则放在整条链的最下方。

3.设置iptables防火墙规则开机自动加载

因为iptables设置的规则默认是临时生效,一旦重启系统所有规则都会清空,所以我们需要保存防火墙规则让其开机自动加载。我们使用的Linux版本为Rocky Linux,可以安装iptables-services工具实现:

dnf install iptables-services

安装完成后通过下面命令保存已配置好的防火墙规则:

service iptables save

保存成功后规则文件默认保存在/etc/sysconfig/iptables中:

可以观察文件中规则和iptables -vnL查询的规则是否一致:

设置服务开机自动启用:

systemctl enable iptables

这样就可以让防火墙开机自动加载防火墙规则了。


扩展说明:

1.其他iptables命令

查看规则:iptables -vnL
增加规则到链顶部:iptables -I INPUT -s x.x.x.0/24 -j DROP
增加规则到链底部:iptables -A INPUT -s x.x.x.0/24 -j DROP
删除规则:iptables -D INPUT -s ***.***.***.*** -j DROP
保存规则到文件:iptables-save > /etc/iptables
加载文件规则:iptables-restore < /etc/iptables

正文到此结束
本文目录