VLAN随笔

VLAN(虚拟局域网)

什么情况下需要VLAN

默认情况下,交换机分割冲突域,路由器分割广播域,那如果想在交换型互联网络中分割广播域,就可以添加VLAN,将交换机的端口指定为不同的子网提供服务(划分VLAN端口),就可以在第二层交换型网络中划分更小的广播域,VLAN就像独立的子网或者广播域,这意味着它只会在属于同一个VLAN的端口之间交换广播帧。可以做到二层隔离的效果,简而言之,就是我们需要更好的交换网络安全性,或者需要划分广播域,做到交换机端口互不干扰,提高网路的健壮性和可靠性。

VLAN的基本概念

VLAN使用IEEE 802.1Q,俗称“Dot One Q”,是经过IEEE认证的对数据帧附加VLAN识别信息的协议,而除了IEEE 802.1Q之外,还有ISL协议,是Cisco产品所使用,但是我没有用过研究过,百度可以查到,实际上和IEEE 802.1Q一样,都是在以太网数据帧上添加标识自己身份的信息来做到区分VLAN的。感兴趣的可以百度研究。两种协议的实现方式不同。

VLAN配置

好多基础信息都可以在百度搜到,没有什么参考价值,所以直接跳到VLAN的应用, 由于每家公司对于VLAN给用户提供的选择不同,所以路由器产品可配置的选项也就不同,由于我们公司也是主要研发路由器,所以我就以我们公司的路由器为主,联系其他几种业界通用的配置叫法,阐述一下VLAN是如何配置并使用的。

  • Untagged :显而易见,对于配置为Untagged的端口,它期待的是一个没有配置VLAN的PC与之建立连接(如果是配置VLAN的PC,他会无法建立连接,从实现的角度讲,每个公司的产品做法不一样,有一些产品会允许带有Tagged的数据包从物理端口中通过,在协议栈中,会由于不识别该数据包的VLAN ID而将其丢弃,还有的公司会在物理端口上直接将其丢弃,不允许进入路由器内部,但是无论怎么实现,它肯定不会建立链接就对了)

  • Tagged:对于配置为Tagged的端口,只允许该端口允许的VID通过,对于不在该端口允许的VID列表中的VLAN,将会被丢弃(和Untagged一样,丢弃的地方取决于不同设备的实现方式)

  • Excluded:对于配置为Excluded的端口,无论是配置VLAN的PC还是未配置VLAN的PC都不可以在这个端口上建立链接。

VLAN IDLAN1LAN2
1UntaggedUntagged
2TaggedTagged
3ExcludedExcluded

看过了上面的描述,我们可以知道如果有一个路由器的VLAN配置为如上表格的样子,那么没有配置VLAN的PC在连接在LAN1/LAN2上能且只能获取到属于VLAN1的子网地址,如果有配置VLAN2的PC连接在LAN1/LAN2上能且只能获取到属于VLAN2的地址,由于VLAN3在LAN1和LAN2上配置的都是Excluded,所以我们不需要将其计算在内,因为除去VLAN2,任何其他的VLAN ID在LAN1/LAN2都不能有正确的连接。由于这种方式是最通俗易懂,且能看的很清晰的,所以 ,我觉得可以用这种方式将其他路由器产品的配置方式带出来。


VLAN IDLAN1LAN2
1UntaggedTagged
2ExcludedTagged
3ExcludedUntagged
  • Access mode :access端口一般用作PC或服务器主机接入,通过该端口的数据包都是不带VLAN tag的。(就如上表格配置,LAN1就属于一个Access mode, 因为它只允许不带VLAN tag的数据包通过)
  • Trunk mode :trunk端口可以允许多个VLAN的数据包通过,一般连接其他交换机。 (如上表格配置,LAN2就属于一个Trunk mode,它允许VLAN1/VLAN2带有VLAN tag通过)
  • PVID:PVID英文解释为Port-base VLAN ID,是基于端口的VLAN ID,一个端口可以属于多个vlan,但是只能有一个PVID,收到一个不带tag头的数据包时,会打上PVID所表示的vlan号,视同该vlan的数据包处理。(如上表配置,LAN1的PVID为1,LAN2的PVID为3)

由于路由器厂家不同,对VLAN模式的定义不同,但是不会绕开Tagged和Untagged,你只需要记住Tagged是允许带Tagged通信,Untagged是不允许带Tagged通讯,万变不离其宗。很好理解。



VLAN的实现原理

