Debian服务器默认安装后,网络协议栈参数偏向通用场景,既没有针对高并发做优化,也没有对常见链路层和传输层攻击做系统性加固。很多人把精力放在防火墙规则和SSH配置上,却忽略了内核网络参数本身才是第一道防线。本文直接给出可落地的配置方案,覆盖TCP/IP协议栈加固、ICMP行为控制、SYN洪水防护、路由与转发安全、IPv6策略以及内核参数持久化。

TCP协议栈基础加固

TCP是服务器上最核心的协议,也是最容易被探测和利用的攻击面。首先要关闭那些在实际生产环境中几乎用不到但会泄露信息的选项。编辑/etc/sysctl.conf或/etc/sysctl.d/99-network-security.conf,加入以下参数:

# 开启TCP SYN Cookie防护,防止SYN队列被填满
net.ipv4.tcp_syncookies = 1

# 关闭TCP时间戳,减少CPU负载并降低被远程推测主机运行时间的风险
net.ipv4.tcp_timestamps = 0

# 关闭TCP窗口缩放,仅在极低延迟内网环境才需要,公网开启会增加被探测风险
net.ipv4.tcp_window_scaling = 0

# 关闭TCP SACK,某些老旧内核存在SACK PANIC漏洞,且公网环境收益有限
net.ipv4.tcp_sack = 0

# 关闭TCP DSACK
net.ipv4.tcp_dsack = 0

# 限制TCP FIN-WAIT-2状态等待时间,加速连接回收
net.ipv4.tcp_fin_timeout = 15

# 缩短TIME-WAIT状态持续时间,降低连接表占用
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3

SYN Cookie是必须开启的,它能保证在SYN队列溢出时依然可以建立合法连接,同时让伪造源地址的SYN洪水攻击难以消耗服务器资源。关闭TCP时间戳和窗口缩放会牺牲一部分长肥管道的传输性能,但对于绝大多数Web服务器、API服务器和数据库服务器来说,安全性收益远大于性能损失。如果你的服务器主要面向移动端或跨运营商访问,关闭这些选项还能减少因中间设备不支持而导致的握手异常。

SYN洪水与连接队列深度调整

默认的SYN队列和Accept队列深度很小,攻击者用极低的带宽就能打满。需要同时调整两个队列的参数,并配合SYN Cookie使用:

# 增大SYN队列最大长度
net.ipv4.tcp_max_syn_backlog = 8192

# 增大Accept队列长度,即已完成握手但未被应用层accept的连接数
net.core.somaxconn = 4096

# 增大半连接队列中SYN-ACK重试次数,降低伪造SYN的存活时间
net.ipv4.tcp_synack_retries = 2

# 减少SYN-ACK重试次数,加快半连接淘汰
net.ipv4.tcp_syn_retries = 2

这里要注意,somaxconn只是内核层面的上限,应用程序本身的listen backlog参数也要同步调大,比如Nginx的backlog指令、Redis的tcp-backlog参数。如果只改内核不改应用,队列深度依然上不去。tcp_synack_retries设为2意味着半连接在约30秒内未完成握手就会被丢弃,这比默认的5次重试(约3分钟)要快得多,能显著降低半连接资源占用。

ICMP行为控制与信息隐藏

ICMP协议经常被用于网络侦察和放大攻击。Debian默认会响应所有类型的ICMP请求,这会让攻击者轻松判断主机存活状态和网络拓扑。建议只保留必要的ICMP功能:

# 忽略所有ICMP Echo请求(ping),彻底隐藏主机
net.ipv4.icmp_echo_ignore_all = 1

# 忽略广播和多播地址的ICMP Echo请求,防止Smurf攻击
net.ipv4.icmp_echo_ignore_broadcasts = 1

# 忽略ICMP Redirect消息,防止路由被恶意重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0

# 不发送ICMP Redirect消息
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

如果你的服务器需要被监控系统ping检测存活,可以把icmp_echo_ignore_all保持为0,但必须配合防火墙限制来源IP。对于纯后端服务或数据库服务器,直接忽略所有ping请求是最稳妥的做法。ICMP Redirect攻击在云环境中虽然少见,但关闭它没有任何副作用,属于必配项。

IP层反欺骗与源路由防护

源地址欺骗是DDoS攻击和入侵渗透中常用的手段。Debian默认不会做反向路径过滤,这意味着伪造源IP的数据包可以被正常处理。开启严格的反向路径过滤能直接丢弃大部分伪造包:

# 对所有接口开启反向路径过滤(严格模式)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# 禁止源路由,防止攻击者指定数据包经过的路径
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# 禁止接收带有SRR选项的数据包
net.ipv4.conf.all.accept_local = 0

rp_filter设为1是严格模式,要求数据包的入接口必须与路由表中该源地址的出接口一致。在多网卡服务器上,如果存在非对称路由,严格模式可能导致正常流量被丢弃。这种情况下可以改为2(宽松模式),但必须确保防火墙规则足够严格。对于单网卡服务器,直接使用严格模式即可。

IPv6协议栈安全策略

