Skip to main content

COMMUNITY KNOWLEDGE FORUM Independent Hosting Community • Not affiliated with netcup GmbH.

NETCUP GUIDE
FORUM · LIVE VOUCHER POOL
Guides LEVEL: Advanced TIME: 15 minutes // 20 MIN READ • VERIFIED:

Mastering Netcup Server Control Panel (SCP): Cloud-Init, Edge Firewall, CoW Snapshots & REST API

Netcup separates commercial contract billing (handled in the Customer Control Panel, CCP) from low-level KVM hypervisor orchestration (handled in the Server Control Panel, SCP at servercontrolpanel.de). Modernized with an OpenAPI v1 REST interface, hypervisor-level stateful packet filtering on the virtio-net tap interface, Copy-on-Write (CoW) disk snapshotting, and full NoCloud/ConfigDrive Cloud-Init injection, SCP provides bare-metal-style control over virtualized instances. This practitioner guide covers QEMU/KVM machine architecture (pc-q35 vs pc-i440fx, host-passthrough), production Cloud-Init (user-data, network-config with routed /64 IPv6 via fe80::1, and execution stage debugging), edge firewall state tracking, application-consistent database snapshots via qemu-guest-agent, and programmatic REST API automation.

THREAD OP // AUTHOR Marcus Vance Principal Systems Architect
MOD VERIFIED // CO-MAINTAINER Elena Rostova Senior Network & Storage Verification Editor
THREAD STATUS // UPDATED Community Standards →
MODERATOR NOTE // TEST ENVIRONMENT & TRANSPARENCY All Cloud-Init Netplan configurations, IPv6 fe80::1 routing, QEMU guest-agent fsfreeze hooks, and OpenAPI v1 endpoints tested on live Netcup G12.5 KVM instances running Ubuntu 24.04 LTS and Debian 12.

PREREQUISITES // ENVIRONMENT REQUIREMENTS

CHECKLIST
  • ✓ Active Netcup Root Server or VPS managed via servercontrolpanel.de (SCP)
  • ✓ Ed25519 SSH keypair for zero-touch Cloud-Init injection
  • ✓ Optional: API credentials enabled in SCP User Profile for REST/OpenAPI automation

Key Takeaways

EXECUTIVE BRIEFING
  • 01 Multi-Payload Cloud-Init (user-data + network-config): SCP mounts a virtual NoCloud cidata ISO at first boot, allowing you to automate SSH hardening, wire up Netcup’s non-SLAAC routed /64 IPv6 subnet via link-local gateway fe80::1, and install qemu-guest-agent with zero manual VNC interaction.
  • 02 Hypervisor Edge Stateful Firewall vs Docker Bypass: SCP’s built-in Stateful Firewall enforces rules on the KVM host’s virtual switch port (tap interface) before packets ever reach your guest OS—preventing the common misconfiguration where Docker manipulates guest iptables PREROUTING/FORWARD chains to expose database ports.
  • 03 Application-Consistent CoW Snapshots via fsfreeze: Installing qemu-guest-agent and placing custom flush scripts in /etc/qemu/fsfreeze-hook.d/ ensures PostgreSQL/MySQL tablespaces and XFS/ext4 journals are quiesced to disk over /dev/virtio-ports/org.qemu.guest_agent.0 before SCP takes an online Copy-on-Write snapshot.
  • 04 Modern SCP REST API (OpenAPI v1) vs Legacy SOAP: Netcup’s modern SCP exposes a Swagger/OpenAPI v1 REST interface authenticated via Keycloak OAuth2 tokens (servercontrolpanel.de/scp-core/api/v1), replacing the legacy SOAP/WSDL webservice for server power, firewall, and image orchestration.
  • 05 QEMU Machine Topology & VirtIO Tuning: SCP lets you toggle machine firmware (OVMF UEFI vs SeaBIOS), configure CPU instruction passthrough (host-passthrough), switch storage bus drivers (virtio-scsi multiqueue vs virtio-blk), and boot directly into a network Rescue System or custom uploaded ISO.
