CG制作公司如何实现制作人员安全上网

基于golang的http(s)与socks5代理服务器的代码实现

代理

背景

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

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)
    }
}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用 MATLAB 实现共轭梯度法(CG)的代码示例: ```matlab function [x, flag, relres, iter, resvec] = cg(A, b, x0, maxit, tol) % CG Conjugate Gradient Method for solving Ax = b % x = CG(A, b) attempts to solve the system of linear equations A*x = b % for x using the Conjugate Gradient method. % A can be a matrix or a function handle that returns A*x. % b is the right-hand side vector. % x0 is the initial guess (default is zero vector). % maxit is the maximum number of iterations (default is 100). % tol is the tolerance for convergence (default is 1e-6). % % [x, flag] = CG(A, b) also returns a convergence flag: % 0 - CG converged to the desired tolerance within maxit iterations. % 1 - CG iterated maxit times but did not converge. % % [x, flag, relres] = CG(A, b) also returns the relative residual norm(b-A*x)/norm(b). % % [x, flag, relres, iter] = CG(A, b) also returns the number of iterations. % % [x, flag, relres, iter, resvec] = CG(A, b) also returns the residual history. % % Example: % A = gallery('poisson', 100); % b = randn(size(A, 1), 1); % x = CG(A, b); % norm(A*x-b)/norm(b) % % See also PCG, GMRES % Reference: Nocedal and Wright, Numerical Optimization, 2nd ed., 2006, p. 86. if nargin < 5 || isempty(tol), tol = 1e-6; end if nargin < 4 || isempty(maxit), maxit = 100; end if nargin < 3 || isempty(x0), x0 = zeros(size(b)); end % Initialize r = b - A(x0); p = r; x = x0; resvec = zeros(maxit+1, 1); resvec(1) = norm(r); flag = 0; for iter = 1:maxit Ap = A(p); alpha = (r'*r) / (p'*Ap); x = x + alpha*p; r_old = r; r = r_old - alpha*Ap; beta = (r'*r) / (r_old'*r_old); p = r + beta*p; resvec(iter+1) = norm(r); relres = resvec(iter+1) / resvec(1); if relres < tol flag = 0; break; end end if flag == 0 % Converged resvec = resvec(1:iter+1); else % Not converged resvec = resvec(1:maxit+1); end end ``` 使用示例: ```matlab % Generate a random matrix A and a random vector b n = 100; A = randn(n); A = A'*A; b = randn(n, 1); % Solve Ax = b using CG [x, flag, relres, iter, resvec] = cg(A, b); % Plot the residual history semilogy(resvec); xlabel('Iteration'); ylabel('Residual norm'); title('CG'); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值