Kali Linux v Proxmoxu jako Docker kontejner: instalace, noVNC a zabezpečení
Kali Linux v Proxmoxu jako Docker kontejner (linuxserver/kali-linux)
Kompletní návod pro lab: Proxmox VM + Docker + Kali GUI přes noVNC, včetně praktických metod zabezpečení (heslo, bind na localhost, firewall, VPN, reverse proxy).
Co přesně nasazujeme a proč to běží jako VM
Image linuxserver/kali-linux poskytuje Kali Linux s grafickým prostředím, které je dostupné přes web (noVNC). V Proxmoxu je nejpraktičtější spustit Docker uvnitř virtuálního stroje (Ubuntu/Debian), protože to zjednoduší izolaci a vyhneš se typickým limitům LXC (AppArmor/privileged kontejnery, jemnosti s kernel capabilities).
Proxmox VE → VM (Ubuntu/Debian) → Docker → linuxserver/kali-linux (noVNC GUI)
Předpoklady
- Proxmox VE s funkční sítí (bridge vmbr0, DHCP nebo statika)
- VM: Ubuntu Server 24.04 / 22.04 nebo Debian 12
- Doporučení: 2–4 vCPU, 4–8 GB RAM, disk 40+ GB
- Přístup do VM jako root nebo uživatel se sudo
Instalace Dockeru a Docker Compose
1) Aktualizace systému
apt update && apt upgrade -y
2) Instalace Dockeru (rychlá a spolehlivá varianta přes APT)
apt install -y docker.io docker-compose-plugin
systemctl enable --now docker
3) Ověření instalace
docker --version
docker compose version
docker run --rm hello-world
Poznámka: Pokud ti nešel přístup na get.docker.com, příčinou bývá DNS / firewall / NAT. APT instalace výše je nejrychlejší cesta, jak pokračovat.
Docker Compose (docker-compose.yml)
Vytvoříme si čistý adresář pro projekt a do něj vložíme compose konfiguraci.
1) Příprava adresářů
mkdir -p /opt/docker/kali
mkdir -p /opt/kali/config
cd /opt/docker/kali
2) Vytvoření docker-compose.yml
nano docker-compose.yml
Vlož tento obsah (základní, funkční konfigurace):
services:
kali:
image: linuxserver/kali-linux
container_name: kali
security_opt:
- seccomp=unconfined
environment:
PUID: "1000"
PGID: "1000"
TZ: "Europe/Prague"
ports:
- "3000:3000"
- "3001:3001"
volumes:
- /opt/kali/config:/config
restart: unless-stopped
docker-compose.yml nepatří příkazy typu docker run .... YAML soubor je čistě konfigurace.
Spuštění a ověření
1) Spuštění na pozadí
cd /opt/docker/kali
docker compose up -d
2) Kontrola běhu a logů
docker ps
docker logs -n 80 kali
3) IP adresa VM (rychle a bez ifconfig)
ip -4 addr
ip route
hostname -I
Přístup do GUI (noVNC)
V prohlížeči otevři:
Pokud se GUI nenačte, zkontroluj firewall a zda kontejner skutečně běží (docker ps).
Zabezpečení: heslo + další metody
3000/3001 nepublikuj do internetu bez VPN / HTTPS reverse proxy. Heslo je jen jedna vrstva.
Metoda 1: Heslo přes USERNAME/PASSWORD (pokud se inicializuje správně)
Tato metoda přidá Basic Auth před noVNC. U části image se projeví hlavně při prvním startu s čistým /config.
services:
kali:
image: linuxserver/kali-linux
container_name: kali
security_opt:
- seccomp=unconfined
environment:
PUID: "1000"
PGID: "1000"
TZ: "Europe/Prague"
USERNAME: "kali"
PASSWORD: "ZDE_DEJ_SILNE_HESLO"
ports:
- "3000:3000"
- "3001:3001"
volumes:
- /opt/kali/config:/config
restart: unless-stopped
Pokud se přihlášení nedaří: udělej čistou inicializaci – smaž konfiguraci a kontejner znovu vytvoř.
cd /opt/docker/kali
docker compose down
rm -rf /opt/kali/config
mkdir -p /opt/kali/config
docker compose up -d
Metoda 2: Ruční Basic Auth (spolehlivé, když env auth selže)
Pokud automatické nastavení nefunguje, je profesionální cesta vytvořit .htpasswd ručně (uvnitř kontejneru nebo v persistentním /config).
docker exec -it kali bash
apt update
apt install -y apache2-utils
mkdir -p /config/nginx
htpasswd -c /config/nginx/.htpasswd kali
exit
docker restart kali
Ověření, že je Basic Auth aktivní:
curl -I http://127.0.0.1:3000
Metoda 3: Bind pouze na localhost (nejrychlejší „hardening“)
Pokud chceš, aby GUI bylo dostupné jen z VM (nebo přes SSH tunel), uprav port mapping na 127.0.0.1.
ports:
- "127.0.0.1:3000:3000"
- "127.0.0.1:3001:3001"
Následně restart:
cd /opt/docker/kali
docker compose down
docker compose up -d
Metoda 4: SSH tunel (bezpečný vzdálený přístup bez otevírání portů)
Porty necháš lokální, a na svém PC si uděláš tunel přes SSH:
ssh -L 3000:localhost:3000 root@IP_VM
Metoda 5: Firewall (UFW) – povol jen LAN nebo konkrétní IP
Pokud porty vystavuješ do LAN, omez je firewall pravidly.
apt install -y ufw
ufw default deny incoming
ufw default allow outgoing
# Povol přístup jen z tvého PC (nahraď IP)
ufw allow from 10.0.1.10 to any port 3000 proto tcp
ufw allow from 10.0.1.10 to any port 3001 proto tcp
ufw enable
ufw status verbose
Metoda 6: VPN (Tailscale/WireGuard) – nejlepší pro přístup zvenku
Pro vzdálený přístup je nejlepší nevystavovat noVNC porty vůbec a připojit se přes VPN. Typicky:
Tailscale/WireGuard → přístup na http://IP_VPN:3000.
Metoda 7: Reverse proxy + HTTPS + autentizace (produkční styl)
Pokud už máš Nginx Proxy Manager / Nginx, uděláš TLS a autentizaci v proxy. Princip:
proxy → kali:3000, TLS certifikát (Let’s Encrypt), případně Basic Auth na proxy vrstvě.
Troubleshooting (časté chyby)
Chyba: „yaml: cannot unmarshal … docker …“
docker-compose.yml jsi vložil příkaz docker run .... YAML musí být konfigurace (klíče a hodnoty), ne shell příkazy.
Nejde stáhnout Docker skript (curl get.docker.com nefunguje)
Typicky DNS / firewall / NAT. Rychlá diagnostika:
ip route
ping -c 2 1.1.1.1
ping -c 2 google.com
resolvectl status
Login/heslo do noVNC nefunguje
- U některých stavů image se autentizace přes env proměnné projeví hlavně při první inicializaci.
- Proveď reset
/config(viz metoda 1) nebo použij ruční.htpasswd(metoda 2). - Bezpečnější a často jednodušší je bind na localhost + SSH tunel (metoda 3 + 4).
FAQ
Je lepší Kali v Dockeru, nebo klasická Kali VM?
Pro rychlý lab je Docker varianta skvělá (rychlé nasazení, jednoduché mazání, přenositelné). Pro pokročilé scénáře, přístup k HW (Wi-Fi adaptér, USB passthrough, kernel moduly) je často praktičtější klasická Kali VM.
Mohu noVNC vystavit do internetu jen s heslem?
Nedoporučuji. Heslo je jen jedna vrstva. Bezpečnější je VPN (Tailscale/WireGuard) nebo reverse proxy s HTTPS + omezení přístupu.
Jak zjistím IP bez ifconfig?
Použij ip a, ip route nebo hostname -I.
Jaké jsou nejrychlejší 2 bezpečné kroky?
1) Bind porty jen na 127.0.0.1. 2) Přistupuj přes SSH tunel nebo VPN.
Komentáře
Okomentovat