LINUX.ORG.RU
ФорумAdmin

Настроить ssh-туннель для доступа за NAT.

 ,


0

1

В интернете полно инструкций, но я откровенно в них уже запутался, поэтому пишу сюда.

Задача: нужно обеспечить доступ по ssh к компьютеру за NAT.

Что есть:

  • Домашний интернет с белым динамическим ip и настроенным ddns. Назовем домен my.ddns.net.
  • Домашний сервер, к которому можно подключиться командой ssh user@my.ddns.net
  • Ноутбук за NAT, к которому как раз и нужен удалённый доступ.

Если правильно понимаю, на ноутбуке должен работать демон, который слушает сервер my.ddns.net, а на самом сервере другой демон перенаправляет подключение к ноутбуку.

Как это дело настроить?

Домашний интернет с белым динамическим ip

Вот тут мой мозг сразу сломался и дальше я понимать перестал.

Твой ноут в твоей домашней сети. Если у тебя есть возможность попасть в эту домашнюю сеть извне (через NAT провайдера и, возможно, твой внутренний NAT на домашнем роутере), то ты можешь использовать port redirection.

У меня не через ddns, но git по ssh наружу именно так и торчит. // Ну точнее далеко совсем не так, у меня схема сложнее, но я не стану пудрить тебе мозги.

Пробросить порт ты можешь много чем, хоть тем же ssh, хоть nginx, хоть даже файерволлом.

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

Вот тут мой мозг сразу сломался и дальше я понимать перестал.

Наверное, тут неправильно выразился, извиняюсь. Я могу извне могу попасть в свою домашнюю сеть, я это имел ввиду.

Твой ноут в твоей домашней сети.

Нет, в этом-то как раз и проблема, он где-то «там». Например, у друга, у которого нельзя сделать port redirection, потому что извне нельзя достучаться до домашней сети.

Jullyfish
() автор топика

На сервере создай ssh-аккаунт для ноутбука. И в sshd_config поменяй GatewayPorts на yes.

На ноутбуке введи

ssh -R 12345:127.0.0.1:22 user@my.ddns.net
и залогинься. После этого входящие подключения на порт 12345 сервера будут оказываться подключениями к 22 порту ноутбука.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от Jullyfish

Нет, в этом-то как раз и проблема, он где-то «там». Например, у друга, у которого нельзя сделать port redirection, потому что извне нельзя достучаться до домашней сети.

Тогда тебе придётся организовывать VPN для соединения своей сети и сети друга. Можешь взять какой-нибудь WireGuard, поднять у себя "сервер", доступный по ddns, и дать креды другу, чтобы он подключался как клиент. Если объединить сети (bidirectional NAT), то это будет так же прозрачно, как если бы твой друг был в твоей домашней сети.

mord0d ★★★★★
()
Ответ на: комментарий от firkax

Огромное спасибо, получилось! Пришлось на роутере ещё одну переадресацию порта на 12345 добавить.

Теперь два вопроса:

  1. Как сделать чтобы ssh -R ... на ноутбуке при включении запускался (Slackware 15.0)?
  2. На что обратить внимание в плане безопасности? К ноутбуку без проблем подключился с помощью ключей (аутентификация по паролю отключена), я даже удивился. ssh -R ... по паролю.
Jullyfish
() автор топика
Ответ на: комментарий от Jullyfish

Как сделать чтобы ssh -R ... на ноутбуке при включении запускался (Slackware 15.0)?

И перезапускался когда соединение падает еще. И хорошо бы проверять состояние как-то. И надеяться что второго ноутбука не появится. В общем проще vpn-сервер поднять на «сервере» если вы хотите чтоб этот коннект был постоянным. Этот проброс порта обычно используется для какой-то разовой активности.

micronekodesu ★★★
()
Ответ на: комментарий от Jullyfish

Как сделать чтобы ssh -R ... на ноутбуке при включении запускался (Slackware 15.0)?

Создать systemd-юнит инит-скрипт. Но это тоже не особо надёжно будет — после перезапуска sshd нужно будет перезапускать и его (он будет запущен, но иногда может ничего при этом не делать).

