1. VRF:一台设备中的多张独立路由表

正常情况下,一台路由器使用一张 Global Routing Table:

1
2
3
4
5
Destination
↓
Global Routing Table
↓
Next-Hop / Outgoing Interface

VRF(Virtual Routing and Forwarding)的核心作用:

在同一台物理设备中创建多个彼此独立的三层路由上下文。

例如:

1
2
3
4
5
6
7
8
9
10
11
        Router

┌───────────────────┐
│ │
│ VRF A │
│ 10.1.1.0/24 │
│ │
│ VRF B │
│ 10.1.1.0/24 │
│ │
└───────────────────┘

两个 VRF 可以存在完全相同的 Prefix:

1
2
3
4
5
VRF A:
10.1.1.0/24

VRF B:
10.1.1.0/24

不会冲突,因为它们属于不同 Routing Context。

因此:

1
2
3
4
5
6
7
VRF
≠
解决 IPv4 地址耗尽

VRF
=
实现三层路由隔离

VLAN 与 VRF 的区别

1
2
3
4
5
6
7
VLAN
→ L2 隔离
→ 独立 Broadcast Domain

VRF
→ L3 隔离
→ 独立 Routing Table

可以组合:

1
2
3
4
5
6
7
8
9
10
11
12
VLAN 10
↓
SVI Vlan10
↓
VRF A


VLAN 20
↓
SVI Vlan20
↓
VRF B

2. 数据包如何选择 VRF

普通 VRF-Lite 中,数据包本身通常不会携带一个:

1
VRF = A

这样的 Header。

设备主要根据:

数据包从哪个 L3 Interface 进入,判断应该进入哪个 VRF Routing Context。

例如:

1
2
3
interface GigabitEthernet0/1
vrf forwarding A
ip address 10.1.1.1 255.255.255.0

数据包从 Gi0/1 进入:

1
2
3
4
5
6
7
8
Packet
↓
Gi0/1
↓
Gi0/1 belongs to VRF A
↓
查 VRF A Routing Table

因此:

1
2
3
4
5
6
Ingress L3 Interface
↓
选择 VRF
↓
在该 VRF 内进行 DIP Lookup

一个接口与 VRF 的关系

一个普通 L3 Interface / Subinterface:

1
2
→ 属于一个 VRF

但:

1
2
3
一个 VRF
→ 可以包含很多 L3 Interfaces


3. VRF 配置、验证与 Inter-VRF

经典 IOS / IOS XE 示例:

1
2
3
ip vrf A
ip vrf B

接口绑定:

1
2
3
4
interface GigabitEthernet0/1
vrf forwarding A
ip address 10.1.1.1 255.255.255.0

注意:

某些经典 IOS / IOS XE 平台上,把已有 IP 的接口绑定到 VRF 时,原来的 IP Address 可能会被移除,需要重新配置。

因此通常:

1
2
3
4
interface GigabitEthernet0/1
vrf forwarding A
ip address 10.1.1.1 255.255.255.0

查看路由表

Global:

1
2
show ip route

VRF A:

1
2
show ip route vrf A

查看接口:

1
2
3
show ip interface brief
show vrf

不同 VRF 可以出现相同接口 IP:

1
2
3
4
5
6
VRF A:
Gi0/1 = 10.1.1.1/24

VRF B:
Gi0/2 = 10.1.1.1/24

因为:

1
2
3
4
5
6
7
8
Packet enters Gi0/1
→ VRF A
→ 查 VRF A

Packet enters Gi0/2
→ VRF B
→ 查 VRF B

即使:

1
2
SIP / DIP 完全相同

只要进入不同 VRF,最终路由结果也可以完全不同。

Inter-VRF

不同 VRF 默认隔离:

1
2
3
4
VRF A
X
VRF B

如果需要互通,需要:

1
2
Route Leaking

并且必须考虑:

1
2
3
4
Forward Reachability
+
Return Reachability

即:

不能只把 A → B 的路由泄露过去,还必须保证返回方向也存在正确路由。


4. NAT:改变报文中的地址身份

NAT 与 Tunnel 最大区别:

1
2
3
4
5
6
NAT
→ 修改原始 IP Header

Tunnel
→ 保留原始 Packet,再增加 Outer Header

例如:

1
2
3
4
5
6
7
8
Inside Host
192.168.1.10

↓ NAT

Internet
203.0.113.10

Static NAT:

1
2
3
4
192.168.1.10
↔
203.0.113.10

Inside Local / Inside Global

