端口复用 :
举一个简单的例子
一台内网服务器 , 一台出口路由器 , 路由器将内网的 80 端口映射到公网
在不了解端口复用技术以前 , 笔者就会单纯地觉得 , 当然用户直接访问 80 端口就只能访问到内网服务器的 HTTP 服务
其实使用端口复用技术是可以达到浏览器访问就会是正常的网页 , 而用 ssh 连接就会是 ssh 终端登录的情况的
事实上 , 我们熟悉的 socks 协议就是高级的端口复用技术的产物
原理 :
- 首先实现一个端口转发工具
- 在端口转发工具的基础上增加一些逻辑 , 如下
a. 在 accept 到一个新的客户端请求的时候 , 首先读取前几个字节
b. 根据前几个字节判断这个请求是在请求什么服务 ?
例如 :
HTTP => GET / POST / HEAD / OPTIONS ...
SSH => SSH-2.0-OpenSSH
- 根据第二步中的判断确定要转发的目的端口
- 连接目标端口 , 并将之前接收到的数据首先发过去再进行双向传输
给出一个简单的实现 :
端口复用 : https://gist.github.com/WangYihang/517fbc8e1875938aa62e942be250cf8e
端口转发 : https://gist.github.com/WangYihang/e7d36b744557e4673d2157499f6c6b5e
参考文档 :
RFC1928 (SOCKS5)