Доступ к сайту на виртуальной машине из внешней сети

У меня есть сервер на lubuntu, на котором стоит виртуальная машина, а в ней - сайт. Мне нужно сделать так, чтобы любой желающий (хоть с ПК или телефона) мог подключиться к этому сайту из внешней сети (допустим с мобильного интернета или с другой сети). На сервер я установил Docker и Docker Compose. Все это настроил и перешёл к настройке прокси на Nginx Proxy Manager. Настроил все правильно (порты 80, 443 и 81 (для настройки)) и в панели администратора создал прокси на ранее купленный домен с http протоколом, ip виртуальной машины и портом 8080. Дальше пробросил порты на роутере на внутренний-ip: ip виртуальной машины. Внутренний и внешние порты 80 (для HTTP) и 443 (для HTTPS). Также у меня на роутере динамический внешний ip, поэтому я настроил DDNS на DuckDNS. Дальше на сайте Рег.ру в ресурсных записях создал новую запись на CNAME с субдоменом www и canonical name доменом из DuckDNS. Отключил фаервол на сервере и виртуальной машине. Включил виртуальную машину и сайт стал доступен по локальной сети. Попробовал подключиться с телефона через мобильный интернет и скинул домен другу, но ни я, ни он не смогли зайти на него с внешней сети. Можете помочь разобраться с этой проблемой? И все ли я правильно делаю?


Ответы (2 шт):

Автор решения: ʏʊքɨ

ну по идее, если динамический ip проброс портов и ddns это правильное решение, но обычно ddns дает свой домен для твоего сайта, duckdns уж точно, только у некоторых ddns можно в их панели управления(на их сайте) настроить свой домен для подключения. потом просмотри еще раз настройку твоего nginx, а также, если ничего не получится, вот ссылочка, бесплатная утилитка для туннелирования трафика, тоесть можно его запустить на виртуалке и там дается сразу и домен, но можно для подключения настроить и свой, сертификаты безопасности там автоматические. либо же можно выбрать альтернативы: ngrok, localxpose, serveo.com, zrok и многие др.

→ Ссылка
Автор решения: ʏʊքɨ

Пошаговое решение проблемы:

Проверка публичного IP и проброса портов:

    Узнайте текущий публичный IP через сайт whatismyip.com.

    На роутере:

        Убедитесь, что порты 80 (TCP) и 443 (TCP) проброшены на внутренний IP виртуальной машины.

        Проверьте, не блокирует ли роутер входящие HTTP/HTTPS-запросы (иногда требуется отключить "DMZ" или "Firewall" в настройках роутера).

Проверка работы DDNS (DuckDNS):

    Убедитесь, что скрипт или клиент DuckDNS регулярно обновляет ваш IP.

    Выполните команду в терминале:
    bash
    Copy

    nslookup ваш_домен.duckdns.org

    Результат должен показывать текущий публичный IP роутера.

Настройка DNS-записей в Рег.ру:

    Для домена (example.com):

        Создайте A-запись, указывающую на публичный IP (если это разрешено для корневого домена).

    Для поддомена (www.example.com):

        Создайте CNAME-запись с значением ваш_домен.duckdns.org.

    Убедитесь, что в DNS-настройках нет конфликтующих записей.

Проверка Nginx Proxy Manager (NPM):

    В панели NPM:

        Убедитесь, что создан прокси-хост с:

            Domain Names: www.example.com и example.com (если настроено).

            Forward Hostname/IP: Внутренний IP виртуальной машины.

            Port: 8080 (порт, на котором работает сайт).

        В разделе SSL добавьте сертификат (можно использовать Let's Encrypt через NPM).

Локальная проверка сети:

    На сервере выполните:
    bash
    Copy

    curl -I http://localhost:8080  # Проверка доступности сайта локально
    netstat -tuln | grep '80\|443'  # Убедитесь, что NPM слушает порты

Тестирование извне:

    Используйте мобильный интернет (без Wi-Fi) для доступа к http://www.example.com.

    Проверьте порты через Port Checker. Если порты закрыты, перепроверьте настройки роутера.

Дополнительные шаги:

    Фаерволы: Убедитесь, что фаерволы на сервере (например, ufw) разрешают входящие соединения на порты 80 и 443:
    bash
    Copy

    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp

    Логи NPM: Проверьте логи Nginx Proxy Manager для выявления ошибок:
    bash
    Copy

    docker logs nginx-proxy-manager

Если проблема не решена:

Временно используйте облачный туннель (например, Cloudflare Tunnel) для обхода проброса портов:

    Зарегистрируйтесь на Cloudflare.

    Установите cloudflared на сервер и настройте туннель.

    Направьте домен на туннель через панель Cloudflare.

Этот подход исключит необходимость пробрасывать порты и работать с динамическим IP. New chat AI-generated, for reference only

→ Ссылка