Skip to content

By Тодор in Linux

Въпрос за 1-ви клас: Знаете ли как се конфигурира SSH автентикация базирана на ключове?
Въпрос за 2-ри клас: Знаете ли какво е обратен (reverse) SSH тунел?

Ситуация: Имаме *nix сървър, който е разположен зад NAT или има толкова лош firewall, че не разрешава никакви входящи връзки. А ние искаме да се свържем с него „от вън“ (през Интернет). А може сървъра да е в мрежата на някой глупав Интернет доставчик, чиито DHCP lease е неприлично кратък и адресите се сменят…

Решение 1: Инсталираме OpenVPN клиент и го свързваме с наш VPN сървър, който е публикуван и достъпен в Интернет. После по изградения VPN канал се свързваме към супер секретния или с неизвестен ИП адрес отдалечен хост.

Решение 2: Стартиране на обратен SSH тунел към наш сървър в Интернет. Ето това решение разглеждам в текущата статия.

Най-краткия пример е следния:
На отдалечения хост изпълняваме следната команда:

ssh -R 42001:localhost:22 tunnel@ssh.kamenitza.org

Това ще изгради SSH връзка до адрес ssh.kamenitza.org и през тази връзка ще тунелира трафика от 127.0.0.1:42001 на сървъра ssh.kamenitza.org към 127.0.0.1:22 на динамичния хост с неизвестно ИП. Т.е, ако искаме да се свържем с отдалечената машина е необходимо в SSH сървъра да извикаме:

ssh 127.0.0.1:42001

Супер лесно и готино. Обаче как да си осигурим постоянното стартиране на SSH тунела от отдалечения хост?

Създаваме си демон, който ще се стартира автоматично сам и ще осигурява SSH връзката.

Генерираме ключовете за автентикация на клиента:

mkdir -p /etc/tunnel
ssh-keygen -qN "" -f /etc/tunnel/id_rsa

Създаваме файл /etc/systemd/system/ssht.service със следното съдържание:

[Unit]
Description=Reverse SSH tunnel
Wants=network-online.target
After=network-online.target
StartLimitIntervalSec=0

[Service]
Type=simple
Environment=REVERSE_PORT=42001
Environment=SSH_SERVER=ssh.kamenitza.org
Environment=SSH_PORT=22
Environment=SSH_USER=worm
Environment=CLIENT_SSH_PORT=22

ExecStart=/usr/bin/ssh -qNn \
  -o ServerAliveInterval=30 \
  -o ServerAliveCountMax=3 \
  -o ExitOnForwardFailure=yes \
  -o StrictHostKeyChecking=no \
  -o UserKnownHostsFile=/dev/null \
  -i /etc/${SSH_USER}/id_rsa \
  -R ${REVERSE_PORT}:localhost:${CLIENT_SSH_PORT} \
  ${SSH_USER}@${SSH_SERVER} -p ${SSH_PORT}
Restart=always
RestartSec=60

[Install]
WantedBy=multi-user.target

Създаване на потребителя на сървъра:

useradd -m -s /bin/true tunnel
mkdir -p ~tunnel/.ssh
chown -R tunnel:tunnel ~tunnel/.ssh
chmod 700 ~tunnel/.ssh

Поставяме съдържанието на /etc/tunnel/id_rsa.pub от клиента в ~tunnel/.ssh/authorized_keys на сървъра.
Настройката на правата е задължителна:
chmod 600 ~tunnel/.ssh/authorized_keys

И вече можем да активираме демона на отдалечената машина:

systemctl daemon-reload
systemctl enable ssht
systemctl start ssht

Ако всичко е наред, би трябвало сега от SSH сървъра да можем да се закачим за отдалечения хост ето така:

ssh localhost:42001

Tags: , , ,

Comment Feed

No Responses (yet)



Some HTML is OK

or, reply to this post via trackback.