func (mapper *PortMapper) Map(ip net.IP, port int, backendAddr net.Addr) error { if _, isTCP := backendAddr.(*net.TCPAddr); isTCP { mapKey := (&net.TCPAddr{Port: port, IP: ip}).String() if _, exists := mapper.tcpProxies[mapKey]; exists { return fmt.Errorf("TCP Port %s is already in use", mapKey) } backendPort := backendAddr.(*net.TCPAddr).Port backendIP := backendAddr.(*net.TCPAddr).IP if mapper.iptables != nil { if err := mapper.iptables.Forward(iptables.Add, ip, port, "tcp", backendIP.String(), backendPort); err != nil { return err } } mapper.tcpMapping[mapKey] = backendAddr.(*net.TCPAddr) proxy, err := mapper.proxyFactoryFunc(&net.TCPAddr{IP: ip, Port: port}, backendAddr) if err != nil { mapper.Unmap(ip, port, "tcp") return err } mapper.tcpProxies[mapKey] = proxy go proxy.Run() } else { mapKey := (&net.UDPAddr{Port: port, IP: ip}).String() if _, exists := mapper.udpProxies[mapKey]; exists { return fmt.Errorf("UDP: Port %s is already in use", mapKey) } backendPort := backendAddr.(*net.UDPAddr).Port backendIP := backendAddr.(*net.UDPAddr).IP if mapper.iptables != nil { if err := mapper.iptables.Forward(iptables.Add, ip, port, "udp", backendIP.String(), backendPort); err != nil { return err } } mapper.udpMapping[mapKey] = backendAddr.(*net.UDPAddr) proxy, err := mapper.proxyFactoryFunc(&net.UDPAddr{IP: ip, Port: port}, backendAddr) if err != nil { mapper.Unmap(ip, port, "udp") return err } mapper.udpProxies[mapKey] = proxy go proxy.Run() } return nil }
func (mapper *PortMapper) Map(ip net.IP, port int, backendAddr net.Addr) error { if _, isTCP := backendAddr.(*net.TCPAddr); isTCP { backendPort := backendAddr.(*net.TCPAddr).Port backendIP := backendAddr.(*net.TCPAddr).IP if mapper.iptables != nil { if err := mapper.iptables.Forward(iptables.Add, ip, port, "tcp", backendIP.String(), backendPort); err != nil { return err } } mapper.tcpMapping[port] = backendAddr.(*net.TCPAddr) proxy, err := proxy.NewProxy(&net.TCPAddr{IP: ip, Port: port}, backendAddr) if err != nil { mapper.Unmap(ip, port, "tcp") return err } mapper.tcpProxies[port] = proxy go proxy.Run() } else { backendPort := backendAddr.(*net.UDPAddr).Port backendIP := backendAddr.(*net.UDPAddr).IP if mapper.iptables != nil { if err := mapper.iptables.Forward(iptables.Add, ip, port, "udp", backendIP.String(), backendPort); err != nil { return err } } mapper.udpMapping[port] = backendAddr.(*net.UDPAddr) proxy, err := proxy.NewProxy(&net.UDPAddr{IP: ip, Port: port}, backendAddr) if err != nil { mapper.Unmap(ip, port, "udp") return err } mapper.udpProxies[port] = proxy go proxy.Run() } return nil }