前言:
昨晚想了想,觉得 uptime-Kuma 和青龙面板这两个内存开销占大头(且稳定性要求较低)的软件,还是迁到其它小鸡去,好为其它想折腾的项目腾出空间,然后就注意到了 @Reno 的Serv00系列教程,觉得这种机子用来放 uptime-Kuma 正好,也成功的迁过去了。
迁移过去的时候看到其它佬友关于服务器安全的一些问题,然后站内搜了一下,看到其它佬友还没有空来水这个东西,就抢先来水一贴,经验+5 。
正文:
首先的话,经过之前各位佬友的分享,大家的小鸡应该或多或少套上了大善人的盾了吧(除了某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
接下来就是通过实际连接去测试对应配置是否生效了