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工具也能在内核更新后提醒重启相关服务,避免旧进程继续使用旧参数。
