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
Последни коментари