На что обратить внимание в плане безопасности?

На всё. (=
В безопасности нет неважных мелочей. (=

mord0d ★★★★★
()
Ответ на: комментарий от micronekodesu

И перезапускался когда соединение падает еще. И хорошо бы проверять состояние как-то.

Тут имхо достаточно прописать в крон скрипт типа

if ! ping -I $IF_TUNNEL -c 1 $IP_SRV>/dev/null 2>&1; then 
# Здесь рестарт туннеля
fi 
Причем именно рестарт, причин почему процесс ssh не робит может быть больше одной, поэтому на всякий случай пытаемся его кильнуть.

anc ★★★★★
()
Ответ на: комментарий от anc

в крон скрипт

Впервые пригляделся к cron. Выглядит прикольно. А есть возможность им запустить ssh -R ... без авторизации пользователя? Допустим, если ноутбук перезагрузили.

Jullyfish
() автор топика
Ответ на: комментарий от Jullyfish

А есть возможность им запустить ssh -R ... без авторизации пользователя?

Крон выполняет задачи по расписанию, а не по воздействию внешних факторов типа логин пользователя, что в расписании задали, так оно и будет запускаться.

anc ★★★★★
()
Ответ на: комментарий от firkax

Почему бы не воспользоваться ssh -D к серверу и быть как дома?

Или локальный порт использовать? ssh -L 11122:адрес-ноута-в-локалке:22 user@my.ddns.net. Затем подключаешься к 127.0.0.1:11122 вторым ssh

NyXzOr ★★★★
()
Последнее исправление: NyXzOr (всего исправлений: 1)
Ответ на: комментарий от anc

Вот включаю ноутбук, хочу чтобы после включения выполнилась команда ssh -R ... без авторизации какого-либо пользователя, как это лучше сделать? Если бы была авторизация, я бы просто в .bashrc это прописал.

Крон выполняет задачи по расписанию

Как я понял, он по умолчанию работает раз в минуту. Так пусть он раз в минуту проверяет есть ли процесс ssh -R ... и если его нет – запускает.

Jullyfish
() автор топика
Ответ на: комментарий от NyXzOr

Почему бы не воспользоваться ssh -D к серверу и быть как дома?

ssh -D в другую сторону работает, автору надо входящий коннект принять (сервер в качестве реверс-прокси) а не проксировать исходящие через сервер. Да и даже для исходящих я его не использую, причины как минмиум три:

1) -L делает прозрачное проксирование, это намного лучше чем всякие SOCKS

2) -L даёт возможность тонко настроить список портов и их номера, а -D тупо открывает ту локалку, которая нам может быть и не нужна и мы не хотим вникать в её внутреннее устрйоство

3) -D даёт слишком много всего, а я сторонник того чтобы выдавать минимально необходимые права только

Или локальный порт использовать? ssh -L 11122

Это опять проксирование не в ту сторону. Ноут не в локалке, он снаружи.

firkax ★★★★★
()
Ответ на: комментарий от firkax

А вообще я такие штуки в /etc/rc.local прописываю обычно.

Прописал, заработало! Спасибо!

Вот осталось только с cron разобраться на случай, если интернет-соединение пропадёт или ещё чего подобное.

Jullyfish
() автор топика
Ответ на: комментарий от NyXzOr

С vpn просто пока не умею работать. В общем пришёл к такому костыльному варианту:

Файл /etc/rc.d/rc.local:

KEY_PATH=/path/to/private/key
TUN_USER=tun
TUN_ADDR=my.ddns.net

ssh -R 12345:127.0.0.1:22 $TUN_USER@$TUN_ADDR -i $KEY_PATH

sleep 10

/etc/rc.d/rc.local
Jullyfish
() автор топика
Ответ на: комментарий от Jullyfish

Как я понял, он по умолчанию работает раз в минуту.

Я на всякие туннели вешаю от 3х до 5-ти мин, в зависимости от...

Так пусть он раз в минуту проверяет есть ли процесс ssh -R ... и если его нет – запускает.

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

anc ★★★★★
()