适合读者:后端开发,知道 ping、IP、端口这些基本概念,但对防火墙、iptables、安全组不太熟。
一、问题背景
刚部署好 Jenkins,需要在另一台机器(从节点)上运行 agent.jar 连接主节点。从节点需要先从主节点下载 agent.jar,命令是:
bash
curl -O http://jenkins.localhost.prod.com:8080/jenkins/jnlpJars/agent.jar
结果------下载不了,连接超时。
但诡异的是,从节点 ping 主节点是通的:
bash
ping jenkins.localhost.prod.com
# PING jenkins.localhost.prod.com (192.168.251.213) 56(84) bytes of data.
# 64 bytes from ... time=0.386 ms ✅ 通!
ping 通,但下载文件不通。 这篇博客就是把这个问题的排查过程完整复盘,顺带把机器之间通信的"拦截层"体系讲清楚。
二、排查过程:一步步缩小范围
2.1 第一步:确认 Jenkins 到底跑在哪个端口
端口是什么? 一台机器上可以同时跑很多服务(Web 服务、数据库、SSH),每个服务绑定一个数字编号,这个编号就是"端口"。比如 80 是 Web 默认端口,22 是 SSH 默认端口,8080 是 Java Web 应用常用端口。
bash
# 在 Jenkins 主节点上执行
ss -lntp | grep java
输出:
LISTEN 0 50 *:8080 *:* users:(("java",pid=2216964,fd=9))
结论:Jenkins 跑在 8080 端口,没问题。
2.2 第二步:查防火墙------8080 有没有被挡住
防火墙(firewall)是什么? 机器上的一道"安检门"。所有进出机器的网络数据,防火墙会按照你设置的规则决定"放行"还是"拦截"。
在 Linux 上,防火墙通常由 firewalld 服务管理。先看它是不是在运行:
bash
systemctl status firewalld
# Active: active (running) ✅ 在运行
再看当前放行了哪些端口:
bash
firewall-cmd --list-ports
# (空输出,什么都没放行!)
根因发现:防火墙在跑,但 8080 端口没有被放行。 于是加规则:
bash
firewall-cmd --zone=public --add-port=8080/tcp --permanent && firewall-cmd --reload
2.3 第三步:加了规则还是不通 ------ 发现网卡没绑定
规则加了,但从节点还是超时。继续排查,发现一个更隐蔽的问题:
bash
firewall-cmd --get-active-zones
# (空输出!)
Zone(区域)是什么? firewalld 把网络接口(网卡)归入不同的"区域",每个区域有自己的一套放行规则。firewalld 预定义了 9 种 zone,按信任度从低到高排列:
Zone 信任度 含义 drop最低 所有入站连接直接丢弃,连拒绝消息都不回复(彻底隐身) block极低 所有入站连接拒绝,但会回复拒绝消息 public低 默认 zone,适用于不可信的公网环境,只放行你明确配置的端口 external中低 用于 NAT 伪装的外部网络(如路由器出口) dmz中 隔离区(Demilitarized Zone),内网和公网之间的缓冲地带 work中高 工作网络,基本信任同网段的机器 home高 家庭网络,信任度高于 work internal很高 内部网络,高度信任 trusted最高 完全信任,所有入站连接无条件放行 日常场景中几乎只用两种:
public(默认,对外暴露的服务器)和trusted(内网里完全互信的机器)。
空输出的真正含义 :网卡没有绑定到任何 zone,所以刚才加的 8080 规则虽然写进了 public zone 的配置里,但没有网卡来"承载"这套规则。
因果链(重点):
#mermaid-svg-YWRNdvOefdTCABy5{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-YWRNdvOefdTCABy5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-YWRNdvOefdTCABy5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-YWRNdvOefdTCABy5 .error-icon{fill:#552222;}#mermaid-svg-YWRNdvOefdTCABy5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YWRNdvOefdTCABy5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-YWRNdvOefdTCABy5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YWRNdvOefdTCABy5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YWRNdvOefdTCABy5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-YWRNdvOefdTCABy5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YWRNdvOefdTCABy5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YWRNdvOefdTCABy5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YWRNdvOefdTCABy5 .marker.cross{stroke:#333333;}#mermaid-svg-YWRNdvOefdTCABy5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YWRNdvOefdTCABy5 p{margin:0;}#mermaid-svg-YWRNdvOefdTCABy5 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-YWRNdvOefdTCABy5 .cluster-label text{fill:#333;}#mermaid-svg-YWRNdvOefdTCABy5 .cluster-label span{color:#333;}#mermaid-svg-YWRNdvOefdTCABy5 .cluster-label span p{background-color:transparent;}#mermaid-svg-YWRNdvOefdTCABy5 .label text,#mermaid-svg-YWRNdvOefdTCABy5 span{fill:#333;color:#333;}#mermaid-svg-YWRNdvOefdTCABy5 .node rect,#mermaid-svg-YWRNdvOefdTCABy5 .node circle,#mermaid-svg-YWRNdvOefdTCABy5 .node ellipse,#mermaid-svg-YWRNdvOefdTCABy5 .node polygon,#mermaid-svg-YWRNdvOefdTCABy5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-YWRNdvOefdTCABy5 .rough-node .label text,#mermaid-svg-YWRNdvOefdTCABy5 .node .label text,#mermaid-svg-YWRNdvOefdTCABy5 .image-shape .label,#mermaid-svg-YWRNdvOefdTCABy5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-YWRNdvOefdTCABy5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-YWRNdvOefdTCABy5 .rough-node .label,#mermaid-svg-YWRNdvOefdTCABy5 .node .label,#mermaid-svg-YWRNdvOefdTCABy5 .image-shape .label,#mermaid-svg-YWRNdvOefdTCABy5 .icon-shape .label{text-align:center;}#mermaid-svg-YWRNdvOefdTCABy5 .node.clickable{cursor:pointer;}#mermaid-svg-YWRNdvOefdTCABy5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-YWRNdvOefdTCABy5 .arrowheadPath{fill:#333333;}#mermaid-svg-YWRNdvOefdTCABy5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-YWRNdvOefdTCABy5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-YWRNdvOefdTCABy5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YWRNdvOefdTCABy5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-YWRNdvOefdTCABy5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YWRNdvOefdTCABy5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-YWRNdvOefdTCABy5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-YWRNdvOefdTCABy5 .cluster text{fill:#333;}#mermaid-svg-YWRNdvOefdTCABy5 .cluster span{color:#333;}#mermaid-svg-YWRNdvOefdTCABy5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-YWRNdvOefdTCABy5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-YWRNdvOefdTCABy5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-YWRNdvOefdTCABy5 .icon-shape,#mermaid-svg-YWRNdvOefdTCABy5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YWRNdvOefdTCABy5 .icon-shape p,#mermaid-svg-YWRNdvOefdTCABy5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-YWRNdvOefdTCABy5 .icon-shape .label rect,#mermaid-svg-YWRNdvOefdTCABy5 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YWRNdvOefdTCABy5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-YWRNdvOefdTCABy5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-YWRNdvOefdTCABy5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 网卡 ens18 未绑定 zone
firewalld 不会为 ens18 生成
对应的 iptables 规则
数据包从 ens18 进入时
iptables INPUT 链走到 INPUT_ZONES 子链
INPUT_ZONES 的规则是:
IN_public 仅匹配来自 + 网卡(wildcard)的包
但 ens18 流量不匹配任何 zone 的规则
在 INPUT_ZONES 中匹配不到任何 ACCEPT
掉到链末尾的兜底规则:
REJECT all
❌ 数据包被拒绝
小技巧:验证这个因果链------执行
iptables -L IN_public_allow -n -v --line-numbers | grep 8080,如果 8080 的 ACCEPT 规则存在但pkts=0(匹配次数为 0),就说明规则写对了但流量没走这儿,大概率是网卡没绑定 zone。
bash
# 把 ens18 网卡绑到 public zone
firewall-cmd --zone=public --add-interface=ens18 --permanent && firewall-cmd --reload
# 确认绑定成功
firewall-cmd --get-active-zones
# public
# interfaces: ens18 ✅
2.4 第四步:还是不通 ------ 换个端口测试,发现 TCP 全死
8080 仍然不通,我换了一个思路:不用 Jenkins 端口测,换个最基础的端口------SSH 的 22 端口,看看是所有 TCP 都不通,还是只有 8080 不通。
TCP 是什么? 两台机器之间"传数据"使用的协议。ping 用的叫 ICMP(只测试通不通,不传实际数据),下载文件、SSH 登录、访问网页用的叫 TCP(真正传输数据的协议)。
bash
# 从节点测试主节点的 SSH 端口
nc -zv jenkins.localhost.prod.com 22 -w 3
# TIMEOUT ❌ 22 端口也不通!
这个发现是关键转折点------如果只有 8080 不通,那是 Jenkins 配置问题;但 22 也不通,说明问题不在应用层,而在网络层。
2.5 第五步:反向测试------主节点往从节点也测一下
bash
# 主节点测试从节点的 SSH 端口
nc -zv 192.168.251.11 22 -w 3
# TIMEOUT ❌ 反向也不通!
双向 TCP 全死,但 ping 双向都通。
2.6 第六步:对照线索,定位根因
整理所有线索:
| 线索 | 含义 |
|---|---|
| ping 通 | 两台机器在同一局域网,网络层可达 |
| ARP 表互见 | 二层链路没问题,能互相看到对方的 MAC 地址 |
| TCP 全不通(22、8080) | 不是某个应用的问题,是 TCP 协议被整体拦截 |
本地 iptables 规则正确,但 pkts=0 |
规则存在但无流量命中------排除本地防火墙问题 |
ARP 是什么? 在局域网里,机器之间通信最终靠 MAC 地址(网卡的物理地址,出厂烧录的)。ARP 就是"根据 IP 查 MAC 地址"的协议。ARP 表互见 = 两台机器确实在同一个局域网里。
iptables 是什么? Linux 内核自带的网络包过滤系统。你可以把它理解为"最底层的防火墙",直接在内核里拦截或放行数据包。firewalld 本质上是 iptables 的一个图形化/命令行封装,最终生成的也是 iptables 规则。
pkts 是什么?pkts是 packets (数据包)的缩写,表示"匹配到这条规则的累计数据包数量"。每有一个数据包命中某条 iptables 规则,该规则的pkts计数器就 +1。排查时的核心判断 :如果一条 ACCEPT 规则的pkts=0,说明从未有数据包走到这里------流量在更上游就被拦了;如果pkts在正常增长,说明规则生效、流量确实在走这条路。
结论只有一种可能:虚拟化平台层面有安全策略,专门拦截了 TCP 协议(但放行了 ICMP/ping)。 这超出了两台虚拟机自己能控制的范围,需要在麒麟虚拟化平台的管理后台去调整。
以上就是排查全过程。下面来系统讲讲------机器之间通信,到底有多少层"拦截"?
三、机器间通信的"拦截层"全景
两台机器通信,数据包从 A 出发到 B,一路上会经过多个"安检关卡"。每个关卡都可以选择放行或拦截。理解这个层级结构,是排查网络问题的基本功。
#mermaid-svg-sakLLdqVxuOF9Wwg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-sakLLdqVxuOF9Wwg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sakLLdqVxuOF9Wwg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sakLLdqVxuOF9Wwg .error-icon{fill:#552222;}#mermaid-svg-sakLLdqVxuOF9Wwg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sakLLdqVxuOF9Wwg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sakLLdqVxuOF9Wwg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sakLLdqVxuOF9Wwg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sakLLdqVxuOF9Wwg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sakLLdqVxuOF9Wwg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sakLLdqVxuOF9Wwg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sakLLdqVxuOF9Wwg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sakLLdqVxuOF9Wwg .marker.cross{stroke:#333333;}#mermaid-svg-sakLLdqVxuOF9Wwg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sakLLdqVxuOF9Wwg p{margin:0;}#mermaid-svg-sakLLdqVxuOF9Wwg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-sakLLdqVxuOF9Wwg .cluster-label text{fill:#333;}#mermaid-svg-sakLLdqVxuOF9Wwg .cluster-label span{color:#333;}#mermaid-svg-sakLLdqVxuOF9Wwg .cluster-label span p{background-color:transparent;}#mermaid-svg-sakLLdqVxuOF9Wwg .label text,#mermaid-svg-sakLLdqVxuOF9Wwg span{fill:#333;color:#333;}#mermaid-svg-sakLLdqVxuOF9Wwg .node rect,#mermaid-svg-sakLLdqVxuOF9Wwg .node circle,#mermaid-svg-sakLLdqVxuOF9Wwg .node ellipse,#mermaid-svg-sakLLdqVxuOF9Wwg .node polygon,#mermaid-svg-sakLLdqVxuOF9Wwg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sakLLdqVxuOF9Wwg .rough-node .label text,#mermaid-svg-sakLLdqVxuOF9Wwg .node .label text,#mermaid-svg-sakLLdqVxuOF9Wwg .image-shape .label,#mermaid-svg-sakLLdqVxuOF9Wwg .icon-shape .label{text-anchor:middle;}#mermaid-svg-sakLLdqVxuOF9Wwg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-sakLLdqVxuOF9Wwg .rough-node .label,#mermaid-svg-sakLLdqVxuOF9Wwg .node .label,#mermaid-svg-sakLLdqVxuOF9Wwg .image-shape .label,#mermaid-svg-sakLLdqVxuOF9Wwg .icon-shape .label{text-align:center;}#mermaid-svg-sakLLdqVxuOF9Wwg .node.clickable{cursor:pointer;}#mermaid-svg-sakLLdqVxuOF9Wwg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-sakLLdqVxuOF9Wwg .arrowheadPath{fill:#333333;}#mermaid-svg-sakLLdqVxuOF9Wwg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sakLLdqVxuOF9Wwg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sakLLdqVxuOF9Wwg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sakLLdqVxuOF9Wwg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-sakLLdqVxuOF9Wwg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sakLLdqVxuOF9Wwg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-sakLLdqVxuOF9Wwg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sakLLdqVxuOF9Wwg .cluster text{fill:#333;}#mermaid-svg-sakLLdqVxuOF9Wwg .cluster span{color:#333;}#mermaid-svg-sakLLdqVxuOF9Wwg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-sakLLdqVxuOF9Wwg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-sakLLdqVxuOF9Wwg rect.text{fill:none;stroke-width:0;}#mermaid-svg-sakLLdqVxuOF9Wwg .icon-shape,#mermaid-svg-sakLLdqVxuOF9Wwg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sakLLdqVxuOF9Wwg .icon-shape p,#mermaid-svg-sakLLdqVxuOF9Wwg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-sakLLdqVxuOF9Wwg .icon-shape .label rect,#mermaid-svg-sakLLdqVxuOF9Wwg .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sakLLdqVxuOF9Wwg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-sakLLdqVxuOF9Wwg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-sakLLdqVxuOF9Wwg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 机器 B(主节点)
网络中间设备
虚拟化平台层 / 云平台
机器 A(从节点)
应用发出请求(如 curl)
出站防火墙规则
(OUTPUT 链)
网卡 → 物理发出
出方向安全组策略
入方向安全组策略
交换机 / 路由器
硬件防火墙 / NAT 网关
网卡 → 接收数据
入站防火墙规则
(INPUT 链)
应用接收请求
(Jenkins:8080)
核心规律 :数据包从 A 到 B,走的是对称路径 ------A 侧有出站规则,B 侧有入站规则,中间还有平台层和硬件层的拦截点。排查时要从近到远逐层排除。
四、各层拦截机制详解
4.1 第一层:虚拟机本地防火墙
这是你可以直接在命令行操作的一层,也是排查时最先查的。
#mermaid-svg-p5OHsqoRKxDAnTrD{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-p5OHsqoRKxDAnTrD .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-p5OHsqoRKxDAnTrD .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-p5OHsqoRKxDAnTrD .error-icon{fill:#552222;}#mermaid-svg-p5OHsqoRKxDAnTrD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-p5OHsqoRKxDAnTrD .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-p5OHsqoRKxDAnTrD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-p5OHsqoRKxDAnTrD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-p5OHsqoRKxDAnTrD .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-p5OHsqoRKxDAnTrD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-p5OHsqoRKxDAnTrD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-p5OHsqoRKxDAnTrD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-p5OHsqoRKxDAnTrD .marker.cross{stroke:#333333;}#mermaid-svg-p5OHsqoRKxDAnTrD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-p5OHsqoRKxDAnTrD p{margin:0;}#mermaid-svg-p5OHsqoRKxDAnTrD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-p5OHsqoRKxDAnTrD .cluster-label text{fill:#333;}#mermaid-svg-p5OHsqoRKxDAnTrD .cluster-label span{color:#333;}#mermaid-svg-p5OHsqoRKxDAnTrD .cluster-label span p{background-color:transparent;}#mermaid-svg-p5OHsqoRKxDAnTrD .label text,#mermaid-svg-p5OHsqoRKxDAnTrD span{fill:#333;color:#333;}#mermaid-svg-p5OHsqoRKxDAnTrD .node rect,#mermaid-svg-p5OHsqoRKxDAnTrD .node circle,#mermaid-svg-p5OHsqoRKxDAnTrD .node ellipse,#mermaid-svg-p5OHsqoRKxDAnTrD .node polygon,#mermaid-svg-p5OHsqoRKxDAnTrD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-p5OHsqoRKxDAnTrD .rough-node .label text,#mermaid-svg-p5OHsqoRKxDAnTrD .node .label text,#mermaid-svg-p5OHsqoRKxDAnTrD .image-shape .label,#mermaid-svg-p5OHsqoRKxDAnTrD .icon-shape .label{text-anchor:middle;}#mermaid-svg-p5OHsqoRKxDAnTrD .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-p5OHsqoRKxDAnTrD .rough-node .label,#mermaid-svg-p5OHsqoRKxDAnTrD .node .label,#mermaid-svg-p5OHsqoRKxDAnTrD .image-shape .label,#mermaid-svg-p5OHsqoRKxDAnTrD .icon-shape .label{text-align:center;}#mermaid-svg-p5OHsqoRKxDAnTrD .node.clickable{cursor:pointer;}#mermaid-svg-p5OHsqoRKxDAnTrD .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-p5OHsqoRKxDAnTrD .arrowheadPath{fill:#333333;}#mermaid-svg-p5OHsqoRKxDAnTrD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-p5OHsqoRKxDAnTrD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-p5OHsqoRKxDAnTrD .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-p5OHsqoRKxDAnTrD .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-p5OHsqoRKxDAnTrD .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-p5OHsqoRKxDAnTrD .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-p5OHsqoRKxDAnTrD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-p5OHsqoRKxDAnTrD .cluster text{fill:#333;}#mermaid-svg-p5OHsqoRKxDAnTrD .cluster span{color:#333;}#mermaid-svg-p5OHsqoRKxDAnTrD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-p5OHsqoRKxDAnTrD .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-p5OHsqoRKxDAnTrD rect.text{fill:none;stroke-width:0;}#mermaid-svg-p5OHsqoRKxDAnTrD .icon-shape,#mermaid-svg-p5OHsqoRKxDAnTrD .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-p5OHsqoRKxDAnTrD .icon-shape p,#mermaid-svg-p5OHsqoRKxDAnTrD .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-p5OHsqoRKxDAnTrD .icon-shape .label rect,#mermaid-svg-p5OHsqoRKxDAnTrD .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-p5OHsqoRKxDAnTrD .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-p5OHsqoRKxDAnTrD .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-p5OHsqoRKxDAnTrD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Linux 防火墙体系
生成规则
匹配数据包
firewalld
(用户友好层)
iptables / nftables
(内核规则层)
规则链 (Chain)
-
INPUT(入站)
-
OUTPUT(出站)
-
FORWARD(转发)
大白话版:
firewalld是"前台服务员",你告诉它"开放 8080 端口",它帮你翻译成底层规则。iptables是"后台保安",真正在内核里检查每个数据包,按规则放行或拦截。- "链(Chain)"是三本登记簿------INPUT 登记入站规则、OUTPUT 登记出站规则、FORWARD 登记转发规则。
关键概念------链的匹配顺序:
iptables 的规则是从上到下依次匹配的,一旦匹配上就执行动作(ACCEPT/DROP/REJECT),不再往下看。如果所有规则都没匹配上,走最后一条默认规则。
#mermaid-svg-PqpUaNosWhhZ42Ah{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PqpUaNosWhhZ42Ah .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PqpUaNosWhhZ42Ah .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PqpUaNosWhhZ42Ah .error-icon{fill:#552222;}#mermaid-svg-PqpUaNosWhhZ42Ah .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PqpUaNosWhhZ42Ah .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PqpUaNosWhhZ42Ah .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PqpUaNosWhhZ42Ah .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PqpUaNosWhhZ42Ah .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PqpUaNosWhhZ42Ah .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PqpUaNosWhhZ42Ah .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PqpUaNosWhhZ42Ah .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PqpUaNosWhhZ42Ah .marker.cross{stroke:#333333;}#mermaid-svg-PqpUaNosWhhZ42Ah svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PqpUaNosWhhZ42Ah p{margin:0;}#mermaid-svg-PqpUaNosWhhZ42Ah .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PqpUaNosWhhZ42Ah .cluster-label text{fill:#333;}#mermaid-svg-PqpUaNosWhhZ42Ah .cluster-label span{color:#333;}#mermaid-svg-PqpUaNosWhhZ42Ah .cluster-label span p{background-color:transparent;}#mermaid-svg-PqpUaNosWhhZ42Ah .label text,#mermaid-svg-PqpUaNosWhhZ42Ah span{fill:#333;color:#333;}#mermaid-svg-PqpUaNosWhhZ42Ah .node rect,#mermaid-svg-PqpUaNosWhhZ42Ah .node circle,#mermaid-svg-PqpUaNosWhhZ42Ah .node ellipse,#mermaid-svg-PqpUaNosWhhZ42Ah .node polygon,#mermaid-svg-PqpUaNosWhhZ42Ah .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PqpUaNosWhhZ42Ah .rough-node .label text,#mermaid-svg-PqpUaNosWhhZ42Ah .node .label text,#mermaid-svg-PqpUaNosWhhZ42Ah .image-shape .label,#mermaid-svg-PqpUaNosWhhZ42Ah .icon-shape .label{text-anchor:middle;}#mermaid-svg-PqpUaNosWhhZ42Ah .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-PqpUaNosWhhZ42Ah .rough-node .label,#mermaid-svg-PqpUaNosWhhZ42Ah .node .label,#mermaid-svg-PqpUaNosWhhZ42Ah .image-shape .label,#mermaid-svg-PqpUaNosWhhZ42Ah .icon-shape .label{text-align:center;}#mermaid-svg-PqpUaNosWhhZ42Ah .node.clickable{cursor:pointer;}#mermaid-svg-PqpUaNosWhhZ42Ah .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-PqpUaNosWhhZ42Ah .arrowheadPath{fill:#333333;}#mermaid-svg-PqpUaNosWhhZ42Ah .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PqpUaNosWhhZ42Ah .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PqpUaNosWhhZ42Ah .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PqpUaNosWhhZ42Ah .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-PqpUaNosWhhZ42Ah .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PqpUaNosWhhZ42Ah .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-PqpUaNosWhhZ42Ah .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PqpUaNosWhhZ42Ah .cluster text{fill:#333;}#mermaid-svg-PqpUaNosWhhZ42Ah .cluster span{color:#333;}#mermaid-svg-PqpUaNosWhhZ42Ah div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PqpUaNosWhhZ42Ah .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-PqpUaNosWhhZ42Ah rect.text{fill:none;stroke-width:0;}#mermaid-svg-PqpUaNosWhhZ42Ah .icon-shape,#mermaid-svg-PqpUaNosWhhZ42Ah .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PqpUaNosWhhZ42Ah .icon-shape p,#mermaid-svg-PqpUaNosWhhZ42Ah .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-PqpUaNosWhhZ42Ah .icon-shape .label rect,#mermaid-svg-PqpUaNosWhhZ42Ah .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PqpUaNosWhhZ42Ah .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-PqpUaNosWhhZ42Ah .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-PqpUaNosWhhZ42Ah :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 不匹配
不匹配
匹配到 ACCEPT
没匹配到
数据包到达
规则1: 已建立连接 → ACCEPT
规则2: 本地回环 → ACCEPT
规则3: 进入子链检查
子链中逐条匹配...
✅ 放行
规则4: 兜底 REJECT
❌ 拦截
本次踩坑点:8080 规则虽然加进去了,但网卡没绑定 zone,导致流量根本没走那条规则链。
这部分你能直接控制的命令后面有速查表。
4.2 第二层:虚拟化平台 / 云平台安全策略
这是本次问题的真正根因所在。
不管你用的是 VMware、Proxmox、麒麟云,还是阿里云 / 腾讯云,虚拟机外面都有一层由平台控制的网络策略。
#mermaid-svg-t3dxgTcSkP428Y7i{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-t3dxgTcSkP428Y7i .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-t3dxgTcSkP428Y7i .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-t3dxgTcSkP428Y7i .error-icon{fill:#552222;}#mermaid-svg-t3dxgTcSkP428Y7i .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-t3dxgTcSkP428Y7i .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-t3dxgTcSkP428Y7i .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-t3dxgTcSkP428Y7i .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-t3dxgTcSkP428Y7i .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-t3dxgTcSkP428Y7i .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-t3dxgTcSkP428Y7i .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-t3dxgTcSkP428Y7i .marker{fill:#333333;stroke:#333333;}#mermaid-svg-t3dxgTcSkP428Y7i .marker.cross{stroke:#333333;}#mermaid-svg-t3dxgTcSkP428Y7i svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-t3dxgTcSkP428Y7i p{margin:0;}#mermaid-svg-t3dxgTcSkP428Y7i .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-t3dxgTcSkP428Y7i .cluster-label text{fill:#333;}#mermaid-svg-t3dxgTcSkP428Y7i .cluster-label span{color:#333;}#mermaid-svg-t3dxgTcSkP428Y7i .cluster-label span p{background-color:transparent;}#mermaid-svg-t3dxgTcSkP428Y7i .label text,#mermaid-svg-t3dxgTcSkP428Y7i span{fill:#333;color:#333;}#mermaid-svg-t3dxgTcSkP428Y7i .node rect,#mermaid-svg-t3dxgTcSkP428Y7i .node circle,#mermaid-svg-t3dxgTcSkP428Y7i .node ellipse,#mermaid-svg-t3dxgTcSkP428Y7i .node polygon,#mermaid-svg-t3dxgTcSkP428Y7i .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-t3dxgTcSkP428Y7i .rough-node .label text,#mermaid-svg-t3dxgTcSkP428Y7i .node .label text,#mermaid-svg-t3dxgTcSkP428Y7i .image-shape .label,#mermaid-svg-t3dxgTcSkP428Y7i .icon-shape .label{text-anchor:middle;}#mermaid-svg-t3dxgTcSkP428Y7i .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-t3dxgTcSkP428Y7i .rough-node .label,#mermaid-svg-t3dxgTcSkP428Y7i .node .label,#mermaid-svg-t3dxgTcSkP428Y7i .image-shape .label,#mermaid-svg-t3dxgTcSkP428Y7i .icon-shape .label{text-align:center;}#mermaid-svg-t3dxgTcSkP428Y7i .node.clickable{cursor:pointer;}#mermaid-svg-t3dxgTcSkP428Y7i .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-t3dxgTcSkP428Y7i .arrowheadPath{fill:#333333;}#mermaid-svg-t3dxgTcSkP428Y7i .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-t3dxgTcSkP428Y7i .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-t3dxgTcSkP428Y7i .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-t3dxgTcSkP428Y7i .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-t3dxgTcSkP428Y7i .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-t3dxgTcSkP428Y7i .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-t3dxgTcSkP428Y7i .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-t3dxgTcSkP428Y7i .cluster text{fill:#333;}#mermaid-svg-t3dxgTcSkP428Y7i .cluster span{color:#333;}#mermaid-svg-t3dxgTcSkP428Y7i div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-t3dxgTcSkP428Y7i .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-t3dxgTcSkP428Y7i rect.text{fill:none;stroke-width:0;}#mermaid-svg-t3dxgTcSkP428Y7i .icon-shape,#mermaid-svg-t3dxgTcSkP428Y7i .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-t3dxgTcSkP428Y7i .icon-shape p,#mermaid-svg-t3dxgTcSkP428Y7i .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-t3dxgTcSkP428Y7i .icon-shape .label rect,#mermaid-svg-t3dxgTcSkP428Y7i .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-t3dxgTcSkP428Y7i .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-t3dxgTcSkP428Y7i .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-t3dxgTcSkP428Y7i :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 物理宿主机 / 云平台
虚拟机 B
应用
虚拟机 A
应用
虚拟交换机
安全组(Security Group)
网络 ACL
安全组(Security Group):
- 作用在虚拟机级别,是一组"允许什么协议、什么端口进出"的规则
- 默认行为一般是"入方向全拒绝,出方向全放行"
- 修改后立即生效,不需要重启
网络 ACL:
- 作用在子网级别,是整个网段的准入规则
- 比安全组更底层,通常由平台管理员配置
- 是无状态的(出和入要分别配)
为什么 ping 通、TCP 不通?
#mermaid-svg-RYHCeWAQANmdn3Fm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-RYHCeWAQANmdn3Fm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-RYHCeWAQANmdn3Fm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-RYHCeWAQANmdn3Fm .error-icon{fill:#552222;}#mermaid-svg-RYHCeWAQANmdn3Fm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-RYHCeWAQANmdn3Fm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-RYHCeWAQANmdn3Fm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-RYHCeWAQANmdn3Fm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-RYHCeWAQANmdn3Fm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-RYHCeWAQANmdn3Fm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-RYHCeWAQANmdn3Fm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-RYHCeWAQANmdn3Fm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-RYHCeWAQANmdn3Fm .marker.cross{stroke:#333333;}#mermaid-svg-RYHCeWAQANmdn3Fm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-RYHCeWAQANmdn3Fm p{margin:0;}#mermaid-svg-RYHCeWAQANmdn3Fm .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-RYHCeWAQANmdn3Fm .cluster-label text{fill:#333;}#mermaid-svg-RYHCeWAQANmdn3Fm .cluster-label span{color:#333;}#mermaid-svg-RYHCeWAQANmdn3Fm .cluster-label span p{background-color:transparent;}#mermaid-svg-RYHCeWAQANmdn3Fm .label text,#mermaid-svg-RYHCeWAQANmdn3Fm span{fill:#333;color:#333;}#mermaid-svg-RYHCeWAQANmdn3Fm .node rect,#mermaid-svg-RYHCeWAQANmdn3Fm .node circle,#mermaid-svg-RYHCeWAQANmdn3Fm .node ellipse,#mermaid-svg-RYHCeWAQANmdn3Fm .node polygon,#mermaid-svg-RYHCeWAQANmdn3Fm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-RYHCeWAQANmdn3Fm .rough-node .label text,#mermaid-svg-RYHCeWAQANmdn3Fm .node .label text,#mermaid-svg-RYHCeWAQANmdn3Fm .image-shape .label,#mermaid-svg-RYHCeWAQANmdn3Fm .icon-shape .label{text-anchor:middle;}#mermaid-svg-RYHCeWAQANmdn3Fm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-RYHCeWAQANmdn3Fm .rough-node .label,#mermaid-svg-RYHCeWAQANmdn3Fm .node .label,#mermaid-svg-RYHCeWAQANmdn3Fm .image-shape .label,#mermaid-svg-RYHCeWAQANmdn3Fm .icon-shape .label{text-align:center;}#mermaid-svg-RYHCeWAQANmdn3Fm .node.clickable{cursor:pointer;}#mermaid-svg-RYHCeWAQANmdn3Fm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-RYHCeWAQANmdn3Fm .arrowheadPath{fill:#333333;}#mermaid-svg-RYHCeWAQANmdn3Fm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-RYHCeWAQANmdn3Fm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-RYHCeWAQANmdn3Fm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RYHCeWAQANmdn3Fm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-RYHCeWAQANmdn3Fm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RYHCeWAQANmdn3Fm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-RYHCeWAQANmdn3Fm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-RYHCeWAQANmdn3Fm .cluster text{fill:#333;}#mermaid-svg-RYHCeWAQANmdn3Fm .cluster span{color:#333;}#mermaid-svg-RYHCeWAQANmdn3Fm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-RYHCeWAQANmdn3Fm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-RYHCeWAQANmdn3Fm rect.text{fill:none;stroke-width:0;}#mermaid-svg-RYHCeWAQANmdn3Fm .icon-shape,#mermaid-svg-RYHCeWAQANmdn3Fm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RYHCeWAQANmdn3Fm .icon-shape p,#mermaid-svg-RYHCeWAQANmdn3Fm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-RYHCeWAQANmdn3Fm .icon-shape .label rect,#mermaid-svg-RYHCeWAQANmdn3Fm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RYHCeWAQANmdn3Fm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-RYHCeWAQANmdn3Fm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-RYHCeWAQANmdn3Fm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 安全组: 允许
安全组: 拒绝
ICMP 数据包(ping)
✅ 通过
TCP 数据包(curl/SSH)
❌ 拦截
安全组可以按协议类型做精细化控制。ICMP(ping)和 TCP(传数据)是不同的协议,可以分别设置允许或拒绝。你的情况大概率是:安全组配置了"允许 ICMP",但没有配"允许 TCP",导致出现 ping 通但传数据不通的诡异现象。
怎么修:去虚拟化平台/云平台的管理后台,找到对应虚拟机/安全组,把 TCP 协议(或需要的端口如 22、8080)加入允许列表。
4.3 第三层:硬件防火墙 / 网络设备
本次问题不涉及这一层,但知道它的存在很重要。
如果是物理机房环境,或者跨机房 / 跨地域通信,还会经过独立的硬件防火墙、路由器 ACL 等。
#mermaid-svg-yrJA97mMJbi6gNXA{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-yrJA97mMJbi6gNXA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-yrJA97mMJbi6gNXA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-yrJA97mMJbi6gNXA .error-icon{fill:#552222;}#mermaid-svg-yrJA97mMJbi6gNXA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-yrJA97mMJbi6gNXA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-yrJA97mMJbi6gNXA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-yrJA97mMJbi6gNXA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-yrJA97mMJbi6gNXA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-yrJA97mMJbi6gNXA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-yrJA97mMJbi6gNXA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-yrJA97mMJbi6gNXA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-yrJA97mMJbi6gNXA .marker.cross{stroke:#333333;}#mermaid-svg-yrJA97mMJbi6gNXA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-yrJA97mMJbi6gNXA p{margin:0;}#mermaid-svg-yrJA97mMJbi6gNXA .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-yrJA97mMJbi6gNXA .cluster-label text{fill:#333;}#mermaid-svg-yrJA97mMJbi6gNXA .cluster-label span{color:#333;}#mermaid-svg-yrJA97mMJbi6gNXA .cluster-label span p{background-color:transparent;}#mermaid-svg-yrJA97mMJbi6gNXA .label text,#mermaid-svg-yrJA97mMJbi6gNXA span{fill:#333;color:#333;}#mermaid-svg-yrJA97mMJbi6gNXA .node rect,#mermaid-svg-yrJA97mMJbi6gNXA .node circle,#mermaid-svg-yrJA97mMJbi6gNXA .node ellipse,#mermaid-svg-yrJA97mMJbi6gNXA .node polygon,#mermaid-svg-yrJA97mMJbi6gNXA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-yrJA97mMJbi6gNXA .rough-node .label text,#mermaid-svg-yrJA97mMJbi6gNXA .node .label text,#mermaid-svg-yrJA97mMJbi6gNXA .image-shape .label,#mermaid-svg-yrJA97mMJbi6gNXA .icon-shape .label{text-anchor:middle;}#mermaid-svg-yrJA97mMJbi6gNXA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-yrJA97mMJbi6gNXA .rough-node .label,#mermaid-svg-yrJA97mMJbi6gNXA .node .label,#mermaid-svg-yrJA97mMJbi6gNXA .image-shape .label,#mermaid-svg-yrJA97mMJbi6gNXA .icon-shape .label{text-align:center;}#mermaid-svg-yrJA97mMJbi6gNXA .node.clickable{cursor:pointer;}#mermaid-svg-yrJA97mMJbi6gNXA .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-yrJA97mMJbi6gNXA .arrowheadPath{fill:#333333;}#mermaid-svg-yrJA97mMJbi6gNXA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-yrJA97mMJbi6gNXA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-yrJA97mMJbi6gNXA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-yrJA97mMJbi6gNXA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-yrJA97mMJbi6gNXA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-yrJA97mMJbi6gNXA .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-yrJA97mMJbi6gNXA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-yrJA97mMJbi6gNXA .cluster text{fill:#333;}#mermaid-svg-yrJA97mMJbi6gNXA .cluster span{color:#333;}#mermaid-svg-yrJA97mMJbi6gNXA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-yrJA97mMJbi6gNXA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-yrJA97mMJbi6gNXA rect.text{fill:none;stroke-width:0;}#mermaid-svg-yrJA97mMJbi6gNXA .icon-shape,#mermaid-svg-yrJA97mMJbi6gNXA .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-yrJA97mMJbi6gNXA .icon-shape p,#mermaid-svg-yrJA97mMJbi6gNXA .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-yrJA97mMJbi6gNXA .icon-shape .label rect,#mermaid-svg-yrJA97mMJbi6gNXA .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-yrJA97mMJbi6gNXA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-yrJA97mMJbi6gNXA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-yrJA97mMJbi6gNXA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 检查项:
-
源IP/目标IP
-
端口
-
协议类型
-
连接数限制
机器 A
交换机
硬件防火墙
路由器
交换机
机器 B
这一层一般由网络管理员控制,开发人员接触不到。但如果你排除了本地防火墙和云平台安全组后问题依旧,就需要联系网络管理员排查这一层。
4.4 计算机网络五层模型 & 本次问题在每一层的状态
上面讲的三层拦截是"物理部署视角",你学的计算机网络五层模型是"协议分层视角"。两者不矛盾,而是正交的两个维度------拦截层告诉你"谁在拦",协议层告诉你"拦了什么东西"。
#mermaid-svg-ucc7mpSARI9lZUgp{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ucc7mpSARI9lZUgp .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ucc7mpSARI9lZUgp .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ucc7mpSARI9lZUgp .error-icon{fill:#552222;}#mermaid-svg-ucc7mpSARI9lZUgp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ucc7mpSARI9lZUgp .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ucc7mpSARI9lZUgp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ucc7mpSARI9lZUgp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ucc7mpSARI9lZUgp .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ucc7mpSARI9lZUgp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ucc7mpSARI9lZUgp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ucc7mpSARI9lZUgp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ucc7mpSARI9lZUgp .marker.cross{stroke:#333333;}#mermaid-svg-ucc7mpSARI9lZUgp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ucc7mpSARI9lZUgp p{margin:0;}#mermaid-svg-ucc7mpSARI9lZUgp .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ucc7mpSARI9lZUgp .cluster-label text{fill:#333;}#mermaid-svg-ucc7mpSARI9lZUgp .cluster-label span{color:#333;}#mermaid-svg-ucc7mpSARI9lZUgp .cluster-label span p{background-color:transparent;}#mermaid-svg-ucc7mpSARI9lZUgp .label text,#mermaid-svg-ucc7mpSARI9lZUgp span{fill:#333;color:#333;}#mermaid-svg-ucc7mpSARI9lZUgp .node rect,#mermaid-svg-ucc7mpSARI9lZUgp .node circle,#mermaid-svg-ucc7mpSARI9lZUgp .node ellipse,#mermaid-svg-ucc7mpSARI9lZUgp .node polygon,#mermaid-svg-ucc7mpSARI9lZUgp .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ucc7mpSARI9lZUgp .rough-node .label text,#mermaid-svg-ucc7mpSARI9lZUgp .node .label text,#mermaid-svg-ucc7mpSARI9lZUgp .image-shape .label,#mermaid-svg-ucc7mpSARI9lZUgp .icon-shape .label{text-anchor:middle;}#mermaid-svg-ucc7mpSARI9lZUgp .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ucc7mpSARI9lZUgp .rough-node .label,#mermaid-svg-ucc7mpSARI9lZUgp .node .label,#mermaid-svg-ucc7mpSARI9lZUgp .image-shape .label,#mermaid-svg-ucc7mpSARI9lZUgp .icon-shape .label{text-align:center;}#mermaid-svg-ucc7mpSARI9lZUgp .node.clickable{cursor:pointer;}#mermaid-svg-ucc7mpSARI9lZUgp .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ucc7mpSARI9lZUgp .arrowheadPath{fill:#333333;}#mermaid-svg-ucc7mpSARI9lZUgp .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ucc7mpSARI9lZUgp .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ucc7mpSARI9lZUgp .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ucc7mpSARI9lZUgp .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ucc7mpSARI9lZUgp .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ucc7mpSARI9lZUgp .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ucc7mpSARI9lZUgp .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ucc7mpSARI9lZUgp .cluster text{fill:#333;}#mermaid-svg-ucc7mpSARI9lZUgp .cluster span{color:#333;}#mermaid-svg-ucc7mpSARI9lZUgp div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ucc7mpSARI9lZUgp .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ucc7mpSARI9lZUgp rect.text{fill:none;stroke-width:0;}#mermaid-svg-ucc7mpSARI9lZUgp .icon-shape,#mermaid-svg-ucc7mpSARI9lZUgp .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ucc7mpSARI9lZUgp .icon-shape p,#mermaid-svg-ucc7mpSARI9lZUgp .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ucc7mpSARI9lZUgp .icon-shape .label rect,#mermaid-svg-ucc7mpSARI9lZUgp .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ucc7mpSARI9lZUgp .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ucc7mpSARI9lZUgp .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ucc7mpSARI9lZUgp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 物理层(Physical Layer)
网线 / 光纤 / 电信号
✅ 物理连接正常(否则 ping 也不会通)
数据链路层(Data Link Layer)
MAC 地址 / ARP / 交换机
✅ ARP 表互见,说明两台机器在同一局域网
网络层(Network Layer)
IP 地址 / 路由 / ICMP(ping)
✅ ping 通,说明网络层可达
但网络层不管端口,只管 IP 寻址
传输层(Transport Layer)
TCP(可靠传输)/ UDP(快速传输)
- 端口号(22, 8080, 80...)
🔥 问题出在这一层!
TCP 协议被平台安全策略整体拦截
应用层(Application Layer)
HTTP / SSH / DNS
具体应用协议
Jenkins 的 HTTP 服务跑在这一层
→ 取决于传输层是否通
一句话总结 :物理层、数据链路层、网络层都是通的(ping 通、ARP 互见),问题卡在传输层------TCP 协议被拦截,导致上层应用(HTTP/SSH)全部不可用。
各层与拦截机制的对应关系:
| 协议层 | 拦截点 | 排查时看什么 |
|---|---|---|
| 物理层 | 网线松了 / 交换机端口坏了 | ip link 看网卡状态是否为 UP |
| 数据链路层 | VLAN 隔离、ARP 欺骗 | arp -n 看能否解析对方 MAC 地址 |
| 网络层 | 路由黑洞、IP 黑白名单 | ping 看 ICMP 是否通,traceroute 看在哪一跳断了 |
| 传输层 | iptables、安全组、ACL | nc -zv <IP> <PORT> 看 TCP 端口是否可达 |
| 应用层 | 应用防火墙(WAF)、代理认证 | curl -v 看 HTTP 响应码 |
这次排查的路径就是沿着协议层从下往上验证的:物理层没问题 → ping 通(网络层)→ ARP 互见(链路层)→ TCP 不通(传输层卡住)。
4.5 为什么需要这么多层拦截?防火墙、安全组、ACL、硬件防火墙的区别
你的直觉没错------表面上看它们都是"拦数据包的",为什么不能一个搞定?答案在三个维度 :控制范围不同、配置权限不同、设计目标不同。
#mermaid-svg-N34EyYxSUvc9jPeC{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-N34EyYxSUvc9jPeC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-N34EyYxSUvc9jPeC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-N34EyYxSUvc9jPeC .error-icon{fill:#552222;}#mermaid-svg-N34EyYxSUvc9jPeC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-N34EyYxSUvc9jPeC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-N34EyYxSUvc9jPeC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-N34EyYxSUvc9jPeC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-N34EyYxSUvc9jPeC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-N34EyYxSUvc9jPeC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-N34EyYxSUvc9jPeC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-N34EyYxSUvc9jPeC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-N34EyYxSUvc9jPeC .marker.cross{stroke:#333333;}#mermaid-svg-N34EyYxSUvc9jPeC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-N34EyYxSUvc9jPeC p{margin:0;}#mermaid-svg-N34EyYxSUvc9jPeC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-N34EyYxSUvc9jPeC .cluster-label text{fill:#333;}#mermaid-svg-N34EyYxSUvc9jPeC .cluster-label span{color:#333;}#mermaid-svg-N34EyYxSUvc9jPeC .cluster-label span p{background-color:transparent;}#mermaid-svg-N34EyYxSUvc9jPeC .label text,#mermaid-svg-N34EyYxSUvc9jPeC span{fill:#333;color:#333;}#mermaid-svg-N34EyYxSUvc9jPeC .node rect,#mermaid-svg-N34EyYxSUvc9jPeC .node circle,#mermaid-svg-N34EyYxSUvc9jPeC .node ellipse,#mermaid-svg-N34EyYxSUvc9jPeC .node polygon,#mermaid-svg-N34EyYxSUvc9jPeC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-N34EyYxSUvc9jPeC .rough-node .label text,#mermaid-svg-N34EyYxSUvc9jPeC .node .label text,#mermaid-svg-N34EyYxSUvc9jPeC .image-shape .label,#mermaid-svg-N34EyYxSUvc9jPeC .icon-shape .label{text-anchor:middle;}#mermaid-svg-N34EyYxSUvc9jPeC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-N34EyYxSUvc9jPeC .rough-node .label,#mermaid-svg-N34EyYxSUvc9jPeC .node .label,#mermaid-svg-N34EyYxSUvc9jPeC .image-shape .label,#mermaid-svg-N34EyYxSUvc9jPeC .icon-shape .label{text-align:center;}#mermaid-svg-N34EyYxSUvc9jPeC .node.clickable{cursor:pointer;}#mermaid-svg-N34EyYxSUvc9jPeC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-N34EyYxSUvc9jPeC .arrowheadPath{fill:#333333;}#mermaid-svg-N34EyYxSUvc9jPeC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-N34EyYxSUvc9jPeC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-N34EyYxSUvc9jPeC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N34EyYxSUvc9jPeC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-N34EyYxSUvc9jPeC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N34EyYxSUvc9jPeC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-N34EyYxSUvc9jPeC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-N34EyYxSUvc9jPeC .cluster text{fill:#333;}#mermaid-svg-N34EyYxSUvc9jPeC .cluster span{color:#333;}#mermaid-svg-N34EyYxSUvc9jPeC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-N34EyYxSUvc9jPeC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-N34EyYxSUvc9jPeC rect.text{fill:none;stroke-width:0;}#mermaid-svg-N34EyYxSUvc9jPeC .icon-shape,#mermaid-svg-N34EyYxSUvc9jPeC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N34EyYxSUvc9jPeC .icon-shape p,#mermaid-svg-N34EyYxSUvc9jPeC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-N34EyYxSUvc9jPeC .icon-shape .label rect,#mermaid-svg-N34EyYxSUvc9jPeC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N34EyYxSUvc9jPeC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-N34EyYxSUvc9jPeC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-N34EyYxSUvc9jPeC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 不同拦截层的作用范围
机房/数据中心
硬件防火墙
控制范围: 整个机房
谁配置: 网络管理员
粒度: 端口+协议+IP+应用层DPI
单台虚拟机内部
firewalld/iptables
控制范围: 本机
谁配置: root 用户
粒度: 端口+协议+IP
云平台/虚拟化平台
安全组
控制范围: 单台VM
谁配置: 云平台用户
粒度: 端口+协议+IP
网络ACL
控制范围: 整个子网
谁配置: 平台管理员
粒度: 端口+协议+子网
核心区别表:
| 维度 | 软件防火墙(firewalld/iptables) | 安全组(Security Group) | 网络 ACL | 硬件防火墙 |
|---|---|---|---|---|
| 控制范围 | 本机 | 单台虚拟机 | 整个子网 | 整个机房/网段 |
| 谁配置 | 机器管理员(root) | 云平台用户(你) | 平台/网络管理员 | 网络管理员 |
| 状态感知 | 有状态(自动放行回包) | 有状态 | 无状态(出入都要配) | 有状态 |
| 粒度 | 端口 + 协议 + IP | 端口 + 协议 + IP | 端口 + 协议 + IP + 子网 | 端口 + 协议 + IP + 应用层(DPI) |
| 典型场景 | 防止本机被外部攻击 | 云上多租户隔离,"我的 VM 不能让别人的 VM 访问" | 子网边界管控,"这个网段只允许访问数据库端口" | 机房边界流量清洗,抗 DDoS |
用大白话解释为什么需要这么多层:
你租了一间公寓(虚拟机),公寓所在的楼(云平台/子网)和小区(机房)各有管理方。
- 软件防火墙 = 你家里的防盗门:你自己决定给谁开门、锁哪些窗户。物业管不着。
- 安全组 = 公寓楼的门禁:物业管,决定外人能不能进你这栋楼。你在手机上就能设置。
- 网络 ACL = 小区的车辆道闸:保安队管,控制哪些车能进出小区。个人住户改不了,要找保安队。
- 硬件防火墙 = 城市边界检查站:政府管,在大规模流量进来之前就做拦截和清洗。你感知不到它的存在。
你家的防盗门再牢固,也不代表你可以撤掉小区门禁------每一层管的是不同边界的安全。
它们会不会有冲突?
会。这也是排查时为什么要从近到远逐层排查:
你机器上的 iptables 放行了 → 安全组可能拦着 → ACL 可能拦着 → 硬件防火墙可能拦着
任何一层不放行,整个链路就断了。本次问题就是:本地防火墙和规则都对了,但安全组(平台层)拦了 TCP。
4.6 出方向安全策略需要配置吗?
在实际开通需求中,一个很容易搞混的问题是:安全组的出方向规则要不要也配置?从节点用的是操作系统随机分配的端口,出方向会不会拦?
先纠正一个概念
出方向规则检查的是目标端口 (你要连到哪),不是源端口(你从哪出发)。从节点的随机源端口根本不会出现在出方向规则的匹配条件里:
出方向规则:从节点 → 主节点:8080
↑ ↑
源 IP(从节点) 目标端口(8080)← 规则只检查这个
源端口(52341)← 规则不关心这个
有状态 vs 无状态,差异巨大
#mermaid-svg-raj22TvcHzpzHGxU{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-raj22TvcHzpzHGxU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-raj22TvcHzpzHGxU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-raj22TvcHzpzHGxU .error-icon{fill:#552222;}#mermaid-svg-raj22TvcHzpzHGxU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-raj22TvcHzpzHGxU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-raj22TvcHzpzHGxU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-raj22TvcHzpzHGxU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-raj22TvcHzpzHGxU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-raj22TvcHzpzHGxU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-raj22TvcHzpzHGxU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-raj22TvcHzpzHGxU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-raj22TvcHzpzHGxU .marker.cross{stroke:#333333;}#mermaid-svg-raj22TvcHzpzHGxU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-raj22TvcHzpzHGxU p{margin:0;}#mermaid-svg-raj22TvcHzpzHGxU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-raj22TvcHzpzHGxU .cluster-label text{fill:#333;}#mermaid-svg-raj22TvcHzpzHGxU .cluster-label span{color:#333;}#mermaid-svg-raj22TvcHzpzHGxU .cluster-label span p{background-color:transparent;}#mermaid-svg-raj22TvcHzpzHGxU .label text,#mermaid-svg-raj22TvcHzpzHGxU span{fill:#333;color:#333;}#mermaid-svg-raj22TvcHzpzHGxU .node rect,#mermaid-svg-raj22TvcHzpzHGxU .node circle,#mermaid-svg-raj22TvcHzpzHGxU .node ellipse,#mermaid-svg-raj22TvcHzpzHGxU .node polygon,#mermaid-svg-raj22TvcHzpzHGxU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-raj22TvcHzpzHGxU .rough-node .label text,#mermaid-svg-raj22TvcHzpzHGxU .node .label text,#mermaid-svg-raj22TvcHzpzHGxU .image-shape .label,#mermaid-svg-raj22TvcHzpzHGxU .icon-shape .label{text-anchor:middle;}#mermaid-svg-raj22TvcHzpzHGxU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-raj22TvcHzpzHGxU .rough-node .label,#mermaid-svg-raj22TvcHzpzHGxU .node .label,#mermaid-svg-raj22TvcHzpzHGxU .image-shape .label,#mermaid-svg-raj22TvcHzpzHGxU .icon-shape .label{text-align:center;}#mermaid-svg-raj22TvcHzpzHGxU .node.clickable{cursor:pointer;}#mermaid-svg-raj22TvcHzpzHGxU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-raj22TvcHzpzHGxU .arrowheadPath{fill:#333333;}#mermaid-svg-raj22TvcHzpzHGxU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-raj22TvcHzpzHGxU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-raj22TvcHzpzHGxU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-raj22TvcHzpzHGxU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-raj22TvcHzpzHGxU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-raj22TvcHzpzHGxU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-raj22TvcHzpzHGxU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-raj22TvcHzpzHGxU .cluster text{fill:#333;}#mermaid-svg-raj22TvcHzpzHGxU .cluster span{color:#333;}#mermaid-svg-raj22TvcHzpzHGxU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-raj22TvcHzpzHGxU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-raj22TvcHzpzHGxU rect.text{fill:none;stroke-width:0;}#mermaid-svg-raj22TvcHzpzHGxU .icon-shape,#mermaid-svg-raj22TvcHzpzHGxU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-raj22TvcHzpzHGxU .icon-shape p,#mermaid-svg-raj22TvcHzpzHGxU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-raj22TvcHzpzHGxU .icon-shape .label rect,#mermaid-svg-raj22TvcHzpzHGxU .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-raj22TvcHzpzHGxU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-raj22TvcHzpzHGxU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-raj22TvcHzpzHGxU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 无状态安全组(如 AWS 网络 ACL)
从节点 → 主节点:8080
出方向规则:目标 8080 ✅
主节点回复 → 从节点:52341
入方向规则检查:目标 52341
❌ 52341 没有显式规则 → 被拦截!
有状态安全组(如 AWS 安全组、firewalld)
从节点 → 主节点:8080
规则检查:目标端口 8080 ✅
连接被记住(状态表)
主节点回复 → 从节点:52341
自动放行(匹配状态表)✅
三种典型场景
| 场景 | 出方向默认策略 | 需要做什么 |
|---|---|---|
| 有状态 + 默认放行出方向(最常见) | 允许所有出方向 | 什么都不用做,agent 自动能连通 |
| 有状态 + 默认拒绝出方向 | 拒绝所有出方向 | 加一条规则:从节点 → 主节点:8080 TCP |
| 无状态(如网络 ACL) | 需双向显式配置 | 出方向:从节点 → 主节点:8080;入方向:主节点 → 从节点 1024-65535 |
为什么默认策略通常是"拦入不拦出"?
安全策略的首要职责是防外部入侵。内部机器主动发起的连接被认为是可信的,外部主动连进来的才需要严格审查。
#mermaid-svg-E6rMcEfTqKgcjb7M{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-E6rMcEfTqKgcjb7M .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-E6rMcEfTqKgcjb7M .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-E6rMcEfTqKgcjb7M .error-icon{fill:#552222;}#mermaid-svg-E6rMcEfTqKgcjb7M .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-E6rMcEfTqKgcjb7M .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-E6rMcEfTqKgcjb7M .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-E6rMcEfTqKgcjb7M .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-E6rMcEfTqKgcjb7M .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-E6rMcEfTqKgcjb7M .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-E6rMcEfTqKgcjb7M .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-E6rMcEfTqKgcjb7M .marker{fill:#333333;stroke:#333333;}#mermaid-svg-E6rMcEfTqKgcjb7M .marker.cross{stroke:#333333;}#mermaid-svg-E6rMcEfTqKgcjb7M svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-E6rMcEfTqKgcjb7M p{margin:0;}#mermaid-svg-E6rMcEfTqKgcjb7M .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-E6rMcEfTqKgcjb7M .cluster-label text{fill:#333;}#mermaid-svg-E6rMcEfTqKgcjb7M .cluster-label span{color:#333;}#mermaid-svg-E6rMcEfTqKgcjb7M .cluster-label span p{background-color:transparent;}#mermaid-svg-E6rMcEfTqKgcjb7M .label text,#mermaid-svg-E6rMcEfTqKgcjb7M span{fill:#333;color:#333;}#mermaid-svg-E6rMcEfTqKgcjb7M .node rect,#mermaid-svg-E6rMcEfTqKgcjb7M .node circle,#mermaid-svg-E6rMcEfTqKgcjb7M .node ellipse,#mermaid-svg-E6rMcEfTqKgcjb7M .node polygon,#mermaid-svg-E6rMcEfTqKgcjb7M .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-E6rMcEfTqKgcjb7M .rough-node .label text,#mermaid-svg-E6rMcEfTqKgcjb7M .node .label text,#mermaid-svg-E6rMcEfTqKgcjb7M .image-shape .label,#mermaid-svg-E6rMcEfTqKgcjb7M .icon-shape .label{text-anchor:middle;}#mermaid-svg-E6rMcEfTqKgcjb7M .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-E6rMcEfTqKgcjb7M .rough-node .label,#mermaid-svg-E6rMcEfTqKgcjb7M .node .label,#mermaid-svg-E6rMcEfTqKgcjb7M .image-shape .label,#mermaid-svg-E6rMcEfTqKgcjb7M .icon-shape .label{text-align:center;}#mermaid-svg-E6rMcEfTqKgcjb7M .node.clickable{cursor:pointer;}#mermaid-svg-E6rMcEfTqKgcjb7M .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-E6rMcEfTqKgcjb7M .arrowheadPath{fill:#333333;}#mermaid-svg-E6rMcEfTqKgcjb7M .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-E6rMcEfTqKgcjb7M .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-E6rMcEfTqKgcjb7M .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-E6rMcEfTqKgcjb7M .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-E6rMcEfTqKgcjb7M .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-E6rMcEfTqKgcjb7M .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-E6rMcEfTqKgcjb7M .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-E6rMcEfTqKgcjb7M .cluster text{fill:#333;}#mermaid-svg-E6rMcEfTqKgcjb7M .cluster span{color:#333;}#mermaid-svg-E6rMcEfTqKgcjb7M div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-E6rMcEfTqKgcjb7M .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-E6rMcEfTqKgcjb7M rect.text{fill:none;stroke-width:0;}#mermaid-svg-E6rMcEfTqKgcjb7M .icon-shape,#mermaid-svg-E6rMcEfTqKgcjb7M .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-E6rMcEfTqKgcjb7M .icon-shape p,#mermaid-svg-E6rMcEfTqKgcjb7M .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-E6rMcEfTqKgcjb7M .icon-shape .label rect,#mermaid-svg-E6rMcEfTqKgcjb7M .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-E6rMcEfTqKgcjb7M .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-E6rMcEfTqKgcjb7M .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-E6rMcEfTqKgcjb7M :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 外部世界
受信任的内部网络
出方向:默认放行 ✅
相信自己人发起的请求
入方向:默认拒绝 ❌
防外部入侵
从节点(内部机器)
潜在攻击者
在节点上的iptables规则也说明了这一点
txt
# OUTPUT 链:只有 3 条规则,最后 policy 是 ACCEPT(默认放行)
Chain OUTPUT (policy ACCEPT ...)
# INPUT 链:7 条规则,最后是 REJECT(默认拒绝)
Chain INPUT (policy ACCEPT ...) → 但第 7 条 REJECT 兜底
三种典型策略对比:
| 出方向默认 | 入方向默认 | 谁用 | |
|---|---|---|---|
| 宽松型 | 放行 | 拒绝 | 个人电脑、内部开发服务器 |
| 标准企业型 | 放行 | 拒绝 | 大多数公司内网 |
| 严格型(金融/军工) | 拒绝 | 拒绝 | 高安全等级环境,出/入都白名单制 |
五、完整排查方法论
综合上面所有的层级,排查两台机器之间网络不通的问题,应该按照从近到远、从内到外的顺序:
#mermaid-svg-jYNeWKrzO2bd1Jii{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-jYNeWKrzO2bd1Jii .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jYNeWKrzO2bd1Jii .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jYNeWKrzO2bd1Jii .error-icon{fill:#552222;}#mermaid-svg-jYNeWKrzO2bd1Jii .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jYNeWKrzO2bd1Jii .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jYNeWKrzO2bd1Jii .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jYNeWKrzO2bd1Jii .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jYNeWKrzO2bd1Jii .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jYNeWKrzO2bd1Jii .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jYNeWKrzO2bd1Jii .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jYNeWKrzO2bd1Jii .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jYNeWKrzO2bd1Jii .marker.cross{stroke:#333333;}#mermaid-svg-jYNeWKrzO2bd1Jii svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jYNeWKrzO2bd1Jii p{margin:0;}#mermaid-svg-jYNeWKrzO2bd1Jii .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-jYNeWKrzO2bd1Jii .cluster-label text{fill:#333;}#mermaid-svg-jYNeWKrzO2bd1Jii .cluster-label span{color:#333;}#mermaid-svg-jYNeWKrzO2bd1Jii .cluster-label span p{background-color:transparent;}#mermaid-svg-jYNeWKrzO2bd1Jii .label text,#mermaid-svg-jYNeWKrzO2bd1Jii span{fill:#333;color:#333;}#mermaid-svg-jYNeWKrzO2bd1Jii .node rect,#mermaid-svg-jYNeWKrzO2bd1Jii .node circle,#mermaid-svg-jYNeWKrzO2bd1Jii .node ellipse,#mermaid-svg-jYNeWKrzO2bd1Jii .node polygon,#mermaid-svg-jYNeWKrzO2bd1Jii .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jYNeWKrzO2bd1Jii .rough-node .label text,#mermaid-svg-jYNeWKrzO2bd1Jii .node .label text,#mermaid-svg-jYNeWKrzO2bd1Jii .image-shape .label,#mermaid-svg-jYNeWKrzO2bd1Jii .icon-shape .label{text-anchor:middle;}#mermaid-svg-jYNeWKrzO2bd1Jii .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-jYNeWKrzO2bd1Jii .rough-node .label,#mermaid-svg-jYNeWKrzO2bd1Jii .node .label,#mermaid-svg-jYNeWKrzO2bd1Jii .image-shape .label,#mermaid-svg-jYNeWKrzO2bd1Jii .icon-shape .label{text-align:center;}#mermaid-svg-jYNeWKrzO2bd1Jii .node.clickable{cursor:pointer;}#mermaid-svg-jYNeWKrzO2bd1Jii .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-jYNeWKrzO2bd1Jii .arrowheadPath{fill:#333333;}#mermaid-svg-jYNeWKrzO2bd1Jii .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jYNeWKrzO2bd1Jii .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jYNeWKrzO2bd1Jii .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jYNeWKrzO2bd1Jii .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-jYNeWKrzO2bd1Jii .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jYNeWKrzO2bd1Jii .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-jYNeWKrzO2bd1Jii .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jYNeWKrzO2bd1Jii .cluster text{fill:#333;}#mermaid-svg-jYNeWKrzO2bd1Jii .cluster span{color:#333;}#mermaid-svg-jYNeWKrzO2bd1Jii div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-jYNeWKrzO2bd1Jii .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jYNeWKrzO2bd1Jii rect.text{fill:none;stroke-width:0;}#mermaid-svg-jYNeWKrzO2bd1Jii .icon-shape,#mermaid-svg-jYNeWKrzO2bd1Jii .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jYNeWKrzO2bd1Jii .icon-shape p,#mermaid-svg-jYNeWKrzO2bd1Jii .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-jYNeWKrzO2bd1Jii .icon-shape .label rect,#mermaid-svg-jYNeWKrzO2bd1Jii .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jYNeWKrzO2bd1Jii .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-jYNeWKrzO2bd1Jii .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-jYNeWKrzO2bd1Jii :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
否
是
否
是
通了
还是不通
❓ 两台机器网络不通
第一层:本地防火墙
systemctl status firewalld
firewall-cmd --list-ports
规则正确?
修复本地防火墙规则
第二层:确认对端端口是否监听
ss -lntp | grep 端口号
端口在监听?
启动目标服务
第三层:平台安全策略
检查虚拟化平台/云平台
安全组、网络ACL
平台策略放行了?
修改安全组/ACL 规则
第四层:联系网络管理员
排查硬件防火墙/路由器
重新测试连通性
✅ 解决
核心原则:
- 先查自己能控制的(本地防火墙、服务端口)
- 再查平台控制的(安全组、ACL)
- 最后查别人控制的(网络设备、硬件防火墙)
六、本次问题速览
| 维度 | 内容 |
|---|---|
| 现象 | 从节点 ping 主节点通,但 curl 下载文件和 SSH 连接均超时 |
| 排除了 | Jenkins 端口配置、本地 firewalld 规则、网卡未绑定 zone(这些都修了但没用) |
| 根因 | 麒麟虚拟化平台的网络策略拦截了 TCP 协议(ICMP/ping 被放行了) |
| 解决方向 | 去麒麟平台管理后台,找到两台虚拟机之间的安全策略,放开 TCP 协议或指定端口 |
| 关键教训 | ping 通不等于能传数据;排查要按"本地 → 平台 → 硬件"逐层推进 |
七、命令速查表
前提 :以下命令默认在问题机器上执行。
<IP>替换为目标机器的 IP,<PORT>替换为端口号。
7.1 判断两台机器能不能通信
| 目的 | 命令 | 说明 |
|---|---|---|
| 看能不能 ping 通(ICMP) | ping <IP> |
只测网络层可达,不等于能传数据 |
| 看 TCP 端口是否可达 | nc -zv <IP> <PORT> -w 3 |
最常用的连通性测试,3秒超时 |
| 测 HTTP 服务是否可达 | curl -v http://<IP>:<PORT>/ |
能测试 Web 服务是否正常响应 |
| 看路由经过哪些节点 | traceroute <IP> |
数据包经过的每一跳,定位在哪一跳断了 |
7.2 查看防火墙状态
| 目的 | 命令 | 说明 |
|---|---|---|
| 看防火墙是否在运行 | systemctl status firewalld |
显示 active (running) 就是在跑 |
| 看当前放行了哪些端口 | firewall-cmd --list-ports |
空输出 = 什么都没放行 |
| 看当前放行了哪些服务 | firewall-cmd --list-services |
如 ssh、http 等预定义服务 |
| 看完整的防火墙配置 | firewall-cmd --list-all |
包含 zone、端口、服务、网卡绑定等所有信息 |
| 看网卡绑定到哪个 zone | firewall-cmd --get-active-zones |
本次踩坑的关键命令 |
7.3 修改防火墙规则
| 目的 | 命令 | 说明 |
|---|---|---|
| 开放端口(临时,重启失效) | firewall-cmd --add-port=<PORT>/tcp |
测试时临时开放用 |
| 开放端口(永久) | firewall-cmd --add-port=<PORT>/tcp --permanent |
加 --permanent 才持久化 |
| 重载规则使其生效 | firewall-cmd --reload |
修改永久规则后必须执行这条 |
| 绑定网卡到 zone | firewall-cmd --zone=public --add-interface=<网卡名> --permanent |
容易忽略的一步 |
| 关闭防火墙(仅测试用!) | systemctl stop firewalld |
仅排查时临时用,测完记得开回来 |
7.4 查看底层 iptables 规则
| 目的 | 命令 | 说明 |
|---|---|---|
| 看 INPUT 链(入站规则) | iptables -L INPUT -n -v --line-numbers |
带行号、带流量统计 |
| 看 OUTPUT 链(出站规则) | iptables -L OUTPUT -n -v --line-numbers |
一般 OUTPUT 默认放行 |
| 看特定端口的规则 | `iptables -L -n -v | grep |
| 看子链内部规则 | iptables -L <子链名> -n -v --line-numbers |
如 IN_public_allow、INPUT_ZONES |
pkts列很关键 :如果一条 ACCEPT 规则的pkts=0,说明数据包根本没走到这条规则------可能是网卡没绑定 zone,或者流量在更上层被拦截了。
7.5 查看端口监听情况
| 目的 | 命令 | 说明 |
|---|---|---|
| 看哪些端口在监听 | ss -lntp |
比老旧的 netstat 更快 |
| 只看某个服务的端口 | `ss -lntp | grep <进程名>` |
| 看监听的 IP 范围 | 关注 0.0.0.0:PORT vs 127.0.0.1:PORT |
0.0.0.0 = 对外网开放,127.0.0.1 = 仅本机访问 |
7.6 系统安全模块检查
| 目的 | 命令 | 说明 |
|---|---|---|
| SELinux 状态 | getenforce |
Enforcing = 开启(可能拦截网络请求),Disabled = 关闭 |
| 麒麟安全模块 | systemctl status kysec |
麒麟系统特有的安全模块 |
7.7 网络基础信息
| 目的 | 命令 | 说明 |
|---|---|---|
| 看本机 IP | `ip addr | grep "inet "` |
| 看 ARP 表 | arp -n |
确认两台机器是否在同一局域网(能看到对方的 MAC 地址就是同网段) |
| 看路由表 | ip route |
确认默认网关等路由配置 |
| DNS 解析测试 | nslookup <域名> 或 ping <域名> |
确认域名是否能正确解析到 IP |
八、总结
这次排查踩了三个坑:
- 网卡没绑定 zone------firewalld 规则加了但不生效,因为网卡没挂到 zone 上
- 被"ping 通"误导------ping 通只能证明 ICMP 协议可达,不代表 TCP 协议能传数据
- 忽略了平台层------排查完本地防火墙就蒙了,没第一时间想到虚拟化平台还有自己的安全策略
记住这张图就够了:
#mermaid-svg-evV5Or6wapfac3KT{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-evV5Or6wapfac3KT .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-evV5Or6wapfac3KT .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-evV5Or6wapfac3KT .error-icon{fill:#552222;}#mermaid-svg-evV5Or6wapfac3KT .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-evV5Or6wapfac3KT .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-evV5Or6wapfac3KT .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-evV5Or6wapfac3KT .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-evV5Or6wapfac3KT .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-evV5Or6wapfac3KT .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-evV5Or6wapfac3KT .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-evV5Or6wapfac3KT .marker{fill:#333333;stroke:#333333;}#mermaid-svg-evV5Or6wapfac3KT .marker.cross{stroke:#333333;}#mermaid-svg-evV5Or6wapfac3KT svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-evV5Or6wapfac3KT p{margin:0;}#mermaid-svg-evV5Or6wapfac3KT .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-evV5Or6wapfac3KT .cluster-label text{fill:#333;}#mermaid-svg-evV5Or6wapfac3KT .cluster-label span{color:#333;}#mermaid-svg-evV5Or6wapfac3KT .cluster-label span p{background-color:transparent;}#mermaid-svg-evV5Or6wapfac3KT .label text,#mermaid-svg-evV5Or6wapfac3KT span{fill:#333;color:#333;}#mermaid-svg-evV5Or6wapfac3KT .node rect,#mermaid-svg-evV5Or6wapfac3KT .node circle,#mermaid-svg-evV5Or6wapfac3KT .node ellipse,#mermaid-svg-evV5Or6wapfac3KT .node polygon,#mermaid-svg-evV5Or6wapfac3KT .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-evV5Or6wapfac3KT .rough-node .label text,#mermaid-svg-evV5Or6wapfac3KT .node .label text,#mermaid-svg-evV5Or6wapfac3KT .image-shape .label,#mermaid-svg-evV5Or6wapfac3KT .icon-shape .label{text-anchor:middle;}#mermaid-svg-evV5Or6wapfac3KT .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-evV5Or6wapfac3KT .rough-node .label,#mermaid-svg-evV5Or6wapfac3KT .node .label,#mermaid-svg-evV5Or6wapfac3KT .image-shape .label,#mermaid-svg-evV5Or6wapfac3KT .icon-shape .label{text-align:center;}#mermaid-svg-evV5Or6wapfac3KT .node.clickable{cursor:pointer;}#mermaid-svg-evV5Or6wapfac3KT .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-evV5Or6wapfac3KT .arrowheadPath{fill:#333333;}#mermaid-svg-evV5Or6wapfac3KT .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-evV5Or6wapfac3KT .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-evV5Or6wapfac3KT .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-evV5Or6wapfac3KT .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-evV5Or6wapfac3KT .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-evV5Or6wapfac3KT .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-evV5Or6wapfac3KT .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-evV5Or6wapfac3KT .cluster text{fill:#333;}#mermaid-svg-evV5Or6wapfac3KT .cluster span{color:#333;}#mermaid-svg-evV5Or6wapfac3KT div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-evV5Or6wapfac3KT .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-evV5Or6wapfac3KT rect.text{fill:none;stroke-width:0;}#mermaid-svg-evV5Or6wapfac3KT .icon-shape,#mermaid-svg-evV5Or6wapfac3KT .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-evV5Or6wapfac3KT .icon-shape p,#mermaid-svg-evV5Or6wapfac3KT .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-evV5Or6wapfac3KT .icon-shape .label rect,#mermaid-svg-evV5Or6wapfac3KT .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-evV5Or6wapfac3KT .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-evV5Or6wapfac3KT .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-evV5Or6wapfac3KT :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 排查顺序: 近→远
排查顺序: 内→外
本地防火墙
(你能控制)
平台安全策略
(去后台改)
硬件防火墙
(找管理员)
从近到远,从内到外,逐层排除,不跳步。