1
2
3
4
5
6
7
8
Inside Local
=
内部网络中看到的地址

Inside Global
=
外部网络中代表这个 Inside Host 的地址

例如:

1
2
3
4
5
6
Inside Local:
192.168.1.10

Inside Global:
203.0.113.10

注意:

Inside Local 不一定严格等于 Private IP,Inside Global 也不一定严格等于 Public IP。

它们描述的是 NAT 视角下的地址角色。


5. Static NAT、Dynamic NAT 与 Static PAT

Static NAT

固定一对一:

1
2
3
4
192.168.1.10
↔
203.0.113.10

配置:

1
2
3
4
5
6
interface GigabitEthernet0/0
ip nat inside

interface GigabitEthernet0/1
ip nat outside

Static NAT:

1
2
ip nat inside source static 192.168.1.10 203.0.113.10

Inside → Outside:

1
2
3
4
5
6
7
8
9
10
11
12
Before NAT:

SIP = 192.168.1.10
DIP = 8.8.8.8

↓

After NAT:

SIP = 203.0.113.10
DIP = 8.8.8.8

Return:

1
2
3
4
5
6
7
8
9
10
11
12
Before NAT:

SIP = 8.8.8.8
DIP = 203.0.113.10

↓

After NAT:

SIP = 8.8.8.8
DIP = 192.168.1.10

Dynamic NAT

Dynamic NAT 从地址池动态选择 Global Address:

1
2
3
4
5
6
7
8
192.168.1.10
↓
203.0.113.10

192.168.1.11
↓
203.0.113.11

特点:

1
2
3
4
一个 Inside Local
↔
一个临时 Inside Global

仍然主要是一对一映射。

如果地址池耗尽:

1
2
3
4
新的 Host
→ 无可用 Global Address
→ 无法建立新的 Translation

Static PAT / Port Forwarding

可以把:

1
2
Public-IP:Port

固定映射到:

1
2
Private-IP:Port

例如:

1
2
3
4
203.0.113.10:443
↓
192.168.1.10:443

典型配置:

1
2
ip nat inside source static tcp 192.168.1.10 443 203.0.113.10 443

这也是常见的:

1
2
Port Forwarding


6. PAT / NAT Overload

PAT 的核心:

多个 Inside Hosts 可以共享一个 Inside Global Address,通过 L4 Port 区分不同 Session。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
192.168.1.10:50001
↓
203.0.113.1:30001

192.168.1.11:50001
↓
203.0.113.1:30002

192.168.1.12:50001
↓
203.0.113.1:30003

所以:

1
2
3
4
5
6
Static / Dynamic NAT
主要依靠 IP Address 区分 Translation

PAT
依靠 IP + L4 Port 区分 Session

Cisco 常见配置:

1
2
3
4
access-list 10 permit 192.168.1.0 0.0.0.255

ip nat inside source list 10 interface GigabitEthernet0/1 overload

其中:

1
2
3
4
5
overload
=
允许多个 Inside Local
共享一个 Inside Global

PAT Packet Walk

Inside Host:

1
2
3
4
192.168.1.10:50000
→
8.8.8.8:443

经过 PAT:

1
2
3
4
203.0.113.1:30001
→
8.8.8.8:443

返回:

1
2
3
4
8.8.8.8:443
→
203.0.113.1:30001

NAT Device 查 Translation Table:

1
2
3
4
203.0.113.1:30001
↓
192.168.1.10:50000

最终:

1
2
3
4
8.8.8.8:443
→
192.168.1.10:50000

查看 NAT / PAT

1
2
3
show ip nat translations
show ip nat statistics

PAT 没有必须单独使用的:

1
2
show pat ...

PAT Translation 同样出现在:

1
2
show ip nat translations


7. Routing 与 NAT:解决的是两个不同问题

Routing 回答:

这个 Destination IP 应该从哪里转发?

即:

1
2
3
4
5
6
DIP
↓
Longest Prefix Match
↓
Next-Hop / Outgoing Interface

NAT 回答:

这个地址/端口在经过 NAT 边界时应该转换成什么身份?

因此:

1
2
3
4
Routing
≠
NAT

一个数据包要成功通信,经常需要:

1
2
3
4
5
6
正确 Routing
+
正确 NAT
+
正确 Return Route

例如:

1
2
3
192.168.1.10
→ Internet

即使 NAT 配置正确:

1
2
3
192.168.1.10
→ 203.0.113.10

如果设备根本没有:

1
2
0.0.0.0/0

