ubuntu的ICMP

配置直接查看 ICMP配置单网卡内核配置

系统版本信息

1
lsb_release  -a
1
lsb_release -cs
1
uname -m
1
uname -a

ICMPv4 / ICMPv6 入站放行 / 拦截完整对照表

ICMPv4(IPv4)入站规则表

分类 Type Code 报文名称 核心作用 阻断后果 安全策略
🔴强制必放行(绝对不能拦) 3 0~15 Destination Unreachable 目标不可达 PMTU-D(Code4 核心)、端口 / 主机 / 网络不可达报错 大包黑洞、BGP 路由更新丢包、TCP 大量重传 ACCEPT
🔴强制必放行 11 0 Time Exceeded TTL 超时 mtr/traceroute 路由跳点排查 无法定位跨运营商丢包节点,故障盲查 ACCEPT
🟡可选放行(限流) 0 0 Echo Reply Ping 回复 本机主动 ping 外部的应答 不影响业务,仅外部无法确认本机连通 ACCEPT + 限流 5/s
🟡可选放行(限流) 8 0 Echo Request Ping 请求 外部探测本机存活 易被 ICMP 洪水扫描攻击 ACCEPT + 限流 5/s
⚫强制拦截(高危) 5 0~3 Redirect 路由重定向 伪造路由劫持流量 攻击者下发恶意路由,流量窃听、劫持 DROP
⚫强制拦截 13 0 Timestamp Request 时间戳请求 扫描探测主机指纹、在线状态
服务器指纹扫描
泄露服务器特征,扩大扫描面 DROP
⚫强制拦截 14 0 Timestamp Reply 时间戳应答 回应时间戳探测
服务器指纹扫描
辅助黑客资产测绘 DROP
⚫强制拦截 9/10 全部 路由器通告 / 路由选择 内网网关专用,公网无需求 伪造网关,内网流量劫持 DROP
⚫强制拦截 12 全部 Parameter Problem 参数错误 极少出现,可统一拦截 无业务影响,减少攻击向量 DROP
⚫强制拦截 其余未列出 Type - 保留 / 实验类型 无标准业务用途 未知攻击利用通道 DROP

ICMPv6(IPv6)入站规则表

分类 Type Code 报文名称 核心作用 阻断后果 安全策略
🔴强制必放行(绝对不能拦) 1 全部 Destination Unreachable 目标不可达 IPv6 端口 / 路由不可达报错 IPv6 业务静默丢包,无法定位连接失败 ACCEPT
🔴强制必放行(PMTU 核心) 2 0 Packet Too Big 数据包过大 IPv6 路径 MTU 发现(无 DF 标记) IPv6 大包全断、BGP IPv6 路由更新丢包、收敛抖动 ACCEPT
🔴强制必放行 3 0 Time Exceeded 跳数超限 traceroute6/mtr6 链路丢包排查 IPv6 跨运营商故障无法定位 ACCEPT
🔴强制必放行 4 全部 Parameter Problem 头部参数错误 IPv6 扩展头畸形报错 异常报文反复重传占用带宽 ACCEPT
🔴强制必放行(NDP 网关发现) 133 0 RS 路由器请求 主机主动请求网关 RA 路由前缀 拿不到默认网关,IPv6 完全断外网 ACCEPT(仅链路本地源 fe80::/10)
🔴强制必放行 134 0 RA 路由器通告 SLAAC 自动分配 IPv6 地址 + 默认路由 无 IPv6 地址、无路由,整机 IPv6 离线 ACCEPT(仅链路本地源 fe80::/10)
🔴强制必放行(替代 ARP) 135 0 NS 邻居请求 MAC 地址解析、DAD 重复地址检测 同网段 IPv6 主机无法互通 ACCEPT
🔴强制必放行 136 0 NA 邻居通告 NS 应答、刷新邻居 MAC 缓存 同网段互相 ping6 不通 ACCEPT
🟡可选放行(限流防洪水) 128 0 Echo Request ping6 请求 外部探测服务器存活 易被扫描、ICMPv6 Flood 打带宽 ACCEPT + limit 5/second burst 10
🟡可选放行 129 0 Echo Reply ping6 回复 本机主动向外 ping6 的应答包 无安全风险,辅助运维排障 ACCEPT
⚫公网强制拦截(内网可放行) 137 0 Redirect 路由重定向 下发更优下一跳 公网攻击者伪造路由劫持流量 公网 DROP;内网信任段 ACCEPT
⚫公网拦截、内网组播业务放行 130/131/132/143 全部 MLD 组播监听报文 IPv6 组播流媒体依赖 公网无组播需求,存在组播放大攻击 公网 DROP
⚫全局强制拦截 144~147 全部 移动 IPv6 相关报文 移动端漫游专用,服务器无业务需求 扩大攻击面,无任何收益 DROP
⚫全局强制拦截 其余所有未列举 Type - 实验 / 保留私有报文 无标准互联网业务定义 未知漏洞利用入口 DROP

补充

出站 ICMPv4/ICMPv6 全部放行

服务器主动向外发起 ping、mtr、PMTU 探测,无任何安全风险,不用限制。

IPv6 和 IPv4 规则完全隔离

iptables 只控制 ICMPv4,ip6tables 单独配置 ICMPv6,不能互相复用规则。

**为什么 ICMPv6 不能像 IPv4 一样大量拦截 **

IPv4 ARP 独立协议;IPv6 没有 ARP,NDP、网关发现、MTU 协商、地址冲突检测全部封装在 ICMPv6,拦截任意一个必导致 IPv6 半断 / 全断网。

BGP 线路影响

  • Type3 (v4)/Type1 (v6)+Type2 (v6) 阻断 → BGP 完整路由表大包传输丢包,收敛极慢、路由抖动;
  • TTL 超时报文阻断 → 运营商无法通过 mtr 探测线路质量,不会自动优选低延迟 BGP 线路。

安全折中方案

ping 类回显请求(v4:8 /v6:128)统一限速 5/s burst 10,抵御 ICMP 洪水;

公网彻底拦截重定向、时间戳、移动 IPv6、未知实验报文;

内网信任网段可放宽全部 ICMP 限制,方便运维排障。

UFW/etc/ufw目录下文件含义

数据包匹配优先级从高到低:

before.rules / before6.rules(最高,最先匹配)

→ user.rules / user6.rules(ufw allow/deny 命令生成)

→ after.rules / after6.rules(最低,最后匹配)

文件名 IPv4/IPv6 区分 文件类型 核心用途、详细解释、适用场景、注意事项
before.rules IPv4 iptables-restore 规则文件 1. 最高优先级 IPv4 规则,所有 ufw 命令规则执行前先匹配这里2. 内置默认规则:放行 lo 回环、放行必要基础 ICMP、丢弃无效数据包、DHCP 放行3. 适合放:黑名单封禁 IP、ICMP 限流、nat/mangle 表、全局限速、强制拦截高危报文4. 语法标准 iptables *filter 格式,结尾必须 COMMIT5. 修改后执行 ufw reload 生效;ufw status 不会展示这里的规则
before6.rules IPv6 ip6tables-restore 规则文件 1. before.rules 的 IPv6 对等文件,逻辑完全一致2. 内置 NDP 基础放行(RS/RA/NS/NA)、Packet Too Big 等 ICMPv6 基础报文3. 双栈服务器必须配置,不能清空,否则 IPv6 断网4. 适合放 IPv6 黑名单、ICMPv6 限流、拦截 MLD/Redirect 高危报文
after.rules IPv4 iptables-restore 规则文件 1. 最低优先级 IPv4 规则,所有 user 用户规则匹配完毕后才执行2. 适合放兜底策略:匹配不到所有放行规则则 DROP、出站全局限制、日志兜底3. 不适合放拦截 / 黑名单(优先级太低,会被 user 放行规则绕过)
after6.rules IPv6 ip6tables-restore 规则文件 after.rules IPv6 版本,兜底 IPv6 所有未匹配流量,一般仅补充默认丢弃策略
before.init 双栈共用 Shell 启动脚本 1. UFW 启动之前执行的自定义脚本2. 用途:加载内核网络模块、调整 sysctl、挂载网络相关操作3. 执行时机:systemctl start ufw 最先执行4. 权限必须 chmod +x /etc/ufw/before.init 才会自动运行
after.init 双栈共用 Shell 启动脚本 1. UFW 规则全部加载完成之后执行2. 用途:启动依赖防火墙的服务(BGP、端口映射、流量监控)、动态添加临时路由 /iptables 规则3. stop/restart/flush-all 都会调用,可写 stop 分支清理临时规则
user.rules IPv4 自动生成规则文件 1. 不要手动编辑,由 ufw allow/deny/limit/delete 命令自动维护2. 存放你日常敲命令添加的端口、IP 放行规则3. 手动修改会被 ufw reload 覆盖丢失
user6.rules IPv6 自动生成规则文件 user.rules IPv6 版本,ufw allow ipv6-icmp 这类命令全部写入此处,禁止手动编辑
applications.d 目录文件夹 应用配置目录 1. 存放应用预定义端口配置文件(.rules),纯文本2. 示例:ssh、nginx、mysql、ftp 预设端口3. 使用:ufw app list / ufw app allow ssh4. 自定义业务端口可新建 xxx.rules 放入此目录,方便一键放行整套服务端口
ufw.conf 双栈共用 主全局配置 1. 控制开机自启、日志等级、规则持久化关键参数:ENABLED=yes/no:开机是否启用 UFWLOGLEVEL=low/medium/high/full 防火墙日志详细度MANAGE_BUILTINS 是否接管系统 iptables 原生链
sysctl.conf 双栈共用 内核网络参数 1. UFW 启动时自动加载的网络内核参数,覆盖系统 /etc/sysctl.conf 网络相关项2. 常用配置:IP 转发开关、tcp_syncookies、ICMP 全局忽略 ping、反向路径过滤 rp_filter3. 仅网络相关参数,不修改内存 / 磁盘类 sysctl

