Вопрос или проблема
У меня есть домашняя лаборатория, работающая на Ubuntu 20.04 (ядро v5.10), и на этом сервере я хостю Docker, DNS-сервер (unbound), Wireguard и несколько веб-приложений.
Хост Docker – это кластер Swarm с 1 узлом, на котором работает несколько веб-приложений в виде контейнеров Docker.
Я настроил Traefik и сконфигурировал веб-приложения так, чтобы они были доступны с других устройств в той же сети. Сервер подключен к моему интернет-роутеру. Ничего особенного, но я настроил его для перенаправления трафика Wireguard на этот конкретный сервер.
Я могу успешно подключаться к своей домашней лаборатории с внешнего устройства, получать доступ к веб-приложениям, работающим на хосте, пинговать другие устройства во внутренней сети, так что все, кажется, работает как ожидается.
Моя проблема в том, что ни одно из веб-приложений, работающих на Docker, недоступно через Wireguard. Есть ли у кого-то идеи, что может быть причиной?
Правка: Подробности о хосте
$ ip route
default via 192.168.188.1 dev wlan0 proto dhcp metric 600
10.110.0.2 dev wg0 scope link
10.110.0.3 dev wg0 scope link
10.110.0.4 dev wg0 scope link
10.110.0.5 dev wg0 scope link
10.110.0.6 dev wg0 scope link
10.110.0.7 dev wg0 scope link
10.110.0.8 dev wg0 scope link
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
172.18.0.0/16 dev docker_gwbridge proto kernel scope link src 172.18.0.1
192.168.188.0/24 dev wlan0 proto kernel scope link src 192.168.188.50 metric 600
$ ip route get 10.110.0.3
10.110.0.3 dev wg0 src 10.110.0.1 uid 0
cache
$ ping 10.110.0.3
PING 10.110.0.3 (10.110.0.3) 56(84) bytes of data.
From 10.110.0.1 icmp_seq=1 Host недоступен
ping: sendmsg: Требуется адрес назначения
From 10.110.0.1 icmp_seq=2 Host недоступен
ping: sendmsg: Требуется адрес назначения
^C
$ ss -tlnp | grep dockerd
LISTEN 0 4096 *:80 *:* users:(("dockerd",pid=788,fd=184)
...
Docker swarm использует docker_gwbridge. Хост использует wlan0 для подключения к остальной сети (и интернету)
Ответ или решение
Для доступа к веб-приложениям, работающим в Docker Swarm, через WireGuard, вам нужно удостовериться, что трафик корректно маршрутизируется между клиентом WireGuard и контейнерами Docker. Проблема заключается в том, что WireGuard не знает, как достичь сети, используемой вашими контейнерами Docker, из-за особенностей маршрутизации и сетевых интерфейсов.
Вот шаги, которые необходимо выполнить для устранения проблемы:
1. Настройка конфигурации WireGuard
Убедитесь, что в конфигурации вашего клиента WireGuard указаны соответствующие маршруты. В зависимости от того, какие IP-адреса вы назначили вашим контейнерам, вам нужно добавить маршрут для сети docker_gwbridge
. Добавьте следующую строку в конфигурацию вашего клиента WireGuard:
PostUp = ip route add 172.18.0.0/16 via 10.110.0.1
PostDown = ip route del 172.18.0.0/16 via 10.110.0.1
2. Убедитесь, что контейнеры доступны
Проверьте, что контейнеры Docker доступны из вашей сети. Используйте команду:
docker network inspect <имя_сети>
Убедитесь, что контейнеры подключены к нужной сети (в вашем случае это docker_gwbridge
или bridge
).
3. Настройка маршрутизации на хосте
Убедитесь, что ваш WireGuard-сервер может маршрутизировать пакеты от вашего клиента WireGuard к сети docker_gwbridge
. Если у вас возникают проблемы, проверьте настройки iptables:
iptables -L -n -v
Убедитесь, что нет правил, блокирующих трафик между интерфейсами wg0
и docker0
или docker_gwbridge
. Возможно, вам потребуется добавить разрешающие правила для этих интерфейсов.
4. DNS и доступ к веб-приложениям
Если ваши веб-приложения доступны по доменным именам, убедитесь, что DNS-записи правильно настроены и разрешаются из сети WireGuard. Можно использовать Unbound как DNS-сервер в вашей настройке, однако убедитесь, что он также обрабатывает запросы от IP-адресов в диапазоне вашего клиента WireGuard.
5. Проверка подключения с клиента WireGuard
После внесения изменений, подключитесь к WireGuard и попробуйте выполнить ping
на IP-адреса контейнеров. Также проверьте доступность веб-приложений по их адресам.
6. Логи и диагностика
Если доступ по-прежнему отсутствует, смотрите логи Docker и WireGuard, чтобы получить дополнительную информацию о том, где может происходить сбой. Используйте команды:
docker logs <имя_контейнера>
И проверьте логи WireGuard на наличие ошибок.
Заключение
Следуя вышеуказанным шагам, вы должны быть в состоянии настроить доступ к вашим веб-приложениям, запущенным в Docker Swarm, через WireGuard. Проверяйте каждую часть конфигурации и все сетевые маршруты, чтобы убедиться, что проблема не возникает на этом уровне.