调整内核参数是加固Debian系统最直接、成本最低的手段之一。很多网络攻击并非利用复杂的0day漏洞,而是利用系统默认的网络栈行为,比如伪造连接耗尽资源、利用ICMP重定向劫持流量,或者通过SYN泛洪让服务假死。系统默认配置通常优先考虑通用兼容性,而非安全性,这导致服务器在公网上裸奔。下面直接针对具体攻击场景,给出具体的参数调整方法和原理。

强化SYN Cookie防护,瓦解TCP半连接攻击

SYN Flood攻击利用TCP三次握手的特性,发送大量伪造源IP的SYN包,让服务器分配大量半连接资源,最终耗尽内存。Debian内核的SYN Cookie机制能将半连接信息加密编码进返回的SYN-ACK序列号中,无需在本地存储状态。首先确保开启该功能:

sysctl -w net.ipv4.tcp_syncookies=1

光开启还不够,需要调整半连接队列的大小。参数net.ipv4.tcp_max_syn_backlog决定了SYN队列长度,默认值通常偏小。在高并发或遭受攻击时,这个队列瞬间就会被填满。可以根据内存大小适度增大:

sysctl -w net.ipv4.tcp_max_syn_backlog=8192

另一个关键参数是net.core.somaxconn,它限制了每个端口监听队列的上限。即使应用层调用listen时指定了backlog,实际值也不会超过这个内核参数。很多Web服务器如Nginx的backlog设置得较高,但内核默认的128往往成为瓶颈,必须同步调大:

sysctl -w net.core.somaxconn=4096

当SYN Cookie被触发时,TCP选项如窗口缩放、时间戳等会丢失,可能影响性能。为了在攻击流量下更快地回收半连接,可以减小SYN-ACK重试次数:

sysctl -w net.ipv4.tcp_synack_retries=2

这样能防止服务器在攻击期间反复向伪造地址发送SYN-ACK包,减少资源空耗。

屏蔽ICMP重定向与异常响应,防止流量劫持

ICMP重定向本意是路由器告知主机有更优路径,但攻击者可以伪造ICMP重定向包,篡改受害主机的路由表,实现中间人攻击。除非你的Debian系统确实作为路由器且需要动态调整路径,否则所有网络接口都应拒绝接受ICMP重定向:

sysctl -w net.ipv4.conf.all.accept_redirects=0
sysctl -w net.ipv4.conf.default.accept_redirects=0
sysctl -w net.ipv6.conf.all.accept_redirects=0
sysctl -w net.ipv6.conf.default.accept_redirects=0

同时,禁止发送ICMP重定向,防止本机被利用去攻击他人:

sysctl -w net.ipv4.conf.all.send_redirects=0
sysctl -w net.ipv4.conf.default.send_redirects=0

ICMP时间戳请求和地址掩码请求可能泄露系统运行时间、网络拓扑等信息,攻击者常利用这些信息做踩点。直接在内核层丢弃这些类型的ICMP包:

sysctl -w net.ipv4.icmp_echo_ignore_all=0
sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1

这里注意不要盲目设置icmp_echo_ignore_all=1,这会屏蔽正常的ping请求,导致监控系统误判主机宕机。关键是忽略异常的ICMP错误响应,而非全部回显请求。

启用反向路径过滤,阻断IP欺骗攻击

攻击者常用伪造源IP发起DDoS或扫描,反向路径过滤(RPF)能检查数据包来源是否合法。如果包从某个接口进入,但系统路由表认为该源IP的回程路径不应走这个接口,该包会被直接丢弃。这能有效阻止IP欺骗。Debian下设置严格模式:

sysctl -w net.ipv4.conf.all.rp_filter=1
sysctl -w net.ipv4.conf.default.rp_filter=1

对于多宿主主机或非对称路由环境,严格模式可能导致合法流量被误杀。此时可针对特定接口设置为松散模式(值2),但全局默认至少应设为1。同时,显式禁止源路由,因为源路由允许发送方指定数据包传输路径,这常被攻击者用于绕过安全设备:

sysctl -w net.ipv4.conf.all.accept_source_route=0
sysctl -w net.ipv4.conf.default.accept_source_route=0
sysctl -w net.ipv6.conf.all.accept_source_route=0
sysctl -w net.ipv6.conf.default.accept_source_route=0
调整TCP超时与重试,缓解资源耗尽型攻击

攻击者可能建立大量空闲连接或发送RST包探测,通过调整TCP Keepalive和超时参数,能让系统更快回收僵死连接。缩短Keepalive探测间隔和次数:

sysctl -w net.ipv4.tcp_keepalive_time=600
sysctl -w net.ipv4.tcp_keepalive_intvl=30
sysctl -w net.ipv4.tcp_keepalive_probes=5

这样在600秒无数据后开始探测,每30秒一次,5次失败即断开,总耗时约750秒,比默认的2小时多大幅缩短。对于已建立的连接,减少孤儿套接字(即已关闭但等待清理的连接)的回收时间:

sysctl -w net.ipv4.tcp_fin_timeout=30
sysctl -w net.ipv4.tcp_max_orphans=65536

