调整内核参数是加固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发起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=0IPv6安全加固,不留盲区
很多管理员只关注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,确保参数生效且未引入性能瓶颈。这些调整是基础,还需结合应用层防火墙、速率限制和持续监控,才能构建完整防线。
