- Вопрос или проблема
- 192.168.1.3:5055
- 0.0.0.0:11000
- 5432/tcp
- Ответ или решение
- Доступ к сервисам Docker и нативным сервисам на Ubuntu Server 24.04.1: Причины и решения
- Описание проблемы
- Причины и возможные решения
- 1. Конфигурация брандмауэра
- 2. Настройки сервисов
- 3. Изоляция Docker
- 4. Ошибки в маршрутизации
- 5. Проверка правил маршрутизатора
- Резюме
Вопрос или проблема
Я только что собрал новый сервер, чтобы заменить старый, и сделал свежую установку 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. В данной статье мы рассмотрим возможные причины такой ситуации и предложим пути решения.
Описание проблемы
-
Доступ к Docker-сервисам:
- Вы можете получить доступ к Docker-сервисам через адреса вида
http://<server-ip>:<port>
и внешние URL. - Например, сервис
jellyseerr
доступен по адресуhttp://192.168.1.3:5055
.
- Вы можете получить доступ к Docker-сервисам через адреса вида
-
Недоступность нативных сервисов:
- Нативные сервисы, установленные через
apt
, не доступны по локальному адресу (например,http://<server-ip>:<port>
), несмотря на то, что доступ к ним возможен через внешние URL.
- Нативные сервисы, установленные через
-
Дополнительная информация:
- Принуждение нативных сервисов использовать 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-сервисам, но недоступности нативных сервисов на локальной сети может быть обусловлен рядом факторов, включая неправильные настройки брандмауэра, конфигурацию самих сервисов и маршрутизации. Следуя рекомендованным шагам, вы сможете локализовать и устранить причину проблемы.
Для получения более точной информации, обратитесь к логам сервисов и системным логам, где могут быть указаны ошибки подключения. Если проблема не устраняется, рассмотрите возможность использования инструментов мониторинга для более глубокой диагностики.
Таким образом, корректная настройка сервера и сервисов позволяет оптимизировать доступ к ним, что значительно улучшит вашу инфраструктуру в целом.