Bypass Port Isolation (AP Isolation)
UCAS 内网互通
最近有一个简单的需求,我需要在教室访问在宿舍的电脑,windows的rdp成为了最佳选择,但是有一个比较难受的事情是UCAS和sdu一样做了端口隔离和AP隔离,虽然同属一个局域网,但是二层设备限制相互之间的访问。sdu提供了IPV4的公网ip(宿舍网线接口),因此我们可以通过该ip走3层实现内网之间的互通,ucas没有提供公网ipv4,但是有ipv6的公网ip,不幸的是所有设备的ipv6同属于一个子网,2层都给隔断了,因此也就有了这篇文章,通过多种方式实现内网的互通。
Zerotier/Tailscale 组网
最简单的方式就是使用商业的组网软件了,这两个软件都支持异地组网,在每台设备上虚拟一个网卡,让你无论处于什么网络环境下, 都能通过一个固定的内网地址互相访问。两者都是通过P2P打洞的方式实现多设备的组网。
即便没有公网IP,zerotier也能通过一定的技术实现NAT打洞,让两个处于NAT状态下的设备直连访问。如果打洞失败,则通过远程的服务器进行转发,不过服务器在国外,效果比较差。在UCAS的网络环境下,打洞是完全没问题的,毕竟设备同处于一个NAT网络下,最简单的情况了,经过测试是在联通的IPv4网络中实现的打洞,多设备互通没问题,延迟有点奇怪,时高时低,最低10ms之下,高的话100ms左右。但是这种方式有一个致命的问题,就是zerotier和tailscale都是通过udp来传输数据,而运营商会进行QoS,速度只有40Mbps,稍微有点慢。
总结
这种方式实现简单,能实现互通,缺点是速度慢,延迟不太稳定。
使用三层转发
端口隔离和VLAN的原理差不多,就是通过给包打tag的方式实现,进端口加tag,出端口检查tag,tag不对丢弃。如此一下,只允许设备与网关进行通信,与其他端口不允许通信。
在ipv4的情况下,当我们想访问同一个子网其他设备时,首先使用ARP协议获取其他设备的MAC地址,而加入端口隔离后,我们ARP的广播包只能到网关,其他设备根本收不到,这样我们的电脑根本就不知道另一台设备的MAC,自然就无法通信了。
明白了这个问题,我们就可以解决了。既然不知道其他设备的MAC,我们手动改写ARP表,直接让设备知道不就行了。有点naive了,因为端口隔离的存在,你的包在二层只能到网关,有了MAC也去不了另一台设备,那么解决方案就只有一个了,让网关(路由器)帮我们转发。此时我们就要卡协议栈的一个bug了,理论上,同属一个网段的两设备通信不需要走网关,但是我们现在希望网关去转发我们的包。下面用一个例子解释。
设备A ip:10.32.10.32 MAC为 xx-a(48位太长了,简写)
设备B ip:10.32.10.23 MAC为 xx-b
网关(路由器) ip:10.32.10.1 MAC为 xx-route
我们改写设备A的ARP表,让10.32.10.23对应MAC为路由器MAC xx-route,同时改写设备B的ARP表,让10.32.10.32对应MAC也为路由器MAC xx-route。
此时A向B发包,根据ARP表,MAC填写的是路由器MAC,二层会把包送到路由器,路由器看到包的目的IP为10.32.10.23,不管源IP,直接进行路由,发送到设备B上,B向A发包同理。
此时,两个设备都仅与网关通信,不受端口隔离影响,借助路由器实现互访,卡了路由器不看源IP的bug。
以上为ipv4的情况,ipv6情况类似,只不过不用arp协议了,但是还是有一张类似arp表的映射表。
windows下如何修改ARP表
netsh interface ipv4 add neighbors "WLAN" "IP" "MAC"
netsh interface ipv6 add neighbors "WLAN" "IP" "MAC"
删除把add换成delete即可
问题
通过路由器转发,速度可到路由器的端口速度,100mbps左右,速度和稳定性都解决了,那么代价是什么呢?
主要是DHCP下IP会不断的变,需要手动添加删除,比较麻烦,最好的话是开一个服务器,仅供设备分享ip,然后自动添加删除ARP表。
总结
绕过2层的隔离,通过3层的路由进行转发,速度快,稳定性好,但是操作麻烦,需要经常修改。