Вопрос или проблема
У меня есть удаленный сервер с IP – 111.222.333.444. Я хочу запустить HTTP-сервер на этой машине, который работает на localhost:8000.
Как мне сделать запросы к 111.222.333.444:6000 снаружи, с моего домашнего компьютера, чтобы достичь моего HTTP-сервера, работающего на localhost:8000 на удаленном сервере?
Я использовал ufw. Включил ip_forwarding в /etc/sysctl.conf
DEFAULT_FORWARD_POLICY в /etc/default/ufw
.
Пробовал это в /etc/ufw/before.rules
:
*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 6000 -j REDIRECT --to-port 8000
COMMIT
В строке -A PREROUTING -p tcp --dport 6000 -j REDIRECT --to-port 8000
отсутствие указанного IP, с которого должен приходить трафик, устанавливает его на IP-адрес интерфейса eth0
по умолчанию?
Использую Ubuntu-20.04-amd64.
Если кто-то мог бы сказать, как бы он это написал, чтобы достичь тех же целей. Через редактирование iptables, или ufw и т. д.
Обновление: Начал с нуля. HTTP-сервер работает на localhost:8000
. Мой ufw status
показывает следующее:
To Action From
-- ------ ----
8000/tcp ALLOW Anywhere
6000/tcp ALLOW Anywhere
8000/tcp (v6) ALLOW Anywhere (v6)
6000/tcp (v6) ALLOW Anywhere (v6)
Добавил строки в /etc/ufw/before.rules
перед *filter:
:PREROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 6000 -j REDIRECT --to-port 8000
Что должно позволить мне ввести в командной строке на удаленном сервере curl localhost:6000
или curl 127.0.0.1:6000
и получить ответ, как я понимаю. Но вместо этого я получаю – curl: (7) Не удалось подключиться к локальному хосту на порт 6000: Подключение отклонено
.
Обновление: Изменил /etc/ufw/before.rules
с -A PREROUTING -p tcp --dport 6000 -j REDIRECT --to-port 8000
на:
-A INPUT -i eth0 -p tcp --dport 6000 -j ACCEPT
-A INPUT -i eth0 -p tcp --dport 8000 -j ACCEPT
-A PREROUTING -t nat -i eth0 -p tcp --dport 6000 -j REDIRECT --to-port 8000
Теперь с новыми правилами, когда я делаю запрос curl из терминала, он висит. Вместо того, чтобы выдавать ошибку.
Проброс порта
Использование Ngrok может помочь вам, если вы хотите получить доступ к вашему localhost из публичного интернета. Ngrok “экспонирует ваш локальный сервер разработки в интернет”, предоставляя вам уникальный случайный поддомен URL, например, abcdef.ngrok.io, для доступа к вашему localhost. Вы можете выбрать пользовательский домен, если у вас есть собственный (больше информации о пользовательском домене здесь).
Примечание: К сожалению, вам не придется редактировать таблицы IP с помощью этого метода.
Пожалуйста, попробуйте эти команды на сервере:
$ rm -f /tmp/f ; mkfifo /tmp/f
$ nc -l 6000 </tmp/f | nc localhost 8000 >/tmp/f
Это перенаправит любой TCP-трафик, приходящий на порт 6000 вашего сервера, на внутренний TCP-порт 8000.
Пожалуйста, обратите внимание, что это будет работать только для одного соединения, и вторую команду выше придется повторять для каждого нового соединения. Поэтому это не является настоящим решением, а просто тест для проверки того, действительно ли это то, что вы хотите сделать.
Ответ или решение
Как открыть порт для доступа из внешнего мира
Открытие порта для внешнего доступа к вашему HTTP-серверу на удаленном сервере — это важная задача, которая требует правильно настроенной сети и файрвола. В вашем случае, вы хотите перенаправить трафик с порта 6000
на порт 8000
, на котором работает ваш HTTP-сервер. Ниже приведены шаги, которые помогут вам в этом процессе, включая необходимые изменения в конфигурациях и управляющих системах.
1. Проверка состояния сервера
Убедитесь, что ваш HTTP-сервер действительно запущен и доступен на localhost:8000
. Для этого выполните команду:
curl localhost:8000
Если сервер работает корректно, вы должны получить ответ.
2. Настройка UFW
Сначала убедитесь, что ufw
(Uncomplicated Firewall) включен и позволяет доступ к необходимым портам. Статус ufw
вы можете проверить командой:
sudo ufw status verbose
В вашем выводе указано, что порты 6000
и 8000
уже открыты для всех. Это отлично. Если этого не было, добавьте правила:
sudo ufw allow 6000/tcp
sudo ufw allow 8000/tcp
3. Настройка перенаправления портов
Поскольку вы хотите перенаправить порты, откройте файл конфигурации before.rules
для ufw
:
sudo nano /etc/ufw/before.rules
Перед строкой *filter
добавьте следующие правила перенаправления:
*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -i eth0 -p tcp --dport 6000 -j REDIRECT --to-port 8000
COMMIT
4. Проверка конфигурации перенаправления
После изменения конфигурации перезапустите ufw
:
sudo ufw disable
sudo ufw enable
5. Дополнительные проверки
Теперь проверьте, что ваши настройки сработали. Используйте команду curl
для проверки перенаправления:
curl localhost:6000
Если вы видите зависание при попытке выполнить данную команду, это может означать, что трафик не доходит до вашего сервера на порт 6000
, либо перенаправление настроено некорректно.
6. Альтернативный тест с netcat
Чтобы убедиться, что перенаправление работает, вы можете временно использовать netcat
:
rm -f /tmp/f ; mkfifo /tmp/f
nc -l 6000 < /tmp/f | nc localhost 8000 > /tmp/f
Этот метод позволяет проверить, будет ли успешно перенаправлен трафик. Учтите, что этот способ работает только с одним подключением, поэтому его следует использовать для тестирования.
7. Рекомендации по диагностике
Если проблемы продолжаются, проверьте следующие моменты:
- Логи сервера: Изучите логи вашего сервера, чтобы оценить, отражается ли попытка подключения.
- Настройки сети: Убедитесь, что адаптер
eth0
настроен правильно и активно принимает трафик. - Проверка статуса: Убедитесь, что ваши настройки
ufw
отсутствуют в конфликте с другими правилами файрвола.
Соблюдение всех этих шагов должно помочь вам успешно открыть порт и настроить доступ к вашему HTTP-серверу из внешнего мира. Если есть дополнительные вопросы, не стесняйтесь спрашивать!