需要修改的文件有

1
2
3
/etc/ufw/before.rules
/etc/ufw/before6.rules
/etc/sysctl.d/99-sysctl.conf

前置备份(每次修改配置前必做)

备份 UFW before 防火墙规则

时间戳备份原始规则,方便一键回滚

1
sudo cp /etc/ufw/before.rules /etc/ufw/before.rules.bak.$(date +%F)
1
sudo cp /etc/ufw/before6.rules /etc/ufw/before6.rules.bak.$(date +%F)

确认备份文件存在。

1
ls -lh /etc/ufw/before*

备份 sysctl 自定义加固文件

1
cp /etc/sysctl.d/99-sysctl.conf /etc/sysctl.d/99-sysctl.conf.$(date +%F)
1
ls -lh /etc/sysctl.d/99-sysctl.conf*

ICMP配置

配置ipv4配置文件

/etc/ufw目录下before.rules文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#
# rules.before
#
# Rules that should be run before the ufw command line added rules. Custom
# rules should be added to one of these chains:
# ufw-before-input
# ufw-before-output
# ufw-before-forward
#

# Don't delete these required lines, otherwise there will be errors
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
# End required lines


# ==========================================
# 1. 放行回环接口 (Loopback) 【禁止删除】
# ==========================================
# -i lo / -o lo : 本地回环127.0.0.1
# -j ACCEPT : 本机程序内部通信必需
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-output -o lo -j ACCEPT

# ==========================================
# 2. 放行已建立和相关的连接 Conntrack 【禁止删除】
# ==========================================
# RELATED,ESTABLISHED:已建立TCP/BGP/SSH/HTTP连接、响应报文放行
-A ufw-before-input -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-output -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# 纯公网单机无路由转发,FORWARD链无流量,保留占位即可无需配置
-A ufw-before-forward -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# ==========================================
# 3. 丢弃无效畸形数据包 INVALID 【禁止删除】
# ==========================================
-A ufw-before-input -m conntrack --ctstate INVALID -j ufw-logging-deny
-A ufw-before-input -m conntrack --ctstate INVALID -j DROP

# ==========================================
# 4. IPv4 ICMP 安全规则(从上至下顺序严格固定,不可调换)
# ==========================================
## 4.1 业务必放ICMP(BGP/PMTU/traceroute核心,不可删)
# Type3 目标不可达,含PMTU Code4,解决大包黑洞、BGP完整路由更新丢包
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT
# Type11 TTL超时,mtr/traceroute链路故障排查
-A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT
# Type12 参数错误,畸形IP头快速报错
-A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT
# Type0 echo-reply:本机主动ping外网的应答包,必须放行
-A ufw-before-input -p icmp --icmp-type echo-reply -j ACCEPT

## 4.2 外部公网入站ping限流 + 洪水日志(适配Fail2ban)
# 每秒5包,突发峰值10,运营商低频线路探测完全不受限
-A ufw-before-input -p icmp --icmp-type echo-request -m limit --limit 5/sec --limit-burst 10 -j ACCEPT
# 超限洪水包写入内核日志,固定前缀用于自动封禁 超限洪水包记录日志,强制输出完整IP源地址信息
-A ufw-before-input -p icmp --icmp-type echo-request -j LOG --log-prefix "UFW_ICMP_FLOOD: " --log-ip-options
# 超出阈值恶意ping直接丢弃
-A ufw-before-input -p icmp --icmp-type echo-request -j DROP

## 4.3 高危ICMP类型全部拦截(路由劫持、资产扫描)
-A ufw-before-input -p icmp --icmp-type redirect -j DROP
-A ufw-before-input -p icmp --icmp-type timestamp-request -j DROP
-A ufw-before-input -p icmp --icmp-type timestamp-reply -j DROP
-A ufw-before-input -p icmp --icmp-type router-solicitation -j DROP
-A ufw-before-input -p icmp --icmp-type router-advertisement -j DROP

## 4.4 兜底规则:所有未匹配的其余ICMP全部丢弃
# 放在所有ICMP放行/拦截最后,不会前置吞掉合法报文
-A ufw-before-input -p icmp -j DROP

# ==========================================
# 5. DHCP客户端放行(静态公网IP可注释,你固定公网IP建议注释)
# ==========================================
# -A ufw-before-input -p udp --sport 67 --dport 68 -j ACCEPT

# ==========================================
# 6. ufw-not-local 非本地流量过滤 【禁止删除】
# ==========================================
-A ufw-before-input -j ufw-not-local
-A ufw-not-local -m addrtype --dst-type LOCAL -j RETURN
-A ufw-not-local -m addrtype --dst-type MULTICAST -j RETURN
-A ufw-not-local -m addrtype --dst-type BROADCAST -j RETURN
-A ufw-not-local -m limit --limit 3/min --limit-burst 10 -j ufw-logging-deny
-A ufw-not-local -j DROP

# ==========================================
# 7. 组播mDNS/UPnP 【纯公网无内网设备,全部注释关闭】
# ==========================================
# -A ufw-before-input -p udp -d 224.0.0.251 --dport 5353 -j ACCEPT
# -A ufw-before-input -p udp -d 239.255.255.250 --dport 1900 -j ACCEPT

# ==========================================
# 8. FORWARD转发链:无内网、不开IP转发,全部注释无需启用
# ==========================================
# -A ufw-before-forward -p icmp --icmp-type destination-unreachable -j ACCEPT
# -A ufw-before-forward -p icmp --icmp-type time-exceeded -j ACCEPT
# -A ufw-before-forward -p icmp --icmp-type parameter-problem -j ACCEPT
# -A ufw-before-forward -p icmp --icmp-type echo-request -m limit --limit 5/s --limit-burst 10 -j ACCEPT
# -A ufw-before-forward -p icmp --icmp-type echo-request -j LOG --log-prefix "UFW_ICMP_FLOOD_FORWARD: "
# -A ufw-before-forward -p icmp --icmp-type echo-request -j DROP

# ====================== 强制尾部COMMIT,严禁删除 ======================
COMMIT

关于ipv4echo-request 8号请求

对比维度 写法一(全量拦截 + 限流记录) 写法二(限流放行 +节省IO) 写法三(限流放行 + 超额记录)
正常 Ping 表现 全部被拦截(无响应) 允许通过(每秒 5 个以内) 允许通过(每秒 5 个以内)
核心目的 隐藏主机存活状态,极致防御 防 DDoS 泛洪攻击,保障业务连通性 防 DDoS 泛洪攻击,保障业务连通性
Fail2ban 触发条件 任何人只要 Ping 就会触发封禁 超出阈值的恶意攻击直接丢弃
简化两段式,减少日志冗余,节省 IO
只有超出阈值的恶意攻击才会触发封禁
适用场景 高安全要求的堡垒机、核心数据库、蜜罐 生产环境、Web 服务器、需要运维诊断的机器

隐身策略(全量拦截 + 限流记录)

1
2
-A ufw-before-input -p icmp --icmp-type echo-request -m limit --limit 1/sec --limit-burst 3 -j LOG --log-prefix "UFW_ICMP8_BLOCK: "
-A ufw-before-input -p icmp --icmp-type echo-request -j DROP

工作原理:这里没有 ACCEPT 规则。所有的 Ping 请求最终都会走向 DROP。limit 模块在这里仅仅作用于 LOG 动作,它的作用是:当有人 Ping 你时,为了防止日志文件被瞬间刷爆,系统每秒最多只记录 1 条拦截日志。
对 Fail2ban 的影响:因为所有的 Ping 都会被记录日志,所以任何人(包括你自己)只要 Ping 了这台服务器,都会触发 Fail2ban 的封禁机制。

流量ping同样限流,没有日志

1
2
-A ufw-before-forward -p icmp --icmp-type echo-request -m limit --limit 5/s --limit-burst 10 -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type echo-request -j DROP

ICMP 洪水

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. 记录超出限流的恶意 Ping 请求 (用于触发 Fail2ban)
# 注意:这里记录的是“被丢弃”的包,或者你可以选择记录所有包但需配合更复杂的 Fail2ban 正则
# 更推荐的做法:记录所有 Ping,但在 Fail2ban 中通过频率判断;
# 或者简单点:只记录被 DROP 的包作为攻击证据。

# 下面是“限流放行 + 超额记录并丢弃”的标准写法:
-A ufw-before-input -p icmp --icmp-type echo-request -m limit --limit 5/sec --limit-burst 10 -j ACCEPT

