当前位置: 首页 > news >正文

电子商务网站建设服务外包佛山自助建站软件

电子商务网站建设服务外包,佛山自助建站软件,百度地图人工服务,长沙是什么时候建立的这里学习一下 socks5 代理的编写 网上有很多 学习一下 go 语言实战入门案例之实现Socks5 - 知乎 滑动验证页面 socks5协议原理学习-腾讯云开发者社区-腾讯云 (tencent.com) 首先我们要了解一下socks5的代理方式 socks5 是基于 认证建立连接转发数据 所形成的代理 我们只…这里学习一下 socks5 代理的编写 网上有很多 学习一下 go 语言实战入门案例之实现Socks5 - 知乎 滑动验证页面 socks5协议原理学习-腾讯云开发者社区-腾讯云 (tencent.com) 首先我们要了解一下socks5的代理方式 socks5 是基于 认证建立连接转发数据 所形成的代理 我们只需要按照这三个写出代码即可  首先就是socks5的认证 Socks5Atuth 这里首先要认证 那么我们首先要确定是不是socks5代理 在socks5中 前两个字节 分别是 socks版本号 和 支持的认证方式 前面两个 1 所以这里我们开始读取前面的 版本号 ver socks5是固定值 0x05 这里开始编写一下监听 package mainimport (bufiofmtlognet )const socks5Ver 0x05 const cmdVer 0x01 const aytpVerIpv4 0x01 const aytpVerUrl 0x03 //这里是下面的常量 不需要理会即可 当作值即可func main() {server, err : net.Listen(tcp, 127.0.0.1:1080)if err ! nil {panic(err)}for {client, err : server.Accept()if err ! nil {log.Printf(Accpet error :, err)continue}//确定ip端口 进行链接后 开始进程fmt.Println(开始监听, client, client.RemoteAddr())} } 然后开始处理数据 首先我们需要开启一个协程 处理 func process(conn net.Conn) {defer conn.Close()readio : bufio.NewReader(conn)err : auth(readio, conn) }这里我们首先处理一下认证的信息 // ------------------------// |VER | NMETHODS | METHODS |// ------------------------// | 1 | 1 | 1 to 255 |// ------------------------// VER: 协议版本socks5为0x05// NMETHODS: 支持认证的方法数量// METHODS: 对应NMETHODSNMETHODS的值为多少METHODS就有多少个字节。RFC预定义了一些值的含义内容如下:// X’00’ NO AUTHENTICATION REQUIRED// X’02’ USERNAME/PASSWORD// 版本和NMETHODS值都是单字节的所以ReadByte读一个字节就好了 这里需要认证的东西就是这些 我们首先进行认证 ver func auth(readio *bufio.Reader, conn net.Conn) (err error) {ver, err : readio.ReadByte()fmt.Println(ver)return nil }这里是通过 readbyte 读取一个字节 我们输出一下就知道是多少了 发现我们通过浏览器进行代理 第一个byte是 5 对应 socks5 如果将代理设置为 socks4 那么这里就是对应4 然后这里进行匹配 如果不是就输出错误 这样 ver认证就结束了 认证的ver func auth(readio *bufio.Reader, conn net.Conn) (err error) {ver, err : readio.ReadByte()if err ! nil {return fmt.Errorf(ver error:, err)}if ver ! socks5Ver {return fmt.Errorf(ver num error: , err)}} 认证method         这里是socks5的认证是否需要认证 methodSize, err : readio.ReadByte()fmt.Println(methodSize)return 其实这里就是读取一个字节的大小 func auth(readio *bufio.Reader, conn net.Conn) (err error) {ver, err : readio.ReadByte()if err ! nil {return fmt.Errorf(ver error:, err)}if ver ! socks5Ver {return fmt.Errorf(ver num error: , err)}methodSize, err : readio.ReadByte() //确定切片大小 为 1字节method : make([]byte, methodSize) //创建一个大小的切片_, err io.ReadFull(readio, method) // 这里是判断是否读了if err ! nil {return fmt.Errorf(read method error :, err)}_, err conn.Write([]byte{socks5Ver, 0x00}) // 这里是握手的回复 说明我们不需要认证if err ! nil {return fmt.Errorf(write error, err)}return nil } 这里注意 _, err conn.Write([]byte{socks5Ver, 0x00}) 这里其实是监听后告诉 不需要进行 认证 当我们认证完后开始处理浏览器的报文 Socks5Connect // 读取浏览器发送的报文// ------------------------------------------// |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |// ------------------------------------------// | 1 | 1 | X00 | 1 | Variable | 2 |// ------------------------------------------// VER 版本号socks5的值为0x05// CMD 0x01表示CONNECT请求// RSV 保留字段值为0x00// ATYP 目标地址类型DST.ADDR的数据对应这个字段的类型。// 0x01表示IPv4地址DST.ADDR为4个字节// 0x03表示域名DST.ADDR是一个可变长度的域名// DST.ADDR 一个可变长度的值// DST.PORT 目标端口固定2个字节这里是浏览器发送的报文 我们依旧先进行鉴定 func connnect(readio *bufio.Reader, conn net.Conn) (err error) {buf : make([]byte, 4)_, err io.ReadFull(readio, buf) // 这里是读取字节数 读取前面4个作为一个切片if err ! nil {return fmt.Errorf(read header error :, err)}var ver, cmd, atyp buf[0], buf[1], buf[3] // 这里对应报文的字节认证的位置fmt.Println(ver, cmd, atyp)return } 这里就很明显了 5 对应 socks5 1 对应 链接的请求 3 对应 url 是一个域名 ------------------------------------------------------------ |VER | CMD | ATYP | HOST SIZE | HOST | ------------------------------------------------------------ | 05 | 01 | 03 | 11 | www.exa.com | ------------------------------------------------------------首先之前的都已经被读了ver cmdatyp然后再读 就是 host size 这里是 后面 host 的地址长度 这里开源发现 cn.bing.com的长度是11 因为url是可变的 所以后面的host也是可变的 我们首先读取字节长度 然后作为 值传递给切片 读取该长度的值 这样我们就开源获取到url地址 _, err io.ReadFull(readio, buf[:2]) //再向后读取两个字节 是portif err ! nil {return fmt.Errorf(port error:, err)}port : binary.BigEndian.Uint16(buf[:2]) //这里是大端序监听端口fmt.Println(port)fmt.Println(addr)return 这里的原理是这样的 首先我们读取两个字节 443 [1 187] 然后进行大端序排序 0 在高 80 在低 这个时候就是 [1 187] 然后我们进uint16处理 [1 187]将高位字节1左移 8 位使其占据 uint16 的高 8 位得到结果 00000001 00000000将低位字节187放在 uint16 的低 8 位得到结果 00000001 1011101100000001 10111011443 这样我们就获取到了端口 然后我们就可以进行拼接url dest : fmt.Sprintf(%v:%v, addr, port) fmt.Println(dest) 然后我们开始建立tcp请求 dest, err : net.Dial(tcp, fmt.Sprintf(%v:%v, addr, port)) //建立tcp协议if err ! nil {return fmt.Errorf(dial error:, err)}defer dest.Close()log.Println(访问:, addr, port) 完整代码 package mainimport (bufiocontextencoding/binaryfmtiolognet )const socks5Ver 0x05 const cmdVer 0x01 const aytpVerIpv4 0x01 const aytpVerUrl 0x03func main() {server, err : net.Listen(tcp, 127.0.0.1:1080)if err ! nil {panic(err)}for {client, err : server.Accept()if err ! nil {log.Printf(Accpet error :, err)continue}//确定ip端口 进行链接后 开始进程fmt.Println(开始监听)go process(client)} } func process(conn net.Conn) {defer conn.Close()readio : bufio.NewReader(conn)err : auth(readio, conn)if err ! nil {fmt.Errorf(ip: %v,auth error :, conn.RemoteAddr().String(), err)}err connnect(readio, conn) }func auth(readio *bufio.Reader, conn net.Conn) (err error) {ver, err : readio.ReadByte()if err ! nil {return fmt.Errorf(ver error:, err)}if ver ! socks5Ver {return fmt.Errorf(ver num error: , err)}methodSize, err : readio.ReadByte() //确定切片大小 为 1字节method : make([]byte, methodSize) //创建一个大小的切片_, err io.ReadFull(readio, method) // 这里是判断是否读了if err ! nil {return fmt.Errorf(read method error :, err)}_, err conn.Write([]byte{socks5Ver, 0x00}) // 这里是握手的回复 说明我们不需要认证if err ! nil {return fmt.Errorf(write error, err)}return nil }func connnect(readio *bufio.Reader, conn net.Conn) (err error) {buf : make([]byte, 4)_, err io.ReadFull(readio, buf) // 这里是读取字节数 读取前面4个作为一个切片if err ! nil {return fmt.Errorf(read header error :, err)}var ver, cmd, atyp buf[0], buf[1], buf[3] // 这里对应报文的字节认证的位置if ver ! socks5Ver {return fmt.Errorf(connect ver error:, err)}if cmd ! cmdVer {return fmt.Errorf(connect cmd error:, err)}addr : switch atyp {case aytpVerIpv4:_, err io.ReadFull(readio, buf)if err ! nil {return fmt.Errorf(ipv4 error:, err)}addr fmt.Sprintf(%d.%d.%d.%d, buf[0], buf[1], buf[2], buf[3]) //读取ip地址case aytpVerUrl: //这里解析的是urlhostSize, err : readio.ReadByte() //获取url的字节长度if err ! nil {return fmt.Errorf(read hostSize failed:%w, err)}host : make([]byte, hostSize) //获取url字符的字节_, err io.ReadFull(readio, host)if err ! nil {return fmt.Errorf(read host failed:%w, err)}addr string(host)default:return fmt.Errorf(not yet, atyp)}_, err io.ReadFull(readio, buf[:2]) //再向后读取两个字节 是portif err ! nil {return fmt.Errorf(port error:, err)}port : binary.BigEndian.Uint16(buf[:2]) //这里是大端序监听端口dest, err : net.Dial(tcp, fmt.Sprintf(%v:%v, addr, port)) //建立tcp协议if err ! nil {return fmt.Errorf(dial error:, err)}defer dest.Close()log.Println(访问:, addr, port)_, err conn.Write([]byte{0x05, 0x00, 0x00, 0x01, 0, 0, 0, 0, 0, 0})if err ! nil {return fmt.Errorf(写入错误:, err)}ctx, cancel : context.WithCancel(context.Background()) //启动一个可以取消的上下文功能defer cancel()go func() {_, _ io.Copy(dest, readio) //这里是从我们的请求中读取出来 写入请求中cancel()}()go func() {_, _ io.Copy(conn, dest) //这里从请求中写入返回报文中cancel()}()-ctx.Done() // 这里是 只要管道输出内容了就停止 所以上面两个协程 只要有一个输出 就取消return nil }
http://www.dnsts.com.cn/news/149904.html

