Virtualmin is an open-source control panel designed for Linux and UNIX servers. It enables administrators to manage domains, email accounts, databases, DNS, and applications from a single interface. Supporting different web servers, databases, and mail systems, Virtualmin also offers monitoring and alerting tools to track server resources and website performance.
This guide demonstrates how to install Virtualmin on Ubuntu 22.04, configure a virtual host web application, and secure it using Let's Encrypt SSL certificates.
Prerequisites
- An Ubuntu 22.04 server.
- A configured A record for your domain that points to your server’s IP, e.g., virtualmin.example.com.
- SSH access as a non-root user with
sudoprivileges. - A fully updated server.
- A 2FA application such as Google Authenticator installed on your device.
Matching infrastructure at centron
Ubuntu servers without your own hardware: ccloud³ VMs with full root access from €3.12 per month, billed by the hour and ready in seconds. Rent a cloud server →
Install Virtualmin
Since Virtualmin is not available in the default repositories of Ubuntu 22.04, you need to download and run the official installation script. Follow these steps:
Set the Server Hostname
Replace the example domain with your own:
$ sudo hostnamectl set-hostname virtualmin.example.comRun the Virtualmin Installation Script
The following command installs the open-source (GPL) edition of Virtualmin with a LAMP stack:
$ sudo sh -c "$(curl -fsSL https://software.virtualmin.com/gpl/scripts/virtualmin-install.sh)" -- --bundle LAMPConfirm the installation by entering Y. The setup may take 5–10 minutes to complete. When finished, you will see:
[SUCCESS] Installation Complete!
[SUCCESS] If there were no errors above, Virtualmin should be ready.
[SUCCESS] Access it at https://virtualmin.example.com:10000 (or https://192.0.2.1:10000).
Secure Virtualmin with Let's Encrypt
Follow these steps to configure Let's Encrypt SSL certificates and secure the Virtualmin interface.
Stop Apache Service
$ sudo systemctl stop apache2Install Certbot
Install the Let's Encrypt client to manage SSL certificates:
$ sudo apt install certbotRequest a New SSL Certificate
Replace the domain and email with your actual values:
$ sudo certbot certonly --standalone -d virtualmin.example.com -m virtualmin@example.com --agree-tosIf a certificate already exists, Certbot may prompt:
- Keep the existing certificate
- Renew and replace the certificate
Choose 1 to retain the current certificate. If no prompt appears, Certbot will issue a new certificate. Follow the on-screen instructions until you see a confirmation message.
Create a Certificate Bundle
Combine the certificate and private key, then configure Webmin to use it:
$ sudo cat /etc/letsencrypt/live/virtualmin.example.com/fullchain.pem /etc/letsencrypt/live/virtualmin.example.com/privkey.pem | sudo tee /etc/webmin/ssl.pemEdit miniserv.conf
sudo nano /etc/webmin/miniserv.confUpdate the following line:
keyfile=/etc/webmin/ssl.pemRestart Webmin
$ sudo systemctl restart webminCheck Webmin Service
$ sudo systemctl status webminYou should see an output similar to:
● webmin.service - Webmin server daemon
Loaded: loaded (/lib/systemd/system/webmin.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2025-04-29 08:53:57 UTC; 5s ago
Main PID: 58333 (miniserv.pl)
Tasks: 1 (limit: 9385)
Memory: 88.0M
CGroup: /system.slice/webmin.service
└─58333 /usr/bin/perl /usr/share/webmin/miniserv.pl /etc/webmin/miniserv.conf
Restart Apache
$ sudo systemctl start apache2Check Apache Service
$ sudo systemctl status apache2The output should look like this:
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2025-04-29 08:56:30 UTC; 4s ago
Docs: https://httpd.apache.org/docs/2.4/
Main PID: 58415 (apache2)
Tasks: 106 (limit: 9385)
Memory: 11.2M
CGroup: /system.slice/apache2.service
├─58415 /usr/sbin/apache2 -k start
├─58416 /usr/sbin/apache2 -k start
├─58417 /usr/sbin/apache2 -k start
└─58418 /usr/sbin/apache2 -k start
Set Up Firewall Rules
Virtualmin relies on the firewalld utility to manage firewall settings. Follow the steps below to allow the required ports and services for Virtualmin.
Check firewalld Service
Verify that the firewall service is running:
$ sudo systemctl status firewalldExpected output:
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2025-04-06 05:53:56 UTC; 1h 20min ago
Docs: man:firewalld(1)
Main PID: 46542 (firewalld)
Tasks: 2 (limit: 9415)
Memory: 25.8M
CGroup: /system.slice/firewalld.service
└─46542 /usr/bin/python3 /usr/sbin/firewalld --nofork --nopid
List Allowed Ports
$ sudo firewall-cmd --zone=public --list-portsSample output:
20/tcp 2222/tcp 10000-10100/tcp 20000/tcp 49152-65535/tcp
List Allowed Services
$ sudo firewall-cmd --zone=public --list-servicesSample output:
dhcpv6-client dns dns-over-tls ftp http https imap imaps mdns pop3 pop3s smtp smtp-submission smtps ssh
Access Virtualmin
Virtualmin operates on TCP port 10000 by default. Follow these steps to access the interface and create a new virtual server:
- Open your browser and go to: https://virtualmin.example.com:10000
- Log in using your
sudouser credentials. - Click Next in the Post-Installation Wizard to complete initial configuration.
- Click Dashboard in the left menu to access the system performance overview.
Enable 2-Factor Authentication
To strengthen security, enable 2FA in Virtualmin with Google Authenticator:
- In the left navigation bar, scroll down and click your username.
- Expand the Security and limits options section.
- Click Enable Two-Factor For User.
- Click Enroll For Two-Factor Authentication.
- Scan the QR code with your authenticator app.
- Log out from Virtualmin via the left menu.
- Log back in using your non-root user credentials.
- Enter the token generated by your app to verify login.
Configuring Virtualmin with the Web Interface
When logging back in, Virtualmin will request a 2FA token. Enter the code from your authenticator app and click Verify to access the web administration interface.
Conclusion
In this tutorial, you installed Virtualmin, set up a website with HTTPS using Let's Encrypt, and enabled two-factor authentication. You also configured firewall rules and restricted unnecessary ports. For more information, refer to the official Virtualmin documentation.
Testen Sie Ihr Setup auf ccloud³
Registrieren Sie sich in der ccloud³ und erhalten Sie 200 € Startguthaben für Ihr Projekt – z. B. für eine PostgreSQL-VM mit automatischen Backups.