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
@startuml
skinparam componentStyle uml2
skinparam backgroundColor white
skinparam packageStyle rectangle

' 定义图标和样式
skinparam interface {
backgroundColor RosyBrown
}

skinparam rectangle {
BackgroundColor<<Firewall>> #FF3333
FontColor<<Firewall>> White
BorderColor<<Firewall>> DarkRed
BorderStyle<<Firewall>> Solid
RoundCorner<<Firewall>> 0
Shadowing<<Firewall>> true
}

package "互联网 (Internet)" {
[Google / External Web] as Web
}

package "校园网环境 (Campus LAN)" {

note as N1
<b>红色墙壁</b>代表校园网网关防火墙
阻断了 Host A 直接访问外网
(需要认证或端口被封)
end note

rectangle "受限区域 (宿舍/实验室)" {
node "内网主机 A (Host A)" as HostA {
port "SSHd (Port 22)" as p22
interface "127.0.0.1:7890\n(映射端口)" as pLocal
[Curl / Browser] as App
}
}

rectangle "跳板/管理区域 (Host B 位置)" {
node "本地主机 B (Host B)" as HostB {
component "SSH Client\n(ssh -R)" as SSHClient
component "Clash Proxy\n(Port 7890)" as Clash
interface "WLAN/4G\n(外网网卡)" as NicExt
interface "Eth/LAN\n(内网网卡)" as NicInt
}
}

rectangle "校园网网关/防火墙" as Firewall <<Firewall>>
}

' 物理链路连接
HostA -right-> NicInt : 1. 局域网连接 (LAN)
NicExt -up-> Web : 2. 独立上网链路 (热点/已认证)
HostA .up.> Firewall : 3. 直接上网流量
Firewall -up-x Web : ❌ 阻断 (未认证/无权限)

' 逻辑隧道连接
pLocal <..> SSHClient : <color:blue><b>SSH 反向隧道 (Tunnel)</b></color>\n数据流经 TCP Port 22
SSHClient -> Clash : 流量转发
Clash -> NicExt : 代理请求

' 内部流向
App -> pLocal : export http_proxy\n指向本地映射端口
@enduml