我好歹还是学网络的,配个最基础的三层交换网络都能遇上一堆问题,我太菜了,我自裁罢

做个网络的小实验,把一些遇到的东西记录如下

首先上拓扑

拓扑

Cloud 连接物理网络,路由器从物理网络获取 DHCP 作为 WAN 连接,三个接入层分别为 VLAN 10,VLAN 20 与 VLAN 30.

Router

DHCP 很好做

1interface GigabitEthernet0/1
2 ip address dhcp
3 duplex auto
4 speed auto
5 media-type rj45
6 no cdp enable

内网分配 10.0.0.0/16 地址,路由的内部接口分配 10.0.1.254/24 ( 一开始是这么做的,然后给我自己挖了个坑 )

所以就是:

1interface GigabitEthernet0/0
2 ip address 10.0.1.254 255.255.255.0
3 duplex auto
4 speed auto
5 media-type rj45
6 no cdp enable

NAT 部分我一直不太记得做法。

给端口配置 inside 与 outside。

一般来讲,给内部端口 ( LAN ) 端配 inside,给外部 ( WAN ) 端配 outside

设置规则这边,由于外网端口通过 DHCP 获取而并非静态地址,所以只能这么写:

1access-list 1 permit any // 这里应该可以换成网络号也就是写成
2// access-list 1 permit 10.0.0.0 0.0.255.255
3ip nat inside source list 1 interface GigabitEthernet0/1 overload

之后在接口配置中指定 inside 与 outside

1interface GigabitEthernet0/1
2 ip nat outside
3interface GigabitEthernet0/0
4 ip nat inside

核心层

配置 3 个 VLAN 给数据使用,默认的 Native VLAN 保持 VLAN 1 不动。

核心打开三层交换机的路由功能,指定路由的 IP 地址为默认路由。

三个 VLAN 分别分配以 VLAN 编号为网络号的网段。

VLAN Network ID Gateway Core1 IP Core2 IP
VLAN 10 10.0.10.0/24 10.0.10.254 10.0.10.252 10.0.10.253
VLAN 20 10.0.20.0/24 10.0.20.254 10.0.20.252 10.0.20.253
VLAN 30 10.0.30.0/24 10.0.30.254 10.0.30.252 10.0.30.253

将中间的两条链路配置为 Etherchannel,使用 LACP 。

配置右端交换机为根桥。

配置右端交换机为 VTP Server 下发 VLAN 信息。 ( 只是因为我懒得配 VLAN,后来发现好像手敲更快一点 )

以 Core1 为例,Core2 大致相同

 1interface Port-channel1
 2 switchport trunk encapsulation dot1q
 3 switchport mode trunk
 4!
 5interface GigabitEthernet0/0
 6 switchport trunk encapsulation dot1q
 7 switchport mode trunk
 8 media-type rj45
 9 negotiation auto
10 channel-group 1 mode passive // 另一端配 active
11!
12interface GigabitEthernet0/1
13 switchport trunk encapsulation dot1q
14 switchport mode trunk
15 media-type rj45
16 negotiation auto
17 channel-group 1 mode passive
18!
19<省略部分>
20interface GigabitEthernet1/0
21 switchport trunk encapsulation dot1q
22 switchport mode trunk
23 media-type rj45
24 negotiation auto
25!
26interface GigabitEthernet1/1
27 switchport trunk encapsulation dot1q
28 switchport mode trunk
29 media-type rj45
30 negotiation auto
31!
32interface GigabitEthernet1/2
33 switchport trunk encapsulation dot1q
34 switchport mode trunk
35 media-type rj45
36 negotiation auto
37!
38<省略部分>
39
40interface Vlan1
41 ip address 10.0.1.1 255.255.255.0
42 vrrp 1 ip 10.0.1.253
43!
44interface Vlan10
45 ip address 10.0.10.252 255.255.255.0
46 vrrp 10 ip 10.0.10.254
47!
48interface Vlan20
49 ip address 10.0.20.252 255.255.255.0
50 vrrp 20 ip 10.0.20.254
51!
52<省略部分>
53ip route 0.0.0.0 0.0.0.0 10.0.1.254

VTP 部分

1vtp version 2
2vtp mode server # 其他都配 client
3vtp domain cisco
4vtp password cisco

生成树部分:

1spanning-tree vlan 1-4094 root primary
2# 另一个核心交换机配 secondary

与路由器连接的端口可以单纯的采用 Access 模式,由三层交换机做三层转发数据包给路由器。

汇聚层

这个例子中汇聚层没啥用

但是需要配 VLAN 信息,不然生成树没有信息导致 VLAN 不通

可以 VTP 下发,也可以配置 transparent 模式并手动分配 VLAN

由于 DTP 协议,把两端端口都开起来 trunk 之后,汇聚层会自动 trunk,Native VLAN 也不需要改

接入层

配置上行链路 Trunk,配置 VTP 接收 VLAN,配置其他端口进相应 VLAN 即可。

Troubleshooting

一开始发现外网不通,然后发现 NAT 配反了,自裁。

我也试了一下如果不在中间配置 VLAN 会导致 VLAN 内不通,大概是因为 Spanning-Tree 是 Per-VLAN Spanning-Tree,然后 show spanning-tree 没有信息

之后一个比较大的问题就是 Inter-VLAN 都是通的,然而外网不通。

从核心层 ping 我的家中网关是通的,外网访问也 OK。

客户机 traceroute 卡在核心层。

ping 核心层其他内网 IP 都正常,唯独 ping 路由器内网接口 IP 不通。

一阵排查之后发现我犯了个大错误。

由于路由接口 IP 配的是 10.0.1.0/24, 路由回程是找不到路由表中 10.0.10.0/24 的路径的,因此他会尝试将其转发给默认路由 ( 也就是公网 ),那自然更不可能通。

去程的时候能够根据核心层交换机的路由表将数据包路由给路由器,但回程因为找不到正确路径因此转发给了外网,而我家庭网关更不可能存在这个路径,所以转发给公网,自然包就被丢弃了。

一个经典的回程路由问题。

路由一定要确保来去都能找得到路径!

解决方法反而很简单,只要让路由器认为数据在二层,让他在二层内部收发包就行了,其他的事情交给三层交换机处理。

根据 VLSM,这种方法完全是可行的。

因此将接口 IP 改为 10.0.1.254/16

接下来网络便一切正常了。

当然其实是可以配置静态路由或者用一道动态路由协议的,不过我觉得没必要,这就把简单问题搞复杂了。

Summary

最近很多时候都在做 Packet Tracer,实际上这个和真机差相当远。用 GNS3 还好,大多数地方和真实设备相当。

实际上就发生过在 Packet Tracer 里通的东西实际上不可能通的事情,搞得我对这个软件很有恐惧感。

最近发现即便是搞云计算啥的,学习网络知识还是相当有用的,虽然基本上 CCNA 水平足以就是了。

还有,这东西真的超级吃内存。

我觉得我的 16GB 在复杂实验环境都根本不够,根本不够开几个虚拟机的。

而且还得多分配点资源给他们,不然卡的不行。

而且这些实验环境用 CPU 模拟的,延迟真的上天。

一个数据包从接入层发到我的家庭网关居然将近 100ms 了。

Anyway,我其实还挺喜欢网络这些东西的。