Mt7621 Vlan
首先要明白VLAN是什么,VLAN本质上就是对网络上数据包进行标记和隔离,在二层生效(IP层)。
VLAN常识
下面是一些术语。
VLAN ID (vid)标记数据流所用的ID,取值为1~4094,用来划分网络,只有VID相同,才能认为他们在同一个网络。- 0和4095是保留值,不要使用。
- 1是较为特殊值的值,不要轻易使用,除非你知道你自己再干什么。
Priority Code Point (prio)包的优先级,取值为0(最低)~7(最高),我们并不关心这个值。tag字面翻译为标记,有多重含义,注意融汇贯通。tag作动词,指对包打上tag头tag作形容词,意味着该包已经被打上tag头。tag作名词,指该包所携带的tag头,主要包括vid和prio。
untag与tag含义相反- 作名词,指将被打上tag的数据流的tag去掉。
- 作形容词,指该包还未被tag。
Port VLAN ID (PVID)每个端口(网口)特有的VID。- 从该端口接受不带tag的包,都会被打上vid等于pvid的tag。
- vid等于pvid的tag的包从该端口发送,都会被untag。
- 对于其他包,根据安全设置,要么原样流入流出,要么被丢弃。
一些常识:
- VLAN32指由tag头中vid为32的包所构成的网络,其余数字同理。
- 终端设备(普通电脑,手机,机顶盒等)未经特殊设置,只会使用untag的包。
- 这里的流入流出,是站在交换机角度而言:包从某个端口流入,指交换机接受到包。
- 网络包流入交换机后,必定携带tag,默认情况下端口的PVID值为1,这也是上文说不要轻易使用的原因。
- MT7621内部包括一个5口交换机,实际上上却有7个端口,其中两个CPU端口,具体情况看下面。
VLAN观察
先ssh进入路由器运行命令,可以看见。 我使用的是Newifi3进行讲解。
[RT-N56U_B1 /home/root]# switch vlan dump
vid portmap eg-tag eg-con stag ivl fid
1 1111--1 uuuu--t 0 0 1 -
2 ----1-1 ----u-t 0 0 1 -
4 ---11-1 ---tt-t 0 0 1 -
PVID:
port pvid prio matrix
0 1 0 1111--1
1 1 0 1111--1
2 1 0 1111--1
3 1 0 11111-1
4 2 0 ---11-1
5 1 0 ------1
6 1 0 11111-1
首先看 PVID: 下的表格。
在port一列可以看见,路由器有0~6个端口7个端口。
根据观察,猜测和查询资料,0~6端口分别对应为LAN4,LAN3,LAN2,LAN1,WAN,CPU1,CPU2。
如果不确定,可以使用switch dump命令进行猜测和估计。
显然,pvid即每一个端口对应的pvid,无需赘述。
值得注意的是,matrix的配置方式,matrix,指当前端口需要和其他哪些端口进行关联,后面讲解如何计算。
两个CPU端口某些路由器(如K2P)上可能分为CPU(LAN)和CPU(WAN),后面再讲解区别。
回头看上面命令返回结果的第一大部分,表头为vid, portmap,eg-tag的表格,只关注前三列,无需关注后4列。
vid portmap eg-tag
1 1111--1 uuuu--t
2 ----1-1 ----u-t
4 ---11-1 ---tt-t
每一行指明了对应VID的VLAN的行为方式。
portmap从左到右,分别指明当前VLAN是否使用的端口0~6。1表示使用该端口,-表示不使用该端口。eg-tag从左到右,分别指明当前VLAN使用端口的模式。u表示untag,t表示tag,-表示不使用。ut应该与portmap中1对应。
以vid为1的一行举例:
portmap说明了VLAN1使用LAN14接口和CPU2接口。即LAN14口和CPU2口。eg-tag说明了对应端口的行为方式,
- LAN1
4接受untag的包,进入交换机后会被认为是VLAN1的包。VLAN1的包在这LAN14流出时会被untag。- CPU2允许tag的VLAN1的数据流入流出。
实际上,这构成一个4口局域网局域网。
以vid为2的一行举例:
portmap说明了VLAN2使用WAN接口和CPU2接口。eg-tag说明了对应端口的行为方式:
- WAN接受untag的包,进入交换机后会被认为是VLAN2的包。VLAN2的包在WAN流出时会被untag
- CPU2允许tag的VLAN2的数据流入流出
实际上,这构成了公网到路由器的连接。
公网数据包从WAN经VLAN2进入CPU,经过处理(拨号,防火墙,NAT等),再经过VLAN1发出,使得连接LAN1~4的设备可以接受互联网数据,反之同理。
注意:每一个端口只能有一个untag的VLAN,并且要和pvid对应
回头看,matrix 参数设置,即设置当前端口可能与哪些端口进行数据交换。
计算方式为,只需要对portmap中当前端口不为0的行,进行按位取或。
VLAN配置
VLAN主要有以下几条命令
配置各个VLAN
switch vlan set [vid] [portmap] <stag> <eg_con> <eg_tag> - set vlan id and associated member
用于配置下面表头为 vid portmap eg-tag eg-con stag ivl fid 的表格内容。
其中<stag> <eg_con>皆设为0。
配置端口pvid
switch pvid [port] [pvid] - set pvid on port 0~6
用于修改端口的pvid的值。
配置端口matrix
switch reg r [offset] - register read from offset
switch reg w [offset] [value] - register write value to offset
这里的 offset 取值为0x2004,0x2104,0x2204,…0x2604。注意只改变右起第3位的值,分别对应端口0~6的寄存器地址。
而寄存器内值 value 类似为0x4f0003,其中,右起5,6位即为matrix的值。
注意:matrix值在输入时应当反序,例如,LAN4口matrix值为
1111--1,那么我们对应的二进制反序后应为1001111,十六进制值为4f,故输入命令:switch reg w 0x2004 0x4f0003
我的配置脚本如下:
switch vlan set 1 1111001 0 0 uuuu--t
switch reg w 0x2004 0x4f0003
switch reg w 0x2104 0x4f0003
switch reg w 0x2204 0x4f0003
switch reg w 0x2304 0x5f0003
switch reg w 0x2604 0x5f0003
switch pvid 3 1