或者正确的外部路由,Packet 仍然无法成功到达目的地。

因此排 NAT 问题不能只盯:

1
2
show ip nat translations

还必须同时看:

1
2
show ip route


8. Hairpin NAT

典型场景:

1
2
3
4
5
6
7
8
9
Internal Client
192.168.1.20

Internal Server
192.168.1.10

Server Public Address
203.0.113.10

Internal Client 不使用:

1
2
192.168.1.10

而访问:

1
2
203.0.113.10

这就是典型的 Hairpin / NAT Loopback 场景。

流量可能需要:

1
2
3
4
5
6
7
8
Internal Client
↓
Public Address
↓
NAT Device
↓
重新转换回 Internal Server

某些设计中不仅需要:

1
2
DNAT

还可能需要:

1
2
SNAT

以确保 Return Traffic 重新经过 NAT Device,保持 Session 对称。

另一种常见解决思路是:

1
2
Split DNS

内部 DNS:

1
2
3
server.example.com
→ 192.168.1.10

外部 DNS:

1
2
3
server.example.com
→ 203.0.113.10

从而避免内部 Client 绕 Public NAT 地址访问内部 Server。


9. ACL:Standard、Extended 与方向

ACL 的核心:

根据 Packet Header 中的字段进行匹配,然后执行 Permit / Deny 等策略动作。

Standard ACL

主要匹配:

1
2
Source IPv4 Address

例如:

1
2
access-list 10 permit 10.1.1.0 0.0.0.255

Extended ACL

可以匹配:

1
2
3
4
5
6
Protocol
Source IP
Destination IP
Source Port
Destination Port

例如:

1
2
access-list 100 permit tcp 10.1.1.0 0.0.0.255 any eq 443

这里匹配的是:

1
2
3
TCP
Destination Port = 443

它并不真正理解:

1
2
HTTPS Application Content

所以:

ACL 能匹配 TCP/443,不等于它拥有完整的 L7 HTTPS Application Awareness。

Wildcard Mask

1
2
3
4
5
6
0
→ 必须匹配

1
→ 忽略

例如:

1
2
10.1.1.0 0.0.0.255

表示:

1
2
3
前三个 Octet 必须匹配
最后一个 Octet 忽略

即:

1
2
10.1.1.0/24

ACL In / Out

方向始终站在:

Router / L3 Interface 自己的视角

来看。

1
2
3
4
5
6
7
8
Inbound:

Packet
↓
Interface
↓
Router

1
2
3
4
5
6
7
8
Outbound:

Router
↓
Interface
↓
Packet

例如:

1
2
3
interface GigabitEthernet0/1
ip access-group 100 in

表示:

从 Gi0/1 进入 Router 的 Packet 被 ACL 100 检查。


10. ACL 在不同功能中的“Permit / Deny”含义

这是非常重要的易错点。

Interface ACL

例如:

1
2
3
interface GigabitEthernet0/1
ip access-group 100 in

此时:

1
2
3
4
5
6
permit
→ Packet 可以通过

deny
→ Packet 被丢弃

NAT ACL

例如:

1
2
3
4
access-list 10 permit 192.168.1.0 0.0.0.255

ip nat inside source list 10 interface GigabitEthernet0/1 overload

这里 ACL 的作用不是直接过滤流量,而是:

选择哪些流量需要参与 NAT。

因此:

1
2
3
4
5
6
permit
→ 匹配 NAT

deny
→ 不匹配 NAT

deny 不一定意味着 Packet 被丢弃。

它只是表示:

1
2
3
这条 Packet
不属于这条 NAT Rule 的匹配对象

Packet 是否最终被丢弃,还要看:

1
2
3
4
5
Routing
Interface ACL
Security Policy
其他规则

所以必须牢记:

ACL 的 Permit / Deny 到底意味着什么,要看 ACL 被哪个 Feature 调用。


11. VRF + NAT + ACL 综合 Packet Walk

假设:

1
2
3
4
5
6
7
8
9
10
11
12
13
Host
10.1.1.10
|
VLAN 10
|
SVI
VRF A
|
Router / Firewall
NAT
|
Internet

Host 访问:

1
2
8.8.8.8

整体逻辑:

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
① Packet 进入属于 VRF A 的 L3 Interface

SIP = 10.1.1.10
DIP = 8.8.8.8

↓

② 根据 Ingress Interface 选择 VRF A

↓

③ 在 VRF A 中进行 Routing Lookup

8.8.8.8
→ Default Route / Next-Hop

↓

