服务器所面临的攻击愈发复杂和频繁,为确保系统安全,仅依赖应用层防护已经远远不够,底层的网络访问控制尤为关键。iptables作为Linux系统中强大而灵活的防火墙工具,可以通过自定义规则有效限制非法访问、封锁恶意端口、限制IP连接频率,从而提升服务器整体防御能力。接下来,我们将系统性介绍如何使用iptables设置Linux服务器的高级防火墙规则。
iptables的基本原理
iptables是Linux内核中Netfilter框架的用户空间工具,它通过设置一系列链与规则控制数据包的进出行为。iptables工作在网络层,能在数据达到应用程序之前做出拦截、放行或修改。
常见的链包括:
- INPUT:控制进入本地的流量。
- OUTPUT:控制从本地发出的流量。
- FORWARD:控制从一个接口转发到另一个接口的数据。
- PREROUTING/POSTROUTING:用于NAT操作。
iptables 使用"表"来组织链,不同的表用于不同功能:
filter
:默认表,处理包的过滤(最常用)nat
:用于网络地址转换mangle
:用于修改数据包的字段raw
:用于决定数据包是否参与连接跟踪
在配置防火墙前,理解这些基本概念能帮助你更精准地制定防护策略。
查看当前规则
在操作前,务必查看现有的防火墙规则,避免误操作影响服务:
iptables -L -n -v
参数说明:
-L
:列出规则
-n
:不进行DNS反查,显示IP地址
-v
:显示详细信息,如匹配的数据包和字节数
设置默认策略:拒绝一切,允许特定
一条最基本的防护策略是“默认拒绝,按需放行”,设置如下:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
说明:
INPUT 和 FORWARD 链默认丢弃所有进入的数据包;
OUTPUT 允许服务器对外发起连接;
后续规则将允许特定端口或IP访问。
放行本地回环接口
防止本地服务通讯被阻断:
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
放行已有连接或相关连接
保持连接跟踪允许返回包通过:
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
这条规则能识别已建立连接的数据流,并允许其返回数据通过,提高服务的可用性和安全性。
开放常用端口
根据业务需求放行必要的端口,例如SSH、HTTP、HTTPS等:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # SSH远程连接
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP服务
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS服务
需要注意的是,如果服务监听的是其他端口(如MySQL默认3306、Redis默认6379等),需根据实际情况决定是否暴露,建议仅绑定到本地或使用白名单控制。
限制某个端口的连接频率
防止暴力破解SSH端口,可以加上访问频率限制:
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 6 -j DROP
解释:
每分钟同一IP尝试连接SSH端口超过6次就拒绝其访问;
适用于防范暴力破解的基本场景。
基于IP白名单策略
只允许特定IP访问指定服务,例如企业固定IP访问SSH:
iptables -A INPUT -p tcp --dport 22 -s 203.0.113.1 -j ACCEPT
在这种策略下,其余IP访问22端口将被默认DROP,有效控制暴露面。
拒绝恶意IP访问
可手动封禁异常流量来源IP:
iptables -A INPUT -s 198.51.100.100 -j DROP
此方式适合临时阻止扫描器、暴力攻击者等非法连接。
保存防火墙规则
iptables 规则是临时的,系统重启后会失效,需手动保存。
在 Debian/Ubuntu 系统中:
apt install iptables-persistent
netfilter-persistent save
在 CentOS/RHEL 系统中:
service iptables save
也可以使用脚本在系统启动时自动加载规则。
清空所有规则
在调试或重设防火墙时,可以执行以下命令:
iptables -F
iptables -X
iptables -Z
含义分别是清空规则、删除自定义链、清空计数器。建议使用前备份已有规则。
注意事项与常见错误
规则顺序敏感:iptables 的匹配按顺序执行,放行规则应在DROP前,否则不会生效。
不慎封掉SSH端口可能导致远程断联:修改防火墙前建议设置 at 定时重置规则,防止误封。
不建议使用INPUT链的ACCEPT ALL规则:容易造成所有端口暴露,失去防护意义。
大量规则时建议使用ipset:提高性能,减少规则重复。
iptables 是 Linux 系统中不可或缺的安全组件,通过合理配置,可以将服务器暴露在公网的风险降到最低。无论是限制端口访问、阻断异常IP、还是控制连接速率,iptables 都提供了灵活而高效的解决方案。掌握其使用,不仅是系统管理员的必备技能,也是保障服务器安全运行的第一道防线。通过实践与不断优化防火墙规则,能够有效抵御各类网络攻击,为Web服务和应用系统提供强大的基础保护。