📑 Quick Jump Table of Contents (5 Sections) ▼
§ 01

1. Inside Netcup SCP: QEMU/KVM Machine Types, CPU Passthrough, and VirtIO Multiqueue

Unlike simplified cloud portals that hide hypervisor internals behind opinionated wrappers, Netcup’s Server Control Panel (https://www.servercontrolpanel.de) exposes the underlying QEMU/KVM virtual machine configuration directly. Modern G12.5 instances instantiate on a PCIe-native QEMU machine model (pc-q35 topology rather than legacy pc-i440fx PCI bridges) with CPU mode set to host-passthrough, exposing the full host instruction set—including Zen 5 avx512f, avx512_vnni, avx512_bf16, aes-ni, and accurate L1/L2/L3 cache hierarchy descriptors—directly to the guest Linux kernel without translation overhead.

At provisioning time, SCP attaches a read-only virtual CD-ROM volume labeled cidata (/dev/sr0, ISO9660 filesystem) formatted for the Cloud-Init NoCloud datasource. This virtual media contains meta-data, user-data, and network-config payloads generated from the SCP UI or REST API. Under Server → Settings / General, administrators can inspect and tune three critical paravirtualized hardware buses prior to OS installation:

  • ▪ Disk Controller (virtio-scsi vs virtio-blk): Always keep virtio-scsi enabled for modern Linux kernels (Debian 12, Ubuntu 24.04, Rocky Linux 9, Proxmox VE). It supports native SCSI UNMAP / TRIM discard pass-through (fstrim.timer) and multiqueue I/O scaling (num_queues mapped across your dedicated EPYC cores).
  • ▪ Network Adapter (virtio-net with mq=on): Exposes paravirtualized 2.5 Gbit/s networking with vhost_net kernel acceleration, hardware TCP/UDP checksum offloading, and multi-queue RX/TX ring buffers that can be verified and scaled inside Linux via ethtool -l eth0 and ethtool -L eth0 combined 4.
  • ▪ Boot Firmware (OVMF UEFI vs SeaBIOS): Official Netcup Cloud-Init templates boot via OVMF UEFI with GUID Partition Tables (GPT). Only revert to Legacy SeaBIOS if booting specialized legacy BSD or older custom recovery ISOs.
§ 02

2. Zero-Touch Cloud-Init: Hardened user-data & Routed /64 IPv6 network-config

When provisioning a server under SCP → Media → Official Images, selecting any image marked with Cloud-Init unlocks the configuration editor. While Netcup automatically pre-fills basic network settings if left untouched, production deployments benefit from supplying explicit user-data and understanding how Netcup routes IPv4 and IPv6 traffic.

On Netcup’s network fabric, your primary IPv4 address typically sits on a shared /22 subnet (e.g., 255.255.252.0), while your dedicated /64 IPv6 block is statically routed through the link-local gateway fe80::1 (Router Advertisements / SLAAC are intentionally disabled so you maintain deterministic addressing and reverse DNS control).

Below is our production user-data YAML alongside the exact Netplan v2 configuration (network-config) for binding your primary IPv4 and multiple deterministic IPv6 addresses on Ubuntu 24.04 LTS / Debian 12:

scp-cloud-init-user-data.yaml
yaml
#cloud-config
hostname: nc-prod-node01
fqdn: nc-prod-node01.example.com
manage_etc_hosts: true
timezone: UTC

package_update: true
package_upgrade: true
packages:
  - qemu-guest-agent
  - ufw
  - fail2ban
  - curl
  - jq
  - htop
  - iotop
  - unattended-upgrades

users:
  - name: opsadmin
    groups: [sudo, adm, systemd-journal]
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    lock_passwd: true
    ssh_authorized_keys:
      - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIReplaceWithYourActualEd25519PublicKey opsadmin@secops

ssh_pwauth: false
disable_root: true

write_files:
  - path: /etc/ssh/sshd_config.d/99-netcup-hardening.conf
    permissions: '0600'
    content: |
      PermitRootLogin no
      PasswordAuthentication no
      KbdInteractiveAuthentication no
      X11Forwarding no
      MaxAuthTries 3
      AllowUsers opsadmin
  - path: /etc/sysctl.d/99-netcup-bbr.conf
    permissions: '0644'
    content: |
      net.core.default_qdisc = fq
      net.ipv4.tcp_congestion_control = bbr
      net.ipv4.tcp_fastopen = 3
      net.ipv6.conf.all.forwarding = 1

runcmd:
  - sysctl --system
  - systemctl enable --now qemu-guest-agent
  - systemctl enable --now fstrim.timer
  - systemctl restart ssh || systemctl restart sshd
  - ufw default deny incoming
  - ufw default allow outgoing
  - ufw allow 22/tcp comment 'SSH Admin'
  - ufw allow 80/tcp comment 'HTTP Ingress'
  - ufw allow 443/tcp comment 'HTTPS Ingress'
  - ufw allow 443/udp comment 'HTTP3 QUIC'
  - ufw --force enable
  - systemctl enable --now fail2ban

Command Explanation: This user-data manifest disables root login and password authentication, enables Google BBR TCP congestion control (fq + bbr) on the 2.5 Gbit/s uplink, enables qemu-guest-agent for SCP hypervisor communication, schedules weekly NVMe TRIM (fstrim.timer), and locks down host ports.

SECURITY NOTE: Triple-check that your ssh-ed25519 public key is valid before clicking Provision in SCP; password login is completely disabled from second zero.

etc-netplan-50-cloud-init.yaml
yaml
# Netcup Static IPv4 (/22) + Routed /64 IPv6 via Link-Local fe80::1 Gateway
network:
  version: 2
  ethernets:
    eth0:
      match:
        macaddress: "aa:bb:cc:dd:ee:ff" # Shown in SCP -> Network tab
      set-name: eth0
      dhcp4: false
      dhcp6: false
      accept-ra: false
      addresses:
        - 152.53.xxx.xxx/22             # Replace with your IPv4 & CIDR prefix from SCP
        - 2a0a:4cc0:xxxx:xxxx::1/64     # Primary IPv6 address from your /64 block
        - 2a0a:4cc0:xxxx:xxxx::2/64     # Optional secondary IPv6 for outbound mail/proxies
      nameservers:
        addresses:
          - 46.38.225.230               # Netcup Anycast DNS 1
          - 46.38.252.230               # Netcup Anycast DNS 2
          - 2a03:4000:0:1::e1e6         # Netcup IPv6 DNS
      routes:
        - to: default
          via: 152.53.xxx.1             # Your IPv4 Gateway from SCP -> Network
        - to: "::/0"
          via: "fe80::1"                # Netcup Standard IPv6 Link-Local Gateway
          on-link: true

Command Explanation: Netcup routes your entire /64 IPv6 prefix (18,446,744,073,709,551,616 addresses) statically to your virtual NIC via the link-local router fe80::1. Setting accept-ra: false and defining the explicit fe80::1 default route ensures consistent dual-stack connectivity across reboots.

Cloud-Init Execution Stages (init-local to modules-final) & Debugging Failed Runs

When a Netcup official template boots for the first time, systemd orchestrates Cloud-Init across four sequential stages: (1) cloud-init-local.service (init-local) probes /dev/sr0 for the NoCloud cidata ISO label and writes /etc/netplan/50-cloud-init.yaml before networking starts; (2) cloud-init.service (init-network) brings up eth0 with your static IPv4 and fe80::1 IPv6 routes, resizes the root partition (growpart + resize2fs), and injects ssh_authorized_keys; (3) cloud-config.service (modules-config) writes /etc/ssh/sshd_config.d/ and /etc/sysctl.d/ files and configures APT repositories; and (4) cloud-final.service (modules-final) installs packages (qemu-guest-agent, ufw, fail2ban) and executes runcmd shell commands.

If your server is reachable over SSH but packages or runcmd rules have not finished applying, run sudo cloud-init status --long --wait to inspect the active stage and check whether any module returned a non-zero exit code. To diagnose syntax errors or failed package downloads, inspect sudo journalctl -u cloud-init-local -u cloud-init -u cloud-config -u cloud-final --no-pager alongside /var/log/cloud-init-output.log, and validate your YAML schema locally or on-host using sudo cloud-init schema --system.

§ 03

3. Designing Hypervisor Edge Stateful Firewall Policies (Solving the Docker Bypass)

One of the most valuable security upgrades in modern Netcup SCP is the Hypervisor Stateful Firewall (SCP → Network → Firewall).

On a standard Linux server running Docker or Kubernetes, publishing a container port with -p 5432:5432 inserts DNAT rules directly into the PREROUTING and DOCKER chains of iptables/nftables, bypassing ufw or firewalld INPUT rules and exposing your PostgreSQL or Redis container to external scanners.

Because the SCP Firewall operates outside your VM on the KVM host’s virtual switch port (tap device), packets blocked by your SCP Firewall policy are dropped at the hypervisor edge before they ever traverse the virtio-net ring buffer into your guest kernel. Even if a developer accidentally binds 0.0.0.0:6379 in docker-compose.yml, the SCP Edge Firewall drops external probes before they reach the VM.

Under the hood, the SCP Firewall maintains a stateful connection tracking (conntrack) table on the KVM host for each virtual interface. Outbound TCP, UDP, and ICMP flows initiated by your VM automatically permit return packets matching the ESTABLISHED,RELATED state without requiring explicit inbound open ports, though idle TCP connections without keepalives may age out if left silent across hypervisor state timeouts. For IPv6 (::/0), however, RFC 4861 Neighbor Discovery Protocol (NDP) operates via link-local multicast and unicast ICMPv6 packets (Types 135 Neighbor Solicitation and 136 Neighbor Advertisement) that are not tied to an outbound upper-layer flow—meaning explicit inbound ICMPv6 acceptance is required so the fe80::1 router can refresh your VM’s MAC-to-IPv6 neighbor binding.

Recommended Production SCP Edge Firewall Policy (Inbound / Ingress Ruleset)
Rule PriorityDirectionProtocolSource IP / CIDRDestination PortActionOperational Purpose
10INGRESS (In)ICMP / ICMPv60.0.0.0/0, ::/0All (Echo / PMTUD)ACCEPTMandatory for IPv6 Neighbor Discovery & Path MTU Discovery
20INGRESS (In)TCPAdmin VPN / Static IP (or 0.0.0.0/0)22 (or custom SSH port)ACCEPTSSH administrative access
30INGRESS (In)TCP0.0.0.0/0, ::/080, 443ACCEPTReverse Proxy HTTP/1.1 & HTTP/2 TLS termination
40INGRESS (In)UDP0.0.0.0/0, ::/0443ACCEPTHTTP/3 (QUIC) UDP transport
50INGRESS (In)UDPPeer Node IPs /3251820ACCEPTWireGuard Private Mesh VPN between Netcup nodes
999 (Default)INGRESS (In)ANY0.0.0.0/0, ::/01–65535DROPDrop all unmatched inbound traffic at hypervisor tap
Never Drop ICMPv6 Type 1/2/3/4/135/136 in SCP Firewall

Unlike IPv4, IPv6 relies on ICMPv6 for Neighbor Solicitation/Advertisement (replacing ARP) and Packet Too Big (Path MTU Discovery). Dropping all ICMPv6 at the SCP Firewall will cause your /64 IPv6 connectivity to drop after neighbor cache expiration (~30–60 seconds). Always keep ICMPv6 permitted.

§ 04

4. Application-Consistent Copy-on-Write (CoW) Snapshots with qemu-guest-agent

Netcup SCP supports both Offline Snapshots and Online (Live) Copy-on-Write Snapshots, as well as exporting any snapshot as a compressed raw disk image over HTTPS for off-site disaster recovery.

When you trigger an Online Snapshot in SCP while qemu-guest-agent is active inside your Linux guest, KVM sends a guest-fsfreeze-freeze QMP command over the /dev/virtio-ports/org.qemu.guest_agent.0 character device. The guest agent executes all scripts in /etc/qemu/fsfreeze-hook.d/ with the freeze argument, invokes the Linux kernel FIFREEZE ioctl to flush filesystem dirty pages to disk, captures the atomic CoW block pointer in under 500 milliseconds, and immediately issues guest-fsfreeze-thaw.

When designing custom /etc/qemu/fsfreeze-hook.d/ scripts, keep execution latency strictly below 3 to 5 seconds. While FIFREEZE is active, all write syscalls (write(), fsync(), open(..., O_CREAT)) across the frozen guest filesystems block in uninterruptible sleep (D state). If a custom hook script hangs—for example, waiting on a deadlocked database connection or an unresponsive network mount—the QEMU QMP guest-fsfreeze-freeze call will exceed the hypervisor timeout, causing SCP to either abort the quiesced freeze (falling back to a crash-consistent block snapshot) or require an explicit sudo fsfreeze --unfreeze / via the VNC console if the guest agent process was killed mid-freeze.

etc-qemu-fsfreeze-hook-postgres.sh
bash
#!/usr/bin/env bash
# Path: /etc/qemu/fsfreeze-hook.d/10-postgresql-checkpoint.sh
# Permissions: chmod 0755 /etc/qemu/fsfreeze-hook.d/10-postgresql-checkpoint.sh

set -euo pipefail

case "$1" in
  freeze)
    if systemctl is-active --quiet postgresql; then
      su - postgres -c "psql -U postgres -c 'CHECKPOINT;'" >/dev/null 2>&1 || true
      logger -t qemu-fsfreeze "PostgreSQL CHECKPOINT flushed prior to Netcup SCP CoW snapshot"
    fi
    ;;
  thaw)
    logger -t qemu-fsfreeze "Filesystem thawed after Netcup SCP CoW snapshot completion"
    ;;