④ ACL / Policy 检查

↓

⑤ NAT/PAT 匹配

10.1.1.10:50000
→
203.0.113.1:30001

↓

⑥ 从 Outside Interface 发出

↓

Internet

Return:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Internet

8.8.8.8:443
→
203.0.113.1:30001

↓

NAT Translation

203.0.113.1:30001
→
10.1.1.10:50000

↓

正确 VRF / Routing Context

↓

10.1.1.10

实际设备中 NAT、ACL、Routing 的内部处理顺序会受到平台、方向和具体 Feature 影响,因此排障时不要机械背一个适用于所有场景的固定内部 Pipeline。

更重要的是确认:

1
2
3
4
5
6
VRF 对不对?
Route 对不对?
NAT Translation 对不对?
ACL / Policy 对不对?
Return Path 对不对?


12. Show、验证与排障

VRF

1
2
3
4
show vrf
show ip route vrf A
show ip interface brief

需要从特定 VRF 测试时:

1
2
3
ping vrf A <destination>
traceroute vrf A <destination>

注意:

Router 自己发出的 ping vrf,不一定能够完整模拟真实 Inside Host 穿越 NAT 的行为。

所以 NAT 排障最好同时使用真实业务流量验证。

NAT / PAT

1
2
3
show ip nat translations
show ip nat statistics

重点检查:

1
2
3
4
5
有没有 Translation?
Inside Local 对不对?
Inside Global 对不对?
Port Translation 对不对?

ACL

1
2
3
show access-lists
show ip access-lists

重点观察:

1
2
3
4
5
6
7
8
ACL 顺序
Permit / Deny
Hit Counter
Protocol
Source
Destination
Port

Routing

Global:

1
2
show ip route

VRF:

1
2
show ip route vrf A


V7 排障逻辑

遇到:

1
2
Host 无法访问目标

不要一上来就改 NAT 或 ACL。

建议按照:

1
2
3
4
5
6
7
8
9
10
1. VRF
↓
2. Routing
↓
3. NAT / PAT
↓
4. ACL / Policy
↓
5. Return Path

1. VRF

1
2
3
Ingress Interface 属于哪个 VRF?
业务是不是进入了正确 Routing Context?

2. Routing

1
2
3
4
5
目标 Prefix 是否存在?
Default Route 是否存在?
Next-Hop 是否正确?
Return Route 是否存在?

3. NAT / PAT

1
2
3
4
5
Inside / Outside 是否正确?
NAT Rule 是否匹配?
ACL 是否选择到了正确流量?
Translation 是否生成?

4. ACL / Policy

1
2
3
4
5
ACL 绑在哪个 Interface?
方向是 In 还是 Out?
匹配 Source / Destination / Protocol / Port 是否正确?
Hit Counter 是否增长?

5. Return Path

最终必须确认:

1
2
3
4
Forward Path
+
Return Path

都成立。


核心总结

1
2
3
4
5
6
VLAN
= L2 隔离

VRF
= L3 Routing Table 隔离

1
2
3
4
5
6
Ingress L3 Interface
↓
选择 VRF
↓
在对应 Routing Table 中查 DIP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
NAT
= 修改地址身份

Static NAT
= 固定 1:1

Dynamic NAT
= 动态 1:1

PAT / Overload
= 多个 Inside Hosts 共享 Global IP
通过 L4 Port 区分 Session

Static PAT
= Public IP:Port → Private IP:Port

1
2
3
4
5
6
7
8
9
10
11
12
Routing
回答:
“这个 DIP 应该往哪里走?”

NAT
回答:
“这个地址/端口经过边界时应该转换成什么?”

ACL
回答:
“这个 Packet 是否匹配指定条件,以及调用它的 Feature 应如何处理?”

ACL 最重要的两个易错点:

1
2
3
4
5
Interface ACL:

permit = 放行
deny = 丢弃

1
2
3
4
5
6
NAT ACL:

permit = 选择参与 NAT
deny = 不匹配这条 NAT

不代表一定丢包

最终排障抓住:

1
2
3
4
5
6
7
8
9
VRF
↓
Routing
↓
NAT / PAT
↓
ACL / Policy
↓
Return Path

不要把 VRF、Routing、NAT、ACL 混成一个功能:

1
2
3
4
5
6
7
8
9
10
11
VRF
→ 决定在哪张路由表里查

Routing
→ 决定往哪里转发

NAT
→ 决定地址/端口怎么转换

ACL
→ 根据报文字段匹配流量并服务于具体策略