使用 AnyEvent 来实现同一个端口跑二种服务
这篇讲的是一个非常实际的网络访问问题:当 Linode 的 SSH 端口(22)被 GFW 过滤后,如何利用仍然开放的 80 端口,让同一台服务器同时提供 HTTP 和 SSH 两种服务。作者从这个痛点出发,实现了一个基于 Perl AnyEvent 库的协议识别与转发代理。 核心方案在于对连接建立时发送的初始数据包进行嗅探。对于 HTTP 请求,开头通常包含“GET”、“POST”等关键字;而对于 SSH 连接,像 SecureCRT 或 Bitvise 这样的客户端会主动发送包含“SSH”字样的协议头。程序根据这个特征,将连接动态转发到本地对应的 80 或 22 端口后端服务。作者基于国外一个 Perl 实现进行了重写和封装,利用 AnyEvent 的事件循环特性来构建高性能的异步代理。 最终效果就是,作者现在浏览的网页和远程管理都是通过这同一个 80 端口完成的。这个方案虽然牺牲了使用 CDN 的可能性,但在特定网络环境下,提供了一种巧妙且有效的端口复用思路。