go實現socks5代理

myml發表於2016-10-28
// go實現socks5代理 project main.go
package main

import (
    "bytes"
    "encoding/binary"
    "fmt"
    "io"
    "log"
    "net"
    "time"
)

func main() {
    log.SetFlags(log.Ltime | log.Lshortfile)
    //監聽1314埠
    s, err := net.Listen("tcp", ":1314")
    if err != nil {
        log.Panic(err)
    }
    //接受客戶端連線
    for {
        c, err := s.Accept()
        if err != nil {
            log.Panic(err)
        }
        go proxy(c)
    }
}

func proxy(client net.Conn) {
    defer client.Close()
    var b [1024]byte

    n, err := client.Read(b[:])
    if err != nil {
        log.Println(err)
        return
    }
    var addr string
    //sock5代理
    if b[0] == 0x05 {
        //回應確認代理
        client.Write([]byte{0x05, 0x00})

        n, err = client.Read(b[:])
        if err != nil {
            log.Println(err)
            return
        }
        switch b[3] {
        case 0x01:
            //解析代理ip
            type sockIP struct {
                A, B, C, D byte
                PORT       uint16
            }
            sip := sockIP{}
            if err := binary.Read(bytes.NewReader(b[4:n]), binary.BigEndian, &sip); err != nil {
                log.Println("請求解析錯誤")
                return
            }
            addr = fmt.Sprintf("%d.%d.%d.%d:%d", sip.A, sip.B, sip.C, sip.D, sip.PORT)
        case 0x03:
            //解析代理域名
            host := string(b[5 : n-2])
            var port uint16
            err = binary.Read(bytes.NewReader(b[n-2:n]), binary.BigEndian, &port)
            if err != nil {
                log.Println(err)
                return
            }
            addr = fmt.Sprintf("%s:%d", host, port)
        }

        server, err := net.DialTimeout("tcp", addr, time.Second*3)
        if err != nil {
            log.Println(err)
            return
        }
        defer server.Close()
        //回覆確定代理成功
        client.Write([]byte{0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
        //轉發
        go io.Copy(server, client)
        io.Copy(client, server)
    }
}

更多原創文章乾貨分享,請關注公眾號
  • go實現socks5代理
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章