Skip to main content

Instalace NTP serveru

Co návod obsahuje:

📋 Základní info

  • Specifikace (Ubuntu 64-bit, /opt/, Docker)
  • Požadavky a prerekvizity
  • 9 evropských NTP serverů

🔧 Instalační kroky (1-11)

  1. Vytvoření adresářové struktury
  2. Konfigurace Chrony s DDoS ochranou
  3. Docker Compose setup
  4. Spuštění a ověření
  5. Monitoring skripty (4 různé)
  6. Automatizace (cron)
  7. Testování
  8. Správa serveru
  9. README dokumentace

🛡️ Bezpečnost

  • Rate limiting (8 req/3s)
  • Resource limits (512MB RAM, 1 CPU)
  • Client log limit (10000 klientů)
  • Automatický monitoring
  • Health checks

📊 Monitoring

  • status.sh - rychlý přehled
  • monitor-public.sh - detailní monitoring
  • check-ddos.sh - kontrola útoků
  • healthcheck.sh - automatická kontrola

🔍 Řešení problémů

  • Kontejner neběží
  • Nesynchronizuje se
  • DDoS útok
  • Nedostatek paměti

📦 Údržba

  • Pravidelné updaty
  • Záloha konfigurace
  • Čištění logů

Extra bonusy v návodu:

✅ Všechny příkazy jsou copy-paste ready
✅ Obsahuje očekávané výstupy (ukázky co máš vidět)
Barevné označení úspěchu/varování (✅⚠️❌)
Troubleshooting sekce
README.md pro produkční dokumentaci
✅ Kompletní cron automatizace

Stačí to zkopírovat na Wiki a je to ready! 📚🚀



Instalace veřejného NTP serveru v Dockeru

Kompletní návod na instalaci veřejného NTP serveru s ochranou proti DDoS pro Ubuntu Server.

Specifikace

  • Platforma: Ubuntu Server 64-bit
  • Umístění: /opt/ntp-server
  • Kontejner: Docker s Portainer kompatibilní
  • Kapacita: 1000+ současných klientů
  • NTP daemon: Chrony (moderní, rychlý)
  • Ochrana: Rate limiting, resource limits, automatický monitoring

Požadavky

# Instalace Docker a Docker Compose (pokud ještě nemáš)
sudo apt update
sudo apt install docker.io docker-compose -y
sudo systemctl enable docker
sudo systemctl start docker

