Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
selfhost:ssh_tunnel [2024/01/25 14:16] – willy | selfhost:ssh_tunnel [2024/02/08 17:28] (current) – removed willy | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== On Local Host ===== | ||
- | |||
- | Create a new user called **tunnel**. | ||
- | Leave tunnel home folder on root partition (/ | ||
- | You need also to create an SSH key, and prepare the tunnels config folder **/ | ||
- | <code bash> | ||
- | > useradd -m tunnel | ||
- | > su - tunnel | ||
- | > ssh-keygen | ||
- | > mkdir tunnels | ||
- | > mkdir logs | ||
- | </ | ||
- | |||
- | Add tunnels configurations like this under **/ | ||
- | <file txt main> | ||
- | REMOTE_SERVER=99.99.99.99 # your remote server IP - don't use name, use IP | ||
- | REMOTE_SERVER_SSH_PORT=22 # your remote server SSH port | ||
- | HOME_SERVER_REMOTE_SSH_PORT=5022 # the port your local server SSH will be accessible from remote | ||
- | SSH_IDENTITY=# | ||
- | REMOTE_USER=tunnel # remote user to login as | ||
- | |||
- | REMOTE_TO_HOME=\ | ||
- | " | ||
- | " | ||
- | " | ||
- | " | ||
- | |||
- | HOME_TO_REMOTE= # list of ports forwarded from local to remote | ||
- | </ | ||
- | |||
- | Remember to " | ||
- | |||
- | You can create as many tunnels as you like. Note that SSH port will always be forwarded anyway, so you want one file for each remote host. | ||
- | |||
- | Now create this script under **/ | ||
- | <code bash> | ||
- | #!/bin/bash | ||
- | |||
- | function log() | ||
- | { | ||
- | echo $(date) - $@ >> $LOG | ||
- | } | ||
- | |||
- | cd $HOME | ||
- | TUNNELS=$(ls tunnels) | ||
- | |||
- | TUNNEL_PIDS= | ||
- | for i in $TUNNELS | ||
- | do | ||
- | # Spin a shell for each tunnel | ||
- | ( | ||
- | NAME=$i | ||
- | CONFIG=tunnels/ | ||
- | LOG=logs/ | ||
- | |||
- | log " | ||
- | |||
- | # Iterate forever | ||
- | while true | ||
- | do | ||
- | # Spin up a sub-shell to ensure we reload the config properly each iteration | ||
- | (log " | ||
- | source $CONFIG | ||
- | |||
- | log " | ||
- | if ping -c 10 -W 5 $REMOTE_SERVER &> /dev/null | ||
- | then | ||
- | log " | ||
- | |||
- | LOGIN_IDENTITY= | ||
- | test ! -z $SSH_IDENTITY && LOGIN_IDENTITY=" | ||
- | LOGIN_AS=$USER | ||
- | test ! -z $REMOTE_USER | ||
- | |||
- | REMOTES=" | ||
- | LOCALS= | ||
- | for i in $REMOTE_TO_HOME; | ||
- | for i in $HOME_TO_REMOTE; | ||
- | |||
- | COMMAND=" | ||
- | |||
- | log "Run: ' | ||
- | $COMMAND &>> | ||
- | ssh_pid=$! | ||
- | |||
- | # Wait a bit to ensure command is running... | ||
- | sleep 1 | ||
- | |||
- | # until SSH returns, check network, because SSH might hang for a long time. | ||
- | while ps -p $ssh_pid &> /dev/null | ||
- | do | ||
- | if ping -c 2 -W 2 $REMOTE_SERVER &> /dev/null | ||
- | then | ||
- | sleep 30 | ||
- | else | ||
- | # Network is down? forcing ssh to stop | ||
- | log " | ||
- | kill -9 $ssh_pid | ||
- | while ps -p $ssh_pid; do sleep 1; done | ||
- | fi | ||
- | done | ||
- | |||
- | # get return code | ||
- | wait $ssh_pid | ||
- | log " | ||
- | sleep 10 # after disconnection, | ||
- | else | ||
- | log "It seems that ' | ||
- | sleep 5 # wait a bit before retry ping | ||
- | fi | ||
- | ) # close iteration shell | ||
- | done | ||
- | )& # close tunnel shell | ||
- | TUNNEL_PIDS=" | ||
- | done | ||
- | |||
- | wait | ||
- | </ | ||
- | |||
- | and set it as executable: | ||
- | <code bash> | ||
- | > chmod +x / | ||
- | </ | ||
- | |||
- | Now create the startup script **/ | ||
- | <file txt 99-tunnels.start> | ||
- | #!/bin/bash | ||
- | |||
- | start-stop-daemon -b -m -p / | ||
- | </ | ||
- | |||
- | Share tunnel' | ||
- | |||