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)
  • No labels
Write a comment…