Mastering ssh-tunnels

2018-11-29

Add this to ~/.zshrc or ~/.bashrc and be happy =):

# By saying PROXY I mean it is a host located in internal network.
# You can access any other internal hosts from it via SSH.

# Export some variables
export PROXY_KEY_PATH="~/.ssh/proxy/id_rsa" # path to locally stored private key from PROXY-server
export PROXY_USER="user" # user name to get access to PROXY via SSH
export PROXY_HOST="internal.host.foobar.com" # FQDN or IP of a proxy
export PROXY_AUTH="$PROXY_USER@$PROXY_HOST" # literally it is a string "user@internal.host.foobar.com"

# Connect to PROXY via SSH
alias proxy="ssh $PROXY_AUTH"

# Connect to PROXY via SSH and attach to screen (P.S. don't do it inside a locally launched screen :))
alias proxy_screen="ssh -t $PROXY_AUTH screen -x"

# Forward some service's port which you can access only from PROXY to localhost:1234
# 1234 - local port with service
# ServiceHost - IP-address of a host with service
# ServicePort - Port of a service at ServiceHost
alias tunnel_service='ssh -L 1234:ServiceHost:ServicePort $PROXY_AUTH'

# Forward MySQL-connection which you can access only from some host inside enterprise network (no a PROXY-host) to localhost
# MySQLHost - IP-address of MySQL-server
# WebHost - IP-address of a host that can connect to MySQLHost
# WebUser - User name to access from PROXY to WebHost via SSH
alias tunnel_mysql='ssh -A -i $PROXY_KEY_PATH -L 3306:MySQLHost:3306 -o ProxyCommand="ssh $PROXY_AUTH nc WebHost 22" WebUser@WebHost'

# Run some command at remote server and disconnect
# TargetHost -IP-address of a host where you wanna execute your command
# TargetUser - User name to access from PROXY to TargetHost via SSH
# 'cd /srv/some/directory/; ls -al | wc -l)' - the command you are willing to run
alias remote_directory_count="ssh -i $PROXY_KEY_PATH -t -o ProxyCommand='ssh $PROXY_AUTH nc TargetHost 22' TargetUser@TargetHost 'cd /srv/some/directory/; ls -al | wc -l)'"