第一百二十八章:暗流
问道期涉及内核源码:
一
林小源在网络之海的深处发现了一些不对劲的东西——水面上漂浮着无数伪装的船只,有些船只没有真正的货物,只是反复进出港口,消耗着港口的资源。
"那是 SYN Flood。"一个警惕的声音从旁边传来。
林小源看到一个穿着黑色铠甲的哨兵站在岸边,手中握着一面盾牌。盾牌上刻着"SYN cookies"三个字。
"我是网络安全的守护者。"哨兵说,"你看到的那些空船——攻击者发送大量 SYN 报文,但不完成三次握手。服务器为每个 SYN 分配资源等待 ACK,最终资源耗尽。"
"怎么防御?"
哨兵举起盾牌:"SYN cookies。服务器不分配资源——把连接信息编码在序列号里返回。如果客户端真的完成握手,序列号会带回来,服务器验证后才分配资源。攻击者的 SYN 不会完成握手,不会消耗资源。"
"但 SYN cookies 不是万能护符。"哨兵把盾牌放低,"它是在 SYN backlog 承压时牺牲部分 TCP 选项空间换生存能力。正常情况下,内核仍希望用 backlog 和 request socket 管理半连接;只有洪水真压上来,才让序列号承担更多信息。防御的目标不是让攻击消失,而是避免资源先被半连接耗尽。"
暗流初试
SYN Flood 主要试图耗尽服务器保存半连接的哪个队列资源?
二
"还有其他攻击吗?"林小源问。
哨兵指向远方的海面——那里有一片异常汹涌的水域,无数船只从四面八方涌向一个港口。
"DDoS——分布式拒绝服务。"哨兵说,"不是一个攻击者,而是成千上万个——分布在世界各地,同时向目标发送大量流量。目标被淹没,合法请求进不去。"
"怎么防御?"
"流量清洗、CDN。"哨兵说,"在流量到达目标之前,用专门的设备过滤恶意流量。CDN 把流量分散到全球的节点,每个节点分担一部分压力。"
"中间人攻击呢?"
哨兵的表情变得严肃:"ARP 欺骗——攻击者冒充网关,截获你的所有流量。你访问银行网站,实际上访问的是攻击者的假网站。防御:HTTPS、证书验证。"
"内核能做的是分层减压。"哨兵指向海面上的三道闸门,"最早的闸门可以是 XDP/eBPF,在 skb 分配前就丢掉明显恶意包;再往后是 tc、netfilter、conntrack、socket backlog;用户态还有限流、TLS、认证和应用层防护。越早丢包,越省资源,但能看的上下文越少。越晚决策,信息越全,代价越高。"
"所以 XDP 不是替代所有防火墙。"
"对。它是早期拦截和快速转发的利刃,不是完整策略系统。"
早闸之试
在网络接收路径中,常用于 skb 分配前早期处理/丢包的 eBPF hook 技术叫什么?
三
"端口扫描?"
"nmap。"哨兵说,"攻击者扫描你的服务器,看哪些端口开放——SSH、HTTP、MySQL。知道开放了哪些端口,就知道攻击哪些服务。防御:关闭不必要端口,用防火墙限制访问。"
"DNS 劫持?"
"篡改 DNS 响应——把你引导到钓鱼网站。"哨兵说,"防御:DNSSEC,DNS 响应签名验证。"
林小源看着那些暗流,忽然明白了——网络安全不是一件事,而是无数件事。从网络层到应用层,每一层都有攻击,每一层都需要防御。
"安全原则是什么?"他问。
哨兵收起盾牌:"最小权限——只开放必要的端口,只授予必要的权限。纵深防御——不依赖单一措施,多层防御。默认拒绝——拒绝所有流量,只允许已知的安全流量。日志审计——记录所有访问,出了问题可以追溯。"
"少即是多。"
"在安全领域,是的。"哨兵说,"攻击面越小,越安全。每多开一个端口,就多一个入口。每多一个服务,就多一个漏洞的可能。"
"容器让这件事更复杂。"哨兵望向远处一片隔离海域,"network namespace 让每个容器看到自己的接口、路由和 netfilter 规则;cgroup 和 BPF 又能按服务、进程组、socket 维度施加策略。攻击不再只看主机的 eth0,还要看 veth、bridge、overlay、NAT 和宿主机转发路径。"
"那日志呢?"
"日志也要分层:netfilter 计数器、conntrack 表、BPF map、tcpdump、perf trace、drop monitor,各看一段水路。没有观测,安全就是猜。"
隔海之试
容器中让每个环境拥有独立网络接口、路由和规则视图的机制是什么?
/*
* 常见的网络攻击:
*
* 1. SYN Flood
* 发送大量 SYN 不完成握手
* 耗尽服务器资源
* 防御: SYN cookies
*
* 2. DDoS
* 分布式拒绝服务
* 大量流量淹没目标
* 防御: 流量清洗、CDN
*
* 3. 中间人攻击
* 截获通信
* ARP 欺骗
* 防御: HTTPS、证书验证
*
* 4. 端口扫描
* 探测开放端口
* nmap 工具
* 防御: 关闭不必要端口
*
* 5. DNS 劫持
* 篡改 DNS 响应
* 防御: DNSSEC
*/
printf("=== 网络安全 — 识别暗流 ===\n\n");
printf("常见的网络攻击:\n\n");
printf("1. SYN Flood:\n");
printf(" 发送大量 SYN 不完成握手\n");
printf(" 耗尽服务器资源\n");
printf(" 防御: SYN cookies\n\n");
printf("2. DDoS:\n");
printf(" 分布式拒绝服务\n");
printf(" 大量流量淹没目标\n");
printf(" 防御: 流量清洗、CDN\n\n");
printf("3. 中间人攻击:\n");
printf(" 截获通信\n");
printf(" ARP 欺骗\n");
printf(" 防御: HTTPS、证书验证\n\n");
printf("4. 端口扫描:\n");
printf(" 探测开放端口\n");
printf(" nmap 工具\n");
printf(" 防御: 关闭不必要端口\n\n");
printf("5. DNS 劫持:\n");
printf(" 篡改 DNS 响应\n");
printf(" 防御: DNSSEC\n\n");
printf("--- 内核安全机制 ---\n");
printf("SYN cookies:\n");
printf(" 不分配资源\n");
printf(" 编码在序列号中\n\n");
printf("iptables:\n");
printf(" 过滤恶意流量\n");
printf(" 限速\n\n");
printf("eBPF:\n");
printf(" 可编程的流量处理\n");
printf(" DDoS 防御\n\n");
printf("--- 安全原则 ---\n");
printf("1. 最小权限\n");
printf("2. 纵深防御\n");
printf("3. 默认拒绝\n");
printf("4. 日志审计\n");#include <stdio.h>
/*
* 常见的网络攻击:
*
* 1. SYN Flood
* 发送大量 SYN 不完成握手
* 耗尽服务器资源
* 防御: SYN cookies
*
* 2. DDoS
* 分布式拒绝服务
* 大量流量淹没目标
* 防御: 流量清洗、CDN
*
* 3. 中间人攻击
* 截获通信
* ARP 欺骗
* 防御: HTTPS、证书验证
*
* 4. 端口扫描
* 探测开放端口
* nmap 工具
* 防御: 关闭不必要端口
*
* 5. DNS 劫持
* 篡改 DNS 响应
* 防御: DNSSEC
*/
int main() {
printf("=== 网络安全 — 识别暗流 ===\n\n");
printf("常见的网络攻击:\n\n");
printf("1. SYN Flood:\n");
printf(" 发送大量 SYN 不完成握手\n");
printf(" 耗尽服务器资源\n");
printf(" 防御: SYN cookies\n\n");
printf("2. DDoS:\n");
printf(" 分布式拒绝服务\n");
printf(" 大量流量淹没目标\n");
printf(" 防御: 流量清洗、CDN\n\n");
printf("3. 中间人攻击:\n");
printf(" 截获通信\n");
printf(" ARP 欺骗\n");
printf(" 防御: HTTPS、证书验证\n\n");
printf("4. 端口扫描:\n");
printf(" 探测开放端口\n");
printf(" nmap 工具\n");
printf(" 防御: 关闭不必要端口\n\n");
printf("5. DNS 劫持:\n");
printf(" 篡改 DNS 响应\n");
printf(" 防御: DNSSEC\n\n");
printf("--- 内核安全机制 ---\n");
printf("SYN cookies:\n");
printf(" 不分配资源\n");
printf(" 编码在序列号中\n\n");
printf("iptables:\n");
printf(" 过滤恶意流量\n");
printf(" 限速\n\n");
printf("eBPF:\n");
printf(" 可编程的流量处理\n");
printf(" DDoS 防御\n\n");
printf("--- 安全原则 ---\n");
printf("1. 最小权限\n");
printf("2. 纵深防御\n");
printf("3. 默认拒绝\n");
printf("4. 日志审计\n");
return 0;
}道藏笔记
内核启示
网络安全需要多层次防御。
常见攻击:
- SYN Flood — 耗尽资源
- DDoS — 流量淹没
- 中间人 — 截获通信
- 端口扫描 — 探测漏洞
防御手段:
- SYN cookies — 防御 SYN Flood
- iptables — 流量过滤
- eBPF — 可编程防御
- XDP — skb 分配前早期处理
- conntrack/netfilter — 有状态过滤和 NAT
- network namespace — 容器网络隔离
安全原则:
- 最小权限
- 纵深防御
- 默认拒绝
- 日志审计
网络安全是"暗流"中的"航行"——需要警惕和防御。
网络安全之试
暗流一章讲网络安全时,域名解析链路里常被劫持或污染的系统是什么?