# 2. 对超额的 Ping 进行日志记录 (Fail2ban 将监控这条日志)
-A ufw-before-input -p icmp --icmp-type echo-request -j LOG --log-prefix "UFW_ICMP_FLOOD: "

# 3. 丢弃超额的 Ping
-A ufw-before-input -p icmp --icmp-type echo-request -j DROP

配置ipv6配置文件

/etc/ufw目录下before.rules文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#
# rules6.before - 完整版(已加载ip6t_rt,启用RH0路由头防护)
# 文件路径:/etc/ufw/before6.rules
# 适用环境:生产公网Ubuntu纯业务服务器,不做路由/网关转发
# 校验语法:ip6tables-restore --test /etc/ufw/before6.rules
# 重载生效:ufw reload
#

# ====================== 固定头部【绝对不能删除,删后防火墙加载失败】 ======================
*filter
:ufw6-before-input - [0:0]
:ufw6-before-output - [0:0]
:ufw6-before-forward - [0:0]
# ====================== 头部区块结束 ======================

# ====================== 全局基础网络规则(生产环境全部必须保留) ======================
# 1. 放行本地lo回环网卡,本机进程通信必备,不可注释
-A ufw6-before-input -i lo -j ACCEPT
-A ufw6-before-output -o lo -j ACCEPT

# 2. 安全基线:丢弃RH0路由扩展头报文,防御路由劫持、DDoS放大攻击
# 本机已加载ip6t_rt模块,规则正常启用
-A ufw6-before-input -m rt --rt-type 0 -j DROP
-A ufw6-before-forward -m rt --rt-type 0 -j DROP
-A ufw6-before-output -m rt --rt-type 0 -j DROP

# 3. 连接跟踪优化:已建立/关联会话直接放行,降低防火墙匹配开销
-A ufw6-before-input -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw6-before-output -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw6-before-forward -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# 4. 前置放行ICMPv6 echo-reply(Ping应答)
# 组播场景下Ping回复无连接跟踪,会被INVALID规则拦截,必须前置
-A ufw6-before-input -p icmpv6 --icmpv6-type echo-reply -j ACCEPT

# 5. 拦截畸形、非法状态IPv6数据包并记录日志
# ufw6-logging-deny 在日志级别medium及以上输出拦截日志,方便溯源扫描攻击
-A ufw6-before-input -m conntrack --ctstate INVALID -j ufw6-logging-deny
-A ufw6-before-input -m conntrack --ctstate INVALID -j DROP
# ====================== 全局基础区块结束 ======================

# ====================== INPUT 入站基础ICMPv6(RFC4890强制保留,缺一不可) ======================
# type 1 目标不可达:端口关闭/路由不存在时返回,业务排错必需
-A ufw6-before-input -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT
# type 2 packet-too-big PMTU探测【严禁注释】
# IPv6禁止路由器分片,缺失该报文会导致大文件、视频、API上传下载卡死
-A ufw6-before-input -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT
# type 3 time-exceeded 路由跳数耗尽,traceroute6网络故障排查依赖
-A ufw6-before-input -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT
# type 4 parameter-problem IPv6头部字段异常,网络底层故障反馈
-A ufw6-before-input -p icmpv6 --icmpv6-type parameter-problem -j ACCEPT

# -------------------------- Ping echo-request 生产安全管控(公网加固核心+自定义日志标识适配fail2ban) --------------------------
# 1. 链路本地 fe80::/10:云主机宿主机、同内网链路通信,无限制ping、不打日志
-A ufw6-before-input -p icmpv6 --icmpv6-type echo-request -s fe80::/10 -j ACCEPT
# 2. ULA私有IPv6网段 fd00::/8:企业VPC/集群内网私有地址,公网无法路由到达,内网无限制ping
# 无私有ULA内网可注释本行
-A ufw6-before-input -p icmpv6 --icmpv6-type echo-request -s fd00::/8 -j ACCEPT

# 规则逻辑:先放行内网网段,剩余全部为公网地址,规避多-s取反语法报错
# 公网外网Ping限速:每秒最多5个请求,突发峰值10个,合规少量探测放行无日志
-A ufw6-before-input -p icmpv6 --icmpv6-type echo-request -m limit --limit 5/s --limit-burst 10 -j ACCEPT

# 超限外网Ping:写入自定义标记日志 PING_FLOOD_BLOCK,方便日志筛选、fail2ban精准匹配
# 宽松日志限速,避免日志刷屏
-A ufw6-before-input -p icmpv6 --icmpv6-type echo-request -m limit --limit 20/s --limit-burst 40 -j LOG --log-prefix "[PING_FLOOD_BLOCK] " --log-level 4
# 超限数据包直接丢弃
-A ufw6-before-input -p icmpv6 --icmpv6-type echo-request -j DROP

# ====================== INPUT 基础ICMP区块结束 ======================

# ====================== INPUT NDP邻居发现协议(IPv6替代ARP,同宿主机互通核心) ======================
# --hl-eq 255 限制报文仅本网段传播,防止外网伪造RA劫持网关/DNS
# 133 RS路由器请求 | 134 RA路由通告 | 135 NS邻居查询 | 136 NA邻居应答
-A ufw6-before-input -p icmpv6 --icmpv6-type router-solicitation -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-input -p icmpv6 --icmpv6-type router-advertisement -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-input -p icmpv6 --icmpv6-type neighbor-solicitation -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-input -p icmpv6 --icmpv6-type neighbor-advertisement -m hl --hl-eq 255 -j ACCEPT
# ====================== INPUT NDP区块结束 ======================

# ====================== INPUT 扩展组播ICMPv6(仅保留云主机必需项) ======================
# 1. IND扩展邻居发现 141/142,辅助NDP,保留不影响安全
-A ufw6-before-input -p icmpv6 --icmpv6-type 141 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-input -p icmpv6 --icmpv6-type 142 -m hl --hl-eq 255 -j ACCEPT

# 2. MLD组播监听协议(DHCPv6自动分配IPv6地址必需,仅放行链路本地fe80::/10)
# 130 MLD查询 / 131 MLDv1上报 / 132 MLD完成 / 143 MLDv2上报
-A ufw6-before-input -p icmpv6 --icmpv6-type 130 -s fe80::/10 -j ACCEPT
-A ufw6-before-input -p icmpv6 --icmpv6-type 131 -s fe80::/10 -j ACCEPT
-A ufw6-before-input -p icmpv6 --icmpv6-type 132 -s fe80::/10 -j ACCEPT
-A ufw6-before-input -p icmpv6 --icmpv6-type 143 -s fe80::/10 -j ACCEPT

# 3. SEND安全邻居发现148/149,加密NDP防网关劫持,云内网环境保留
-A ufw6-before-input -p icmpv6 --icmpv6-type 148 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-input -p icmpv6 --icmpv6-type 149 -m hl --hl-eq 255 -j ACCEPT

# 4. MR组播路由报文151/152/153,仅子网内传播,云主机保留无风险
-A ufw6-before-input -p icmpv6 --icmpv6-type 151 -s fe80::/10 -m hl --hl-eq 1 -j ACCEPT
-A ufw6-before-input -p icmpv6 --icmpv6-type 152 -s fe80::/10 -m hl --hl-eq 1 -j ACCEPT
-A ufw6-before-input -p icmpv6 --icmpv6-type 153 -s fe80::/10 -m hl --hl-eq 1 -j ACCEPT

# 5. Mobile IPv6 144~147 【已注释】
# 公网业务服务器无移动漫游终端,关闭减少攻击面
#-A ufw6-before-input -p icmpv6 --icmpv6-type 144 -j ACCEPT
#-A ufw6-before-input -p icmpv6 --icmpv6-type 145 -j ACCEPT
#-A ufw6-before-input -p icmpv6 --icmpv6-type 146 -j ACCEPT
#-A ufw6-before-input -p icmpv6 --icmpv6-type 147 -j ACCEPT
# ====================== INPUT 扩展ICMP区块结束 ======================

# ====================== INPUT 局域网组播UDP(仅保留DHCPv6,mDNS/UPnP注释关闭) ======================
# DHCPv6客户端通信:端口546客户端、547服务端,云主机自动获取IPv6地址必需,不可注释
-A ufw6-before-input -p udp -s fe80::/10 --sport 547 -d fe80::/10 --dport 546 -j ACCEPT

# mDNS 5353 局域网设备发现【注释关闭】,公网服务器无内网打印/共享设备,关闭缩小攻击面
#-A ufw6-before-input -p udp -d ff02::fb --dport 5353 -j ACCEPT

# UPnP 1900 智能家居端口映射【注释关闭】,生产服务器不需要,存在端口暴露风险
#-A ufw6-before-input -p udp -d ff02::f --dport 1900 -j ACCEPT
# ====================== INPUT 组播UDP区块结束 ======================

# ====================== OUTPUT 出站全量ICMPv6(本机主动对外访问全部放行,无业务限制) ======================
# 基础标准ICMP报文
-A ufw6-before-output -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT
-A ufw6-before-output -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT
-A ufw6-before-output -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT
-A ufw6-before-output -p icmpv6 --icmpv6-type parameter-problem -j ACCEPT
-A ufw6-before-output -p icmpv6 --icmpv6-type echo-request -j ACCEPT
-A ufw6-before-output -p icmpv6 --icmpv6-type echo-reply -j ACCEPT

