Nginx屏蔽国外IP访问服务器
最近遇到个现象,服务器被国外IP疯狂访问,带宽被占满,导致应用不能正常运行。
在网上查了一下,不是个例,2021年就有人发帖讲过解决方案。
经过一番努力,没有找到问题根源。经过推测,服务器被入侵后,留下木马,国外IP通过变成肉鸡的服务器,发起请求去访问别的IP,导致服务器流入流出的流量都很大。
所以这是把服务器当成跳板了。
不想重装系统,所以搜索了一些屏蔽国外IP的方案。
参考来源:
https://www.cnblogs.com/RainBol/p/15147967.html
https://blog.51cto.com/u_64214/6098467
https://blog.51cto.com/u_15080021/2654549
https://blog.51cto.com/u_15127657/3837941
方案一:
拿到所有国外ip段,更新到nginx中来做限制。用脚本每周更新国外IP库,利用nginx deny功能直接拒绝这些IP地址。
1、先到/usr/local/tools下新建black_nginx.sh。
2、添加到crontab
0 0 * * 5 /bin/bash /usr/local/tools/black_nginx.sh3、编写black_nginx.sh如下
#!/bin/bash
rm -f legacy-apnic-latest black_`date +%F`.conf && wget http://ftp.apnic.net/apnic/stats/apnic/legacy-apnic-latest
awk -F '|' '{if(NR>2)printf("%s %s/%d%s\n","deny",$4,24,";")}' legacy-apnic-latest > black_`date +%F`.conf && rm -f /usr/local/nginx/conf/black.conf && ln -s $PWD/black_`date +%F`.conf /usr/local/nginx/conf/black.conf && /etc/init.d/nginx reload以上代码中,要注意替换nginx的配置文件的位置,以及nginx的启动命令。
4、在nginx.conf中加入black.conf
5、预先执行脚本
sh /usr/local/tools/black_nginx.sh6、重启nginx
实践了本方案,没有起作用,不知道是设置不对,还是这个方法有问题。上述获得的IP地址段不知道是不是涵盖了所有的国外IP,没有验证过。
方案二:
使用防火墙工具iptables来过滤和拦截请求。
Iptables中包含了一个叫Ipset的模块,支持匹配大批量IP地址段,同时兼具良好的性能。
https://www.ipdeny.com/ 这个网站会定期更新全球分配的IP地址段。
首先把国内的IP地址段整理到到Ipset中,接着从Iptables中调用Ipset模块判断来源IP是否在国内的IP地址段中,最后如果来源IP是国内IP地址就放行,否则就将数据包丢弃。
实现步骤(CentOS7.6):
1、下载IP地址段文件
访问网址http://www.ipdeny.com/ipblocks/data/countries/cn.zone ,另存为国内IP地址段,然后将文件上传到服务器;
也可以直接在服务器上执行如下命令直接下载文件到服务器:(一般是下载不了的 国外网站)
wget http://www.ipdeny.com/ipblocks/data/countries/cn.zone2、将IP地址段转换为Ipset指令
执行如下脚本,将IP地址段中的记录转换为Ipset指令,保存在 ipset_result.sh 可执行文件中
for i in `cat cn.zone`; do echo "ipset add china $i" >>ipset_result.sh; done
chmod +x ipset_result.sh3、Ipset写入地址段数据
首先,创建一个名字叫 china 的Ipset的链
然后,执行前面生成的 ipset_result.sh 脚本,为 china 链添加国内地址段
ipset create china hash:net hashsize 10000 maxelem 1000000
sh ipset_result.sh接着,添加局域网IP地址段,防止局域网IP地址被拦截
ipset add china 10.0.0.0/8
ipset add china 172.16.0.0/12
ipset add china 192.168.0.0/16我们来检查一下china 链的数据,大概8000多条数据
ipset list china
ipset list china | wc -l最后,为了性能考虑,Ipset数据保存在内存中。
如果服务器重启,将会导致Ipset中的IP地址段数据失效。
我们需要将数据持久化到 /etc/ipset.conf 这个文件中。
ipset save china > /etc/ipset.conf
ipset restore < /etc/ipset.conf让服务器重启时,通过脚本在加载 /etc/ipset.conf 中的数据。
chmod +x /etc/rc.d/rc.local
echo "ipset restore < /etc/ipset.conf" >> /etc/rc.d/rc.local4、调整或建立Iptables规则
Iptables中的指令有从上到下匹配顺序的,我们需要注意拦截指令顺序
假设我们已经有Iptables指令,需要通过 iptables -I 指令插件到现有INPUT链中
注意:需要修改下面指令中的数值,即插入到INPUT链中的第几个位置
iptables -I INPUT 5 -m set ! --match-set china src -j DROP如果之前没有启用Iptables,可以通过如下脚本清除重建Iptables
注意:不同服务器需要开放的端口和服务不同,请修改和调整如下udp或tcp端口规则
iptables -F # 清除预设链中规则
iptables -X # 清除自定义链中规则
iptables -A INPUT -i lo -j ACCEPT # 允许来自本机的全部连接
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # 允许已建立的连接不中断
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # 允许icmp协议,即允许ping服务器
iptables -A INPUT -m set ! --match-set china src -j DROP # 匹配china链,非国内IP则直接丢弃包
iptables -A INPUT -p udp --dport 5060 -j ACCEPT # 允许UDP协议的5060端口
iptables -A INPUT -p udp --dport 20000:30000 -j ACCEPT # 允许UDP协议的20000-30000端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许TCP协议的80端口
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 允许TCP协议的443端口
iptables -A INPUT -j DROP # 未匹配以上规则的请求直接丢弃
iptables -A OUTPUT -j ACCEPT # 允许全部出网数据包
iptables -A FORWARD -j DROP # 不允许Iptables的FORWARD转发
5、持久化Iptables规则
让服务器重启时,通过脚本在加载 /etc/sysconfig/iptables 中的数据。
iptables-save > /etc/sysconfig/iptables # 持久化Iptables规则
chmod +x /etc/rc.d/rc.local
echo "/usr/sbin/iptables-restore < /etc/sysconfig/iptables" >> /etc/rc.d/rc.local
方案二在执行的时候,命令ipset restore和iptables-save有异常提示。没有仔细去研究解决方案。
方案二最终也没有起作用。
方案三:
禁用服务器80端口的访问,所有web服务走443端口。
具体配置这里就不说了,主要是SSL的使用。
