iptables 将 Cloudflare's IP 加入白名单

本文介绍如何使用 iptables 将 Cloudflare’s IP 加入白名单。

本文适用于这种情况:你的网站使用了 Cloudflare,你的网站不需要获取客户真实 IP,你的网站只想放行 Cloudflare 服务器的访问而拒绝所有来自其它 IP 的访问
那么这时,你需要将 Cloudflare’s IP 放进 iptables 的白名单,并将其它访问都 drop 掉。
需要注意的是,iptables 规则是有顺序的,所以需要先写 accept 再写 drop。这点类似于 Nginx 的 allow 和 deny 的顺序。

将 Cloudflare’s IP 放进白名单

官方文档:https://support.cloudflare.com/hc/en-us/articles/200169166-How-do-I-whitelist-Cloudflare-s-IP-addresses-in-iptables
基于这个官方文档,我写了这么一个简易脚本来实现 iptables 的规则加入:

# 对 cloudflare 的 ip 进行白名单放行
accept-v4(){
# ipv4
iptables  -t filter -A INPUT -p tcp -m multiport --dports http,https -s $1 -j ACCEPT
}
# ipv6
accept-v6(){
ip6tables -t filter -A INPUT -p tcp -m multiport --dports http,https -s $1 -j ACCEPT
}
accept-v4 103.21.244.0/22
accept-v4 103.22.200.0/22
accept-v4 103.31.4.0/22
accept-v4 104.16.0.0/12
accept-v4 108.162.192.0/18
accept-v4 131.0.72.0/22
accept-v4 141.101.64.0/18
accept-v4 162.158.0.0/15
accept-v4 172.64.0.0/13
accept-v4 173.245.48.0/20
accept-v4 188.114.96.0/20
accept-v4 190.93.240.0/20
accept-v4 197.234.240.0/22
accept-v4 198.41.128.0/17
accept-v6 2400:cb00::/32
accept-v6 2405:8100::/32
accept-v6 2405:b500::/32
accept-v6 2606:4700::/32
accept-v6 2803:f800::/32
accept-v6 2c0f:f248::/32
accept-v6 2a06:98c0::/29
echo "success!"

把以上代码放进 accept.sh 然后运行,白名单就写入完成了。

禁止所有其它访问

iptables -t filter -A INPUT -p tcp -m multiport --dports http,https -j DROP
ip6tables -t filter -A INPUT -p tcp -m multiport --dports http,https -j DROP

这两行运行完成后,就禁止了所有对你的网站的访问。
然后因为先写入了对 Cloudflare 的白名单规则,最后达到的效果就是只有 Cloudflare 的反代服务器能够访问你的源站。
 
原文链接:https://sometimesnaive.org/article/linux/technique/iptables/whitelist-cloudflare-ip