VLAN实现方法我见过的一共两种(只是我见过的,可能还有更多),一种是在路由器上使用Linux 网桥去实现,一种是修改Linux内核代码,在内核中去实现,第二种办法是我之前看过公司之前项目的一段源码看到的,没去深究很多,大致流程是在数据包被送进内核协议栈之前判断skb_buff中有没有VLAN ID,如果有VLAN ID的话再去判断是否在设置的Allow VID的List中,如果不在则丢弃,在的话在送入协议栈。

在这里插入图片描述
在这里插入图片描述

上面两图是我当时画的流程图,比较简陋,仅仅代表是我们的实现方式,可能与市面上的很多产品存在差异,请仅作了解使用。

然而主要想说的还是Linux网桥去实现。

网桥实现VLAN

既然已经有Linux内核帮我们实现VLAN的功能了,所以除去一些客制化的要求,我认为Linux网桥已经满足我们对于VLAN的所有需求,由于路由器绝大部分都是使用Linux内核开发的,所以这个配置方法也同样适用于绝大部分路由器。

  1. brctl addbr br-vlan2 (添加一个名字为br-vlan2的桥)
  2. vconfig add eth1 2 (在eth1上配置VLAN2 )
  3. ifconfig eth1.2 (生成eth1.2的接口)
  4. brctl addif br-vlan2 eth1.2 (将eth1.2的虚拟接口添加到br-vlan2的桥下)
  5. ifconfig eth1.2 up (启动该接口)

经过如上配置后,我们的设备在eth1上已经可以支持带有VLAN2 tag的数据包进入,同理,我们可以为自己的接口添加更多的VLAN,你可以理解为你添加的虚拟接口的VLAN就是该物理接口的Allow VID。(所有数据的发送和接受还是需要经过物理接口,例如我们在eth1上添加了一个eth1.3的虚拟接口,那么数据进入的时候,是这样的路线Source->eth1->eth1.3->Destination, 而数据发送的时候是这样的路线 Source-> eth1.3->eth1->Destination, 所以我们在做一些操作的时候,一定要记得这个,所有的数据实际上都是会经过这个物理接口,然后才会走上虚拟接口)

VLAN的抓包

Windows 下VLAN的抓包需要修改注册表,且修改完成后如果你还对该网卡开启VLAN的话可能会有一些影响,所以我建议是专门使用一个电脑使用hub或者可以设置Port Mirror的可配置交换机进行抓包,而且根据你的网卡品牌和型号不同,配置方法也不一致,所以自行百度吧。

Linux下对于VLAN的抓包就友好的多,你可以使用tcpdump 或者tshark, 这两个命令的参数基本差不多,就以tcpdump举例:

tcpdump -i eth1

-i 指定需要抓取的网桥,也可以是我们添加的虚拟接口

下面附上一个抓包结果:

05:06:49.158811 14:3f:xx:xx:xx:xx (oui Unknown) > 14:3f:xx:xx:xx:xx (oui Unknown), ethertype 802.1Q (0x8100), length 60: vlan 10, p 0, ethertype IPv4, (tos 0x0, ttl 127, id 46707, offset 0, flags [DF], proto TCP (6), length 40)
    localhost.55139 > 111.225.218.3.443: Flags [F.], cksum 0xb94e (correct), seq 1, ack 0, win 1025, length 0
        0x0000:  4500 0028 b673 4000 7f06 495b c0a8 f173
        0x0010:  6fe1 da03 d763 01bb 3892 5380 40ac 50a5
        0x0020:  5011 0401 b94e 0000 0000

切记,在你不知道一个包进入路由器后的VLAN ID的情况下,建议直接抓物理接口,也就是进入或者发送的物理接口,这样就能看到完整的VLAN ID,如果你在你确认该包的VLAN ID的情况下,可以直接去网桥上或者虚拟接口抓包,因为在虚拟接口或者网桥上的数据包都是被剥掉VLAN ID的,是看不见的,我觉得应该和tcpdump的hook 点有关,感兴趣的可以看一下tcpdump的抓包点是在哪里。

另外附上tcpdump的参数指南:

root@Gerry:~# tcpdump -h
tcpdump version 4.9.2
libpcap version 1.8.1
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
                [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
                [ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
                [ -Q in|out|inout ]
                [ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
                [ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
                [ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
                [ -Z user ] [ expression ]

最后,目前很多路由器支持配置VLAN,但是实际上VLAN是一个二层的概念,一开始应该是广泛被二层可管理交换机所使用用来分割广播域,可以避免很多问题,是我们的通信网络更加健壮,即使现在我们可以在路由器上配置并使用,但是路由器实际是一个三层的设备,我们将概念明确,才方便后续的开发和学习。后面有时间会写一下Inter-VLAN-Routing, 也就是在路由器上转发两个VLAN之间的流量,做到两个广播域之间的链接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值