tcp_fin_timeout从默认60秒降到30秒,加速FIN-WAIT-2状态连接的清理。tcp_max_orphans限制孤儿连接总数,超出时新孤儿连接会被立即重置,防止内存被耗尽。另外,启用TCP时间戳和窗口缩放虽然对性能有利,但时间戳可能泄露系统运行时间,如果不需要极致安全,可以保留;若需强化,可关闭:

sysctl -w net.ipv4.tcp_timestamps=0

但关闭时间戳会影响PAWS(Protection Against Wrapped Sequences)机制,在高带宽网络下可能导致序列号回绕攻击风险,需权衡。

内核连接跟踪与包过滤优化

使用iptables或nftables时,连接跟踪表是状态防火墙的核心。攻击者可能通过发送大量无效包来填满跟踪表,导致正常连接被拒绝。增大跟踪表容量并缩短超时:

sysctl -w net.netfilter.nf_conntrack_max=1048576
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=3600
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_syn_sent=30
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_syn_recv=30
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_fin_wait=30
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30

将已建立连接的超时从默认的5天缩减到1小时,可让跟踪表更高效地回收条目。SYN_SENT和SYN_RECV状态缩短到30秒,能对抗SYN扫描和半连接攻击。同时,确保启用nf_conntrack_tcp_be_liberal=0,让跟踪器严格遵循TCP状态转换,丢弃不符合窗口序列号的包,防止攻击者注入RST包切断连接:

sysctl -w net.netfilter.nf_conntrack_tcp_be_liberal=0
IPv6安全加固,不留盲区

很多管理员只关注IPv4而忽略IPv6,攻击者常利用IPv6隧道或邻居发现协议发起攻击。即使网络未正式部署IPv6,链路本地地址也可能被利用。按IPv4的策略同步加固IPv6:

sysctl -w net.ipv6.conf.all.accept_redirects=0
sysctl -w net.ipv6.conf.default.accept_redirects=0
sysctl -w net.ipv6.conf.all.accept_source_route=0
sysctl -w net.ipv6.conf.default.accept_source_route=0
sysctl -w net.ipv6.conf.all.accept_ra=0
sysctl -w net.ipv6.conf.default.accept_ra=0

关闭路由器通告(RA)接受,能防止攻击者通过伪造RA包进行地址配置或路由注入。如果主机无需自动配置IPv6地址,可进一步禁用自动配置:

sysctl -w net.ipv6.conf.all.autoconf=0
sysctl -w net.ipv6.conf.default.autoconf=0
内核日志与内存安全强化

防止内核符号表泄露,攻击者常通过读取/proc/kallsyms获取内核函数地址来绕过KASLR。限制非特权用户访问:

sysctl -w kernel.kptr_restrict=2

值为2时,所有用户(包括root)通过proc查看的内核指针都显示为零。同时,限制dmesg访问,避免攻击者从内核日志中提取敏感信息:

sysctl -w kernel.dmesg_restrict=1

启用地址空间布局随机化(ASLR)的更高强度:

sysctl -w kernel.randomize_va_space=2

值2代表完全随机化,包括堆、栈、mmap基址等。这些参数虽不直接处理网络包,但能大幅增加漏洞利用难度,属于纵深防御的关键环节。

持久化配置与验证

上述所有sysctl命令仅对当前运行内核生效,重启后丢失。必须写入/etc/sysctl.conf或/etc/sysctl.d/目录下的配置文件:

cat <> /etc/sysctl.d/99-hardening.conf
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_max_syn_backlog=8192
net.core.somaxconn=4096
net.ipv4.tcp_synack_retries=2
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
net.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.default.accept_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.icmp_ignore_bogus_error_responses=1
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
net.ipv6.conf.all.accept_source_route=0
net.ipv6.conf.default.accept_source_route=0
net.ipv4.tcp_keepalive_time=600
net.ipv4.tcp_keepalive_intvl=30
net.ipv4.tcp_keepalive_probes=5
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_max_orphans=65536
net.netfilter.nf_conntrack_max=1048576
net.netfilter.nf_conntrack_tcp_timeout_established=3600
net.netfilter.nf_conntrack_tcp_timeout_syn_sent=30
net.netfilter.nf_conntrack_tcp_timeout_syn_recv=30
net.netfilter.nf_conntrack_tcp_timeout_fin_wait=30
net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
net.netfilter.nf_conntrack_tcp_be_liberal=0
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.default.accept_ra=0
net.ipv6.conf.all.autoconf=0
net.ipv6.conf.default.autoconf=0
kernel.kptr_restrict=2
kernel.dmesg_restrict=1
kernel.randomize_va_space=2
EOF
sysctl -p /etc/sysctl.d/99-hardening.conf

应用后,使用sysctl -a | grep -E "tcp_syncookies|rp_filter|accept_redirects"等命令逐一验证。同时,用nmap或hping3从外部测试SYN Flood响应,观察连接跟踪表使用情况conntrack -S,确保参数生效且未引入性能瓶颈。这些调整是基础,还需结合应用层防火墙、速率限制和持续监控,才能构建完整防线。