具有动态主机和端口的反向代理

时间:2021-01-22 00:26:05

标签: go proxy reverse-proxy

如果请求 localhost:8080?url=google.com 它充当 Google 的反向代理。我看过其他一些具有某种程度相似但限制的帖子,例如维护端口。

这是我的做法:

package main

import(
    "fmt"
    "log"
    "net/url"
    "net/http"
    "net/http/httputil"
)

type baseHandle struct{}

type handler struct {
    proxy *httputil.ReverseProxy
}

func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    h.proxy.ServeHTTP(w, r)
}

func (h *baseHandle) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    url_arg := r.URL.Query()["url"]
    if len(url_arg) < 0 {
        w.Write([]byte("403: Host forbidden"))
        return
    }
    url_parsed, err := url.Parse(url_arg[0])
    if err != nil {
        w.Write([]byte("403: Host forbidden"))
        return
    }

    director := func(req *http.Request) {
        req.URL.Scheme = "http://"
        req.URL.Host = url_parsed.Host
    }
    reverseProxy := &httputil.ReverseProxy{Director: director}
    handler := handler{proxy: reverseProxy}
    http.Handle("/", handler)
    http.ListenAndServe(fmt.Sprintf(":%d", 80), nil)
    return
}

func main(){
    h := &baseHandle{}
    http.Handle("/", h)

    server := &http.Server{
        Addr:    ":8080",
        Handler: h,
    }
    log.Fatal(server.ListenAndServe())
}

我觉得我离完成它并不遥远,因为我看到网络在浏览器上带来了一些东西,但我一定错过了一些东西。

只是为了让您了解这背后的原因是我们公司的 VPN 阻止了所有非 https 流量,我们的团队在 EMR 及其应用程序(Zeppelin、Jupyter、Livy 等)上高度可靠。 创建 ELB 不在表中,因为 EMR 集群的创建和删除非常频繁,但是如果我可以根据初始请求将这个反向代理动态地应用于所有主机和端口,它可以允许我们连接到所有流量通过的所有应用程序这个服务器。

0 个答案:

没有答案