Предположим, у вас есть сервер в домашней сети, который недоступен из интернета, так как находится за 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) будет сохраняться лог ошибок, если будут проблемы при подключениях.