# Přidání uživatele do docker skupiny
sudo usermod -aG docker $USER
# Po tomto příkazu se odhlaš a znovu přihlaš!
  1. Vytvoření adresářové struktury
    # Vytvoření hlavního adresáře
    sudo mkdir -p /opt/ntp-server
    
    # Vytvoření podadresářů
    sudo mkdir -p /opt/ntp-server/config
    sudo mkdir -p /opt/ntp-server/logs
    sudo mkdir -p /opt/ntp-server/data
    
    # Nastavení práv (volitelně)
    sudo chown -R $USER:$USER /opt/ntp-server
    2. Vytvoření konfiguračního souboru Chrony
    cat > /opt/ntp-server/config/chrony.conf << 'EOF'
    # ===== ČESKÉ SERVERY - NEJVYŠŠÍ PRIORITA =====
    # prefer = preferovat tyto servery před ostatními
    
    # NIC.cz - priorita 1
    server ntp.nic.cz iburst prefer minpoll 4 maxpoll 6
    
    # CESNET servery - priorita 2
    server tik.cesnet.cz iburst prefer minpoll 4 maxpoll 6
    server tak.cesnet.cz iburst prefer minpoll 4 maxpoll 6
    
    # ===== EVROPSKÉ SERVERY - ZÁLOHA =====
    # Německo
    server ptbtime1.ptb.de iburst minpoll 4 maxpoll 6
    server ptbtime2.ptb.de iburst minpoll 4 maxpoll 6
    server ntp1.fas.org iburst minpoll 4 maxpoll 6
    
    # Belgie
    server ntp1.oma.be iburst minpoll 4 maxpoll 6
    server ntp2.oma.be iburst minpoll 4 maxpoll 6
    
    # Švédsko
    server ntp.netnod.se iburst minpoll 4 maxpoll 6
    
    # Cloudflare (edge v EU)
    server time.cloudflare.com iburst minpoll 4 maxpoll 6
    
    # ===== VEŘEJNÝ PŘÍSTUP S OCHRANOU PROTI DDoS =====
    
    # Povolit přístup odkudkoliv (FireWall řešíš v UniFi/externím FW)
    allow all
    
    # KRITICKÁ OCHRANA: Rate limiting
    # Maximálně 8 požadavků během 3 sekund z jedné IP
    # Po překročení: leak 2 = pomalé obnovování limitu
    ratelimit interval 3 burst 8 leak 2
    
    # Limit sledovaných klientů (šetří paměť pro až 1000+ klientů)
    clientloglimit 10000
    
    # Command access pouze z localhostu
    cmdallow 127.0.0.1
    cmdallow ::1
    cmddeny all
    
    # Command rate limiting
    cmdratelimit interval 2 burst 2
    
    # ===== OPTIMALIZACE PRO VEŘEJNÝ SERVER =====
    
    # Maximální rozdíl pro akceptaci změny
    maxupdateskew 100.0
    
    # Minimální počet zdrojů pro synchronizaci
    minsources 3
    
    # Korekce pro zpoždění na síti
    maxdistance 16.0
    
    # Zvýšení přesnosti
    maxslewrate 1000.0
    
    # Pool optimalizace
    maxsamples 8
    minsamples 4
    
    # ===== BEZPEČNOST =====
    
    # Zakázat client logging (šetří paměť a CPU)
    noclientlog
    
    # Drift file pro zachování přesnosti
    driftfile /var/lib/chrony/chrony.drift
    
    # Povolit velké časové skoky při startu
    makestep 1.0 3
    
    # Synchronizace hardwarových hodin
    rtcsync
    
    # ===== LOGOVÁNÍ =====
    logdir /var/log/chrony
    log measurements statistics tracking
    
    # Logovat změny větší než 0.5s
    logchange 0.5
    EOF
    3. Vytvoření Docker Compose souboru
    version: '3.8'
    
    services:
      ntp:
        image: cturra/ntp:latest
        container_name: ntp-server
        restart: unless-stopped
        ports:
          - "123:123/udp"
        environment:
          - TZ=Europe/Prague
          # DŮLEŽITÉ: Seznam NTP serverů v pořadí priority
          - NTP_SERVERS=ntp.nic.cz,tik.cesnet.cz,tak.cesnet.cz,ptbtime1.ptb.de,ptbtime2.ptb.de,ntp1.oma.be,ntp2.oma.be,ntp.netnod.se,ntp1.fas.org,time.cloudflare.com
          - LOG_LEVEL=1
          - ENABLE_NTS=false
          - ENABLE_SYSCLK=true
        volumes:
          - /opt/ntp-server/logs:/var/log/chrony:rw
          - /opt/ntp-server/data:/var/lib/chrony:rw
          - /opt/ntp-server/config/chrony.conf:/etc/chrony/chrony.d/custom.conf:ro
        cap_add:
          - SYS_TIME
          - SYS_NICE
          - SYS_RESOURCE
          - NET_BIND_SERVICE
        networks:
          - ntp-net
        logging:
          driver: "json-file"
          options:
            max-size: "50m"
            max-file: "5"
        # Resource limity pro stabilitu a ochranu
        mem_limit: 512m
        mem_reservation: 128m
        cpus: 1.0
        security_opt:
          - no-new-privileges:true
        ulimits:
          nofile:
            soft: 65536
            hard: 65536
    
    networks:
      ntp-net:
        driver: bridge

    Ověření funkčnosti

    Kontrola běhu kontejneru

    docker ps | grep ntp-server

    Měl bys vidět:


    CONTAINER ID   IMAGE              STATUS                   PORTS
    xxxxx          cturra/ntp:latest  Up X minutes (healthy)   0.0.0.0:123->123/udp

    Kontrola zdrojů času

    docker exec ntp-server chronyc sources -v

    Měl bys vidět všech 9 evropských serverů s označením:

    • ^* = primární zdroj (aktuálně používaný)
    • ^+ = kombinovaný (používá se pro výpočet)
    • ^- = dostupný záložní

    Kontrola synchronizace

    docker exec ntp-server chronyc tracking

    Výstup by měl obsahovat:


    Reference ID    : [IP českého serveru] (ntp.nic.cz/tik/tak.cesnet.cz)
    Stratum         : 2
    System time     : X.XXXXXX seconds [fast/slow] of NTP time

    Kontrola klientů

    docker exec ntp-server chronyc clients

    6. Vytvoření monitoring skriptů

    Rychlá kontrola stavu

    cat > /opt/ntp-server/status.sh << 'EOF'
    #!/bin/bash
    echo "🕐 NTP Server Status"
    echo "===================="
    echo "Primary: $(docker exec ntp-server chronyc tracking | grep 'Reference ID' | awk '{print $4}')"
    echo "Offset:  $(docker exec ntp-server chronyc tracking | grep 'System time' | awk '{print $4,$5,$6,$7}')"
    echo "Clients: $(docker exec ntp-server chronyc clients 2>/dev/null | grep -v '^=' | grep -v 'Hostname' | wc -l)"
    echo "Sources: $(docker exec ntp-server chronyc sources | grep -c '^[\^]')"
    EOF
    
    chmod +x /opt/ntp-server/status.sh

    Detailní monitoring

    cat > /opt/ntp-server/monitor-public.sh << 'EOF'
    #!/bin/bash
    
    echo "======================================"
    echo "PUBLIC NTP SERVER MONITORING"
    echo "Time: $(date)"
    echo "======================================"
    
    echo -e "\n[CONTAINER STATUS]"
    docker ps | grep ntp-server || echo "❌ Container not running!"
    
    echo -e "\n[HEALTH CHECK]"
    HEALTH=$(docker inspect ntp-server --format='{{.State.Health.Status}}' 2>/dev/null)
    if [ "$HEALTH" == "healthy" ]; then
        echo "✅ Container is healthy"
    else
        echo "Status: $HEALTH"
    fi
    
    echo -e "\n[SYSTEM RESOURCES]"
    docker stats ntp-server --no-stream --format "CPU: {{.CPUPerc}}\tMEM: {{.MemUsage}}\tNET I/O: {{.NetIO}}"
    
    echo -e "\n[PRIMARY SOURCE]"
    docker exec ntp-server chronyc tracking | grep "Reference ID"
    docker exec ntp-server chronyc tracking | grep "Stratum"
    docker exec ntp-server chronyc tracking | grep "System time"
    
    echo -e "\n[NTP SOURCES (Top 5)]"
    docker exec ntp-server chronyc sources | head -7
    
    echo -e "\n[CLIENT COUNT]"
    CLIENT_COUNT=$(docker exec ntp-server chronyc clients 2>/dev/null | grep -v "^=" | grep -v "Hostname" | wc -l)
    echo "Active clients: $CLIENT_COUNT"
    
    if [ "$CLIENT_COUNT" -gt 0 ]; then
        echo -e "\n[TOP CLIENTS (by requests)]"
        docker exec ntp-server chronyc clients | grep -v "^=" | grep -v "Hostname" | sort -k2 -rn | head -10
    fi
    
    echo -e "\n[ACTIVITY]"
    docker exec ntp-server chronyc activity
    
    echo -e "\n[SERVER STATS]"
    docker exec ntp-server chronyc serverstats 2>/dev/null || echo "Serverstats not available"
    
    echo -e "\n[RECENT DOCKER LOGS]"
    docker logs ntp-server --tail 5 2>/dev/null || echo "No recent logs"
    
    echo -e "\n======================================"
    echo "✅ Monitoring completed"
    EOF
    
    chmod +x /opt/ntp-server/monitor-public.sh
    Kontrola DDoS útoků
    cat > /opt/ntp-server/check-ddos.sh << 'EOF'
    #!/bin/bash
    
    # Threshold pro varování
    MAX_CLIENTS=1000
    MAX_REQUESTS_PER_CLIENT=100
    
    CLIENT_COUNT=$(docker exec ntp-server chronyc clients 2>/dev/null | grep -v "^=" | grep -v "Hostname" | wc -l)
    
    if [ "$CLIENT_COUNT" -gt "$MAX_CLIENTS" ]; then
        echo "⚠️  WARNING: High client count: $CLIENT_COUNT (threshold: $MAX_CLIENTS)"
        echo "Timestamp: $(date)"
        
        # Najdi TOP útočníky
        echo "Top 5 clients:"
        docker exec ntp-server chronyc clients | grep -v "^=" | grep -v "Hostname" | sort -k2 -rn | head -5
    fi
    
    # Zkontroluj jednotlivé klienty s vysokým počtem požadavků
    docker exec ntp-server chronyc clients 2>/dev/null | grep -v "^=" | grep -v "Hostname" | while read line; do
        REQUESTS=$(echo $line | awk '{print $2}')
        HOST=$(echo $line | awk '{print $1}')
        
        if [ ! -z "$REQUESTS" ] && [ "$REQUESTS" -gt "$MAX_REQUESTS_PER_CLIENT" ]; then
            echo "⚠️  Suspicious activity from $HOST: $REQUESTS requests at $(date)"
        fi
    done
    
    echo "✅ DDoS check completed at $(date)"
    EOF
    
    chmod +x /opt/ntp-server/check-ddos.sh
    Health check skript
    cat > /opt/ntp-server/healthcheck.sh << 'EOF'
    #!/bin/bash
    
    # Zkontroluj, zda je kontejner spuštěný
    if ! docker ps | grep -q ntp-server; then
        echo "❌ NTP kontejner neběží! Spouštím..." | tee -a /opt/ntp-server/logs/healthcheck.log
        cd /opt/ntp-server && docker-compose up -d
        exit 1
    fi
    
    # Zkontroluj synchronizaci
    SOURCES=$(docker exec ntp-server chronyc sources 2>/dev/null | grep -c "^\^[*+]")
    
    if [ "$SOURCES" -lt 1 ]; then
        echo "⚠️  NTP není synchronizován s žádným zdrojem! $(date)" | tee -a /opt/ntp-server/logs/healthcheck.log
        exit 1
    fi
    
    echo "✅ NTP server je zdravý a synchronizován ($(date))"
    exit 0
    EOF
    
    chmod +x /opt/ntp-server/healthcheck.sh

    7. Spuštění monitoringu

    Rychlá kontrola

    /opt/ntp-server/status.sh

