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

内容电商的网站如何做做平面的公司网站

内容电商的网站如何做,做平面的公司网站,wordpress安装504,企迪网文章目录 前言socks协议简介go实现一个简单的socks5代理运行与压测抓包验证 前言 SOCKS是一种网络传输协议#xff0c;主要用于客户端与外网服务器之间通讯的中间传递。协议在应用层和传输层之间。 本文使用先了解socks协议。然后实现一个socks5的tcp代理服务端。最后#… 文章目录 前言socks协议简介go实现一个简单的socks5代理运行与压测抓包验证 前言 SOCKS是一种网络传输协议主要用于客户端与外网服务器之间通讯的中间传递。协议在应用层和传输层之间。 本文使用先了解socks协议。然后实现一个socks5的tcp代理服务端。最后进行抓包验证。 本文完整代码见仓库laboratory/16-go-socks5 socks协议简介 socks协议相对http和tcp协议还是比较简单。当然想要搞明白每个细节也非一件容易的事情。 关于协议本身的介绍见rfc1928、RFC 1928 - SOCKS 5 协议中文文档「译」 文档总是枯燥的可以边看文档边看代码实战150行Go实现高性能socks5代理 go实现一个简单的socks5代理 了解协议后我们来实现一个tcp的socks5服务端代理。 网上有很多这样的示例见socks - Search Results - Go Packages 本节的代码参考自实战150行Go实现高性能socks5代理 、Subsocks: 用 Go 实现一个 Socks5 安全代理 - Luyu Huangs Blog 完整代码见仓库下面是主要的代码。 package socks5import (bufioencoding/binaryerrorsfmtgo-socks5-demo/configgo-socks5-demo/utilsionetstrconvlog github.com/sirupsen/logrus )const SOCKS5VERSION uint8 5const (MethodNoAuth uint8 iotaMethodGSSAPIMethodUserPassMethodNoAcceptable uint8 0xFF )const (RequestConnect uint8 iota 1RequestBindRequestUDP )const (RequestAtypIPV4 uint8 iotaRequestAtypDomainname uint8 3RequestAtypIPV6 uint8 4 )const (Succeeded uint8 iotaFailureAllowedNetUnreachableHostUnreachableConnRefusedTTLExpiredCmdUnsupportedAddrUnsupported )type Proxy struct {Inbound struct {reader *bufio.Readerwriter net.Conn}Request struct {atyp uint8addr string}OutBound struct {reader *bufio.Readerwriter net.Conn} }func Start() error {// 读取配置文件中的监听地址和端口log.Debug(socks5 server start)listenPort : config.Conf.ListenPortlistenIp : config.Conf.ListenIpif listenPort 0 || listenPort 65535 {log.Error(invalid listen port:, listenPort)return errors.New(invalid listen port)}//创建监听addr, _ : net.ResolveTCPAddr(tcp, listenIp:strconv.Itoa(listenPort))listener, err : net.ListenTCP(tcp, addr)if err ! nil {log.Error(fail in listen port:, listenPort, err)return errors.New(fail in listen port)}// 建立连接for {conn, _ : listener.Accept()go socks5Handle(conn)} }func socks5Handle(conn net.Conn) {proxy : Proxy{}proxy.Inbound.reader bufio.NewReader(conn)proxy.Inbound.writer connerr : handshake(proxy)if err ! nil {log.Warn(fail in handshake, err)return}transport(proxy) }func handshake(proxy *Proxy) error {err : auth(proxy)if err ! nil {log.Warn(err)return err}err readRequest(proxy)if err ! nil {log.Warn(err)return err}err replay(proxy)if err ! nil {log.Warn(err)return err}return err }func auth(proxy *Proxy) error {/*Read------------------------|VER | NMETHODS | METHODS |------------------------| 1 | 1 | 1 to 255 |------------------------*/buf : utils.SPool.Get().([]byte)defer utils.SPool.Put(buf)n, err : io.ReadFull(proxy.Inbound.reader, buf[:2])if n ! 2 {return errors.New(fail to read socks5 request: err.Error())}ver, nmethods : uint8(buf[0]), int(buf[1])if ver ! SOCKS5VERSION {return errors.New(only support socks5 version)}_, err io.ReadFull(proxy.Inbound.reader, buf[:nmethods])if err ! nil {return errors.New(fail to read methods err.Error())}supportNoAuth : falsefor _, m : range buf[:nmethods] {switch m {case MethodNoAuth:supportNoAuth true}}if !supportNoAuth {return errors.New(no only support no auth)}/*replay------------|VER | METHOD |------------| 1 | 1 |------------*/n, err proxy.Inbound.writer.Write([]byte{0x05, 0x00}) // 无需认证if n ! 2 {return errors.New(fail to wirte socks method err.Error())}return nil }func readRequest(proxy *Proxy) error {/*Read------------------------------------------|VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |------------------------------------------| 1 | 1 | X00 | 1 | Variable | 2 |------------------------------------------*/buf : utils.SPool.Get().([]byte)defer utils.SPool.Put(buf)n, err : io.ReadFull(proxy.Inbound.reader, buf[:4])if n ! 4 {return errors.New(fail to read request err.Error())}ver, cmd, _, atyp : uint8(buf[0]), uint8(buf[1]), uint8(buf[2]), uint8(buf[3])if ver ! SOCKS5VERSION {return errors.New(only support socks5 version)}if cmd ! RequestConnect {return errors.New(only support connect requests)}var addr stringswitch atyp {case RequestAtypIPV4:_, err io.ReadFull(proxy.Inbound.reader, buf[:4])if err ! nil {return errors.New(fail in read requests ipv4 err.Error())}addr string(buf[:4])case RequestAtypDomainname:_, err io.ReadFull(proxy.Inbound.reader, buf[:1])if err ! nil {return errors.New(fail in read requests domain len err.Error())}domainLen : int(buf[0])_, err io.ReadFull(proxy.Inbound.reader, buf[:domainLen])if err ! nil {return errors.New(fail in read requests domain err.Error())}addr string(buf[:domainLen])case RequestAtypIPV6:_, err io.ReadFull(proxy.Inbound.reader, buf[:16])if err ! nil {return errors.New(fail in read requests ipv4 err.Error())}addr string(buf[:16])}_, err io.ReadFull(proxy.Inbound.reader, buf[:2])if err ! nil {return errors.New(fail in read requests port err.Error())}port : binary.BigEndian.Uint16(buf[:2])proxy.Request.atyp atypproxy.Request.addr fmt.Sprintf(%s:%d, addr, port)log.Debug(request is, proxy.Request)return nil }func replay(proxy *Proxy) error {/*write------------------------------------------|VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |------------------------------------------| 1 | 1 | X00 | 1 | Variable | 2 |------------------------------------------*/conn, err : net.Dial(tcp, proxy.Request.addr)if err ! nil {log.Warn(fail to connect , proxy.Request.addr)_, rerr : proxy.Inbound.writer.Write([]byte{SOCKS5VERSION, HostUnreachable, 0x00, 0x01, 0, 0, 0, 0, 0, 0})if rerr ! nil {return errors.New(fail in replay err.Error())}return errors.New(fail in connect addr proxy.Request.addr err.Error())}_, err proxy.Inbound.writer.Write([]byte{SOCKS5VERSION, Succeeded, 0x00, 0x01, 0, 0, 0, 0, 0, 0})if err ! nil {return errors.New(fail in replay err.Error())}proxy.OutBound.reader bufio.NewReader(conn)proxy.OutBound.writer connreturn nil }func transport(proxy *Proxy) {// 语义上是注释的动作;但是iobuf.reader中无法获取rd值// io.Copy(proxy.OutBound.writer, proxy.Inbound.reader)go io.Copy(proxy.OutBound.writer, proxy.Inbound.writer) // outbound - inbound// io.Copy(proxy.Inbound.writer, proxy.OutBound.reader)go io.Copy(proxy.Inbound.writer, proxy.OutBound.writer) // inbound - outbound } 运行与压测 运行测试可以在浏览器中安装和配置下Proxy SwitchyOmega。插件将http流量转换成socks5流量通过代理浏览器可正常上网。访问百度看B站都没问题。 压测略。 抓包验证 关于wireshare的使用可见wireshark入门指北 客户端连接到 SOCKS 服务端发送的协议版本与方法选择消息。 ------------------------ |VER | NMETHODS | METHODS | ------------------------ | 1 | 1 | 1 to 255 | ------------------------socks5–客户端只支持1种方法–不验证 服务器从给出的方法进行选择并且发送方法选择消息 ------------ |VER | METHOD | ------------ | 1 | 1 | ------------socks5–不验证 客户端发送要请求的目标地址。 ------------------------------------------ |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT | ------------------------------------------ | 1 | 1 | X00 | 1 | Variable | 2 | ------------------------------------------客户端告诉服务端要请求www.bing.com,目标端口是443。 服务端根据请求信息去建立连接。并返回连接情况。 ------------------------------------------ |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT | ------------------------------------------ | 1 | 1 | X00 | 1 | Variable | 2 | ------------------------------------------ 服务单与目标地址连接成功。这里没有设置与目标建立连接的地址和端口。对于UDP而言这里必须返回。因为客户端与服务端协商完之后客户端需要将udp的流量发送到这个地址和端口。 socks协议到这里已经结束。后面则是数据转发。由于转发过程是在传输层。所以无论是http还是https该代理程序都可以很好的运行。
http://www.zqtcl.cn/news/83625/

