一、背景
为了突破(公司)的网络限制,同时需要满足以二层、三层网络的方式进行路由。最初选择以OpenVPN、Wireguard的TUN模式为基础的隧道技术进行,可在实践过程中发现,(公司)对这两种可实现三层网络的协议能够达到即开即封,被封禁速度与使用网络流量大小成正相关。
故不得不选择更基础的协议去进行测试,在此过程中,针对(公司)对数据流量的阻断原理有了进一步的了解。
二、过程
首先进行了架构设计,最初方案为使用VXLAN+MACsec进行隧道的搭建与加密。两端设备均为Ubuntu 22.04,在两端利用公网建立了VXLAN隧道,并配置了MACsec,具体方法可问GPT。
建立连接后,配置路由器,使用OpenVPN TUN技术将路由器与机器A(公司内)进行了连接,获取到两端内网地址,配置默认NAT,将所有流量NAT至机器A的TUN接口地址。

可见流量已转发至机器A。但在此过程中遇到一个问题,按照此时的理解,在机器A与机器B之间通过VXLAN与MACsec建立的隧道中传输数据并不会被(公司)防火墙进行探测阻断。可实践后发现并非如此。
具体的表现为:
- 访问 https://www.google.com/ 可以完成TLS握手,且可获取到页面内容;
- 访问 https://www.x.com/ 或其他HTTPS网站,TLS握手过程被干扰,无法建立连接;
- 访问 HTTP 明文网站会出现 RST 阻断包,与(公司)防火墙阻断原理(网传)相同。
故进行了进一步了解。
(一)MACsec协议
MACsec 是链路层加密协议(IEEE 802.1AE),它的加密范围是:本地以太网链路上的以太网帧的 payload。它的保护范围是 本地链路上的明文数据在物理层传输过程中的机密性与完整性。
也就是说MACsec是针对二层的数据包可以完成加密,而在笔者的设计中,所有的流量均为走的三层协议,所以其实我的流量并未进行加密。但由此可以笔者推测出以下的结论:
- 在 VXLAN 内访问的数据包(公司)防火墙也可以识别到且阻断;
- (公司)防火墙对VXLAN的包容性是存在的;
- 跨国云计算公司所使用此协议的过程中,有一部分白名单证书可以被放行。
针对这种情况,笔者只好选择了在VXLAN隧道上运行了能够支持三层的VPN软件,经过实验发现此种方式可以做到全程加密,且稳定性与延迟较低(前提为选择合适的主机A与主机B)。