一、SOCKS5协议简介
SOCKS5是一种代理协议,通过代理服务器在客户端和服务器端之间交换网络数据。虽然是代理协议,但不能直接用来翻墙,因为是明文传输的。
- 用途:某些企业的内网为了确保安全性,配置了很严格的防火墙策略;副作用是,即使管理员访问某些资源也会很麻烦。Socks5协议相当于在防火墙内部开了口,让授权用户可以通过单个端口访问内部所有的资源。
- 原理图
二、SOCKS5代理服务器的实现
1. 简化版
-
发送什么就回复什么,可用来测试server写的对不对
-
process函数处理连接
- go 关键字表示这里会启动一个go routine
- go routine可类比为子进程子线程但开销小得多
-
写完后,用nc命令测试
- nc 127.0.0.1 1080
- 可直接与某个ip和端口建立TCP连接
2. 实现协议第一阶段:认证阶段
-
逻辑
-
第一步,浏览器给代理服务器发送报文【3个字段】
-
version协议版本号,固定字段
-
nmethods建传方式数
-
methods对每个建传方式的编码
-
常见方式
- X’00’ NO AUTHENTICATION REQUIRED 不需建传
- X’02’ USERNAME/PASSWORD 用户名密码建传
-
-
第二步,server需要返回一个报文,告诉浏览器选择了什么建传方式
-
cmd测试【curl命令,nc也行吗? 】
-
curl --socks5 127.0.0.1:1080 -v www.qq.com
- 通过代理server 127.0.0.1:1080访问qq
-
此时肯定不正确,因为只实现了第一阶段,但打印日志信息
-
-
3. 请求阶段:试图读取浏览器发送的报文
- 实现一个和auth函数类似的connect函数
- 第一步,浏览器发送一个报文,六个字段
- 二,返回给浏览器一个报文
- 测试:还是失败,但可以正确打印ip和端口,说明目前实现是正确的
4. 最后阶段:和真正的服务器建立TCP连接
- go routine不耗时间,会直接跑到最后return nil结束
- 用到context,要等到任何一个方向的copy失败,这代表某一方可能关闭连接了,此时才终止整个连接
- 测试:
- 成功
- cmd打印详细信息
- 代理server端打印和某个ip 端口建立了连接
- 成功
在浏览器中测试代理
-
chrome浏览器插件SwitchyOmega
- 再打开新的网页时,流量都会经过代理server
本篇笔记记录了下在学习SOCKS5代理服务器这章实践中的一些知识总结,学习了服务器与客户端之间的通信流程以及相应go语言编程。