Ubuntu系统下如何用iptables防范SYN攻击
保护服务器安全,特别是应对SYN Flood这类经典拒绝服务攻击,是运维工作中的关键任务。在Ubuntu系统中,iptables配合系统内核参数调优,能够构成一套较为完善的防御方案。下面我们详细拆解这一流程,分步说明具体操作方法。

1. 启用SYN Cookies
SYN Cookies是一种高效的内核级防御机制。其核心思路是:当收到SYN请求时,不立即分配资源,而是通过一个特殊Cookie验证客户端是否真实存在,待确认客户端的ACK包后再真正建立连接。这样,攻击者发送的大量虚假SYN请求就无法耗尽服务器资源。
操作非常简单,编辑/etc/sysctl.conf文件,确保以下行存在且值设为1:
net.ipv4.tcp_syncookies = 1
保存文件后,执行命令使配置生效:
sudo sysctl -p
2. 限制SYN队列长度
服务器内核中存在一个专门存放未完成三次握手连接的队列,即SYN队列。如果攻击者持续发送SYN包,该队列很快会爆满,导致正常连接请求被丢弃。因此,合理限制队列长度能够起到缓冲作用。
同样在/etc/sysctl.conf中添加或修改以下两行:
net.ipv4.tcp_max_syn_backlog = 2048
net.core.somaxconn = 2048
此处数值2048仅为参考,实际生产环境中可根据服务器并发能力和硬件配置灵活调整。修改后别忘了运行sudo sysctl -p。
3. 设置SYN-ACK重传次数
当服务器收到SYN包并回复SYN-ACK后,若客户端一直不回应ACK,服务器会进行重试。攻击者可以故意不响应,迫使服务器反复重试从而消耗资源。降低SYN-ACK重传次数,可以快速释放这些半连接。
编辑/etc/sysctl.conf,添加以下一行:
net.ipv4.tcp_synack_retries = 2
默认情况下该值可能是5,将其调低至2,意味着服务器重试两次后即放弃,效率显著提升。同样执行sudo sysctl -p生效。
4. 使用iptables限制连接速率
系统参数层打好基础后,iptables登场。通过iptables的limit模块,可以精确控制单位时间内允许接收的SYN包数量。这相当于在入口处设置了一道限流阀,超出阈值的请求直接丢弃。
例如,若要将每秒新SYN请求限制在10个以内,可以这样配置:
sudo iptables -A INPUT -p tcp --syn -m limit --limit 10/s -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP
第一条规则表示每秒最多放行10个SYN包;第二条规则将未被第一条匹配的所有SYN包全部丢弃。参数--limit 10/s可根据实际访问量调整,例如正常业务流量较大时可适当放宽限制。
5. 阻止伪造的IP地址
许多SYN攻击使用伪造或随机的源IP,但有时攻击源可能集中在特定网段。如果确认某个IP段异常,直接封禁是最高效的方法。
例如,阻止来自192.168.1.0/24的SYN请求:
sudo iptables -A INPUT -p tcp --syn -s 192.168.1.0/24 -j DROP
当然,此方法需要事先了解攻击源IP或结合日志分析判断。对于大范围随机源IP攻击,该策略效果会有所减弱。
6. 借助Fail2Ban实现自动化防御
手动配置iptables虽然有效,但面对频繁变化的攻击IP,难免显得被动。Fail2Ban作为补充工具,可自动监控系统日志(如SSH登录日志、Web服务器日志),当检测到某个IP短时间内多次失败或异常连接时,自动添加iptables规则将其临时封禁。
安装Fail2Ban只需一条命令:
sudo apt-get update
sudo apt-get install fail2ban
安装后建议先复制一份默认配置:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
在jail.local文件中,可根据需要添加或调整规则。例如针对SSH服务,可以这样配置:
[DEFAULT]
bantime = 600
findtime = 600
maxretry = 3
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
其中bantime = 600表示封禁10分钟,findtime = 600表示在10分钟内如果同一IP尝试失败3次(maxretry = 3),触发封禁。配置完成后,启动并启用服务:
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
这样一来,iptables负责静态限流和过滤,Fail2Ban负责动态封禁,两者协同工作,基本可以应对常见的SYN攻击场景。
最后需要强调,以上所有参数并非一成不变。实际部署时,建议根据服务器硬件、正常业务流量以及攻击激烈程度进行针对性调整。没有一套配置能覆盖所有情况,运维工作总是在实践中不断优化。