相关文章:

  • 网站图片自动切换怎么做定制网站开发报价单
  • 域名注册以后怎样做网站erp管理软件开发公司
  • 甜品网站建设规划网站百度权重查询
  • 张家港建设局门户网站陕西省建设厅三类人员报名网站
  • 如何把网站做的更好wordpress搬家404
  • 啊宝贝才几天没做网站网站建设公司市场定位
  • 外国网站在内地做seo2020最成功的网络营销
  • 网站开发与设计实训报告最好看免费观看高清大全宫崎骏
  • 陕西城乡建设部网站深圳市无限空间工业设计有限公司
  • 建设网站采用的网络技术企业营销策划书模板范文
  • 网站开发的形式合肥网站建设的公司
  • 购物网站页面设计新华网官网首页
  • 外贸网站建站那家公司好网站建设项目需求说明书
  • 收录好的网站有哪些保山做网站
  • 化工网站制作网站建设资源平台
  • 专题网站开发报价怎么做一直弹窗口网站
  • 网站首次备案 多久手机怎么登录微信网页版
  • 网站引入优酷视频旅游网站规划设计与建设
  • 网站模板 作业谷歌系平台推广
  • 搜索引擎网站优化推广浙江均泰建设有限公司网站
  • 网站开发项目时序图商标logo设计生成器免费
  • 天价索赔背后的平台版权对垒慈溪企业网站seo
  • 合肥网站建设王道下拉??线下推广有哪些渠道
  • 个性化网站有哪些新钥匙石家庄网站建设
  • 哪里网站海报做的比较好桂林建设信息网站
  • 百度站长工具登录方式网站搜索排名和什么有关系
  • 网站规划与建设wordpress 主题 排名
  • 如何做网站界面linode vps wordpress
  • 如何做pc网站适配胶南网络推广
  • 机关门户网站 建设 方案wordpress的固定链接怎么设置