Ubuntu Server: Почему я могу получить доступ к сервисам Docker, но не к местным на своей локальной сети?

Вопрос или проблема

Я только что собрал новый сервер, чтобы заменить старый, и сделал свежую установку Ubuntu 24.04.1, перенес все данные и прошел все этапы настройки своих сервисов, используя смесь Docker и нативных сервисов, установленных через apt. В основном все прошло по плану, но, как говорится в заголовке, я не могу получить доступ к любым нативным сервисам по локальной сети, используя IP-адрес и порт (например: http://<сервер-ip>:<порт>), но могу получить к ним доступ через внешний URL, который я настроил для них (для тех немногих, для которых у меня есть такое). И странно, что мои Docker-сервисы работают как через IP-адрес и порт, так и через внешний URL.

У меня нет никакого представления, что может быть причиной этого. Кто-нибудь когда-либо сталкивался с чем-то подобным?

ИЗМЕНЕНИЕ:

По запросу, вот вывод docker ps:

CONTAINER ID   IMAGE                                                COMMAND                  CREATED        STATUS                   PORTS                                                    NAMES
176df3c42d4c   fallenbagel/jellyseerr:latest                        "/sbin/tini -- pnpm …"   18 часов назад  Запущен 7 минут             192.168.1.3:5055->5055/tcp                               jellyseerr
50b07deee3dd   ghcr.io/immich-app/immich-server:release             "tini -- /bin/bash s…"   21 час назад   Запущен 7 минут (здоров)   192.168.1.3:2283->2283/tcp                               immich_server
ed31f3b63292   2e2cb40c55b8                                         "docker-entrypoint.s…"   21 час назад   Запущен 7 минут (здоров)   5432/tcp                                                 immich_postgres
2bc81795c57b   redis:6.2-alpine                                     "docker-entrypoint.s…"   21 час назад   Запущен 7 минут (здоров)   6379/tcp                                                 immich_redis
ad09f6b31664   ghcr.io/immich-app/immich-machine-learning:release   "tini -- ./start.sh"     21 час назад   Запущен 7 минут (здоров)                                                            immich_machine_learning
2ac1a3bc2669   nextcloud/aio-apache:latest                          "/start.sh /usr/bin/…"   22 часа назад  Запущен 7 минут (здоров)   80/tcp, 0.0.0.0:11000->11000/tcp                         nextcloud-aio-apache
09626bed6ef0   nextcloud/aio-notify-push:latest                     "/start.sh"              22 часа назад  Запущен 7 минут (здоров)                                                            nextcloud-aio-notify-push
903fb028f53f   nextcloud/aio-nextcloud:latest                       "/start.sh /usr/bin/…"   22 часа назад  Запущен 7 минут (здоров)   9000/tcp                                                 nextcloud-aio-nextcloud
8c70985c4893   nextcloud/aio-docker-socket-proxy:latest             "/start.sh"              22 часа назад  Запущен 7 минут (здоров)                                                            nextcloud-aio-docker-socket-proxy
191a3675c062   nextcloud/aio-fulltextsearch:latest                  "/bin/tini -- /usr/l…"   22 часа назад  Запущен 7 минут (здоров)   9200/tcp, 9300/tcp                                       nextcloud-aio-fulltextsearch
ed17e7f8c462   nextcloud/aio-redis:latest                           "/start.sh"              22 часа назад  Запущен 7 минут (здоров)   6379/tcp                                                 nextcloud-aio-redis
fadc6c646b84   nextcloud/aio-postgresql:latest                      "/start.sh"              22 часа назад  Запущен 7 минут (здоров)   5432/tcp                                                 nextcloud-aio-database
32daa0a87f36   nextcloud/aio-collabora:latest                       "/start-collabora-on…"   22 часа назад  Запущен 7 минут (здоров)   9980/tcp                                                 nextcloud-aio-collabora
57539b73781d   searxng/searxng:latest                               "/sbin/tini -- /usr/…"   22 часа назад  Запущен 7 минут             192.168.1.3:8080->8080/tcp                               searxng
ad53dcae7eb3   valkey/valkey:7-alpine                               "docker-entrypoint.s…"   22 часа назад  Запущен 7 минут             6379/tcp                                                 redis
06f8439c2b8e   nextcloud/all-in-one:latest                          "/start.sh"              22 часа назад  Запущен 7 минут (здоров)   80/tcp, 8443/tcp, 9000/tcp, 192.168.1.4:8080->8080/tcp   nextcloud-aio-mastercontainer
0a7d81a8983a   jc21/nginx-proxy-manager:latest                      "/init"                  23 часа назад  Запущен 7 минут             192.168.1.4:80-81->80-81/tcp, 192.168.1.4:443->443/tcp   nginx-proxy-manager-nginixproxymanager-1
111220fe43b3   jc21/mariadb-aria:latest                             "/scripts/run.sh"        23 часа назад  Запущен 7 минут             3306/tcp                                                 nginx-proxy-manager-db-1

Также новая информация: принудительное связывание нативных сервисов с ipv4 адресом не позволяет получить доступ

ИЗМЕНЕНИЕ2:

По запросу, вот конфигурация брандмауэра перед сервером, работающая на маршрутизаторе ubiquity unifi:

Name         From       Port      Forward IP / Port
Nginx        Any        80        192.168.1.4:80
Nginx2       Any        443       192.168.1.4:443

Если это поможет, вот как выглядит вывод iptables -L на новом сервере:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
LIBVIRT_INP  all  --  anywhere             anywhere            
ACCEPT     all  --  192.168.1.0/24       anywhere            
ACCEPT     all  --  192.168.1.0/24       anywhere            
ACCEPT     all  --  192.168.1.0/24       anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
DOCKER-USER  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
LIBVIRT_FWX  all  --  anywhere             anywhere            
LIBVIRT_FWI  all  --  anywhere             anywhere            
LIBVIRT_FWO  all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
LIBVIRT_OUT  all  --  anywhere             anywhere            
ACCEPT     all  --  192.168.1.0/24       anywhere            
ACCEPT     all  --  192.168.1.0/24       anywhere            
ACCEPT     all  --  192.168.1.0/24       anywhere            

Chain DOCKER (7 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             172.23.0.2           tcp dpt:5055
ACCEPT     tcp  --  anywhere             172.21.0.3           tcp dpt:http-alt
ACCEPT     tcp  --  anywhere             172.18.0.3           tcp dpt:http
ACCEPT     tcp  --  anywhere             172.18.0.3           tcp dpt:81
ACCEPT     tcp  --  anywhere             172.18.0.3           tcp dpt:https
ACCEPT     tcp  --  anywhere             172.19.0.5           tcp dpt:2283
ACCEPT     tcp  --  anywhere             172.22.0.7           tcp dpt:11000
ACCEPT     tcp  --  anywhere             172.22.0.9           tcp dpt:http-alt

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination         
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-ISOLATION-STAGE-2 (7 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-USER (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere            

Chain LIBVIRT_FWI (1 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             192.168.123.0/24     ctstate RELATED,ESTABLISHED
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain LIBVIRT_FWO (1 references)
target     prot opt source               destination         
ACCEPT     all  --  192.168.123.0/24     anywhere            
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain LIBVIRT_FWX (1 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            

Chain LIBVIRT_INP (1 references)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootps
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:67

Chain LIBVIRT_OUT (1 references)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootpc
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:68

docker ps показывает разные случаи для PORTS:

192.168.1.3:5055

Это означает, что этот порт доступен через подсеть 192.168.1. Вы должны иметь возможность вызвать его с хоста или другого компьютера в той же сети (его IP-адрес должен начинаться с 192.168.1) с помощью curl http://192.168.1.3:5055/ --output /dev/null или открыв этот URL в своем браузере. Но не с другого компьютера.

0.0.0.0:11000

Это означает, что этот порт доступен через любую подсеть. Вы должны иметь возможность вызвать его с любого компьютера с помощью curl http://<сервер-ip>:11000 --output /dev/null или открыв этот URL в своем браузере.

5432/tcp

Этот порт недоступен с хоста или Интернета. (он может быть доступен из контейнеров на том же хосте, но это не в нашей компетенции)

Эти настройки зависят от того, как вы определили порты при использовании docker run или docker compose. Запрет доступа из Интернета позволяет ограничить доступ через прокси, а с использованием чего-то вроде fail2ban вы могли бы заблокировать скрипты, которые отправляют тысячи запросов.

Смотрите также документацию Docker о портах: https://docs.docker.com/get-started/docker-concepts/running-containers/publishing-ports/

Ответ или решение

Доступ к сервисам Docker и нативным сервисам на Ubuntu Server 24.04.1: Причины и решения

При настройке нового сервера на базе Ubuntu 24.04.1 вы столкнулись с проблемой доступа к нативным сервисам через локальную сеть, в то время как Docker-сервисы доступны как по локальному IP-адресу, так и через внешние URL. В данной статье мы рассмотрим возможные причины такой ситуации и предложим пути решения.

Описание проблемы

  1. Доступ к Docker-сервисам:

    • Вы можете получить доступ к Docker-сервисам через адреса вида http://<server-ip>:<port> и внешние URL.
    • Например, сервис jellyseerr доступен по адресу http://192.168.1.3:5055.
  2. Недоступность нативных сервисов:

    • Нативные сервисы, установленные через apt, не доступны по локальному адресу (например, http://<server-ip>:<port>), несмотря на то, что доступ к ним возможен через внешние URL.
  3. Дополнительная информация:

    • Принуждение нативных сервисов использовать IPv4 не решает проблему доступа.
    • Правила NAT на вашем маршрутизаторе настроены на перенаправление внешнего трафика на локальный IP-адрес сервера, что позволяет получать доступ к сервисам через внешние URL.

Причины и возможные решения

1. Конфигурация брандмауэра

Проверьте конфигурацию брандмауэра на уровне сервера:

  • В выводе iptables -L видно, что у вас принята политика ACCEPT для цепочки INPUT. Однако наличие дополнительных правил может блокировать доступ на уровне сети:

    • Убедитесь, что нативные сервисы слушают на всех интерфейсах (0.0.0.0) или на конкретном IP-адресе сервера:
      sudo netstat -tuln

      Это позволит определить, на каких именно IP-адресах и портах работает ваш сервис.

2. Настройки сервисов

Некоторые сервисы могут быть настроены так, что они слушают только на localhost или определённом IP-адресе вместо 0.0.0.0. Убедитесь, что конфигурационные файлы сервисов настроены для приема соединений из внешней сети.

3. Изоляция Docker

Docker создает виртуальные сети, и ваша проблема может быть связана с тем, что Docker-сервисы могут быть настроены на использование изолированных сетевых интерфейсов. Убедитесь в необходимости правильно настроенных маршрутов и правил NAT.

4. Ошибки в маршрутизации

Убедитесь, что маршрутизация настроена корректно. Используйте команду traceroute для диагностики маршрута, по которому проходит трафик к нативным сервисам.

5. Проверка правил маршрутизатора

Ваш маршрутизатор должен правильно перенаправлять пакеты. Попробуйте временно отключить правила NAT для тестирования, чтобы определить, является ли это проблемой.

Резюме

Ваш случай доступа к Docker-сервисам, но недоступности нативных сервисов на локальной сети может быть обусловлен рядом факторов, включая неправильные настройки брандмауэра, конфигурацию самих сервисов и маршрутизации. Следуя рекомендованным шагам, вы сможете локализовать и устранить причину проблемы.

Для получения более точной информации, обратитесь к логам сервисов и системным логам, где могут быть указаны ошибки подключения. Если проблема не устраняется, рассмотрите возможность использования инструментов мониторинга для более глубокой диагностики.

Таким образом, корректная настройка сервера и сервисов позволяет оптимизировать доступ к ним, что значительно улучшит вашу инфраструктуру в целом.

Оцените материал
Добавить комментарий

Капча загружается...