因为众所周知的原因,机场的服务商把协议从 SS 切换到了 Trojan。但是之前的 SS windows 客户端只支持 SS 协议,所以切换后只能换 Trojan-qt5 作为客户端。

但是这个客户端做的实在不怎么样,作者似乎是在原来的 ss-qt5 的基础上做的修改,集成了 libtrojan;以至于之前 SS-Windows 用的好好的 Allow Connections From LAN 功能到这里没法用了。

更改 socks5 监听地址为 INETADDR_ANY 确实能让局域网内的其他主机链接 socks5 代理,但是 HTTP 代理就神奇的不能用了…

试验了一番结果发现要使 HTTP 代理能够正常工作,socks5 代理监听地址必须是 localhost… 🤪

因为我的 Linux 开发环境是搭建在虚拟机里并通过 X11 转发到宿主机的,所以不能使用来自 LAN 的连接会严重影响开发效率。

解决方案

  1. 自己写一个 tcp socket 运行在宿主机上,并监听 INETADDR_ANY,Mint 把转发器作为代理
  2. 用 netcat 实现
  3. 找其他替代品

先考虑 (1),然而发现 netcat 可以实现单次连接转发,但是后续的同一个连接的通信会直接 hang 住,可能哪里姿势不对

再考虑 (2),发现可以用 socat。

WSL 里通过 apt 安装,然后

1
socat tcp-l:10086,fork,reuseaddr tcp:127.0.0.1:10081

Mint 把宿主机的 10086 端口作为代理端口

嗯,发现工作非常顺畅…

这样就不用考虑 (3) 了,不然哪怕用 ASIO 也差不多要百来行代码。