很多管理员在服务器上直接禁用IPv6来减少攻击面,但现代Debian系统和部分应用已经依赖IPv6的socket行为。更合理的做法是保留IPv6但做同等强度的加固:

# 关闭IPv6路由功能(除非服务器作为路由器使用)
net.ipv6.conf.all.forwarding = 0

# 关闭IPv6自动配置,防止通过RA消息被注入恶意路由
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0

# 关闭IPv6 Redirect接受
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0

# 关闭IPv6源路由
net.ipv6.conf.all.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0

# 限制IPv6邻居发现表的垃圾回收
net.ipv6.neigh.default.gc_thresh1 = 1024
net.ipv6.neigh.default.gc_thresh2 = 2048
net.ipv6.neigh.default.gc_thresh3 = 4096

如果你的服务器完全不需要IPv6,最彻底的方式是在引导加载器中禁用,例如在/etc/default/grub中添加ipv6.disable=1然后更新grub。但要注意,某些云服务商的VPC网络依赖IPv6做内部通信,直接禁用可能导致网络异常。因此建议优先采用上述参数做协议栈加固,而不是一刀切禁用。

连接追踪与NAT相关优化

使用iptables或nftables做状态防火墙时,连接追踪表的大小直接决定了防火墙的抗压能力。默认的nf_conntrack参数在攻击流量下会迅速耗尽,导致正常连接被拒绝:

# 增大连接追踪表最大条目数
net.netfilter.nf_conntrack_max = 1048576

# 缩短TCP连接追踪超时,加速表项回收
net.netfilter.nf_conntrack_tcp_timeout_established = 600
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 15
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 30

# 开启连接追踪表自动扩容
net.netfilter.nf_conntrack_expect_max = 1024

nf_conntrack_max的值要根据服务器内存来定,每1GB内存大约可以支撑10万条连接追踪。如果服务器内存为16GB,设为1048576是合理的。同时要监控/proc/sys/net/netfilter/nf_conntrack_count的实际值,如果经常接近上限,要么继续调大,要么优化应用减少连接数。对于纯UDP服务,还需要单独调整UDP超时时间,避免短连接占满追踪表。

路由与转发安全参数

即使服务器不作为路由器使用,路由相关的安全参数也要配置。攻击者可能通过发送伪造的ICMP重定向或利用IP转发特性来探测内网:

# 关闭IP转发(除非服务器确实需要转发流量)
net.ipv4.ip_forward = 0

# 关闭动态地址转换
net.ipv4.conf.all.proxy_arp = 0
net.ipv4.conf.default.proxy_arp = 0

# 忽略所有接口的ARP欺骗响应
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1

# 使用严格模式响应ARP请求
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2

arp_ignore和arp_announce这两个参数经常被忽略,但在共享二层网络或多租户环境中非常重要。arp_ignore=1表示只回答目标IP是本地接口地址的ARP请求,避免响应其他主机的ARP请求。arp_announce=2表示始终使用目标地址所在接口的IP作为ARP源地址,防止ARP缓存投毒。

应用层协议安全联动

内核参数优化只是基础,还需要与应用程序的安全配置联动。以Nginx为例,在http块中加入以下配置来配合内核参数:

# 限制单个IP的并发连接数
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn perip 20;

# 限制请求速率
limit_req_zone $binary_remote_addr zone=reqlimit:10m rate=10r/s;
limit_req zone=reqlimit burst=20 nodelay;

# 设置listen backlog
listen 80 backlog=4096;

SSH服务也要做协议层面的加固,在/etc/ssh/sshd_config中调整:

# 仅使用SSH协议2
Protocol 2

# 限制最大并发未认证连接数
MaxStartups 10:30:100

# 缩短登录超时
LoginGraceTime 30

# 禁用TCP转发,除非确实需要
AllowTcpForwarding no

这些应用层配置与内核参数形成纵深防御。内核参数负责在网络层和传输层过滤异常流量,应用层配置负责在协议交互阶段限制资源消耗。只做其中一层都会留下明显短板。

持久化与生效验证

所有参数写入/etc/sysctl.d/99-network-security.conf后,执行sysctl --system让配置立即生效。验证时不要只看参数是否写入,要实际测试行为。用以下命令检查关键参数:

sysctl net.ipv4.tcp_syncookies
sysctl net.ipv4.conf.all.rp_filter
sysctl net.ipv4.icmp_echo_ignore_all
sysctl net.netfilter.nf_conntrack_max

然后从外部主机发起ping测试、SYN扫描测试和连接追踪压力测试。如果服务器在云环境中有安全组,还要确认安全组规则与内核参数不冲突。例如内核关闭了ICMP Echo响应,但安全组层面放行了ICMP,攻击者虽然收不到回复,但能判断主机存活,因为TCP握手行为仍然存在。因此安全组和内核参数要同步收紧。

最后建议把网络协议栈配置纳入配置管理和监控体系。每次内核升级后,某些参数默认值可能会变化,需要定期审计。用简单的脚本对比当前生效值与基线文件,发现漂移立即告警。Debian的needrestart工具也能在内核更新后提醒重启相关服务,避免旧进程继续使用旧参数。