Detailní monitoring

/opt/ntp-server/monitor-public.sh

Kontrola DDoS

/opt/ntp-server/check-ddos.sh

8. Automatizace monitoringu (Cron)

# Editace crontabu
crontab -e

Přidej tyto řádky:

# NTP Server automatický monitoring
*/5 * * * * /opt/ntp-server/check-ddos.sh >> /opt/ntp-server/logs/ddos-check.log 2>&1
0 * * * * /opt/ntp-server/monitor-public.sh >> /opt/ntp-server/logs/hourly-monitor.log 2>&1
0 2 * * * /opt/ntp-server/monitor-public.sh > /opt/ntp-server/logs/daily-$(date +\%Y\%m\%d).log 2>&1

# Health check každých 5 minut
*/5 * * * * /opt/ntp-server/healthcheck.sh >> /opt/ntp-server/logs/healthcheck.log 2>&1

# Čištění starých logů (starší než 30 dní)
0 3 * * 0 find /opt/ntp-server/logs -name "*.log" -type f -mtime +30 -delete

9. Test z jiného zařízení

Z lokální sítě

# Nahraď IP_SERVERU svojí skutečnou IP adresou
ntpdate -q IP_SERVERU

# Nebo pomocí chrony
chronyc -h IP_SERVERU tracking

