diff --git a/alpine/packages/proxy/libproxy/proxy.go b/alpine/packages/proxy/libproxy/proxy.go index b7b89f27d..472a0a5db 100644 --- a/alpine/packages/proxy/libproxy/proxy.go +++ b/alpine/packages/proxy/libproxy/proxy.go @@ -25,8 +25,8 @@ type Proxy interface { BackendAddr() net.Addr } -// NewProxy creates a Proxy according to the specified frontendAddr and backendAddr. -func NewProxy(frontendAddr *vsock.VsockAddr, backendAddr net.Addr) (Proxy, error) { +// NewVsockProxy creates a Proxy listening on Vsock +func NewVsockProxy(frontendAddr *vsock.VsockAddr, backendAddr net.Addr) (Proxy, error) { switch backendAddr.(type) { case *net.UDPAddr: listener, err := vsock.Listen(frontendAddr.Port) @@ -44,3 +44,29 @@ func NewProxy(frontendAddr *vsock.VsockAddr, backendAddr net.Addr) (Proxy, error panic(fmt.Errorf("Unsupported protocol")) } } + +// NewIPProxy creates a Proxy according to the specified frontendAddr and backendAddr. +func NewIPProxy(frontendAddr, backendAddr net.Addr) (Proxy, error) { + switch frontendAddr.(type) { + case *net.UDPAddr: + listener, err := net.ListenUDP("udp", frontendAddr.(*net.UDPAddr)) + if err != nil { + return nil, err + } + return NewUDPProxy(frontendAddr, listener, backendAddr.(*net.UDPAddr)) + case *net.TCPAddr: + listener, err := net.Listen("tcp", frontendAddr.String()) + if err != nil { + return nil, err + } + return NewTCPProxy(listener, backendAddr.(*net.TCPAddr)) + case *vsock.VsockAddr: + listener, err := vsock.Listen(frontendAddr.(*vsock.VsockAddr).Port) + if err != nil { + return nil, err + } + return NewTCPProxy(listener, backendAddr.(*net.TCPAddr)) + default: + panic(fmt.Errorf("Unsupported protocol")) + } +} diff --git a/alpine/packages/proxy/main.go b/alpine/packages/proxy/main.go index a7ab17b15..aa44b2b8f 100644 --- a/alpine/packages/proxy/main.go +++ b/alpine/packages/proxy/main.go @@ -14,19 +14,25 @@ import ( func main() { host, port, container := parseHostContainerAddrs() - p, err := libproxy.NewProxy(&vsock.VsockAddr{Port: uint(port)}, container) + vsockP, err := libproxy.NewVsockProxy(&vsock.VsockAddr{Port: uint(port)}, container) if err != nil { sendError(err) } + ipP, err := libproxy.NewIPProxy(host, container) + if err != nil { + sendError(err) + } + ctl, err := exposePort(host, port) if err != nil { sendError(err) } - go handleStopSignals(p) + go handleStopSignals(ipP) // TODO: avoid this line if we are running in a TTY sendOK() - p.Run() + go ipP.Run() + vsockP.Run() ctl.Close() // ensure ctl remains alive and un-GCed until here os.Exit(0) }