logo

ssh туннелирование

Описание задачи

Есть три компьютера: A, B, C. Только компьютер B может хоститься в интернете. Как подключиться через ssh с компьютера A к компьютеру C, через компьютер B?

#####          
# A #--NAT|----+
#####          |
 |           ##### 
 |?          # B #
 V           #####
#####          |
# C #--NAT|----+
#####      

Компьютер B (хост)

# 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.

Компьютер 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

Скачать шаблон скрипта.