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。
  • untagtag含义相反
    • 作名词,指将被打上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 说明了对应端口的行为方式,
    • LAN14接受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

AP