Měl bys vidět něco jako:

server 192.168.X.X, stratum 2, offset 0.000123, delay 0.00234

Z internetu (veřejná IP)

ntpdate -q ntp.zelina.eu

Vyčištění starých Docker images

docker image prune -f

11. Vytvoření README dokumentace

cat > /opt/ntp-server/README.md << 'EOF'
# NTP Server - Veřejný čas

## Přehled
- **Lokace:** /opt/ntp-server
- **Docker Image:** cturra/ntp:latest
- **Port:** 123/UDP (veřejný)
- **Primární zdroj:** České servery (ntp.nic.cz, tik/tak.cesnet.cz)
- **Kapacita:** 1000+ klientů

## Zdroje času (9 evropských serverů)

### České servery (priorita):
- ntp.nic.cz
- tik.cesnet.cz
- tak.cesnet.cz

### Evropské servery (záloha):
- ptbtime1.ptb.de (Německo - atomové hodiny PTB)
- ptbtime2.ptb.de (Německo)
- ntp1.oma.be (Belgie)
- ntp2.oma.be (Belgie)
- ntp.netnod.se (Švédsko)
- ntp1.fas.org (Německo)
- time.cloudflare.com (Cloudflare EU edge)

## Ochrana proti DDoS

✅ Rate limiting: 8 požadavků za 3 sekundy z jedné IP
✅ Client log limit: max 10000 sledovaných klientů
✅ Memory limit: 512MB
✅ CPU limit: 1.0 CPU
✅ Zakázané staré NTP protokoly (MODE 6/7)
✅ Automatický monitoring každých 5 minut

## Rychlé příkazy

### Kontrola stavu
```bash
/opt/ntp-server/status.sh
```

### Detailní monitoring
```bash
/opt/ntp-server/monitor-public.sh
```

