VLAN是网络交换机的一种技术,可以把不同的电脑划分在不同的网络中,使其不能互相通信,以达到提高安全性和网络性能的目的。要跨越VLAN通信,必须借助路由器或者3层交换模块。
我市的ADSL网在接入层使用了Cisco的Catalyst6509型三层交换机,在端口上设置了VLAN,把同一IP段的用户相互隔开。这样一来,安全性倒是高了,可惜平时打游戏、共享文件都不方便,需要通过其他IP段的朋友中转。于是突破VLAN成了当务之急。
我所在的段,IP地址为10.145.254.x,网关为10.145.254.1,采用24位的掩码。因为是同一IP段,所以电脑不会自动通过路由器转发数据,而妄想通过直接通信的方式联络对方电脑。在VLAN环境下,ARP是收不到回应的,因此直接通信也就被禁止了。
要想实现互通,必须强制电脑把数据发给路由器。
大家知道,路由器判断一个数据包是否应该转发,是以其2层地址和3层地址为依据的。如果该数据包的目标MAC地址不是路由器接口的MAC地址,那么这个包根本不是给路由器的,而是HUB产生的1层广播包;如果目标MAC地址与路由器接口的MAC地址相同,但目标IP地址并不是路由器接口的IP地址,这个包就应该被路由出去;如果目标MAC地址和IP地址都与路由器接口相匹配,那这个数据包是发给路由器本身的。
电脑在发送数据时,先判断目标和自己是否在同一IP网段。如果在同一网段,则发送ARP请求,查询对方的MAC地址,然后封包发送;如果不在同一IP网段,则发送数据包,并把包头中目标MAC地址设置为本子网的路由器接口的MAC地址,而目标IP地址则是最终接收数据的电脑的IP地址的数据包。路由器收到数据以后,就会把它转发出去。
要强制电脑把本来直接发送的数据发给路由器,可以从ARP协议上下手,也可以从判断是否同一网段的过程下手。
使用ARP的方法如下:
1、使用arp -a命令查看已知的MAC列表。因为目前VLAN里只有网关和本身,所以这里只显示网关的MAC地址:
Internet Address Physical Address Type
10.145.254.1 00-d0-04-14-af-fc dynamic
2、使用arp -s命令把要与之通信的电脑的IP地址和网关的MAC地址强行捆绑。这样,这台电脑就会把发给对方的数据发给路由器。对方的机器也要运行这个命令,不过IP地址要指定为这一台。比如10.145.254.a和10.145.254.b通信,要在10.145.254.a上运行arp -s 10.145.254.b 00-d0-04-14-af-fc ,而在10.145.254.b上运行arp -s 10.145.254.a 00-d0-04-14-af-fc
经过这样的设置,电脑还以为自己在直接发送数据,而路由器以为自己收到了需要路由的数据包。这其实是一种ARP欺骗技术。
使用同子网判断的方法如下:
双方使用route命令,建立一条“主机路由”。所谓主机路由,就是针对一台电脑而不是一个IP网段的路由项目,其目标掩码为255.255.255.255。
在10.145.254.a上运行route ADD 10.145.254.b MASK 255.255.255.255 10.145.254.1 ,在10.145.254.b上运行route ADD 10.145.254.a MASK 255.255.255.255 10.145.254.1即可。根据路由的最长匹配原则,电脑在发送数据时会选择掩码里1比较多的那一项,也就是主机路由(32位掩码),而不会认为对方和自己同一子网(24位掩码)。
使用以上两种方法,就可以突破VLAN的限制了。除了CS的LAN Gane还不能正常运行(Internet Game正常)以外,其他软件均运行正常。
现在是一个高人的介绍哈:
第一:如果该数据包的目标MAC地址不是路由器接口的MAC地址,那么这个包根本不是给路由器的,而是HUB产生的1层广播包;
点评:这句话表达有失偏颇!问题的关键在于“HUB产生的1层广播报文”这是一句让人昏倒在地的说法哦!
分析:
1、路由器可以分解为一个独立的物理层+数据链路层+网络层构成转发决策机构!当然路由器还有自己的七层(严格的说是TCP/IP的第四层应用层)。现在我们仅仅需要关心的就是路由器的二层+三层这两个层面;
2、如果路由器一个interface接受到的报文的DMAC不等于interface的MAC,那么路由器认为这个报文不是自己的,或者这个报文不需要自己进行处理,所以路由器将直接discard这个报文!
所以“HUB产生的1层广播报文”犯下了严重的阶级路线错误!
第二:如果目标MAC地址与路由器接口的MAC地址相同,但目标IP地址并不是路由器接口的IP地址,这个包就应该被路由出去;
点评:这句话表达基本上没有什么错误!
分析:
1、路由器接口接收到报文如果DMAC=路由器接口自身的MAC,那么路由器将尽义务进行下一步的处理,那就是到底将这个报文进行路由转发还是给我CPU自己使用;
2、但是究竟是进行转发还是提交给CPU,这已经不是二层是事情了,各司其职嘛。二层协议栈还要将这个报文的二层帧头、FCS这个尾巴去掉提交给三层!
3、三层收到IP包之后,那么判断这个IP包的DIP等不等于接口IP地址,如果不等于,那么表示的是这个报文不需要提交CPU高层协议栈。需要进行路由转发处理!
一旦路由器作出路由转发处理,那么路由器接下来的工作是不是就是查询路由表,看看把这个瘟神从那个接口送走了之!
第三:如果目标MAC地址和IP地址都与路由器接口相匹配,那这个数据包是发给路由器本身的。
点评:这句话表达没有什么错误!
分析:
1、这个观点还是延续的上一个说法,那就是路由器二层协议栈将报文的帧头、FCS尾巴去掉之后,提交给协议栈的三层---网络层;
2、三层收到IP包之后,那么判断这个IP包的DIP等不等于接口IP地址,如果不等于,那么表示的是这个报文不需要提交CPU高层协议栈。需要进行路由转发处理!
3、那么如果DIP=接口IP,三层就认为这个报文需要提交给CPU来处理!
一旦路由器作出判定,这个报文需要提交给CPU,那么三层协议栈就需要将报文的IP包头删除,将剩余的部分(就是IP包的内容部分哈)提交给四层或者直接提交给ICMP等协议高层处理
下面是高人的一个交换原理的模型图片,出处[url]www.cditlab.com[/url]
摘自
https://blog.51cto.com/xiong/17780