孤陋寡闻的博主某天突然知道还可以通过“全网扫描”这种骚操作来获取CDN背后网站的真实IP。于是乎为了(hao)增(wan)强网站的安全性,博主开始折腾通过白名单来屏蔽全网扫描大法。
博主首先想到的是通过Nginx来屏蔽。
首先通过https://www.cloudflare.com/ips/来get到Cloudflare的IP段。
将allow指令添加到配置文件的http块下,依次添加Cloudflare的IP段。
allow 103.21.244.0/22;
…
allow 2400:cb00::/32;
…
然后再添加
deny all;
访问源站,服务器确实返回了403,可这是在https握手之后才返回的。。。
证书暴露了。。。
然后想到让Nginx返回444,说不定可以在握手前断开与白名单外主机的连接。
参考Ilham Sulaksono的回答后,在配置文件的http块中加入
geo $remote_addr $allowed_trafic {
default false;
103.21.244.0/22 true;
…
2400:cb00::/32 true;
…
}
来添加Cloudflare的IP段
在每个server块下添加
if ( $allowed_trafic = 'false'){
return 444;
}
重启Nginx后发现。。。
依然是在握手后才断开连接。。。
好吧,服气。。。
看来只能用iptables屏蔽了。。。
依次输入
sudo systemctl enable iptables
sudo systemctl enable ip6tables
启用iptables
然后输入
sudo touch /etc/iptables/iptables.rules
sudo touch /etc/iptables/ip6tables.rules
新建一个空配置文件
再依次输入
sudo systemctl start iptables
sudo systemctl start ip6tables
启动iptables
输入sudo bash
提权
参考Frank Rietta的文章还有Cloudflare的文档用root权限执行以下指令来将Cloudflare的IP段以及本地回环地址添加进iptables。
for i in `curl https://www.cloudflare.com/ips-v4`; do iptables -I INPUT -p tcp -s $i --dport http -j ACCEPT; done
for i in `curl https://www.cloudflare.com/ips-v4`; do iptables -I INPUT -p tcp -s $i --dport https -j ACCEPT; done
for i in `curl https://www.cloudflare.com/ips-v6`; do ip6tables -I INPUT -p tcp -s $i --dport http -j ACCEPT; done
for i in `curl https://www.cloudflare.com/ips-v6`; do ip6tables -I INPUT -p tcp -s $i --dport https -j ACCEPT; done
然后再输入下列指令来丢弃掉白名单外主机的数据包
iptables -A INPUT -p tcp --dport http -j DROP
iptables -A INPUT -p tcp --dport https -j DROP
ip6tables -A INPUT -p tcp --dport http -j DROP
ip6tables -A INPUT -p tcp --dport https -j DROP
此时设置就已经完成了,可设置还没有保存,还需要输入
iptables-save > /etc/iptables/iptables.rules
ip6tables-save > /etc/iptables/ip6tables.rules
将设置保存到配置文件