最近在做cmdb的agent-server,原本主机(700台左右)都是在内网环境,本以为网络这块没啥幺蛾子,但是还是出现了网络不通的情况;解决方式2种,1 从机房防火墙开通策略,2 通过已有的(zabbix已使用过)代理网络进行讯通。
最后:推荐使用 github.com/go-httpproxy/httpproxy 使用,易上手、好用、支持自定义拦截。
package main
import (
"log"
"net/http"
"strings"
"github.com/go-httpproxy/httpproxy"
)
func OnError(ctx *httpproxy.Context, where string,
err *httpproxy.Error, opErr error) {
// Log errors.
log.Printf("ERR: %s: %s [%s]", where, err, opErr)
}
func OnAccept(ctx *httpproxy.Context, w http.ResponseWriter,
r *http.Request) bool {
// Handle local request has path "/info"
if r.Method == "GET" && !r.URL.IsAbs() && r.URL.Path == "/info" {
w.Write([]byte("This is go-httpproxy."))
return true
}
if strings.Index(r.URL.String(), "xxx") == -1 {
// 可以做一些拦截的事情
return true
}
return false
}
func OnConnect(ctx *httpproxy.Context, host string) (
ConnectAction httpproxy.ConnectAction, newHost string) {
// Apply "Man in the Middle" to all ssl connections. Never change host.
log.Printf("INFO: Proxy: %s----%s", host,ctx.ConnectHost)
return httpproxy.ConnectMitm, host
}
func OnRequest(ctx *httpproxy.Context, req *http.Request) (
resp *http.Response) {
// Log proxying requests.
log.Printf("INFO: Proxy: %s %s", req.Method, req.URL.String())
return
}
func OnResponse(ctx *httpproxy.Context, req *http.Request,
resp *http.Response) {
// Add header "Via: go-httpproxy".
resp.Header.Add("heliuyan", "heliuyan")
}
func main() {
// Create a new proxy with default certificate pair.
prx, _ := httpproxy.NewProxy()
// Set handlers.
prx.OnError = OnError
prx.OnAccept = OnAccept
prx.OnConnect = OnConnect
prx.OnRequest = OnRequest
prx.OnResponse = OnResponse
// Listen...
http.ListenAndServe(":12344", prx)
}