第一课:SOCKS5代理服务器 | 豆包MarsCode AI 刷题

267 阅读2分钟

一、SOCKS5协议简介

SOCKS5是一种代理协议,通过代理服务器在客户端和服务器端之间交换网络数据。虽然是代理协议,但不能直接用来翻墙,因为是明文传输的。

  • 用途:某些企业的内网为了确保安全性,配置了很严格的防火墙策略;副作用是,即使管理员访问某些资源也会很麻烦。Socks5协议相当于在防火墙内部开了口,让授权用户可以通过单个端口访问内部所有的资源。
  • 原理图

1.png

二、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语言编程。