Firewalld 设置仅允许 CloudFlare IP 访问 80/443 端口
本着最小访问权限的原则,在使用 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
保存设置。