ssh

Прокинуть socks на удаленный хост

Можно добавить опцию -C для сжатия трафика.
ssh -D 9999 user@remote.host

Через socks-прокси

ssh -o ProxyCommand="nc -X 5 -x localhost:9999 %h %p" root@10.0.0.1

Проброс авторизации

Аналогичен связке с socks. Удобно в случае если hidden-host доступен только с gate-host
ssh -o ProxyCommand="ssh -W %h:%p user@gate-host" user@hidden-host

Port Forwarding

-f	go to background
-N	Не выполнять команд (не спавнить шелл)
-R	remote
-L	local

Вытащить порт наружу

Прокинуть локальный порт на удаленный хост, например из-за NAT.

Синтаксис: <remote ip>:<remote port>:<local ip>:<local port>

В данном случае ssh будет доступен на машине remote-host на 127.0.0.1:9999
ssh -f -N -R 9999:127.0.0.1:22 user@remote-host

Чтобы забиндить на удаленной машине порт на внешний адрес необходимо в sshd_config указать
GatewayPorts yes
В таком случае можно биндится на внешний адрес машины remote-host
ssh -f -N -R 0.0.0.0:9999:127.0.0.1:22 user@remote-host

Можно так же пробросить пробросить порт соседней машины, например из локальной сети
ssh -f -N -R 0.0.0.0:9999:192.168.1.1:22 user@remote-host

Втащить удаленный порт на локалхост

ssh -L [локальный_адрес:]локальный_порт:[удаленный_адрес]:удаленный_порт remote-host

AutoSSH

Для автоматического удаленного доступа к устройствам за NAT
На сервере создается юзер switch без шелла, клиенты добавляются по ключам. У каждого клиента свой уникальный порт, который он форвардит.

Сервер для autossh

Создать юзера:
useradd --create-home switch

Заменить шелл на nologin:

switch:x:1001:1001::/home/switch:/bin/nologin

Разрешить авторизацию в /etc/shadow:

Заменить это
switch:!:...........

На это 
switch:*:...........

Создать ключи:

mkdir /home/switch/.ssh
ssh-keygen -t rsa -b 2048 -C "switch@autossh" -f /home/switch/.ssh/id_rsa
cat /home/switch/.ssh/id_rsa.pub > /home/switch/.ssh/authorized_keys

Клиент autossh

Скопировать ключ:

cp id_rsa /home/REMOTE_DEVICE/.ssh/switch-autossh.key
chmod go-rwx /home/REMOTE_DEVICE/.ssh/switch-autossh.key

Подключиться первый раз чтобы создался known_hosts:

ssh -N -i  ~/.ssh/switch-autossh.key switch@remote_server_ip 

Настроить демон autossh:

# /etc/systemd/system/autossh.service
# --------------------------------

[Unit]
Description=Keeps a tunnel to zhovner.switch open
After=ssh.service

[Service]
Environment=AUTOSSH_GATETIME=0

# -p [PORT]
# -l [user]
# -M 0 --> no monitoring
# -N Just open the connection and do nothing (not interactive)
# -R remote forwarding <remote ip>:<remote port>:<local ip>:<local port>
# -R can be more than one
ExecStart=/usr/bin/autossh -M 0 -q -N  -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -p 222  -R 123.123.123.123:9122:127.0.0.1:22 -i /root/.ssh/switch-autossh.key switch@123.123.123.123

# Wait 30 seconds before start. Dirty hack to maximum portability because of After=network.target mess.
ExecStartPre=/bin/sleep 30

ExecStop=killall -s KILL autossh

RestartSec=5
Restart=always

[Install]
WantedBy=multi-user.target