Перенаправление трафика из Интернет на локальный компьютер

Предположим, мы делаем «бота» для месенджера или работаем с каким-либо внешним сервисом, который отправляет запросы на наш веб-сервер и требует доступности веб-сервера в Интернет. Примеры:
- Telegram-бот (Facebook-бот, WhatsApp-бот) который шлёт информацию через «web-hook» на наш сервер.
- IoT сервер в локальной сети предприятия, который должен принимать запросы из интернета.
- Если захочется организовать «домашний сервер» без внешнего IP-адреса.

Что для этого надо сделать?
1. На локальном хосте ставим веб-сервер (nginx), и назначаем ему порт 3002. Пример конфига:

server {
listen 3002;
location / {
add_header Content-type text/plain;
return 200 "localhost";
}
}


2. На «хостинге» тоже нужен веб-сервер, например nginx или apache, пример будет для nginx.

server {
server_name ;
listen 80;
location / {
proxy_set_header X-Forwarded-For $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:3001;
}
}


Заголовки X-Forwarded-* нужны для идентификации клиента. Т.к конфиг выполняет перенаправление запросов на «хостинге» внутри сети хостинга на 3001 порт, который мы будем проксировать на наш локальный порт.

3. Теперь на «хостинге» понадобится sshd (доступ по ssh), в большинстве случаев он установлен и работает. Важно сделать доступ по ssh через публичный ключ. Для этого на локальном хосте получите публичный ключ.

localhost $ cat ~/.ssh/id_rsa.pub
Скопируйте и вставьте на «хостинге» в /home/<ssh_user>/.ssh/authorized_keys

Проверьте доступ с локального хоста.
Вызов ssh <ssh_user>@hosting не должен запрашивать пароль и при этом должен предоставлять доступ. Если доступ работает, значит можно переходить к следующему пункту.

4. Теперь на локальном хосте запускаем ещё раз команду ssh, но с другими параметрами.

localhost $ ssh -vnNT -R 3001:127.0.0.1:3002 <hosting>
debug1: Remote connections from LOCALHOST:3001 forwarded to local address 127.0.0.1:3002
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: pledge: filesystem full

Эта команда подсоединиться к «хостингу» и создаст «туннель» для «проксирования» запросов на локальный хост. И пока эта команда запущена ВСЕ запросы, которые будут идти на веб-сервер «хостинга» на <hosting>:80 будут перенаправлены сначала во внутреннюю сеть «хостинга» (на 3001 порт), а затем из внутренней сети «хостинга» по «ssh-протоколу» будут отправлены на локальный хостинг на 3002 порт.

Теперь проясним что делают параметры -vnNT -R
→ v — Подробный режим, он выводит лог-сообщения в терминал.
→ n – позволяет перенаправлять stdin из /dev/null (предотвращает чтение из stdin)
→ N — отключает «запуск удалённых команд».
→ T — отключает «псевдо-терминал»
→ R —Задаёт перенаправление (forward) с указанного порта (3001) на заданный локальный адрес и порт (127.0.0.1:3002)

Теперь локальный веб-сервер сможет получать запросы из интернета и отвечать на них, т.е клиенты будут получать в ответ текст «localhost».

Комментарии (0)

Написать комментарий