From b1fc0084332587a7f0e23f3784b9ca117184e761 Mon Sep 17 00:00:00 2001 From: Tomas Carnecky Date: Sat, 14 Sep 2019 17:05:32 +0200 Subject: [PATCH] Tor option to override target ip address --- config.go | 1 + server.go | 2 +- tor/controller.go | 30 +++++++++++++++++++++++------- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/config.go b/config.go index 499870ba..9749038c 100644 --- a/config.go +++ b/config.go @@ -219,6 +219,7 @@ type torConfig struct { DNS string `long:"dns" description:"The DNS server as host:port that Tor will use for SRV queries - NOTE must have TCP resolution enabled"` StreamIsolation bool `long:"streamisolation" description:"Enable Tor stream isolation by randomizing user credentials for each connection."` Control string `long:"control" description:"The host:port that Tor is listening on for Tor control connections"` + TargetIPAddress string `long:"targetipaddress" description:"IP address that Tor should use as the target of the hidden service"` V2 bool `long:"v2" description:"Automatically set up a v2 onion service to listen for inbound connections"` V3 bool `long:"v3" description:"Automatically set up a v3 onion service to listen for inbound connections"` PrivateKeyPath string `long:"privatekeypath" description:"The path to the private key of the onion service being created"` diff --git a/server.go b/server.go index c47be832..11bc03db 100644 --- a/server.go +++ b/server.go @@ -542,7 +542,7 @@ func newServer(listenAddrs []net.Addr, chanDB *channeldb.DB, // automatically create an onion service, we'll initiate our Tor // controller and establish a connection to the Tor server. if cfg.Tor.Active && (cfg.Tor.V2 || cfg.Tor.V3) { - s.torController = tor.NewController(cfg.Tor.Control) + s.torController = tor.NewController(cfg.Tor.Control, cfg.Tor.TargetIPAddress) } chanGraph := chanDB.ChannelGraph() diff --git a/tor/controller.go b/tor/controller.go index b96db967..149e766b 100644 --- a/tor/controller.go +++ b/tor/controller.go @@ -81,12 +81,17 @@ type Controller struct { // version is the current version of the Tor server. version string + + // The IP address which we tell the Tor server to use to connect to the LND node. + // This is required when the Tor server runs on another host, otherwise the service + // will not be reachable. + targetIPAddress string } // NewController returns a new Tor controller that will be able to interact with // a Tor server. -func NewController(controlAddr string) *Controller { - return &Controller{controlAddr: controlAddr} +func NewController(controlAddr string, targetIPAddress string) *Controller { + return &Controller{controlAddr: controlAddr, targetIPAddress: targetIPAddress} } // Start establishes and authenticates the connection between the controller and @@ -469,13 +474,24 @@ func (c *Controller) AddOnion(cfg AddOnionConfig) (*OnionAddr, error) { // port. If no target ports were specified, we'll use the virtual port // to provide a one-to-one mapping. var portParam string - if len(cfg.TargetPorts) == 0 { - portParam += fmt.Sprintf("Port=%d,%d ", cfg.VirtualPort, - cfg.VirtualPort) - } else { - for _, targetPort := range cfg.TargetPorts { + + // Helper function which appends the correct Port param depending on + // whether the user chose to use a custom target IP address or not. + pushPortParam := func(targetPort int) { + if c.targetIPAddress == "" { portParam += fmt.Sprintf("Port=%d,%d ", cfg.VirtualPort, targetPort) + } else { + portParam += fmt.Sprintf("Port=%d,%s:%d ", cfg.VirtualPort, + c.targetIPAddress, targetPort) + } + } + + if len(cfg.TargetPorts) == 0 { + pushPortParam(cfg.VirtualPort) + } else { + for _, targetPort := range cfg.TargetPorts { + pushPortParam(targetPort) } }