Удаленный доступ к компьютеру за NAT’ом через SSH-туннель

в 0:43, , рубрики: linux, nat, ssh tunnel, Сетевые технологии, метки: , ,

в продолжение темы прохождения через NAT, вот краткий пересказ моих статей об управлении компьютером, который находится за NATом.

Фактически это описание бэкдора, поэтому убедитесь, что вы не нанесете вреда чужой сети и что локальные администраторы в курсе ваших манипуляций.

Задача: разместить линуксовый компьютер в сети за NATом, и иметь к нему доступ из внешнего мира. Например, вы траблшутите или поддерживаете что-то у клиента, и чтобы не сидеть у него в офисе, нужно быстро соорудить удаленный доступ. Или, например в 3G-сетях клиенты как правило получают приватные адреса, а нам нужен доступ к компьютеру, где другой связи нет.

1. Нужен линуксовый сервер с глобальным IP-адресом. Дешевый VPS в минимальной конфигурации подойдет лучше всего. Заводим новую DNS-запись для нашего сервиса, тем самым отвязав сервис от конкретного сервера. Далее в качестве примера используется имя «callhome.example.net».

2. Активируем keepalives на сервере и разрешаем GatewayPorts в /etc/ssh/sshd_config:

ClientAliveInterval 5
ClientAliveCountMax 3
GatewayPorts yes

3. Создаем юзера comehome на сервере:

useradd -r -m -k /dev/null comehome
cd /home/comehome/
mkdir .ssh
chown comehome:comehome .ssh/
chmod 700 .ssh/

4. Удаленный компьютер — в принципе, любое устройство под линуксом. Назовем его agent01. Если у рута ещё нет SSH-ключей, создаем пару ключей командой ssh-keygen. Затем создаем скрипт /root/ssh_tunnel.sh:

#!/bin/sh

SSHCMD="ssh -Tq -o ServerAliveInterval=5 
    -o UserKnownHostsFile=/dev/null 
    -o StrictHostKeyChecking=no 
    comehome@callhome.example.net"

while true; do
    PORT=`$SSHCMD`
    if test 0${PORT} -gt 0; then
      $SSHCMD -NC -R "*:${PORT}:127.0.0.1:22"
    fi
    sleep 5
done

в оригинальной статье есть также скрипт для /etc/init.d для автоматического запуска нашего туннеля.

5. Добавляем публичный ключ рута с agent01 в список авторизованных ключей на сервере, при этом не разрешаем агенту выполнять никаких команд. Также сообщяем агенту адрес порта, по которому он будет доступен (всё в одну строку):

cat >>.ssh/authorized_keys <<EOT
command="/bin/echo 2101",no-user-rc,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3N/skipped/ root@agent01
EOT

Собственно, всё. Остается только протестировать. После запуска туннеля, SSH-соединение на порт 2101 должно приземляться на порту 22 удаленного компьютера.

Если агент — ноутбук под убунтой, начиная с убунты 12.04 невозможно отключить засыпание от закрытия крышки глобально (по крайней мере, мне не удавалось когда я последний раз тестировал).

Не забывайте сделать бэкап скриптов.

Убедитесь в том, что никто кроме вас не получит доступа к агенту, а также что на агенте четко написаны координаты владельца — вы же не хотите подставить чужую сеть под опасность.

В скрипте очень важны ServerAliveInterval (в случае разрыва соединения и клиент и сервер должны оборвать предыдущий туннель), а также sleep (без него при отсутсвии маршрута до сервера ssh возвращается мгновенно, так что лучше притормозить перед следующим запуском). StrictHostKeyChecking отключен на тот случай, если сервис callhome переедет на другую машину, а агент вне нашей физической досягаемости.

Автор: xxqs

* - обязательные к заполнению поля