Есть три компьютера: A, B, C.
Только компьютер B может хоститься в интернете. Как
подключиться через ssh с компьютера A к
компьютеру C, через компьютер B?
##### # A #--NAT|----+ ##### | | ##### |? # B # V ##### ##### | # C #--NAT|----+ #####
# useradd -m tun
Добавить в sshd_config:
Match User tun AllowTcpForwarding yes GatewayPorts yes X11Forwarding no AllowAgentForwarding no ForceCommand /sbin/nologin
Генерируем ключи:
$ ssh-keygen -t ed25519 -f keyB
Публичный ключ добавляем в authorized_keys, приватный ключ
keyB отправляем на компьютер C.
Генерируем ещё ключи:
$ ssh-keygen -t ed25519 -f keyC
Публичный ключ добавляем в authorized_keys на компьютере
C, приватный ключ keyC отправляем на компьютер
A.
На компьютере C:
$ ssh tun@hostB -N -R 12345:127.0.0.1:22 -i /path/to/keyB
На компьютере A:
$ ssh user@hostB -p 12345 -i /path/to/keyC
#!/bin/sh
# Configure:
KEY_PATH=/absolute/path/to/key
USER=tun-user
ADDR=my.domain.org
LISTEN_PORT=12345
# Don't change below:
GATEWAY="$LISTEN_PORT:127.0.0.1:22"
OPT='-o PubkeyAuthentication=yes -o IdentitiesOnly=yes'
FLAGS='-f -T -N -R'
SSH_TUN_CMD="ssh $OPT $FLAGS $GATEWAY $USER@$ADDR -i $KEY_PATH"
pgrep -f "$SSH_TUN_CMD"
if [ $? -eq 0 ]; then
exit 0
fi
ping -c 3 $ADDR
if [ $? -ne 0 ]; then
exit 1
fi
exec $SSH_TUN_CMD
В crontab:
@reboot /path/to/ssh_tun.sh >> /tmp/ssh_tun.tmp * * * * * /opt/start_ssh_tunnel.sh >> /tmp/ssh_tun.tmp