support proxy protocol for type http

This commit is contained in:
fatedier 2019-04-10 10:51:01 +08:00
parent 7f9d88c10a
commit b7a73d3469
5 changed files with 21 additions and 7 deletions

View File

@ -523,6 +523,9 @@ func HandleTcpWorkConnection(localInfo *config.LocalSvrConf, proxyPlugin plugin.
// check if we need to send proxy protocol info // check if we need to send proxy protocol info
if baseInfo.ProxyProtocolVersion != "" { if baseInfo.ProxyProtocolVersion != "" {
if m.SrcAddr != "" && m.SrcPort != 0 { if m.SrcAddr != "" && m.SrcPort != 0 {
if m.DstAddr == "" {
m.DstAddr = "127.0.0.1"
}
h := &pp.Header{ h := &pp.Header{
Command: pp.PROXY, Command: pp.PROXY,
SourceAddress: net.ParseIP(m.SrcAddr), SourceAddress: net.ParseIP(m.SrcAddr),

View File

@ -16,6 +16,7 @@ package proxy
import ( import (
"io" "io"
"net"
"strings" "strings"
"github.com/fatedier/frp/g" "github.com/fatedier/frp/g"
@ -97,8 +98,14 @@ func (pxy *HttpProxy) GetConf() config.ProxyConf {
return pxy.cfg return pxy.cfg
} }
func (pxy *HttpProxy) GetRealConn() (workConn frpNet.Conn, err error) { func (pxy *HttpProxy) GetRealConn(remoteAddr string) (workConn frpNet.Conn, err error) {
tmpConn, errRet := pxy.GetWorkConnFromPool(nil, nil) rAddr, errRet := net.ResolveTCPAddr("tcp", remoteAddr)
if errRet != nil {
pxy.Warn("resolve TCP addr [%s] error: %v", remoteAddr, errRet)
// we do not return error here since remoteAddr is not necessary for proxies without proxy protocol enabled
}
tmpConn, errRet := pxy.GetWorkConnFromPool(rAddr, nil)
if errRet != nil { if errRet != nil {
err = errRet err = errRet
return return

View File

@ -89,13 +89,15 @@ func NewHttpReverseProxy(option HttpReverseProxyOptions) *HttpReverseProxy {
DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
url := ctx.Value("url").(string) url := ctx.Value("url").(string)
host := getHostFromAddr(ctx.Value("host").(string)) host := getHostFromAddr(ctx.Value("host").(string))
return rp.CreateConnection(host, url) remote := ctx.Value("remote").(string)
return rp.CreateConnection(host, url, remote)
}, },
}, },
WebSocketDialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { WebSocketDialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
url := ctx.Value("url").(string) url := ctx.Value("url").(string)
host := getHostFromAddr(ctx.Value("host").(string)) host := getHostFromAddr(ctx.Value("host").(string))
return rp.CreateConnection(host, url) remote := ctx.Value("remote").(string)
return rp.CreateConnection(host, url, remote)
}, },
BufferPool: newWrapPool(), BufferPool: newWrapPool(),
ErrorLog: log.New(newWrapLogger(), "", 0), ErrorLog: log.New(newWrapLogger(), "", 0),
@ -138,12 +140,12 @@ func (rp *HttpReverseProxy) GetHeaders(domain string, location string) (headers
return return
} }
func (rp *HttpReverseProxy) CreateConnection(domain string, location string) (net.Conn, error) { func (rp *HttpReverseProxy) CreateConnection(domain string, location string, remoteAddr string) (net.Conn, error) {
vr, ok := rp.getVhost(domain, location) vr, ok := rp.getVhost(domain, location)
if ok { if ok {
fn := vr.payload.(*VhostRouteConfig).CreateConnFn fn := vr.payload.(*VhostRouteConfig).CreateConnFn
if fn != nil { if fn != nil {
return fn() return fn(remoteAddr)
} }
} }
return nil, fmt.Errorf("%v: %s %s", ErrNoDomain, domain, location) return nil, fmt.Errorf("%v: %s %s", ErrNoDomain, domain, location)

View File

@ -158,6 +158,7 @@ func (p *ReverseProxy) serveWebSocket(rw http.ResponseWriter, req *http.Request)
req = req.WithContext(context.WithValue(req.Context(), "url", req.URL.Path)) req = req.WithContext(context.WithValue(req.Context(), "url", req.URL.Path))
req = req.WithContext(context.WithValue(req.Context(), "host", req.Host)) req = req.WithContext(context.WithValue(req.Context(), "host", req.Host))
req = req.WithContext(context.WithValue(req.Context(), "remote", req.RemoteAddr))
targetConn, err := p.WebSocketDialContext(req.Context(), "tcp", "") targetConn, err := p.WebSocketDialContext(req.Context(), "tcp", "")
if err != nil { if err != nil {
@ -215,6 +216,7 @@ func (p *ReverseProxy) serveHTTP(rw http.ResponseWriter, req *http.Request) {
// Modify for frp // Modify for frp
outreq = outreq.WithContext(context.WithValue(outreq.Context(), "url", req.URL.Path)) outreq = outreq.WithContext(context.WithValue(outreq.Context(), "url", req.URL.Path))
outreq = outreq.WithContext(context.WithValue(outreq.Context(), "host", req.Host)) outreq = outreq.WithContext(context.WithValue(outreq.Context(), "host", req.Host))
outreq = outreq.WithContext(context.WithValue(outreq.Context(), "remote", req.RemoteAddr))
p.Director(outreq) p.Director(outreq)
outreq.Close = false outreq.Close = false

View File

@ -51,7 +51,7 @@ func NewVhostMuxer(listener frpNet.Listener, vhostFunc muxFunc, authFunc httpAut
return mux, nil return mux, nil
} }
type CreateConnFunc func() (frpNet.Conn, error) type CreateConnFunc func(remoteAddr string) (frpNet.Conn, error)
type VhostRouteConfig struct { type VhostRouteConfig struct {
Domain string Domain string