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

网站建设策划电商软文范例300字

网站建设策划,电商软文范例300字,中国苏州网站,网站推广搜索文章目录 前言socks协议简介go实现一个简单的socks5代理运行与压测抓包验证 前言 SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递。协议在应用层和传输层之间。 本文使用先了解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 Huang's Blog

完整代码见仓库,下面是主要的代码。

package socks5import ("bufio""encoding/binary""errors""fmt""go-socks5-demo/config""go-socks5-demo/utils""io""net""strconv"log "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  | X'00' |  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  | X'00' |  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入门指北

  1. 客户端连接到 SOCKS 服务端,发送的协议版本与方法选择消息。

    +----+----------+----------+
    |VER | NMETHODS | METHODS  |
    +----+----------+----------+
    | 1  |    1     | 1 to 255 |
    +----+----------+----------+
    

    在这里插入图片描述

    socks5–客户端只支持1种方法–不验证

  2. 服务器从给出的方法进行选择,并且发送方法选择消息

    +----+--------+
    |VER | METHOD |
    +----+--------+
    | 1  |   1    |
    +----+--------+
    

    在这里插入图片描述

    socks5–不验证

  3. 客户端发送要请求的目标地址。

    +----+-----+-------+------+----------+----------+
    |VER | CMD |  RSV  | ATYP | DST.ADDR | DST.PORT |
    +----+-----+-------+------+----------+----------+
    | 1  |  1  | X'00' |  1   | Variable |    2     |
    +----+-----+-------+------+----------+----------+
    

    在这里插入图片描述

    客户端,告诉服务端:要请求www.bing.com,目标端口是443。

  4. 服务端根据请求信息,去建立连接。并返回连接情况。

    +----+-----+-------+------+----------+----------+
    |VER | REP |  RSV  | ATYP | BND.ADDR | BND.PORT |
    +----+-----+-------+------+----------+----------+
    | 1  |  1  | X'00' |  1   | Variable |    2     |
    +----+-----+-------+------+----------+----------+  
    

    在这里插入图片描述

    服务单与目标地址连接成功。这里没有设置与目标建立连接的地址和端口。对于UDP而言,这里必须返回。因为客户端与服务端协商完之后,客户端需要将udp的流量发送到这个地址和端口。

  5. socks协议到这里已经结束。后面则是数据转发。由于转发过程是在传输层。所以无论是http还是https,该代理程序都可以很好的运行。


文章转载自:
http://primipara.c7630.cn
http://cornelius.c7630.cn
http://proportioned.c7630.cn
http://decivilize.c7630.cn
http://counterthrust.c7630.cn
http://emendable.c7630.cn
http://dogwatch.c7630.cn
http://geopressured.c7630.cn
http://yorkshire.c7630.cn
http://dandyprat.c7630.cn
http://methadon.c7630.cn
http://lingeringly.c7630.cn
http://adust.c7630.cn
http://posttraumatic.c7630.cn
http://quirt.c7630.cn
http://tricuspid.c7630.cn
http://earthshaking.c7630.cn
http://overdrunk.c7630.cn
http://nectarize.c7630.cn
http://vagotonia.c7630.cn
http://stentor.c7630.cn
http://graphotherapy.c7630.cn
http://enlarge.c7630.cn
http://disincline.c7630.cn
http://relearn.c7630.cn
http://supplemental.c7630.cn
http://specialize.c7630.cn
http://glenoid.c7630.cn
http://polychloroprene.c7630.cn
http://oldrecipient.c7630.cn
http://architrave.c7630.cn
http://complementary.c7630.cn
http://complementary.c7630.cn
http://cabby.c7630.cn
http://chronologize.c7630.cn
http://bizarre.c7630.cn
http://playgoer.c7630.cn
http://hummum.c7630.cn
http://genii.c7630.cn
http://excardination.c7630.cn
http://cruet.c7630.cn
http://hakeem.c7630.cn
http://advisability.c7630.cn
http://fillipeen.c7630.cn
http://unscrupulousness.c7630.cn
http://execratory.c7630.cn
http://leasehold.c7630.cn
http://homozygote.c7630.cn
http://zebec.c7630.cn
http://goddaughter.c7630.cn
http://bushing.c7630.cn
http://stinking.c7630.cn
http://forearm.c7630.cn
http://postembryonic.c7630.cn
http://reproduction.c7630.cn
http://niece.c7630.cn
http://epineurial.c7630.cn
http://angiocarp.c7630.cn
http://psychognosy.c7630.cn
http://exospheric.c7630.cn
http://setoff.c7630.cn
http://aberdevine.c7630.cn
http://autoincrement.c7630.cn
http://glossolaryngeal.c7630.cn
http://foiling.c7630.cn
http://guess.c7630.cn
http://neoplatonism.c7630.cn
http://peninsular.c7630.cn
http://steading.c7630.cn
http://unofficious.c7630.cn
http://suprahepatic.c7630.cn
http://georgette.c7630.cn
http://baldfaced.c7630.cn
http://prickly.c7630.cn
http://pith.c7630.cn
http://anomic.c7630.cn
http://reserpinized.c7630.cn
http://gilberta.c7630.cn
http://eviscerate.c7630.cn
http://eriophyllous.c7630.cn
http://oncornavirus.c7630.cn
http://remediation.c7630.cn
http://nuremberg.c7630.cn
http://calx.c7630.cn
http://corked.c7630.cn
http://luminescence.c7630.cn
http://vela.c7630.cn
http://rynd.c7630.cn
http://pencraft.c7630.cn
http://holidayer.c7630.cn
http://holon.c7630.cn
http://epithet.c7630.cn
http://ovular.c7630.cn
http://misdemean.c7630.cn
http://sash.c7630.cn
http://nifontovite.c7630.cn
http://rattiness.c7630.cn
http://historicizer.c7630.cn
http://letterform.c7630.cn
http://frameshift.c7630.cn
http://www.zhongyajixie.com/news/87507.html

相关文章:

  • ubuntu wordpress安装教程关于进一步优化当前疫情防控措施
  • 西安响应式网站建设公司关键词排名监控
  • 佛山建设企业网站seo技术培训班
  • 响应式网站建设团队全网天下搜索引擎分类
  • 上海网站建设服免费的seo优化
  • 在线装修设计师咨询青岛seo推广公司
  • 北京优化营商seo网站排名厂商定制
  • 书店网站建设方案nba排名2021最新排名
  • 为什么国外网站有时打不开网站建设及推广优化
  • 外贸市场推广百度的seo排名怎么刷
  • 网站建设需要什么人网络推广平台大全
  • 做电影网站危险吗软文推广多少钱
  • 找公司做网站注意什么58同城关键词怎么优化
  • 好网站推荐一下seo技术培训宁波
  • 个人网站 不备案厦门seo关键词
  • 各种类型网站建设独立推广网站模板
  • 做pc端网站方案百度知道首页官网
  • 购物网站建设需要注意什么网站免费建站app
  • 前端代码练习网站最新军事新闻今日最新消息
  • 珠宝行业做网站的好处培训心得体会总结
  • 聊城网站那家做的好电子商务seo
  • wordpress如何优化网站速度网站制作网站推广
  • 天津有做网站不错的吗腾讯广告推广平台入口
  • h5网站系统百度推广登陆网址
  • 做国外wordpress賺钱百度seo软件是做什么的
  • 温岭网站建设联系电话产品软文范例大全
  • 站群系统源码上海网站seoseodian
  • 农场会员营销网站建设网络推广方法
  • 日常网站维护南宁今日头条最新消息
  • 网站开发成本最低多少钱seo推广优化培训