# 出站NDP邻居发现
-A ufw6-before-output -p icmpv6 --icmpv6-type router-solicitation -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-output -p icmpv6 --icmpv6-type router-advertisement -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-output -p icmpv6 --icmpv6-type neighbor-solicitation -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-output -p icmpv6 --icmpv6-type neighbor-advertisement -m hl --hl-eq 255 -j ACCEPT

# 出站IND扩展NDP
-A ufw6-before-output -p icmpv6 --icmpv6-type 141 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-output -p icmpv6 --icmpv6-type 142 -m hl --hl-eq 255 -j ACCEPT

# 出站MLD组播管理
-A ufw6-before-output -p icmpv6 --icmpv6-type 130 -s fe80::/10 -j ACCEPT
-A ufw6-before-output -p icmpv6 --icmpv6-type 131 -s fe80::/10 -j ACCEPT
-A ufw6-before-output -p icmpv6 --icmpv6-type 132 -s fe80::/10 -j ACCEPT
-A ufw6-before-output -p icmpv6 --icmpv6-type 143 -s fe80::/10 -j ACCEPT

# 出站SEND安全邻居发现
-A ufw6-before-output -p icmpv6 --icmpv6-type 148 -m hl --hl-eq 255 -j ACCEPT
-A ufw6-before-output -p icmpv6 --icmpv6-type 149 -m hl --hl-eq 255 -j ACCEPT

# 出站MR组播路由
-A ufw6-before-output -p icmpv6 --icmpv6-type 151 -s fe80::/10 -m hl --hl-eq 1 -j ACCEPT
-A ufw6-before-output -p icmpv6 --icmpv6-type 152 -s fe80::/10 -m hl --hl-eq 1 -j ACCEPT
-A ufw6-before-output -p icmpv6 --icmpv6-type 153 -s fe80::/10 -m hl --hl-eq 1 -j ACCEPT
# ====================== OUTPUT 出站区块结束 ======================

# ====================== FORWARD 转发ICMPv6【整段注释】 ======================
# 本服务器为纯业务公网主机,不开启IPv6转发、不做网关/路由,无需转发规则
# 若后续改为代理/网关,取消下方注释启用
#-A ufw6-before-forward -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT
#-A ufw6-before-forward -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT
#-A ufw6-before-forward -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT
#-A ufw6-before-forward -p icmpv6 --icmpv6-type parameter-problem -j ACCEPT
#-A ufw6-before-forward -p icmpv6 --icmpv6-type echo-request -j ACCEPT
#-A ufw6-before-forward -p icmpv6 --icmpv6-type echo-reply -j ACCEPT
# ====================== FORWARD 转发区块结束 ======================

# ====================== 固定尾部【绝对不能删除】 ======================
# COMMIT 标识所有规则写入内核,删除后所有IPv6规则全部失效
COMMIT

测试语句

语法离线校验(无报错再重载,避免断网)

1
2
# 校验IPv4 before.rules
iptables-restore --test /etc/ufw/before.rules
1
2
# 校验IPv6 before6.rules
ip6tables-restore --test /etc/ufw/before6.rules

无输出:规则语法正常;

有报错:打开 before.rules 修正语法,再重试。

加载配置

1
ufw reload
1
systemctl reload-or-restart ufw.service

查看所有规则过滤ICMPv4/v6

1
nft list ruleset | grep -E 'icmp|icmpv6'

单独看IPv4 INPUT链

1
nft list chain ip filter INPUT

同时存在:放行 3/11/12 诊断 ICMP、拦截 5/9/10/13/14 风险 ICMP、末尾兜底 DROP 所有未知 ICMP。

单独看IPv6 INPUT链

1
nft list chain ip6 filter INPUT

配置加载正确性校验

打印ufw-before-input链全部规则

1
iptables -S ufw-before-input

仅过滤ICMP相关规则

1
iptables -S ufw-before-input | grep icmp

必须完整出现 Ping 限流三条规则:

1
2
3
-A ufw-before-input -p icmp -m icmp --icmp-type 8 -m limit --limit 5/sec --limit-burst 10 -j ACCEPT
-A ufw-before-input -p icmp -m icmp --icmp-type 8 -j LOG --log-prefix "UFW_ICMP_FLOOD: " --log-ip-options
-A ufw-before-input -p icmp -m icmp --icmp-type 8 -j DROP

带流量计数可视化查看规则匹配包量

1
iptables -L ufw-before-input -v --line-numbers | grep icmp

清空计数,从零测试(可选)

1
iptables -Z ufw-before-input

查看ufw内置icmp配置文件

1
2
cat /etc/ufw/before.rules | grep -i icmp
cat /etc/ufw/after.rules | grep -i icmp

查看当前iptables icmp规则

1
2
iptables -L INPUT -v | grep icmp
ip6tables -L INPUT -v | grep icmpv6

fail2ban防御ICMP攻击

点击这里跳转ICMP的fail2ban配置

查看内核全局禁ping开关

1
sysctl net.ipv4.icmp_echo_ignore_all

查看反向路径过滤(防IP伪造)

1
sysctl net.ipv4.conf.all.rp_filter

启用内核级防护

开启反向路径过滤(防IP伪造):

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

确保ICMP响应未全局禁用

1
sysctl -w net.ipv4.icmp_echo_ignore_all=0  # 必须设为0,否则限速无效

永久生效:将参数写入/etc/sysctl.conf后执行sysctl -p

1
2
3
4
# 新创建网卡默认继承该配置
net.ipv4.conf.default.rp_filter=2
# 全局所有网卡统一生效,覆盖单网卡、default默认值
net.ipv4.conf.all.rp_filter=2

单网卡内核配置

先备份文件,再执行操作

1
nano  /etc/sysctl.d/99-sysctl.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
#
# /etc/sysctl.conf - Configuration file for setting system variables
# See /etc/sysctl.d/ for additional system variables.
# See sysctl.conf (5) for information.
#

#kernel.domainname = example.com

# Uncomment the following to stop low-level messages on console
#kernel.printk = 3 4 1 3

###################################################################
# Functions previously found in netbase
#

# Uncomment the next two lines to enable Spoof protection (reverse-path filter)
# Turn on Source Address Verification in all interfaces to
# prevent some spoofing attacks
#net.ipv4.conf.default.rp_filter=1
#net.ipv4.conf.all.rp_filter=1

# Uncomment the next line to enable TCP/IP SYN cookies
# See http://lwn.net/Articles/277146/
# Note: This may impact IPv6 TCP sessions too
#net.ipv4.tcp_syncookies=1

# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1

# Uncomment the next line to enable packet forwarding for IPv6
# Enabling this option disables Stateless Address Autoconfiguration
# based on Router Advertisements for this host
#net.ipv6.conf.all.forwarding=1


###################################################################
# Additional settings - these settings can improve the network
# security of the host and prevent against some network attacks
# including spoofing attacks and man in the middle attacks through
# redirection. Some network environments, however, require that these
# settings are disabled so review and enable them as needed.
#
# Do not accept ICMP redirects (prevent MITM attacks)
#net.ipv4.conf.all.accept_redirects = 0
#net.ipv6.conf.all.accept_redirects = 0
# _or_
# Accept ICMP redirects only for gateways listed in our default
# gateway list (enabled by default)
# net.ipv4.conf.all.secure_redirects = 1
#
# Do not send ICMP redirects (we are not a router)
#net.ipv4.conf.all.send_redirects = 0
#
# Do not accept IP source route packets (we are not a router)
#net.ipv4.conf.all.accept_source_route = 0
#net.ipv6.conf.all.accept_source_route = 0
#
# Log Martian Packets
#net.ipv4.conf.all.log_martians = 1
#

###################################################################
# Magic system request Key
# 0=disable, 1=enable all, >1 bitmask of sysrq functions
# See https://www.kernel.org/doc/html/latest/admin-guide/sysrq.html
# for what other values do
#kernel.sysrq=438
#


# /etc/sysctl.conf - 系统内核参数配置文件
# 说明:本文件用于持久化内核参数,修改后需执行 "sysctl -p" 生效
# 环境:4Mbps低带宽公网单网卡、BGP多线路、IPv4+IPv6双栈、无NAT/路由转发
# 策略:4Mbps参数默认生效,大带宽参数已注释备用,升级带宽时可直接取消注释
#

# ==================================================================================================
# 一、系统内存与内核调试基础配置(全带宽通用)
# ==================================================================================================

# ===================== 页缓存 & 脏页刷新(减少频繁刷盘,降低磁盘IO) =====================
# vm.dirty_background_ratio:后台刷盘阈值(占系统总内存百分比)
# 默认值:10
# 当前配置:10
# 执行逻辑:
# 内存中未写入磁盘的缓存数据叫「脏页」;
# 当脏页内存占总内存 ≥10%,内核后台启动pdflush线程异步刷盘;
# 调低该值(5~10)适合机械硬盘HDD,避免瞬间大量刷盘打满磁盘IO;
# SSD可保持10,兼顾缓存与刷盘压力。
#vm.dirty_background_ratio = 10

