Вопрос или проблема
Я пытаюсь развернуть базовое приложение Flask на своем VM Ubuntu через multipass. Однако я не могу получить доступ к веб-сайту по IP-адресу. Но то же самое работает для localhost.
flask run
* Обслуживание приложения Flask 'microblog.py'
* Режим отладки: отключен
ПРЕДУПРЕЖДЕНИЕ: Это сервер разработки. Не используйте его в производственном развертывании. Вместо этого используйте производственный WSGI-сервер.
* Работа на http://127.0.0.1:5000
Нажмите CTRL+C, чтобы выйти
curl работает с localhost и 127.0.0.1, но не с назначенным публичным IP-адресом
ubuntu@mysql:~$ curl -X GET "http://192.168.1.178:5000/"
curl: (7) Не удалось подключиться к 192.168.1.178 порт 5000 после 0 мс: Подключение отклонено
ubuntu@mysql:~$ curl -X GET "http://localhost:5000/"
Привет, мир!
ubuntu@mysql:~$ curl -X GET "http://127.0.0.1:5000/"
Привет, мир!
Я включил ufw для порта 5000
ubuntu@mysql:~$ sudo ufw status
Статус: активен
Куда Действие Откуда
-- ------ ----
Apache Full ДА Везде
80/tcp ДА Везде
443 ДА Везде
22/tcp ОГРАНИЧИТЬ Везде
5000 ДА Везде
Apache Full (v6) ДА Везде (v6)
80/tcp (v6) ДА Везде (v6)
443 (v6) ДА Везде (v6)
22/tcp (v6) ОГРАНИЧИТЬ Везде (v6)
5000 (v6) ДА Везде (v6)
ubuntu@mysql:~$ netstat -an |grep :5000
tcp 0 0 127.0.0.1:5000 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:47376 127.0.0.1:5000 TIME_WAIT ```
Ответ или решение
Когда вы сталкиваетесь с проблемой доступа к веб-приложению Flask через IP-адрес в Ubuntu VM с использованием Multipass, но при этом можете получить доступ через localhost
, следует рассмотреть несколько ключевых аспектов конфигурации вашей сетевой среды и самого приложения.
1. Проблема конфигурации Flask
Ваши выводы показывают, что Flask работает только на локальном интерфейсе (127.0.0.1). Это означает, что ваше приложение доступно только для локальных соединений. Чтобы решить эту проблему, запустите Flask-приложение, указав, что он должен слушать на всех интерфейсах. Вы можете сделать это, заменив команду:
flask run
на
flask run --host=0.0.0.0
Это позволит вашему приложению принимать соединения как с локального интерфейса, так и с внешних IP-адресов.
2. Проверка брандмауэра (ufw)
Вы указали, что включили UFW (Uncomplicated Firewall) и разрешили трафик на порт 5000. Однако, стоит убедиться, что правила безопасности действительно применяются корректно. После внесения изменений в конфигурацию UFW, выполните команду:
sudo ufw status verbose
Это выдаст развернутый отчет о всех текущих правилах, убедившись, что ваше правило для порта 5000 активно.
3. Использование netstat
Вы уже проверили, что Flask действительно прослушивает 127.0.0.1:5000
. Чтобы убедиться, что ваше приложение теперь прослушивает на всех интерфейсах, после изменения команды запуска перемещение к 0.0.0.0:5000
, снова выполните команду:
netstat -an | grep :5000
Ожидается, что теперь в списке появится строка, аналогичная следующей:
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN
4. Тестирование доступа
После того, как вы убедились, что Flask слушает на всех интерфейсах и UFW настроен корректно, попробуйте снова выполнить команду curl
для доступа к вашему приложению по IP-адресу:
curl -X GET "http://192.168.1.178:5000/"
Это должно успешно вернуть ответ от вашего приложения.
5. Окончательное тестирование и рекомендации
Если возникли дополнительные трудности, проверьте следующее:
- Убедитесь, что ваш Flask-приложение работает корректно и оно действительно отвечает на запросы.
- Попробуйте временно отключить UFW с помощью
sudo ufw disable
, чтобы исключить вероятность блокировки доступа. - Если вы используете какие-либо VPN-соединения или прокси, убедитесь, что они не влияют на соединение.
Заключение
В общем, настройка доступа к веб-приложению Flask в окружении Ubuntu VM с использованием Multipass требует проверки конфигурации самого приложения и управления сетевыми правилами. Настройка Flask для прослушивания на всех интерфейсах и корректная настройка UFW создадут условия для успешного доступа к приложению через IP-адрес.