PRTG + Docker Remote API по TLS (Linux)
Цель и итоговая схема
PRTG Probe подключается к Docker Engine на Linux-хосте по Docker Remote API через TLS:
- Docker слушает tcp://0.0.0.0:2376 (или конкретный IP) + tlsverify=true
- На хосте есть:
- CA (корневой сертификат)
- server-cert / server-key (для dockerd)
- client cert / key (для PRTG)
- На хосте открыт TCP/2376 только от IP PRTG Probe
Часть A. На каждом Docker-хосте (Linux): подготовка TLS и включение API
A1) Создать сертификаты (CA + server + client) на хосте
Выполните на Docker-хосте от root:
set -euo pipefail
# Определяем имя хоста и его IPv4 (для SAN)
HOST_FQDN="$(hostname -f 2>/dev/null || hostname)"
HOST_IP="$(ip -4 route get 1.1.1.1 2>/dev/null | awk '{print $7; exit}' || true)"
echo "FQDN: ${HOST_FQDN}"
echo "IPv4: ${HOST_IP}"
install -d -m 0750 /etc/docker/prtg-tls
cd /etc/docker/prtg-tls
# 1) CA
openssl genrsa -out ca-key.pem 4096
openssl req -new -x509 -days 3650 -sha256 \
-key ca-key.pem \
-subj "/CN=${HOST_FQDN}-prtg-docker-ca" \
-out ca.pem
# 2) Server cert (для dockerd)
openssl genrsa -out server-key.pem 4096
openssl req -new -sha256 \
-key server-key.pem \
-subj "/CN=${HOST_FQDN}" \
-out server.csr
{
echo "subjectAltName = DNS:${HOST_FQDN}${HOST_IP:+,IP:${HOST_IP}}"
echo "extendedKeyUsage = serverAuth"
} > server-ext.cnf
openssl x509 -req -days 3650 -sha256 \
-in server.csr \
-CA ca.pem -CAkey ca-key.pem -CAcreateserial \
-out server-cert.pem \
-extfile server-ext.cnf
# 3) Client cert (для PRTG)
openssl genrsa -out key.pem 4096
openssl req -new -sha256 \
-key key.pem \
-subj "/CN=prtg-docker-client" \
-out client.csr
echo "extendedKeyUsage = clientAuth" > client-ext.cnf
openssl x509 -req -days 3650 -sha256 \
-in client.csr \
-CA ca.pem -CAkey ca-key.pem -CAcreateserial \
-out cert.pem \
-extfile client-ext.cnf
# 4) Права
chmod 0400 ca-key.pem server-key.pem key.pem
chmod 0444 ca.pem server-cert.pem cert.pem
rm -f server.csr client.csr server-ext.cnf client-ext.cnf
echo "Created:"
ls -l /etc/docker/prtg-tls
Файлы, которые понадобятся дальше:
- для Docker:
- /etc/docker/prtg-tls/ca.pem
- /etc/docker/prtg-tls/server-cert.pem
- /etc/docker/prtg-tls/server-key.pem
- для PRTG:
- /etc/docker/prtg-tls/cert.pem
- /etc/docker/prtg-tls/key.pem
- (иногда ещё ca.pem — в bundle)
A2) Включить Docker Remote API по TLS на 2376
Отредактируйте (или создайте) файл /etc/docker/daemon.json.
Если файл уже существует — аккуратно объединяйте настройки.
Пример рабочего конфигурационного файла:
cat > /etc/docker/daemon.json <<'EOF'
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"],
"tlsverify": true,
"tlscacert": "/etc/docker/prtg-tls/ca.pem",
"tlscert": "/etc/docker/prtg-tls/server-cert.pem",
"tlskey": "/etc/docker/prtg-tls/server-key.pem"
}
EOF
Рекомендация: вместо 0.0.0.0 лучше указать конкретный IP интерфейса управления.
A3) Убрать конфликт -H fd:// (systemd override)
Docker не стартует, если одновременно используются daemon.json и -H fd://.
Создайте override:
mkdir -p /etc/systemd/system/docker.service.d cat > /etc/systemd/system/docker.service.d/override.conf <<'EOF' [Service] ExecStart= ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock EOF
Перечитать systemd и перезапустить Docker:
systemctl daemon-reload systemctl restart docker systemctl status docker --no-pager
A4) Проверить, что порт 2376 слушается
ss -lntp | grep ':2376' || true
Ожидается: LISTEN ... :2376 ... dockerd
A5) Открыть 2376 в firewalld только для PRTG Probe
Пример: IP Probe = 10.10.0.12
firewall-cmd --get-active-zones
Если зона public:
firewall-cmd --zone=public --permanent \ --add-rich-rule='rule family="ipv4" source address="10.10.0.12" port protocol="tcp" port="2376" accept' firewall-cmd --reload firewall-cmd --zone=public --list-rich-rules
Вместо 10.10.0.12 необходимо подставить адрес реального сервера PRTG, с которого будет отправляться probe-запросы
A6) Проверка TLS локально на хосте
curl -sS https://127.0.0.1:2376/version \ --cert /etc/docker/prtg-tls/cert.pem \ --key /etc/docker/prtg-tls/key.pem \ --cacert /etc/docker/prtg-tls/ca.pem
Если вернулся JSON — Docker API по TLS работает.
Часть B. На PRTG: добавление хоста и сенсоров
B1) Добавить / открыть Device
Device должен указывать на IP Docker-хоста, доступный Probe.
B2) Добавить Docker-сенсор
- Сенсор: Статус контейнера Docker / Docker Container status
- Порт: 2376
- Private Key — содержимое key.pem
- Certificate — содержимое cert.pem
Получение файлов на Linux-хосте:
cat /etc/docker/prtg-tls/key.pem
cat /etc/docker/prtg-tls/cert.pem
Если PRTG требует доверие CA — используйте bundle:
cat /etc/docker/prtg-tls/cert.pem /etc/docker/prtg-tls/ca.pem
B3) Контейнеры отдельными сенсорами
1. Docker-сенсор успешно подключается
2. PRTG выполняет autodiscovery контейнеров
3. Вы выбираете нужные контейнеры
4. PRTG создаёт отдельные сенсоры
Часть C. Чек-лист при timeout на новом хосте
На сервере PRTG:
Test-NetConnection <IP_ХОСТА> -Port 2376
- False — сеть / firewall
- True — сеть ок, проверяем TLS (cert / key / SAN)