# vm.dirty_ratio:前台阻塞刷盘阈值(总内存占比)
# 默认值:20
# 当前配置:30
# 执行逻辑:
# 脏页内存达到30%时,**所有写操作进程直接阻塞**,强制同步刷盘;
# 调高到30%允许系统缓存更多静态文件数据在内存,减少磁盘重复读取;
# 你的场景是只读静态XML,几乎无写入,调高无风险,提升内存缓存命中率。
# vm.dirty_ratio = 30

# vm.dirty_expire_centisecs:脏页最小存活时间(单位:百分之一秒,100=1秒)
# 默认值:3000(30秒)
# 当前配置:3000
# 执行逻辑:脏页至少在内存停留30秒才会被后台刷盘;
# 同一XML短时间多次回源时,直接复用内存脏页,不用重读磁盘;
# 适合CDN高频重复请求同一份静态文件。
#vm.dirty_expire_centisecs = 3000

# vm.dirty_writeback_centisecs:后台pdflush扫描脏页的间隔(百分之一秒)
# 默认值:500(5秒)
# 当前配置:500
# 执行逻辑:内核每5秒扫描一次内存脏页,判断是否需要后台刷盘;
# 缩短可减少脏页堆积,拉长会缓存更多数据,5秒是均衡通用值。
#vm.dirty_writeback_centisecs = 500

# 内存交换倾向值(0-100)
# 当前值=80:表示系统倾向于积极使用Swap交换分区;数值越大,系统越倾向把内存数据挪到swap磁盘;0=尽量不用swap,100=优先用swap
# 原理:数值越大越积极使用Swap。80适合内存紧张或需要预留物理内存给文件缓存的场景;若内存充足建议10~20以减少磁盘IO
# 注意:此值已按你的要求保留为80,未做调整
vm.swappiness = 80

# vm.vfs_cache_pressure:内核回收目录/索引缓存的倾向(0~100)
# 默认值:100
# 当前配置:50
# 执行逻辑:
# 内核内存紧张时,优先回收两种缓存:1)文件内容页缓存 2)目录inode元数据缓存;
# 调低到50:减少回收inode缓存,缓存文件大小、修改时间、目录信息;
# Nginx open_file_cache依赖inode数据,降低重复磁盘stat()查询,减少磁盘IO。
vm.vfs_cache_pressure = 50

# ===================== 网络/文件系统辅助优化 =====================

# vm.max_map_count:进程最大内存映射mmap区域数量
# 默认:65530
# 当前:1.5G 131072 大于4G 262144
# 关键依赖:sendfile零拷贝、directio直接IO都依靠mmap;
# 大文件+并发读取会消耗大量mmap条目,数值过小导致aio读取失败、文件传输中断。
# vm.max_map_count = 262144

# ===================== 1. AIO 异步IO内核上限(配合nginx aio threads) =====================
# fs.aio-max-nr:系统全局最大异步IO事件总数
# 默认值:常见131072(128k)
# 当前配置:1048576(1024k)
# 作用说明:Nginx、MySQL、Gitea FFmpeg 都会占用 AIO 名额
# Nginx thread_pool 开启aio threads后,每一条磁盘读/写都会占用1个aio事件;
# 默认128k在高并发回源、大文件并发读取时会耗尽,aio阻塞、下载卡顿/断流;
# 设1048576给32线程线程池充足余量,允许大量并发异步磁盘读取不排队。
fs.aio-max-nr = 1048576

# 全局最大文件描述符数 fs.file-max ≈ 整机内存(KB) ÷ 10 × 2
# 原理:限制系统级可同时打开的文件/网络连接总数。默认理论值过大,实际受内核内存限制,盲目使用可能导致OOM。
# 100000 足以覆盖 4Mbps 带宽下的并发连接需求,并留有充足余量
fs.file-max = 100000

# 内核魔术快捷键SysRq开关
# 当前值=176:仅允许 sync/unmount/reboot 等安全操作
# 原理:当系统卡死无响应时,可通过键盘组合键(如Alt+SysRq+REISUB)安全重启、同步磁盘、杀死进程,是服务器运维排障的最后一道防线
# 安全提示:生产环境不建议全开(1),176 可防止物理接触时的恶意破坏
kernel.sysrq = 176

# 控制台内核日志打印等级
# 当前值=5:表示仅打印优先级高于5(KERN_NOTICE)的内核消息到控制台
# 原理:避免低级别调试日志刷屏控制台,影响正常运维操作,同时保留关键告警信息
# kernel.printk = 5

# ==================================================================================================
# 二、IPv4 独立完整区块:安全加固 + TCP优化 + ICMP防护 + ARP适配
# 当前生效:4Mbps低带宽适配参数 | 大带宽高并发参数已注释备用
# ==================================================================================================

# --- 2.1 防IP欺骗:反向路径校验 ---
# 对所有网卡启用反向路径过滤,丢弃源IP与路由表不匹配的伪造数据包
# 原理:防止攻击者伪造源IP发起CC攻击、扫描攻击,是基础防欺骗手段
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# --- 2.2 禁用危险源路由报文 ---
# 拒绝接收包含源路由选项的IP数据包
# 原理:源路由允许发送方指定数据包传输路径,攻击者可利用此特性绕过防火墙或进行流量劫持;服务器不做路由器,必须关闭
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# --- 2.3 关闭IPv4转发 ---
# 禁用内核IP转发功能
# 原理:服务器仅作为终端主机,不做网关/NAT跳板;关闭转发可避免被利用为攻击肉鸡,减少不必要的内核路由处理开销
net.ipv4.ip_forward = 0

# --- 2.4 禁用ICMPv4重定向 ---
# 拒绝接收和发送ICMP重定向报文
# 原理:ICMP重定向可被攻击者用于中间人攻击,篡改主机路由表;服务器不做路由器,无需处理重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
# send_redirects=0 禁止本机向外发送ICMP重定向报文,防止本机被控制后向全网下发恶意路由误导其他主机
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

# --- 2.5 记录伪造火星包 ---
# 记录源IP无效/不可达的异常数据包到系统日志
# 原理:用于攻击溯源和安全审计,帮助识别网络中的扫描、欺骗行为;开启后需配合日志轮转避免日志膨胀
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1

# --- 2.6 云主机ARP缓存优化 ---
# ARP缓存垃圾回收时间设为120秒
# 原理:云环境虚拟网卡跨网关通信时,默认ARP缓存超时过长会导致断流
net.ipv4.neigh.default.gc_stale_time = 120
# arp_announce=2 严格ARP宣告模式,只宣告本机出站网卡对应IP
# 原理:云服务器多IP、虚拟网卡环境,避免ARP广播错乱导致内网/公网访问断流
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2

# --- 2.7 TCP 抗DDoS与连接优化 ---
# 启用SYN Cookie防御SYN洪水攻击
# 原理:当SYN队列满时,通过加密Cookie验证客户端,不分配内核资源;兼顾新旧内核TCP特性,是抗SYN Flood的基础手段
net.ipv4.tcp_syncookies = 1

# SYN-ACK重试次数设为2次
# 原理:减少无效半连接在内核中的停留时间,快速释放资源;默认5次过长,2次在低带宽下可平衡连接成功率与资源占用
net.ipv4.tcp_synack_retries = 2

# 复用TIME_WAIT状态的端口
# 原理:允许将TIME_WAIT状态的端口用于新的出站连接,解决短连接频繁创建导致的端口耗尽问题;仅对出站连接生效,不影响入站安全
net.ipv4.tcp_tw_reuse = 1

# 强制开启TCP时间戳
# 原理:该参数是 tcp_tw_reuse 生效的必要条件(依赖时间戳校验新旧连接安全性)。虽多数系统默认开启,但生产环境必须显式声明以避免兼容性风险
net.ipv4.tcp_timestamps = 1

# 启用TCP选择性确认,加速丢包恢复
# 原理:在BGP多线路等存在波动的公网环境中,SACK能让接收端告知发送端具体缺失的数据块,避免盲目重传整个窗口
net.ipv4.tcp_sack = 1

# 注意:tcp_tw_recycle 已在Linux 4.12+内核中彻底移除
# 原理:旧内核中该参数在NAT环境下会导致客户端连接被误丢弃;现代内核通过tcp_tw_reuse+tcp_fin_timeout已足够处理TIME_WAIT,无需也不应配置此项
# net.ipv4.tcp_tw_recycle = 0

# --- 【4Mbps 低带宽当前生效参数】 ---
# SYN半连接队列最大长度设为1024
# 原理:低带宽下连接建立速率有限,1024足够承载;过大会导致内核维护过多半连接状态,增加内存开销和攻击面
net.ipv4.tcp_max_syn_backlog = 1024

# TIME_WAIT套接字最大数量设为40000
# 原理:允许同时存在的 TIME_WAIT 状态 TCP 连接的最大数量(单位:条)。合理值 = 每秒新建连接数 × TIME_WAIT持续时间(120s) × 安全系数(1.5~2)
# 40000 可容纳正常业务峰值,避免触发内核强制清理导致连接异常和日志膨胀,且内存占用极低
net.ipv4.tcp_max_tw_buckets = 40000

