Skip to content

Commit

Permalink
Tor option to override target ip address
Browse files Browse the repository at this point in the history
  • Loading branch information
wereHamster committed Sep 14, 2019
1 parent 35027e5 commit b1fc008
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 7 deletions.
1 change: 1 addition & 0 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"`
Expand Down
2 changes: 1 addition & 1 deletion server.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
28 changes: 22 additions & 6 deletions tor/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

// 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 {
portParam += fmt.Sprintf("Port=%d,%d ", cfg.VirtualPort,
cfg.VirtualPort)
pushPortParam(cfg.VirtualPort)
} else {
for _, targetPort := range cfg.TargetPorts {
portParam += fmt.Sprintf("Port=%d,%d ", cfg.VirtualPort,
targetPort)
pushPortParam(targetPort)
}
}

Expand Down

0 comments on commit b1fc008

Please sign in to comment.