esac

Command Explanation: Placing this executable hook inside /etc/qemu/fsfreeze-hook.d/ forces PostgreSQL to write a clean WAL checkpoint immediately before the kernel freezes the NVMe filesystem for an online SCP snapshot.

§ 05

5. Automating Server Lifecycle & Firewall Rules via the SCP OpenAPI (REST v1)

Netcup’s modern Server Control Panel exposes a full OpenAPI v1 REST interface (https://www.servercontrolpanel.de/scp-core/api/v1) secured by Keycloak OAuth2 OpenID Connect bearer tokens. You can explore the interactive Swagger UI directly at https://www.servercontrolpanel.de/scp-core/api/v1/swagger-ui/index.html.

Using the REST API, DevOps teams can query server telemetry, trigger graceful ACPI shutdowns, automate snapshot rotation before Ansible deployments, and programmatically update hypervisor firewall IP allowlists:

scp-rest-api-workflow.sh
bash
#!/usr/bin/env bash
# Authenticate against Netcup SCP Keycloak OIDC & Query Server UUIDs + Metrics
set -euo pipefail

SCP_TOKEN_URL="https://www.servercontrolpanel.de/realms/scp/protocol/openid-connect/token"
SCP_API_BASE="https://www.servercontrolpanel.de/scp-core/api/v1"

# 1. Exchange your SCP API credentials / refresh token for a short-lived Bearer Access Token:
ACCESS_TOKEN=$(curl -sS -X POST "$SCP_TOKEN_URL" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "client_id=scp" \
  -d "grant_type=refresh_token" \
  -d "refresh_token=${NETCUP_SCP_REFRESH_TOKEN}" | jq -r '.access_token')

# 2. List all Root Servers & VPS instances under your account:
curl -sS -X GET "${SCP_API_BASE}/servers" \
  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
  -H "Accept: application/json" | jq '.[] | {id: .id, name: .name, hostname: .hostname, status: .status}'

# 3. Create an Online Copy-on-Write Snapshot prior to maintenance:
SERVER_ID="123456"
curl -sS -X POST "${SCP_API_BASE}/servers/${SERVER_ID}/snapshots" \
  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{"name": "pre-upgrade-'$(date +%Y%m%d)'", "description": "Automated pre-Ansible CoW snapshot"}'

Command Explanation: Generate an offline refresh token in your SCP User Profile under the API tab, store it in your CI/CD secret vault (NETCUP_SCP_REFRESH_TOKEN), and use standard REST calls to orchestrate snapshots and power states.

SECURITY NOTE: Never hardcode SCP refresh tokens or CCP API keys in Git repositories. Store them in GitHub Actions Secrets, HashiCorp Vault, or SOPS-encrypted environment files.

Common Troubleshooting Scenarios

DIAGNOSTIC RUNBOOK

[SYMPTOM] IPv6 works for 30 seconds after boot and then stops responding externally

Root Cause: Either accept-ra overrode your static route, or your firewall (SCP Firewall or guest UFW/nftables) blocked ICMPv6 Neighbor Solicitation (Type 135) and Neighbor Advertisement (Type 136) packets.

Resolution: Ensure via: "fe80::1" with on-link: true is configured in /etc/netplan/50-cloud-init.yaml, and permit ICMPv6 inbound/outbound in both the SCP Edge Firewall and guest firewall.

[SYMPTOM] Cloud-Init user-data script did not execute on reinstall

Root Cause: You installed a standard template instead of an official "Cloud-Init" image, or there is a YAML indentation syntax error in your #cloud-config block.

Resolution: Mount the SCP VNC console or log in via Rescue System and inspect /var/log/cloud-init.log and /var/log/cloud-init-output.log to identify the exact YAML line error.

[SYMPTOM] Online snapshot warns that guest filesystem freeze failed

Root Cause: The qemu-guest-agent daemon is either not installed or not running inside your Linux VM.

Resolution: Run sudo apt update && sudo apt install -y qemu-guest-agent && sudo systemctl enable --now qemu-guest-agent inside your server so SCP can coordinate atomic FIFREEZE calls.

Frequently Asked Questions

VERIFIED Q&A

What is the difference between Netcup CCP and Netcup SCP?

The Customer Control Panel (CCP at customercontrolpanel.de) manages commercial operations: contracts, invoices, vouchers, domains, DNS zones, and cancellations. The Server Control Panel (SCP at servercontrolpanel.de) manages technical KVM hypervisor operations: power cycling, VNC console, Cloud-Init installations, ISO mounting, Edge Firewall policies, and disk snapshots.

Does taking a Snapshot in SCP count against my server’s NVMe disk space?

Yes. Netcup SCP uses Copy-on-Write (CoW) snapshots on the underlying storage pool. The available free space inside your server’s allocated storage pool must accommodate the delta blocks written while the snapshot remains active. For long-term retention, export the snapshot image to off-site backup storage and delete the local CoW snapshot.

Can I upload and boot my own custom ISO (e.g., Proxmox VE, NixOS, Talos Linux, FreeBSD)?

Yes. Under SCP → Media → Own ISOs, you can upload custom .iso images (or select from Netcup’s extensive library of community/BSD/virtualization ISOs), attach the ISO to the virtual DVD drive, change the boot order to DVD-first, and install via the HTML5 noVNC console.

Does the SCP Edge Firewall reduce my server’s CPU load during a port scan or flood?

Yes. Because SCP Firewall rules are evaluated on the KVM host hypervisor before packets enter your VM’s virtual network interface (virtio-net), dropped packets consume zero guest CPU interrupts or kernel conntrack table memory inside your VM.

How do I change the reverse DNS (rDNS / PTR) record for my server’s IPv4 and IPv6 addresses?

Navigate to SCP → Network (or CCP → Products → Server → IP Addresses) where you can set custom PTR hostnames for both your primary IPv4 address and any individual IPv6 address within your routed /64 block.

REFERENCES // VERIFIED TECHNICAL SOURCES

FURTHER READING // ARCHITECTURE AUDITS & GUIDES

Active Coupons →