# 长连接空闲时不重置慢启动阈值
# 原理:BGP/SSH等跨地域长连接在空闲后恢复传输时,避免重新从低速慢启动开始,保持已有带宽探测结果,提升跨地域链路体验
net.ipv4.tcp_slow_start_after_idle = 1

# 监听队列最大长度设为1024
# 原理:限制应用层未accept的连接队列大小;低带宽下1024足够,过大会导致应用层处理不过来,反而增加连接延迟
net.core.somaxconn = 1024

# TCP连接关闭后FIN-WAIT-2状态超时时间设为30秒
# 原理:默认60秒过长,30秒可加快无效连接回收;低带宽下连接生命周期短,缩短超时可释放内核资源,避免堆积
net.ipv4.tcp_fin_timeout = 30

# 连接跟踪参数(仅当使用 conntrack 防火墙如 iptables/nftables 时生效)
# 原理:控制连接跟踪表的最大条目数。默认值(通常 65536)在4Mbps下可能不足,溢出会导致新连接被丢弃
net.netfilter.nf_conntrack_max = 100000
# 已建立TCP连接的超时时间(秒),默认 5天(432000秒)
# 原理:设为 86400(1天)可加速释放闲置连接,避免跟踪表被僵尸连接占满,尤其适合短连接高频场景
net.netfilter.nf_conntrack_tcp_timeout_established = 86400

# --- 【100M/200M+ 大带宽备用参数|取消注释即可启用】 ---
# 大带宽高并发场景扩容SYN队列
# net.ipv4.tcp_max_syn_backlog = 4096
# 大带宽高并发场景扩容TIME_WAIT桶
# net.ipv4.tcp_max_tw_buckets = 40000
# 大带宽高并发场景扩容监听队列
# net.core.somaxconn = 4096
# 大带宽高并发场景加速连接回收
# net.ipv4.tcp_fin_timeout = 20

# --- 2.8 ICMPv4 安全防护 ---
# 不全局禁ping,保留防火墙限流/封禁的有效性
# 原理:全局禁ping会导致所有ICMP探测被内核直接丢弃,防火墙规则无法生效;保留0可让UFW/iptables精细控制ping频率和黑白名单
net.ipv4.icmp_echo_ignore_all = 0

# 屏蔽广播ping响应
# 原理:防御Smurf放大攻击,攻击者向广播地址发送伪造源IP的ping请求,若主机响应会导致流量放大;服务器无需响应广播ping
net.ipv4.icmp_echo_ignore_broadcasts = 1

# 过滤畸形ICMP错误响应报文
# 原理:丢弃不符合RFC规范的ICMP错误报文,减少内核垃圾日志和无效处理开销;不影响正常ICMP通信
net.ipv4.icmp_ignore_bogus_error_responses = 1

# ==================================================================================================
# 三、IPv6 独立完整区块:双栈启用 + 安全加固 + ICMPv6限速防攻击
# 当前生效:4Mbps低带宽限速参数 | 大带宽宽松限速参数已注释备用
# ==================================================================================================

# --- 3.1 全局开启IPv6双栈 ---
# 在所有网卡、默认配置、回环口上启用IPv6
# 原理:确保IPv6双栈完整可用,避免因部分接口禁用IPv6导致DNS解析、连接协商异常
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0

# --- 3.2 禁用IPv6临时地址(公网服务器必备) ---
# 关闭IPv6隐私扩展生成的临时地址
# 原理:默认情况下IPv6会周期性更换临时地址,会导致长连接源IP突变被服务端丢弃、日志溯源混乱及增加内核开销。
# 公网服务器必须固定使用稳定分配的IPv6地址,确保服务连续性和安全审计
net.ipv6.conf.all.use_tempaddr = 0
net.ipv6.conf.default.use_tempaddr = 0

# --- 3.3 IPv6安全加固 ---
# 禁用IPv6源路由、重定向、转发
# 原理:与IPv4安全策略对齐,防止IPv6层面的路由劫持、中间人攻击;服务器不做IPv6路由器,必须关闭转发
net.ipv6.conf.all.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
net.ipv6.conf.all.forwarding = 0
net.ipv6.conf.default.forwarding = 0

# --- 3.4 ICMPv6 精细化防攻击策略 ---
# 忽略ICMPv6组播回显请求(系统中可能没有这个配置值)
# 原理:组播ping通常用于网络发现,正常业务无需响应;忽略可减少不必要的内核处理和带宽占用
# net.ipv6.conf.all.icmpv6_echo_ignore_multicast = 1
# net.ipv6.conf.default.icmpv6_echo_ignore_multicast = 1

# 过滤畸形ICMPv6错误响应(系统中可能没这个值)
# 原理:与IPv4策略对齐,丢弃不符合规范的ICMPv6错误报文,减少垃圾日志
# net.ipv6.conf.all.icmpv6_ignore_bogus_error_responses = 1
# net.ipv6.conf.default.icmpv6_ignore_bogus_error_responses = 1

# --- 【4Mbps 低带宽当前生效】ICMPv6限速与协议栈优化 ---
# ICMPv6报文速率限制为30个/秒(系统中可能没这个值)
# 原理:IPv6依赖ICMPv6进行邻居发现、路径MTU探测等核心功能,不能全局禁;30个/秒可过滤洪水攻击,同时保留正常协议通信
# net.ipv6.icmpv6_ratelimit = 30

# 邻居表大小(防 NDP 耗尽)
# 原理:默认 1024,高并发场景下需调高,避免邻居发现协议缓存溢出导致IPv6通信中断
net.ipv6.neigh.default.gc_thresh3 = 8192

# 路由缓存优化
# 原理:默认 60 秒,调大可避免频繁重建路由,减少低带宽下的CPU开销
net.ipv6.route.gc_timeout = 3600

# IPv6 TIME_WAIT套接字最大数量(系统中可能没这个值)
# 原理:建议与 IPv4 值保持一致,防止IPv6侧突发流量触发内核强制清理
# net.ipv6.tcp_max_tw_buckets = 40000

# IPv6 连接超时优化(系统中可能没这个值)
# 原理:缩短保活探测间隔,加速释放闲置连接,避免跟踪表被僵尸连接占满
# net.ipv6.tcp_keepalive_time = 600
# net.ipv6.tcp_fin_timeout = 60

# --- 【100M/200M+ 大带宽备用】宽松限速 ---
# 大带宽可承载更多正常ICMPv6探测报文,放宽限速至100个/秒
# net.ipv6.icmpv6_ratelimit = 100

# ==================================================================================================
# 四、全局双栈拥塞调度(IPv4/IPv6共用)
# 当前生效:4Mbps低带宽缓冲限制 | 大带宽缓冲参数已注释备用
# ==================================================================================================

# 默认:centos/bbr系统bbr,debian默认cubic
# 当前:cubic
# 适用:普通服务器、非专线跨运营商CDN链路,延迟波动场景更稳定;专线可切换bbr。
# 启用BBR拥塞控制算法
# 原理:BBR通过建模带宽和RTT来发送数据,而非依赖丢包反馈;在BGP高延迟、跨地域、低带宽链路上可显著提升吞吐量和降低延迟
net.ipv4.tcp_congestion_control = bbr

# 默认队列调度器设为fq_codel
# 原理:fq_codel结合公平队列和主动队列管理,可有效抑制bufferbloat(缓冲区膨胀),保证低带宽下交互式流量(SSH、游戏)的低延迟
net.core.default_qdisc = fq_codel

# --- 【4Mbps 低带宽当前生效】网卡缓冲 ---
# 网卡接收队列最大长度设为500
# 原理:低带宽下数据包到达速率慢,500足够承载;过大会导致数据包在内核队列中堆积,增加延迟;此参数配合fq_codel彻底解决低带宽bufferbloat问题
net.core.netdev_max_backlog = 500

# net.ipv4.tcp_no_metrics_save:不保存TCP拥塞状态记录
# 默认:0
# 当前:1
# 作用:频繁新建/销毁CDN回源连接时,不缓存旧链路拥塞数据,新连接不会被旧的差链路参数拖累。
# net.ipv4.tcp_no_metrics_save = 1

# net.ipv4.tcp_keepalive_time:空闲多久后发送保活探测包(单位秒)
# 默认:7200(2小时)
# 当前:60
# 执行逻辑:TCP链路空闲30秒就开始发保活包;
# CDN中间链路防火墙会静默断开长时间空闲连接,缩短探测时间提前识别断网。
net.ipv4.tcp_keepalive_time = 60

# net.ipv4.tcp_keepalive_intvl:保活探测包发送间隔(秒)
# 默认:75
# 当前:10
# 空闲后每5秒发一次探测包,快速检测链路假死。
net.ipv4.tcp_keepalive_intvl = 10

# net.ipv4.tcp_keepalive_probes:探测失败多少次判定连接死亡
# 默认:9
# 当前:3
# 连续3次无ACK响应,内核直接关闭TCP连接,快速释放资源,避免僵死连接占用句柄。
net.ipv4.tcp_keepalive_probes = 3

#BDP = 带宽 (Bandwidth) × 往返延迟 (RTT)
#BDP = 带宽 × RTT = 1,000,000,000 bits/s × 0.2 s = 200,000,000 bits
# 设置所有新创建套接字的默认发送缓冲区大小(单位:字节)
# 建议值:1MB (1048576) 或更高,根据带宽和延迟调整
# 适用于 Nginx、文件下载、API 响应等场景,确保大文件或高吞吐传输稳定
net.core.wmem_default = 1048576