### Restart
```bash
cd /opt/ntp-server && docker-compose restart
```

### Logy
```bash
docker logs ntp-server --tail 50 -f
```

## Důležité soubory

- `/opt/ntp-server/docker-compose.yml` - konfigurace kontejneru
- `/opt/ntp-server/config/chrony.conf` - NTP konfigurace
- `/opt/ntp-server/logs/` - logy serveru
- `/opt/ntp-server/data/` - drift file a data

## Firewall

⚠️ **DŮLEŽITÉ:** Firewall se NEŘEŠÍ v Ubuntu!
Port 123/UDP musí být otevřený v externím firewallu (UniFi, apod.)

## Očekávaný výkon

- **Přesnost:** <1ms offset
- **Stratum:** 2 (jeden hop od atomových hodin)
- **Využití CPU:** <1%
- **Využití RAM:** 1-5 MB
- **Klienti:** Podpora pro 1000+ současných připojení

---
Vytvořeno: 2026-01-11
EOF

 

Bezpečnostní poznámky

✅ Co je implementováno

  1. Rate limiting v Chrony - 8 požadavků/3s z jedné IP
  2. Client log limit - max 10000 klientů (šetří paměť)
  3. Resource limits - 512MB RAM, 1 CPU core
  4. Security options - no-new-privileges
  5. Automatický monitoring - každých 5 minut
  6. Health checks - automatické restartování při selhání
  7. Log rotation - automatické mazání starých logů

⚠️ Co NENÍ v Ubuntu (řeší se externě)

  1. Firewall - Firewall pravidla se nastavují v UniFi nebo jiném externím firewallu
  2. Fail2ban - Není potřeba, rate limiting je v Chrony
  3. IPTables/UFW - NEPOUŽÍVAT! Může to kolidovat s Docker networking

 

Server se nesynchronizuje

# Zkontroluj zdroje
docker exec ntp-server chronyc sources -v

# Zkontroluj tracking
docker exec ntp-server chronyc tracking

# Zkontroluj aktivitu
docker exec ntp-server chronyc activity

Vysoká zátěž / DDoS útok

# Zkontroluj klienty
docker exec ntp-server chronyc clients

# Najdi útočníky (vysoký počet požadavků)
docker exec ntp-server chronyc clients | sort -k2 -rn | head -10

# Blokuj v externím firewallu (UniFi, apod.)

Nedostatek paměti

# Zkontroluj využití
docker stats ntp-server

# Zvyš limit v docker-compose.yml pokud potřeba
# mem_limit: 1024m

Očekávaný výstup po instalaci

Status check

bash
/opt/ntp-server/status.sh
🕐 NTP Server Status
====================
Primary: C37190EE (tak.cesnet.cz)
Offset:  0.000101957 seconds slow of NTP time
Clients: 5
Sources: 9

Sources

bash
docker exec ntp-server chronyc sources -v
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^+ ntp.nic.cz                    1   6   377    12   -948us[ -902us] +/- 5471us
^+ tik.cesnet.cz                 1   6   377    15   +992us[+1038us] +/- 4697us
^* tak.cesnet.cz                 1   6   377     1   +709us[ +801us] +/- 5108us
^+ ptbtime1.ptb.de               1   6   377    28  -2104us[-2013us] +/-   15ms
... (dalších 5 serverů)

Tracking

docker exec ntp-server chronyc tracking

 

Reference ID    : C37190EE (tak.cesnet.cz)
Stratum         : 2
Ref time (UTC)  : Sun Jan 11 17:18:53 2026
System time     : 0.000435149 seconds fast of NTP time
Last offset     : -0.000038851 seconds
RMS offset      : 0.000597632 seconds
Frequency       : 0.038 ppm fast
Residual freq   : +0.004 ppm
Skew            : 0.202 ppm
Root delay      : 0.007059581 seconds
Root dispersion : 0.001461992 seconds
Update interval : 129.0 seconds
Leap status     : Normal

Závěr

Po dokončení této instalace máš plně funkční veřejný NTP server s:

  • ✅ 9 evropských Stratum 1-2 zdrojů
  • ✅ České servery jako priorita
  • ✅ Ochrana proti DDoS útokům
  • ✅ Kapacita pro 1000+ klientů
  • ✅ Přesnost <1ms
  • ✅ Automatický monitoring a health checks
  • ✅ Produkční stabilita

Server je připraven k použití! 🚀

Pro podporu nebo otázky viz README.md v /opt/ntp-server/