Firewalld 设置仅允许 CloudFlare IP 访问 80/443 端口

Anson 教程 19 次浏览 评论已关闭

本着最小访问权限的原则,在使用 CloudFlare CDN 后,为防止其它恶意访问,可以设置仅允许 CloudFlare IP 访问服务器 80/443 端口。虽然 Nginx 也能干这个事情,但直接用系统防火墙来设置更简单。

在开始设置之前,请检查系统是否安装和启用 Firewalld 防火墙

1. 移除之前允许的 80/443 端口或服务访问(如果不是在 public 区域添加的设置,请自行修改命令)。

firewall-cmd --permanent --zone=public --remove-port={80,443}/tcp
firewall-cmd --permanent --zone=public --remove-service={http,https}

2. 设置只允许指定 IP 访问 80/443 端口(示例命令。如果要添加其它 IP,请自行修改命令使用)。

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="173.245.48.0/20" port port="80" protocol="tcp" accept'

由于 CloudFlare IP 众多,手动添加麻烦,可以用下面脚本命令快速设置。

curl -s https://www.cloudflare.com/ips-v4 | awk '{ print "firewall-cmd --permanent --add-rich-rule=\"rule family=\"ipv4\" source address=\""$0"\" port port=\"80\" protocol=\"tcp\" accept\"" }' | sh
curl -s https://www.cloudflare.com/ips-v4 | awk '{ print "firewall-cmd --permanent --add-rich-rule=\"rule family=\"ipv4\" source address=\""$0"\" port port=\"443\" protocol=\"tcp\" accept\"" }' | sh
curl -s https://www.cloudflare.com/ips-v6 | awk '{ print "firewall-cmd --permanent --add-rich-rule=\"rule family=\"ipv6\" source address=\""$0"\" port port=\"80\" protocol=\"tcp\" accept\"" }' | sh
curl -s https://www.cloudflare.com/ips-v6 | awk '{ print "firewall-cmd --permanent --add-rich-rule=\"rule family=\"ipv6\" source address=\""$0"\" port port=\"443\" protocol=\"tcp\" accept\"" }' | sh

如果遇到意外报错,请检查服务器上是否能正常访问 IP 列表网址,有时可能因为触发 CloudFlare 人机验证,导致后续处理失败。

3. 完成后运行 firewall-cmd --reload 保存设置,之后可以用 firewall-cmd --info-zone=public 命令查看添加的设置。

如果以后停用 CloudFlare CDN 要删除设置,可以使用下面命令(注意,这里是删除所有 rich rules 设置)。

firewall-cmd --info-zone=public | grep "rule family=" | sed 's/^[[:blank:]]*//' | awk '{ print "firewall-cmd --permanent --remove-rich-rule=\""$0"\"" }' | sh

如果要删除指定 IP,则使用下面命令(自行修改)。

firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="173.245.48.0/20" port port="80" protocol="tcp" accept'

别忘了 firewall-cmd --reload 保存设置。