# 全局最大套接字接收/发送缓冲区大小 根据内存调整
# BDP = 200*10^6 * 0.05 /8 = 1,250,000 Byte ≈ 1.22MB
# BDP = 500*10^6 *0.05 /8 = 3,125,000 Byte ≈ 3.0MB
# 原理:大带宽高延迟链路需要更大的缓冲区来维持管道满载;4Mbps下16MB过大,会导致内存浪费和连接抖动
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152

# --- 【100M/200M+ 大带宽备用】网卡缓冲 ---
# 大流量场景提升网卡接收队列至2000,减少高吞吐下的丢包
# net.core.netdev_max_backlog = 2000

# ==================================================================================================
# 五、TCP缓冲区大带宽专属配置【200Mbps+ 专用|默认注释不生效】
# 说明:4Mbps小带宽无需大缓冲区,避免内存浪费、连接抖动
# 带宽升级至200M及以上,可全部取消注释启用,跑满大带宽吞吐量
# ==================================================================================================

# 全局最大套接字接收/发送缓冲区大小 1-199mbps:2MB 200M:(16MB)
# 原理:大带宽高延迟链路需要更大的缓冲区来维持管道满载;4Mbps下16MB过大,会导致内存浪费和连接抖动
# net.core.rmem_max = 16777216
# net.core.wmem_max = 16777216

# TCP自动调优缓冲区范围(最小 默认 最大)
# 原理:定义TCP连接缓冲区的动态调整范围;大带宽下需要更大的默认值和最大值来匹配链路带宽延迟积
# net.ipv4.tcp_wmem = 4096 1048576 2097152
# net.ipv4.tcp_rmem = 4096 1048576 16777216

# 启用TCP窗口缩放
# 原理:突破TCP头部64KB窗口限制,支持GB级窗口;大带宽高延迟链路必备,4Mbps下64KB已足够
# net.ipv4.tcp_window_scaling = 1

# 启用缓冲区内核自动动态优化
# 原理:内核根据连接状态自动调整缓冲区大小,无需手动调优;大带宽下建议开启
# net.ipv4.tcp_moderate_rcvbuf = 1

# ==================================================================================================
# 【IPv6 大带宽专属配置|升级 100M/500M+ 时取消注释】
# 说明:IPv6 缓冲区与 IPv4 独立,升级带宽时必须同步放开,否则 IPv6 侧流量会因窗口过小被限速
# ==================================================================================================


# IPv6 全局最大套接字接收/发送缓冲区大小(16MB)
# 原理:与 IPv4 对齐,确保大带宽高延迟链路下管道满载
# net.core.rmem_max = 16777216 # (若IPv4已在全局配置,此项无需重复)
# net.core.wmem_max = 16777216 # (若IPv4已在全局配置,此项无需重复)

# IPv6 TCP 自动调优缓冲区范围(最小 默认 最大)(系统中可能没有这个参数)
# 原理:允许 IPv6 连接根据链路状况动态扩大缓冲区,跑满 500M 带宽必备
# net.ipv6.tcp_wmem = 4096 1048576 2097152
# net.ipv6.tcp_rmem = 4096 1048576 16777216

路由劫持 / IP 欺骗防御段

拦截伪造 ICMP 重定向、源 IP 扫描欺骗包;单网卡 BGP、SSH、网站无任何丢包、延迟副作用。

ICMP 双层防护

内核放开 ping 流量交给 UFW 精细化限流,同时屏蔽广播 ping、无效 ICMP 垃圾日志,不影响 PMTU 大包探测、mtr 线路诊断。

TCP 抗洪水优化

SYN Cookie + 扩大半连接队列,海量 CC/SYN 攻击下不会耗尽连接表,BGP 邻居会话稳定不断连。

BBR 线路加速

跨运营商 BGP 路由表同步速度提升,减少大路由更新时的延迟与抖动。

云服务器兼容保留

ARP、tw_buckets、synack 重试等云主机专属参数完整保留,不会触发阿里云虚拟网卡异常。.

Linux 公网双栈服务器网络调优与运维指南

适用环境:IPv4/IPv6 双栈、BGP 多线路、无 NAT/路由转发
当前基线:4Mbps 低带宽(保守策略,防 Bufferbloat)
扩展能力:支持平滑升级至 500Mbps+(通过解锁预留参数)


📋 当前配置核心注意点(4Mbps 基线)

关键参数逻辑

参数 当前值 核心作用 注意事项
vm.swappiness 80 积极使用 Swap 适合内存紧张场景;若内存充足(>16G)建议降至 10-20 以减少磁盘 IO。
kernel.sysrq 176 安全重启快捷键 仅允许 sync/unmount/reboot,防止物理接触时的恶意破坏,切勿改为 1
tcp_slow_start_after_idle 1 空闲后重置慢启动 当前为保守值。若发现 SSH/长连接空闲后首包卡顿,需改为 0(BGP 稳定链路推荐)。
tcp_tw_reuse 1 复用 TIME_WAIT 必须配合 tcp_timestamps=1;仅对出站连接(客户端)有效,服务端无效。
use_tempaddr 0 禁用 IPv6 临时地址 公网服务器必备。防止因 IPv6 地址周期性更换导致长连接断开或日志溯源失败。
fs.file-max 100000 系统级文件句柄 4Mbps 下足够;升级 500M 前必须调大,否则触发 Too many open files

安全与防护

  • ICMPv6 不可禁:配置中仅做限速(30/s),严禁 icmpv6_echo_ignore_all=1,否则 IPv6 邻居发现(NDP)和 MTU 探测失效,导致断网。
  • Conntrack 监控:若使用 iptables/nftables,nf_conntrack_max=100000 是 4Mbps 的安全线;需定期执行 conntrack -S | grep drop 检查是否溢出。
  • 反向路径过滤rp_filter=1 在 BGP 多线路下若出现单通(能 ping 通但无法访问),需临时改为 2(宽松模式)排查。

🚀 带宽升级操作清单(4Mbps ➔ 500Mbps)

当带宽升级时,不要直接覆盖配置,请按以下步骤“解锁”预留参数并补充瓶颈项:

Step 1: 解锁内核预留参数

编辑 /etc/sysctl.conf删除以下区块行首的 #

  1. IPv4 大带宽备用区

    1
    2
    3
    4
    net.ipv4.tcp_max_syn_backlog = 4096
    net.ipv4.tcp_max_tw_buckets = 40000 # 或根据公式计算
    net.core.somaxconn = 4096
    net.ipv4.tcp_fin_timeout = 20
  2. TCP 缓冲区大带宽专属区

    1
    2
    3
    4
    5
    6
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    net.ipv4.tcp_wmem = 4096 1048576 2097152
    net.ipv4.tcp_rmem = 4096 1048576 16777216
    net.ipv4.tcp_window_scaling = 1
    net.ipv4.tcp_moderate_rcvbuf = 1
  3. 网卡缓冲扩容

    1
    net.core.netdev_max_backlog = 2000

Step 2: 补充系统级瓶颈参数(必须!)

在配置文件中新增或修改以下项,防止高并发下系统崩溃:(高并发情况下使用,可以搜索对应功能)

1
2
# 1. 扩大本地端口范围(防端口耗尽,500M 必备) 格式 net.ipv4.ip_local_port_range = 最小值 最大值
net.ipv4.ip_local_port_range = 1024 65535

定义 Linux 系统发起对外 TCP/UDP 连接时,自动选用的「临时源端口(外出端口)范围」

当你的服务器主动去连接别的机器(客户端角色),内核会从这个区间挑选一个未占用端口作为本地源端口建立连接。

区分清楚:

  • 监听端口nginx:80):用于接收别人连进来,不受此参数控制
  • 本地临时端口:服务器主动向外发起连接使用,由 ip_local_port_range 管控
1
2
3
4
5
6
# 2. 提升系统级文件描述符(10万在 500M 下极易触顶)
fs.file-max = 1000000

# 3. 扩大连接跟踪表(若使用防火墙,防止静默丢包)
net.netfilter.nf_conntrack_max = 1000000
net.netfilter.nf_conntrack_tcp_timeout_established = 86400

Step 3: 补充 IPv6 大带宽专属参数

IPv6 缓冲区与 IPv4 独立,升级带宽时必须同步放开,否则 IPv6 侧流量会因窗口过小被限速:

1
2
3
4
5
6
# IPv6 TCP 自动调优缓冲区范围(最小 默认 最大)
net.ipv6.tcp_wmem = 4096 1048576 2097152
net.ipv6.tcp_rmem = 4096 1048576 16777216

# 双栈高并发下,建议将连接跟踪表上限进一步提升
net.netfilter.nf_conntrack_max = 2000000

Step 4: 用户级限制同步

编辑 /etc/security/limits.conf,确保进程不被 ulimit 卡死:

1
2
3
4
* soft nofile 655350
* hard nofile 655350
* soft nproc 65535
* hard nproc 65535

Step 5: 生效与验证

