基于Golang的Http(s)与Socks5代理服务器的代码实现

开发 前端
在Go语言中,可以使用标准库的 Net/Http 包来实现HTTP代理。

背景

很多制作公司为了安全起见,大部分内部设计人员的电脑是没法联网的,只有少数部分电脑可以连外网(比如制片人员的电脑)。但是在外包这种模式下,为了能够让设计人员方便的接包任务,并回传结果,需要设计人员的电脑能够通过代理服务(部署在制片的电脑上)上指定的网站,这个时候就需要我们实现代理请求转发的功能。

HTTP代理

在Go语言中,可以使用标准库的 net/http 包来实现HTTP代理。

下面是一个简单的例子,实现了一个HTTP代理服务器,它可以代理客户端的HTTP请求并返回请求的响应:

package main

import (
	"net"
	"net/http"
	"net/http/httputil"
)

func handleHTTP(w http.ResponseWriter, req *http.Request) {
	resp, err := http.DefaultTransport.RoundTrip(req)
	if err != nil {
		http.Error(w, err.Error(), http.StatusServiceUnavailable)
		return
	}
	defer resp.Body.Close()
	copyHeader(w.Header(), resp.Header)
	w.WriteHeader(resp.StatusCode)
	io.Copy(w, resp.Body)
}

func copyHeader(dst, src http.Header) {
	for k, vv := range src {
		for _, v := range vv {
			dst.Add(k, v)
		}
	}
}

HTTPS代理

Golang可以轻松实现一个https代理,你需要执行以下步骤:

  1. 获取客户端请求: 使用Golang的net包接收客户端请求。
  2. 转发请求: 使用Golang的http包将请求转发到服务端。
  3. 获取服务端响应: 从服务端接收响应并将其返回给客户端。

以下是一个示例代码,实现了一个https代理:

package main

import (
	"bufio"
	"io"
	"net"
	"net/http"
	"net/http/httputil"
)

func handleHttps(w http.ResponseWriter, r *http.Request) {
	dest_conn, err := net.DialTimeout("tcp", r.Host, 10*time.Second)
	if err != nil {
		http.Error(w, err.Error(), http.StatusServiceUnavailable)
		return
	}
	w.WriteHeader(http.StatusOK)
	hijacker, ok := w.(http.Hijacker)
	if !ok {
		http.Error(w, "Hijacking not supported", http.StatusInternalServerError)
		return
	}
	client_conn, _, err := hijacker.Hijack()
	if err != nil {
		http.Error(w, err.Error(), http.StatusServiceUnavailable)
	}
	go transfer(dest_conn, client_conn)
	go transfer(client_conn, dest_conn)
}

func transfer(destination io.WriteCloser, source io.ReadCloser) {
	defer destination.Close()
	defer source.Close()
	io.Copy(destination, source)
}

func handleHTTP(w http.ResponseWriter, req *http.Request) {
	resp, err := http.DefaultTransport.RoundTrip(req)
	if err != nil {
		http.Error(w, err.Error(), http.StatusServiceUnavailable)
		return
	}
	defer resp.Body.Close()
	copyHeader(w.Header(), resp.Header)
	w.WriteHeader(resp.StatusCode)
	io.Copy(w, resp.Body)
}

func copyHeader(dst, src http.Header) {
	for k, vv := range src {
		for _, v := range vv {
			dst.Add(k, v)
		}
	}
}

SOCKS代理

Socks5协议是一种灵活的代理协议,主要用于实现代理服务器的功能,允许客户端通过代理服务器与其他网络资源进行通信。Socks5协议比Socks4协议更先进,具有更多的特性,如它支持用户名/密码验证,还支持TCP和UDP协议.下面实现的是Socks5代理协议

package main

import (
    "bufio"
    "fmt"
    "net"
    "os"
)

func main() {
    l, err := net.Listen("tcp", ":1080")
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    defer l.Close()

    for {
        client, err := l.Accept()
        if err != nil {
            fmt.Println(err)
            continue
        }
        go handleClientRequest(client)
    }
}

func handleClientRequest(client net.Conn) {
    if client == nil {
        return
    }
    defer client.Close()

    var b [1024]byte
    n, err := client.Read(b[:])
    if err != nil {
        fmt.Println(err)
        return
    }

    var host, port string
    switch b[3] {
    case 0x01: // IPv4
        host = net.IPv4(b[4], b[5], b[6], b[7]).String()
        port = fmt.Sprintf("%d", b[8]<<8|b[9])
    case 0x03: // Domain name
        host = string(b[5 : n-2])
        port = fmt.Sprintf("%d", b[n-2]<<8|b[n-1])
    case 0x04: // IPv6
        host = net.IP{b[4], b[5], b[6], b[7], b[8], b[9], b[10], b[11], b[12], b[13], b[14], b[15], b[16], b[17], b[18], b[19]}.String()
        port = fmt.Sprintf("%d", b[20]<<8|b[21])
    }

    server, err := net.Dial("tcp", host+":"+port)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer server.Close()

    client.Write([]byte{0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x43})
    go func() {
        _, err := io.Copy(server, client)
        if err != nil {
            fmt.Println("io.Copy error:", err)
        }
    }()
    _, err = io.Copy(client, server)
    if err != nil {
        fmt.Println("io.Copy error:", err)
    }
}

责任编辑:姜华 来源: 今日头条
相关推荐

2009-02-27 14:12:00

socks5代理服务器服务器

2023-11-01 07:14:55

2009-02-12 15:33:00

代理服务器HTTPSOCKS

2024-01-08 08:36:29

HTTPGo代理服务器

2024-02-20 14:53:01

2009-06-19 16:12:07

IPv6代理服务器IPv6代理设备IPv协议

2010-09-13 16:13:36

2009-10-10 15:06:14

代理服务器

2009-02-12 15:43:00

CCProxy代理服务器

2009-12-16 16:41:44

Linux代理服务器

2009-12-07 09:43:45

代理服务器路由器配置

2009-02-10 15:42:00

代理服务器代理服务器设置

2009-10-10 09:52:32

2009-02-06 11:12:00

代理服务器代理服务器应用

2009-02-27 11:21:00

高校机房代理服务器服务器架设

2017-12-27 09:49:35

HTTP服务器反向

2010-03-09 11:21:24

代理服务器工作原理域名服务器工作原理

2018-04-17 12:10:40

2009-02-12 15:40:00

代理服务器隐藏ip地址

2009-02-06 10:54:00

Necsocks5Windows代理服务代理服务器
点赞
收藏

51CTO技术栈公众号