我正在尝试为基于CONNECT的 HTTP 代理创建反向代理。想要使用代理的用户只是将machine A
其视为 HTTP 代理。它的工作方式如下:
machine B
打开一个 TCP 套接字到machine A
.
在 上machine A
,TCP 套接字在端口上公开,所有传入数据都通过隧道传输到machine B
(io.Copy)。
开启machine B
时,所有数据都通过隧道传输到本地 HTTP 服务器和套接字machine A
。
本质上,这是 HTTP 代理背后的反向代理。之所以如此复杂,是因为 HTTP 代理位于 NAT 之后(打开machine B
),因此无法直接访问。该用例能够在 NAT 后面托管 HTTP 代理。
机器A隧道(Go):
package main
import (
"log"
"net"
)
func Conn(c *net.TCPConn) string {
return c.RemoteAddr().String() + " (" + c.LocalAddr().String() + ")"
}
func ProxifyConns(recipientConn, donorConn *net.TCPConn) {
log.Println("Proxying", ConnrecipientConn), "and", Conn(donorConn))
go func() {
_, err := io.Copy(recipientConn, donorConn)
if err != nil {
utils.StacktraceError(err)
}
recipientConn.Close()
}()
go func() {
_, err := io.Copy(donorConn, recipientConn)
if err != nil {
utils.StacktraceError(err)
}
recipientConn.Close()
}()
}
func main() {
// Open the donor listener
donorsAddr, err := net.ResolveTCPAddr("tcp4", ":11000")
if err != nil {
utils.StacktraceErrorAndExit(err)
}
listenerDonors, err := net.ListenTCP("tcp", donorsAddr)
if err != nil {
utils.StacktraceErrorAndExit(err)
}
defer listenerDonors.Close()
log.Println("Listening for donors on", listenerDonors.Addr())
// Open the recipient listener
recipientsAddr, err := net.ResolveTCPAddr("tcp4", ":10000")
if err != nil {
utils.StacktraceErrorAndExit(err)
}
listenerRecipients, err := net.ListenTCP("tcp", recipientsAddr)
if err != nil {
utils.StacktraceErrorAndExit(err)
}
defer listenerRecipients.Close()
log.Println("Listening for recipients on", listenerRecipients.Addr())
天涯尽头无女友
相关分类