Connect C-Lightning to a Remote Bitcoin Node

This post describes how to make your local lightning node connect to a remote node. First set up an ssh tunnel between you and your remote and make it listen to bitcoin’s default rpc port:

ssh -i /path/to/your/ssh_key.pem -f <USER>@<SERVER_IP> -L 8332:127.0.0.1:8332 -N

If you authenticate to ssh with a password, you can leave out the -i option. There are two different ways at the moment to authenticate to bitcoind. One is the standard rpcuser/rpcpassword method. This however is about to be deprecated. It is recommend to use the new ‘cookie’ authentication. For this first generate a token, bitcoin provides a tool for this in the bitcoin core repository. It is located in share/rpcauth. To get a new token for the user ‘rpcuser’ run ./rpcauth.py rpcuser. The output will be similar to:

rpcauth=rpcuser:fac3ce16b0855ef141398ac69b1f340$19524bd5d63262d8928385e5d8a694e3d0ec98046b540a1faa7d016c3622d8d3                                                                                                                                                                                     
Your password:                                                                                                                                                                                                                                                                                       
tvIZqauaRAJ1oU1gDS0JSRgPmR1FEzJ6bfM2CKxfy_4=

Now open your bitcoin.conf file in your bitcoin data directory and add the following lines. You can add as many different rpcauth lines with different users as you want to. I added the # commented line for the password to make sure I can lookup the password again at a later stage, however it can be left out. Ideally it should be stored only on the client side:

txindex=1                                                                                                                                                                                                                                                                                            
testnet=1                                                                                                                                                                                                                                                                                            
whitelist=0.0.0.0/0                                                                                                                                                                                                                                                                                  
server=1                                                                                                                                                                                                                                                                                             
rpcauth=rpcuser:fac3ce16b0855ef141398ac69b1f340$19524bd5d63262d8928385e5d8a694e3d0ec98046b540a1faa7d016c3622d8d3                                                                                                                                                                                                                                                                                 
# password = tvIZqauaRAJ1oU1gDS0JSRgPmR1FEzJ6bfM2CKxfy_4=
rpcport=8332 

Leave out the testnet=1 to run it on mainnet. Save and close the file, then start bitcoind on your remote host. You can track its syncing progress by running tail -f debug.log in your remote host bitcoin data dir.

Now install bitcoin-cli on your local machine. To test if the ssh tunnel is running correctly execute the following line on your local machine:

bitcoin-cli -rpcuser=rpcuser -rpcpassword=tvIZqauaRAJ1oU1gDS0JSRgPmR1FEzJ6bfM2CKxfy_4= -rpcport=8332 getblockchaininfo

Once the remote machine is synced start your local lightning daemon with:

lightningd/lightningd --bitcoin-rpcuser=rpcuser --bitcoin-rpcpassword=tvIZqauaRAJ1oU1gDS0JSRgPmR1FEzJ6bfM2CKxfy_4=
--bitcoin-rpcport=8332 --network=testnet --log-level=debug

Replace --network=testnet with --network=bitcoin to run mainnet. When restarting your local machine, you need to re-open the ssh tunnel again.

Written on July 11, 2018