分类
Linux

Web服务IP白名单

孤陋寡闻的博主某天突然知道还可以通过“全网扫描”这种骚操作来获取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

将设置保存到配置文件

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据