香港服务器有个特点:网络通达性极好,中国大陆、东南亚、欧美访问都快。但正因为好,它也成了全球扫描器最密集的靶子。一台不设防的香港服务器,交付后不到五分钟就会被扫描机器人“问候”,SSH端口每小时收到上千次破解尝试是常态。iptables作为Linux内核自带的包过滤系统,是挡在这前面的第一道墙,而且是最不用花钱的那道。
为什么香港服务器尤其需要精细的iptables规则?
先看清一个事实:香港服务器的安全威胁和其他地区不太一样。
第一,攻击来源更复杂。因为香港是国际网络枢纽,攻击者可能来自中国大陆、东南亚、欧美任何地方,IP分布极广,没法简单地“封哪个国家段”就万事大吉。第二,攻击频率更高。香港带宽资源丰富,攻击者发起扫描和暴力破解的成本也更低。第三,跨境管理场景多。很多用户远程运维时,IP是动态变化的,这就要求白名单策略需要更灵活的设计。
明白了这个背景,就知道iptables配置不能图省事——随便抄几条规则就开跑,效果可能适得其反。
端口封锁:先搞清楚默认策略怎么定
很多人配置iptables上来就敲命令,结果把自己挡在门外了。正确的顺序是:先设置默认策略,再放行必要端口,最后保存验证。
第一步:设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
“默认拒绝,按需放行”的原则要先落地。INPUT链DROP意味着所有入站流量都会被挡住,FORWARD链DROP则禁止转发。OUTPUT链保持ACCEPT,保证服务器能正常对外发起连接。
注意:这一步执行后,如果你的SSH会话没有额外配置白名单规则,会话会立即断掉。建议通过服务器管理后台的VNC或KVM控制台操作,或者先把后续的SSH放行规则写进一个脚本里一次性执行。
第二步:放行关键端口
先把回环接口放行,确保本地服务通信正常:
iptables -A INPUT -i lo -j ACCEPT
然后允许已建立的连接和关联包——这条规则能大幅提升效率,避免每个数据包都重新检查:
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
接下来按需开放端口。Web服务通常需要80和443:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
SSH端口建议不要直接用默认的22。改成一个高位端口(比如2222或更隐蔽的五位数),能过滤掉九成以上的自动扫描。但改端口只是第一步,后面还要配合连接频率限制才能真正防住:
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
第三步:保存规则
不同发行版保存方式不同。CentOS系用:
service iptables save
systemctl restart iptables
Ubuntu/Debian需要装iptables-persistent:
apt install iptables-persistent -y
netfilter-persistent save
防暴力破解:recent模块和connlimit模块的组合用法
端口封住了,但暴露在公网的服务端口还是会被穷举。针对SSH暴力破解,最直接有效的手段是结合recent模块限制连接频率。
以下两条规则就是对付SSH暴力破解的经典组合:
iptables -I INPUT -p tcp --dport 2222 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 2222 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
第一句:对目标端口2222(你改过的SSH端口)的新连接,记录到recent列表。第二句:如果同一个IP在60秒内触发了4次以上新连接,后续连接直接丢弃。
这个方案的好处是纯iptables实现,不依赖额外工具,也不需要像fail2ban那样去解析日志文件。实际测试中效果很明显——规则生效后,auth.log里的红色失败记录密度会急剧下降。
对于Web服务的CC攻击,用connlimit模块限制单个IP的并发连接数更合适:
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP
iptables -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above 50 -j DROP
单IP超过50个并发连接就丢弃,能挡掉大部分浅层CC。阈值具体设多少,要根据你业务的正常并发量来调。
特殊场景处理:Docker容器端口和数据库端口
如果你在服务器上跑了Docker容器,需要注意一个坑:Docker在iptables里创建的是DOCKER链,普通的INPUT链规则对容器暴露的端口不生效。端口扫描仍然能扫到容器端口,因为网络请求在到达INPUT链之前就被转给了DOCKER的虚拟网卡。
正确的做法是在DOCKER-USER链上加规则。以青龙面板的5700端口为例,只允许特定IP访问:
先禁止所有IP访问5700端口:
iptables -I DOCKER-USER -p tcp -m conntrack --ctorigdstport 5700 --ctdir ORIGINAL -j DROP
再单独放行你的办公IP或跳板机IP:
iptables -I DOCKER-USER -s 你的IP/32 -p tcp -m conntrack --ctorigdstport 5700 --ctdir ORIGINAL -j ACCEPT
数据库端口(MySQL的3306、Redis的6379)则建议完全禁止公网访问,只允许内网或指定应用服务器连接:
iptables -A INPUT -p tcp --dport 3306 -s 内网IP或应用服务器IP -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP
规则维护与持久化:别让重启清零你的劳动成果
iptables规则默认是内存里跑的,服务器一重启就丢。除了前面提到的iptables-save和iptables-persistent方案,还有几个实战中的注意事项:
先备份再修改:改规则之前,先把当前配置导出一份:
iptables-save > /root/iptables-backup-$(date +%Y%m%d).rules
万一改错了,用iptables-restore可以快速回滚。
善用日志规则:在DROP规则前面加一条LOG规则,方便排查异常:
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "IPTABLES-DROP: " --log-level 4
这样被拒绝的连接会记录到系统日志,方便你后续用logwatch或fail2ban做二次分析。
定期审计:业务变了,端口要求也会变。建议每季度review一遍当前开放的端口,确认哪些已经不需要了,及时清理。可以用iptables -L -v -n查看每条规则的命中计数——长期为0的规则基本可以移除。
配置iptables这件事,说难不难,说简单也不简单。难在要对网络协议、服务器业务、攻击模式都有一定了解;简单在核心原则就那么几条——“默认拒绝,按需放行,限制频率,定期审计”。香港服务器的特殊之处在于它更“惹眼”,攻击来得更密、更杂,所以规则也得更细致一些。但只要你把上面这些基础打扎实了,配合定期检查和fail2ban这类工具的辅助,大部分常规攻击都能挡在门外。
相关内容
