Меню

Доступ к домашнему серверу с серым IP из интернета через SSH-тоннель

Просмотров: 245

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

Рассмотрим это на примере веб-сервера, но таким же образом можно "открыть" любые порты для других сервисов, запущенных на домашнем сервере.

Для начала арендуем недорогой сервер у хостинг-провайдера, желательно за 200-300 рублей. На этом сервере мы сделаем следующее:

Откроем файл конфигурации SSH:

nano /etc/ssh/sshd_config

Изменим порт SSH на такой, который точно не будет занят на домашнем сервере, и разрешим перенаправление портов:

#Раскомментируем и меняем 22 на новый порт
Port 3437
#Добавляем
GatewayPorts yes
AllowTcpForwarding yes

Далее в тексте я буду использовать порт 3437, вы замените его на тот, который указали в /etc/ssh/sshd_config. После внесения изменений перезапустите SSH-сервер:

systemctl restart sshd

Теперь наша задача — подключиться к арендованному серверу с домашнего и настроить перенаправление нужных портов на него.

SSH тоннель между серверами

Можно создать частную сеть между серверами и настроить перенаправление с помощью iptables или проксирования запросов (например, с помощью Nginx), но это может снизить производительность, так как сервер недорогой (потребутся ресурсы на шифрование). SSH-тоннель будет более эффективным.

На домашнем сервере мы будем использовать аутентификацию с помощью SSH-ключей. Для этого выполните:

ssh-keygen -t rsa -b 4096

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

Копируем ключи на арендованный сервер:

ssh-copy-id -p 3437 root@IP_АРЕНДОВАННОГО_СЕРВЕРА

Вам будет предложено ввести пароль для пользователя root на сервере. После этого ваш публичный ключ будет добавлен в файл ~/.ssh/authorized_keys на сервере.

Далее создаем файл ssh_tunnel.sh:

nano /root/ssh_tunnel.sh

С содержимым:

#!/bin/sh

# Установите переменные для подключения
REMOTE_USER="root"
REMOTE_HOST="IP_АРЕНДОВАННОГО_СЕРВЕРА"
REMOTE_PORT="3437"

# Установите перенаправления портов
nohup ssh -N -R 80:localhost:80 \
    -R 443:localhost:443 \
    -p $REMOTE_PORT $REMOTE_USER@$REMOTE_HOST > ssh_tunnel.log 2>&1 &

Делаем файл исполняемым:

chmod +x /root/ssh_tunnel.sh

Теперь его можно запустить и проверить, что все работает. После запуска все запросы на порты 80 и 443, которые поступают на IP арендованного сервера, будут перенаправляться на ваш домашний сервер.

Добавляя в этот скрипт строки вида -R 443:localhost:443 \ можно перенапрялять любые порты с арендованного на домашний (кроме занятого SSH порта).

В принципе, можно перенаправлять порты не на прямую. А например порт 1234 арендованного сервера на 9090 домашнего -R 1234:localhost:9090 \

Если A-записи домена (например, my-home-server.ru) направлены на IP арендованного сервера, сайт, запущенный на домашнем сервере, также откроется.

Не имеет значения, что у вас серый IP или что этот IP может постоянно меняться. Работает обычное SSH, без каких-либо частных сетей.

В файле ssh_tunnel.log (появится рядом с ssh_tunnel.sh) будет сохраняться лог ошибок, если будут проблемы при подключениях.

Михаил Базаров 05.04.2025
Что бы постоянно не запускать скрипт ssh_tunnel.sh, при перезагрузке домашнего сервера. Можно добавить его в cron.

Код
crontab -e

добавляем запись:

Код
@reboot /root/ssh_tunnel.sh

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

Вверх скрипта добавляем sleep 30. Скорректируйте под себя, если домашний сервер медленный 30-ти секунд может быть не достаточно.

Код
#!/bin/sh

sleep 30

# Установите переменные для подключения
REMOTE_USER="root"
REMOTE_HOST="IP_АРЕНДОВАННОГО_СЕРВЕРА"
REMOTE_PORT="3437"

# Установите перенаправления портов
nohup ssh -N -R 80:localhost:80 \
-R 443:localhost:443 \
-p $REMOTE_PORT $REMOTE_USER@$REMOTE_HOST > ssh_tunnel.log 2>&1 &

Стоимость и сроки разработки сайтов и приложений

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

Разработка интернет-магазина с максимальной оптимизацией от 350 000 руб.
от 4-х недель

Cоздание интернет-магазина на 1С-Битрикс. Разработка с нуля, оптимизация кода и производительности под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Запуск интернет-магазина на готовом решении от 60 000 руб.
от 7-ми дней

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

Мобильное приложение от 400 000 руб.
от 1-го месяца

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Опросник на разработку. После ознакомления, задам уточняющие вопросы и оценю проект по стоимости и срокам разработки.