相关文章:

  • 代价网站建设五种常见的软件架构
  • 企业网站开发服务合同建站网站图片不显示
  • 运城姚孟网站建设2022年楼市最新消息
  • 长沙建站工作室常用网站代码
  • 做国际网站多少钱上海市建设机械行业协会网站
  • 企业的网站建设文章青岛住房和城乡建设厅网站首页
  • 湖南省住房和城乡建设厅网站考试飞数石家庄网站建设
  • 延边有没有做网站的安县网站制作
  • 网站结构形式有哪些媒体营销平台
  • 微企点建站怎么样淘宝上网站建设续费
  • 易语言跳到指定网站怎么做如何获取网站开发语言
  • 南昌网站建设公司网站建设公司哪家好石家庄科技中心网站
  • 门户网站建站流程做网站除了域名还要买什么
  • 做百度推广网站多少钱专业营销型网站建设费用
  • 目前哪个网站建设的最好网站制作aqq
  • 电子商务系统网站建设外贸推广网站邮箱收费
  • 西安市城乡建设管理局网站做珠宝网站公司
  • 网站开发者工具的网络选项电销系统软件
  • wordpress movie做百度网站优化多少钱
  • 企业网站改自适应网站建设夜猫
  • 网站建设电话销售技巧和话术网络游戏中心
  • 营销型网站建设策划书怎么写网站怎样才有流量
  • 手机端做的优秀的网站交流网站建设心得体会
  • 宁波正规网站建设使用方法如何做网站稳定客户
  • 钓鱼网站开发系列教程网站全站模板
  • 如何在自己电脑上建网站河南网站优化公司哪家好
  • 网站反链和外链的区别怎么自己开公司
  • 公司网站建设的相关费用入账邢台做移动网站哪儿好
  • 网站背景修改网络服务采购
  • 资深做网站公司北京网站ui设计公司