在当今互联网环境中,服务器的安全性至关重要,尤其是对于面向国内用户的服务,限制国外IP的访问可以有效减少恶意攻击和未经授权的访问尝试,本文将详细介绍如何通过防火墙工具Iptables结合Ipset模块来禁止国外IP访问服务器。
背景介绍
公网上的服务器更容易受到来自全球各地的攻击,根据实际运维经验和服务器日志分析,发现大多数发起攻击的服务器位于国外,禁止国外IP访问服务器可以显著提升其安全性。
解决方案
要实现禁止国外IP访问服务器,主要步骤包括:
1、下载并整理国内IP地址段
2、将这些IP地址段转换为Ipset指令
3、使用Ipset将IP地址段数据写入
4、在Iptables中调用Ipset链完成拦截
5、持久化Iptables规则
以下是详细的操作步骤:
一、整理IP地址段到Ipset
1. 下载IP地址段文件
需要从可信赖的网站下载最新的国内IP地址段文件,可以从[ipdeny.com](http://www.ipdeny.com/ipblocks/data/countries/cn.zone)下载cn.zone文件,并将其上传到服务器,或者直接在服务器上执行以下命令下载:
wget http://www.ipdeny.com/ipblocks/data/countries/cn.zone
2. 将IP地址段转换为Ipset指令
需要编写一个脚本将下载的IP地址段转换为Ipset指令,执行以下脚本:
for i incat cn.zone
; do echo "ipset add china $i" >> ipset_result.sh; done
chmod +x ipset_result.sh
这个脚本会生成一个名为ipset_result.sh
的可执行文件,其中包含添加国内IP地址段到Ipset的指令。
3. Ipset写入地址段数据
创建一个名为china
的Ipset链:
ipset create china hash:net hashsize 10000 maxelem 1000000
执行生成的ipset_result.sh
脚本,为china
链添加国内地址段:
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
链的数据是否正确:
ipset list china ipset list china | wc -l
为了性能考虑,将Ipset数据保存到内存中,并在服务器重启时自动加载这些数据:
ipset save china > /etc/ipset.conf ipset restore < /etc/ipset.conf chmod +x /etc/rc.d/rc.local echo "ipset restore < /etc/ipset.conf" >> /etc/rc.d/rc.local
二、在Iptables中调用Ipset的china链完成拦截国外IP
1. 调整或建立Iptables规则
假设已经有Iptables指令,需要通过iptables -I
指令将其插入到现有INPUT链中的合适位置,注意需要修改下面指令中的数值以匹配具体需求:
iptables -I INPUT 5 -m set ! --match-set china src -j DROP
如果之前没有启用Iptables,可以通过以下脚本清除重建Iptables规则,请根据实际需要开放的端口和服务进行调整:
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转发
2. 持久化Iptables规则
为了让服务器重启后仍然保持这些规则,可以将它们保存到一个脚本文件中,并在启动时自动加载:
iptables-save > /etc/sysconfig/iptables
然后在启动脚本中加入:
iptables-restore < /etc/sysconfig/iptables
或者直接编辑启动脚本:
chmod +x /etc/rc.d/rc.local echo "/sbin/iptables-restore < /etc/sysconfig/iptables" >> /etc/rc.d/rc.local
相关问题与解答
问题1:如何更改规则以允许特定的国外IP访问?
答:如果需要允许特定的国外IP访问,可以在Iptables规则中添加相应的例外规则,假设要允许IP地址为192.168.1.100
的国外IP访问,可以在Iptables规则中添加以下行:
iptables -I INPUT -s 192.168.1.100 -j ACCEPT
这将确保来自该特定IP的流量不会被阻止。
问题2:如何定期更新IP地址段以确保准确性?
答:为了确保IP地址段的准确性,建议定期从可信赖的来源(如[ipdeny.com](http://www.ipdeny.com/))下载最新的IP地址段文件,并重新运行转换脚本和Ipset命令,可以设置一个定时任务(如cron job)来自动化这个过程,每天凌晨2点自动更新:
0 2 * * * wget -O /path/to/cn.zone http://www.ipdeny.com/ipblocks/data/countries/cn.zone && sh /path/to/ipset_result.sh && ipset restore < /etc/ipset.conf
以上就是关于“服务器禁止国外ip访问”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/760047.html