1
2
# 1. 加载配置
sysctl -p
1
2
3
# 2.sysctl 内核参数重载
# **全量加载所有 sysctl 配置(包含 99-sysctl.conf)**
sysctl --system
1
2
3
4
5
# 3. 检查关键值
sysctl net.ipv4.ip_local_port_range \
sysctl fs.file-max \
sysctl net.core.somaxconn \
sysctl net.ipv6.tcp_rmem

🔍 故障排查与监控命令

连接丢失/拒绝排查

现象 检查命令 关键指标
Cannot assign requested address ss -s | grep time-wait TIME_WAIT 是否接近 tcp_max_tw_buckets
Too many open files cat /proc/sys/fs/file-nr 第1列是否接近第3列(fs.file-max)?
新连接被静默丢弃 conntrack -S | grep drop drop 计数是否持续增长?
IPv6 能 Ping 但无法访问 ip -6 neigh show | grep FAILED 邻居发现是否失败?(检查 ICMPv6 是否被拦截)
长连接空闲后卡顿 ss -ti | grep cwnd 空闲后 cwnd 是否重置为 10?(需改 tcp_slow_start_after_idle=0

性能瓶颈监控

1
2
3
4
5
6
7
8
# 查看 TCP 重传与丢包(关注 RetransSegs 和 OutRsts)
netstat -s | grep -E "retrans|drop|pruned"

# 查看网卡队列堆积(若 backlog 持续 > 0,需调大 netdev_max_backlog)
watch -n 1 "cat /proc/net/softnet_stat | awk '{print \$1, \$2, \$3}'"

# 查看 BBR 状态(确认拥塞控制是否生效)
ss -ti | grep bbr

⚠️ 四、常见误区警告

  1. 不要开启 tcp_tw_recycle:该参数在 NAT 环境下(如公网用户)会导致随机丢包,Linux 4.12+ 已移除,永远保持注释或 0
  2. 不要盲目调大 tcp_max_tw_buckets:4Mbps 下设为 40000 足够,过大只会浪费内存,无法解决端口耗尽(那是 ip_local_port_range 的问题)。
  3. IPv6 临时地址:生产服务器必须 use_tempaddr=0,否则日志 IP 变动会导致安全审计失效。
  4. Swap 策略vm.swappiness=80 适合小内存机器;若服务器内存 > 32G,建议改为 10,避免数据库等关键进程被换出。
  5. IPv6 缓冲区:升级带宽时务必检查 net.ipv6.tcp_rmemnet.ipv6.tcp_wmem,仅调大 IPv4 缓冲区会导致 IPv6 侧无法跑满带宽。

内存页缓存、脏页、VFS、AIO、TCP 保活全局内核调优

适用场景:Nginx CDN 静态资源回源、大量 XML / 静态文件只读、高并发磁盘读取、长连接链路防断流;优化脏页刷盘 IO、inode 缓存、异步 IO 上限、TCP 僵死连接快速回收

1
2
3
4
5
6
7
8
9
10
11
12
vm.dirty_background_ratio
vm.dirty_ratio
vm.dirty_expire_centisecs
vm.dirty_writeback_centisecs
vm.vfs_cache_pressure
vm.max_map_count
fs.aio-max-nr
net.core.wmem_default
net.ipv4.tcp_no_metrics_save
net.ipv4.tcp_keepalive_time
net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_probes
参数名称 默认值 推荐配置值 核心作用 配置注意事项 / 风险点 适用场景
vm.dirty_background_ratio 10 10 后台异步刷盘阈值,脏页占比达标后 pdflush 静默刷盘 SSD 保持 10 即可;HDD 建议调低至 5~8,避免集中刷盘打满 IO;纯读业务无负面影响 机械硬盘 / 固态硬盘通用
vm.dirty_ratio 20 30 前台强制同步刷盘阈值,达标后所有写进程阻塞 内存<4G 的机器不建议调太高,避免缓存挤占业务内存;纯只读场景调高无风险,写密集型业务需谨慎,防止瞬间阻塞 静态文件 CDN 回源、读多写少
vm.dirty_expire_centisecs 3000(30 秒) 3000 脏页在内存最短存活时间,到期才允许后台刷盘 时间越长缓存命中率越高,但异常掉电丢失数据风险越大;静态只读文件无数据丢失风险,可放心拉长 高频重复读取同一份文件
vm.dirty_writeback_centisecs 500(5 秒) 500 内核扫描脏页、判断是否刷盘的间隔 缩短会增加 CPU 开销、刷盘更频繁;拉长会堆积更多脏页;5 秒为通用均衡值,不建议随意大幅调整 绝大多数服务器通用
vm.vfs_cache_pressure 100 50 控制 inode / 目录元数据缓存回收倾向,数值越低越优先保留元数据 不建议低于 10,过低会导致内存紧张时无法回收元数据,引发 OOM;Nginx open_file_cache 场景收益显著 大量小文件、目录遍历频繁
vm.max_map_count 65530 262144 单进程 mmap 内存映射区域最大数量 sendfile、directio、aio 均依赖 mmap;数值过小会导致大文件并发读取中断、报错;调高无明显副作用,仅略微增加内核管理开销 大文件传输、零拷贝、AIO 异步 IO
fs.aio-max-nr 131072 1048576 系统全局异步 IO 事件总数上限 Nginx aio threads 高并发下默认值极易耗尽,导致读阻塞、下载断流;调高后需确认应用实际用量,避免无限制放大 Nginx thread_pool、高并发磁盘异步读取
net.ipv4.tcp_no_metrics_save 0 1 不保存 TCP 拥塞状态历史,新连接不受旧链路拖累 短连接频繁创建销毁场景收益明显;长连接稳定传输场景影响不大;开启无负面性能影响 CDN 回源、大量短连接 HTTP 请求
net.ipv4.tcp_keepalive_time 7200(2 小时) 60 TCP 空闲多久后开始发送保活探测包 缩短可更快识别中间防火墙断开的死链;不建议低于 30 秒,过于频繁会增加无效探测包流量 长连接、CDN 中间链路、NAT 防火墙环境
net.ipv4.tcp_keepalive_intvl 75 10 保活探测包发送间隔 间隔越小检测越快,但网络开销略增;配合 probes 控制总判定时长 快速检测链路假死场景
net.ipv4.tcp_keepalive_probes 9 3 连续探测失败多少次判定连接死亡 数值越小释放死连接越快,但误判概率略高;建议总判定时长 = time + intvl×probes ≥ 90 秒 高并发服务器快速回收僵死连接
net.core.wmem_default 212992 1048576

校验命令

1
2
3
4
5
# 批量查看当前生效值
sysctl vm.dirty_background_ratio vm.dirty_ratio vm.dirty_expire_centisecs \
vm.dirty_writeback_centisecs vm.vfs_cache_pressure vm.max_map_count \
fs.aio-max-nr net.ipv4.tcp_no_metrics_save net.ipv4.tcp_keepalive_time \
net.ipv4.tcp_keepalive_intvl net.ipv4.tcp_keepalive_probes

双网卡内核配置

校验 sysctl 内核加固参数是否加载生效

内存与调试

1
sysctl vm.swappiness kernel.sysrq

网络安全防劫持参数

1
2
3
4
5
6
7
sysctl \
net.ipv4.conf.all.rp_filter \
net.ipv4.conf.default.rp_filter \
net.ipv4.conf.all.accept_source_route \
net.ipv4.ip_forward \
net.ipv4.conf.all.accept_redirects \
net.ipv4.conf.all.send_redirects

TCP并发、抗洪水参数

1
2
3
4
5
6
sysctl \
net.ipv4.tcp_syncookies \
net.ipv4.tcp_max_syn_backlog \
net.ipv4.tcp_tw_reuse \
net.ipv4.tcp_fin_timeout \
net.core.somaxconn

ICMP内核管控

1
2
3
4
sysctl \
net.ipv4.icmp_echo_ignore_all \
net.ipv4.icmp_echo_ignore_broadcasts \
net.ipv4.conf.all.log_martians

BBR拥塞控制

1
sysctl net.ipv4.tcp_congestion_control net.core.default_qdisc
对比项 fq fq_codel
内置 AQM(拥塞队列管理) ❌ 无,仅尾部丢包(tail drop) ✅ CoDel,基于包驻留时间动态丢包
Bufferbloat(缓冲区膨胀) 无法根治,大流量下延迟暴涨 专门解决,维持队列低延迟(目标 5ms)
丢包逻辑 队列满了才一次性丢大量包,易触发 TCP 全局同步 队列滞留超时主动提前丢包,精准抑制单流缓存堆积
单流带宽抢占隔离 有,每流独立队列 有,每流独立队列 + 超时限流双重隔离
BBR 适配 Google 官方推荐原生搭配 fq,早年 BBR 依赖 fq pacing 新版内核 BBR 可兼容,但吞吐理论略低于 fq
CPU 开销 更低,逻辑简单 略高,额外执行 CoDel 延迟计算
默认发行版 极少默认 Ubuntu/Debian/RHEL9 系统默认 qdisc
UDP 实时流量(游戏 / 语音) 高负载下延迟抖动严重 实时小包优先,大下载不会卡死 UDP
ECN 显式拥塞标记 不支持 原生支持 ECN,不丢包仅标记拥塞