iptables阻止大善人外的ip连接 + nginx回显真实ip

前言
昨晚想了想,觉得 uptime-Kuma 和青龙面板这两个内存开销占大头(且稳定性要求较低)的软件,还是迁到其它小鸡去,好为其它想折腾的项目腾出空间,然后就注意到了 @Reno 的Serv00系列教程,觉得这种机子用来放 uptime-Kuma 正好,也成功的迁过去了。

迁移过去的时候看到其它佬友关于服务器安全的一些问题,然后站内搜了一下,看到其它佬友还没有空来水这个东西,就抢先来水一贴,经验+5 :smiling_face_with_three_hearts:

正文

首先的话,经过之前各位佬友的分享,大家的小鸡应该或多或少套上了大善人的盾了吧(除了某GCP走CF cdn会额外算流量费的永久“免费”小鸡外)。
为了阻止像 fofa 这种搜索引擎进行扫描,以及一些恶意者通过ip+port+Host请求头进行连接,绕过CF进行爆破,一个解决方法就是只允许 大善人公布的 他家节点的ip地址访问网站,以下分享的方案是通过 iptables 进行配置,只放行 cloudflare 的 ip 地址。
此外,套完盾后,访问小鸡的 ip 地址就变成了大善人反代后的 ip 地址,于是如果我们通过 fail2ban 等方案加强网站防御的话,fail2ban 根据 nginx 日志禁止的 ip 就全是 cloudflare ip 的地址,而不是网站访问者的 ip 地址,伤害全给 cloudflare 承受过去了。好在 cloudflare 反代后,会在请求头中设置对应的字段回显请求真正的来源地址,我们要做的就是配置 nginx,让其正确标识这些 cf 反代请求的源 ip。


系统:debian

前置
配置依赖

# 创建CLOUDFLARE链并在INPUT链中引用
iptables -N CLOUDFLARE
ip6tables -N CLOUDFLARE
iptables -A INPUT -j CLOUDFLARE
ip6tables -A INPUT -j CLOUDFLARE

# touch /etc/nginx/conf.d/cloudflare.conf
echo "" > /etc/nginx/conf.d/cloudflare.conf;
nginx -s reload

apt install iptables-persistent

主体
如果有需要的话,可以根据脚本里注释掉的内容配置定时任务定时更新配置

# /root/update_cloudflare.sh
#!/bin/bash

set -e 
curl -s https://www.cloudflare.com/ips-v4 > /tmp/cloudflare-ips-v4
curl -s https://www.cloudflare.com/ips-v6 > /tmp/cloudflare-ips-v6
set +e


# 更新 nginx 中的 Cloudflare IP 列表
echo "#Cloudflare" > /etc/nginx/conf.d/cloudflare.conf;
for i in `cat /tmp/cloudflare-ips-v4`; do
        echo "set_real_ip_from $i;" >> /etc/nginx/conf.d/cloudflare.conf;
done

for i in `cat /tmp/cloudflare-ips-v6`; do
        echo "set_real_ip_from $i;" >> /etc/nginx/conf.d/cloudflare.conf;
done
echo "" >> /etc/nginx/conf.d/cloudflare.conf;
echo "# use any of the following two" >> /etc/nginx/conf.d/cloudflare.conf;
echo "real_ip_header CF-Connecting-IP;" >> /etc/nginx/conf.d/cloudflare.conf;
echo "#real_ip_header X-Forwarded-For;" >> /etc/nginx/conf.d/cloudflare.conf;


# 更新 iptables 中的 Cloudflare IP 列表

iptables -F CLOUDFLARE
for i in `cat /tmp/cloudflare-ips-v4`; do
    iptables -A CLOUDFLARE  -p tcp -m multiport --dports http,https -s $i -j ACCEPT;
done

for i in `cat /tmp/cloudflare-ips-v6`; do
    ip6tables -A CLOUDFLARE -p tcp -m multiport --dports http,https -s $i -j ACCEPT
done

# 其他 IP 一律拒绝
iptables -A CLOUDFLARE -p tcp -m multiport --dport http,https -j DROP
ip6tables -A CLOUDFLARE -p tcp -m multiport --dport http,https -j DROP

iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

# crontab -e
#定时更新
# 0 2 * * 0 /bin/bash /root/update_cloudflare.sh

查看结果

iptables -L

配置重启自动恢复
iptables 修改配置后,在系统重启后会恢复默认配置,因此使用vi /etc/systemd/system/iptables-load.service添加个系统服务来使系统重启后自动读取恢复 iptables:

[Unit]
Description=Packet Filtering Framework
Before=network-pre.target
Wants=network-pre.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c '/sbin/iptables-restore < /etc/iptables/rules.v4; /sbin/ip6tables-restore < /etc/iptables/rules.v6'
ExecReload=/bin/sh -c '/sbin/iptables-restore < /etc/iptables/rules.v4; /sbin/ip6tables-restore < /etc/iptables/rules.v6'
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

老两样:

systemctl enable iptables-load
systemctl start iptables-load

接下来就是通过实际连接去测试对应配置是否生效了

20 个赞

坐等教程 :green_book:

mark

我比较感兴趣的是怎么绕过大善人的dns找到真实ip。网上一直找不到教程 可惜

这个是大善人的核心业务

基本上要么是网站漏洞,要么就是 fofa、censys 之类的扫到源站了。
如果你能在网上直接搜到正面绕开 cdn 获取 ip 的教程,那对应的漏洞应该已经被大善人修了或者加紧在修了

fofa那玩意是真恶心

1 个赞

原来如此 大善人牛掰:cow:

搞七捻三配置调优

fofa这么厉害吗,感兴趣了

感谢分享,十分有用

按照大佬思路,把ufw的防火墙做了一下加固
获取cloudflare最新网段信息
https://www.cloudflare.com/ips-v4

然后使用下面命令加入防火墙规则,端口根据实际修改

sudo ufw allow from 173.245.48.0/20 to any port 443
sudo ufw allow from 103.21.244.0/22 to any port 443
sudo ufw allow from 103.22.200.0/22 to any port 443
sudo ufw allow from 103.31.4.0/22 to any port 443
sudo ufw allow from 141.101.64.0/18 to any port 443
sudo ufw allow from 108.162.192.0/18 to any port 443
sudo ufw allow from 190.93.240.0/20 to any port 443
sudo ufw allow from 188.114.96.0/20 to any port 443
sudo ufw allow from 197.234.240.0/22 to any port 443
sudo ufw allow from 198.41.128.0/17 to any port 443
sudo ufw allow from 162.158.0.0/15 to any port 443
sudo ufw allow from 104.16.0.0/13 to any port 443
sudo ufw allow from 104.24.0.0/14 to any port 443
sudo ufw allow from 172.64.0.0/13 to any port 443
sudo ufw allow from 131.0.72.0/22 to any port 443
2 个赞

大佬强

mark

好东西,标记一处地点

这个貌似动态变的,不怕后边更新了,漏了?

只允许cf还是可能被warp攻击

mark

感谢分享,代码收下了

按照楼主说的做了以后,用套了小黄云的域名访问x-ui还是访问不了,不知道是什么原因呢?