支持内网穿透的VPN应用
在以前宽带运营商提供公网IP的时候,我一直使用的是IPSec访问内网。后来没有了公网IP,只能使用Wireguard+Wgsd在两端路由器上完成穿透。手机如果没有连接指定路由器,就只能使用国内VPS中转IPSec数据。但不能从手机直接访问内网一直是个遗憾,因为国内VPS的带宽可不便宜。
实际上,除了WireGuard,我还一直还同时在使用Minivtun,甚至还写了一个Rust的克隆版本。WireGuard的劣势是数据包有明显的特征很容易被识别和屏蔽,Minivtun则完全没有任何特征 。Minivtun的代码还非常简单,很容易修改。在Rust版本里,我加入了原始版本里没有的两个功能,fwmark和rebind。前者便于设置路由规则(参照wireguard),特别是默认路由。后者则在断连时,自动变换端口,这样就稳定很多。
然而,虽然WireGuard可以借助WireGuard-Wgsd进行内网穿透,Minivtun却做不到。也不是做不到,在去年上半年有感于libp2p的分布式打孔功能太弱鸡的时候,我曾经搞了一个简单的打孔库Rndz,并把Minivtun进行了改造,可以做到内网穿透了。但因为已经有了WireGuard-Wgsd,这个可以穿透的Minivtun显得很鸡肋,没用上。
我一直想要的是可以从手机访问内网的功能,特别是在使用移动网络的时候。想法由来已久,终于在上个月动手干了。App是从Android SDK的ToyVPN的例子简单改造的,使用JNI调用minivtun-rs的lib。目前已经在手机稳定跑了两天,可以在wifi和数据之间自由切换,耗电量也很低,可以一直开着。虽然代码很糙,界面也非常简陋,但是暂时够用了,呵呵。