三 、 通过上级代理建议远程连接
  1. 直接使用 golang 官方库实现远程连接建立

支持 HTTP,HTTP+CONNECT,SOCKS

  1. 自己动手实现SOCKS5连接

    1. 与服务建立TCP连接

      1
      2
      3
      4
      conn, err = net.Dial("tcp", proxy)
      if err != nil {
      return
      }
    2. 发送SOCKS5会话标识 (无认证)

      1
      2
      3
      4
      _, err = conn.Write([]byte{0x05, 0x01, 0x00})
      if err != nil {
      return
      }
    3. 读取服务端响应

      1
      2
      3
      4
      5
      6
      7
      8
      9
      ans := make([]byte, 2)
      _, err = io.ReadFull(conn, ans)
      if err != nil {
      return
      }
      if ans[0] != 0x05 || ans[1] != 0x00 {
      err = errors.New("server answer error")
      return
      }

      ans[1] == 0x00 表示无需认证

    4. 发送目标地址及端口号

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      _, err = conn.Write([]byte{0x05, 0x01, 0x00, 0x01})
      if err != nil {
      return
      }
      _, err = conn.Write(raddr.IP.To4())
      if err != nil {
      return
      }
      err = binary.Write(conn, binary.BigEndian, uint16(raddr.Port))
      if err != nil {
      return
      }
    5. 读取服务器响应 (会话标识+其他数据共10 bytes)

      1
      2
      ans = make([]byte, 10)
      _, err = io.ReadFull(conn, ans)

    到此 SOCKS5 会话建立成功。

    https://datatracker.ietf.org/doc/html/rfc1928