Skip to content

Доступ до робочого комп'ютера за NAT по ssh

Інструкція з того як побудувати ssh-тунель з сервера до робочого Linux-комп’ютера. Маст хев, якщо часто працюєш з дому й забуваєш зробити git push.

Отже, маємо наступну схему:

┌────────────┐       ┌──────────────────────┐       ┌─────────────┐
│ Робочий ПК │ <---> │ your.api.example.com │ <---> │ Домашній ПК │
└────────────┘       └──────────────────────┘       └─────────────┘

Певно, що ssh сервіс вже встановлено на сервері your.api.example.com, то ж я відразу перейду до цікавого - відкриваємо термінал та встановлюємо на робочий ПК ssh сервер. Без цього зворотний ssh-тунель не буде працювати.

$ sudo apt-get install openssh-server --no-install-recommends

Далі нам потрібно згенерувати безпарольний ssh-ключ, який буде використовувати сервіс systemd. По задуму сервіс повинен автоматично під’єднатися до your.api.example.com у разі перебоїв у мережі. Тож виконуємо наступні команди для створення ключа з ім’ям nopwd та додамо публічний ключ на your.api.example.com сервер.

$ ssh-keygen -N '' -C work-pc-tunnel -f ~/.ssh/nopwd
$ cat ~/.ssh/nopwd.pub | ssh root@your.api.example.com "cat >>  ~/.ssh/authorized_keys"
$ # Перевіряємо, чи ключ працює нормально
$ ssh root@your.api.example.com -i ~/.ssh/nopwd whoami
root

Тепер у нас є все для створення сервісу systemd, тож створюємо /etc/systemd/system/backdoor.service файл з наступним змістом:

[Unit]
Description=SSH Tunnel to your.api.example.com
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/ssh \
    -o StrictHostKeyChecking=no -o ExitOnForwardFailure=yes \
    -o TCPKeepAlive=yes -o ConnectTimeout=10 \
    -o ServerAliveInterval=300 -o ServerAliveCountMax=2 \
    -n -N -R 2222:localhost:22 root@your.api.example.com -i /home/user/.ssh/nopwd
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always
RestartSec=10s
StartLimitIntervalSec=0

[Install]
WantedBy=default.target

Активуємо сервіс та перевіряємо його статус:

$ sudo systemctl daemon-reload
$ sudo systemctl enable backdoor.service
$ sudo systemctl start backdoor.service
$ sudo systemctl status backdoor.service | head -n3
● backdoor.service - SSH Tunnel to your.api.example.com
     Loaded: loaded (/etc/systemd/system/backdoor.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2020-05-17 23:41:13 EEST; 28s ago

Отже, все гаразд, переходимо до домашнього ПК, підключаємося до your.api.example.com, а з нього вже до робочого ПК:

$ ssh root@your.api.example.com
root@vps-00001:~# ssh user@localhost -p 2222
user@work:~$

Або все те ж саме, але однією командою:

$ ssh root@your.api.example.com -t ssh user@localhost -p 2222
user@work:~$

Ось і все, щасливого хакінгу!

Корисне

  1. Ізолюємо процес від доступу до мережі