IXP Manager
Overview
This guide covers the deployment and configuration of IXP Manager 7.3.1 on Ubuntu 24.04 on Azure using SecureAnyCloud Azure Marketplace images. IXP Manager is the open source platform that operates an Internet Exchange Point, developed by INEX and in production at over 250 exchanges worldwide.
It manages members and their peering ports, IXP LAN and VLAN addressing, patch panels and colocated equipment. It generates route server, route collector and switch configuration, builds IRRDB-based prefix and AS path filters, publishes peering matrices and peer-to-peer traffic statistics, exports the IX-F member list, and gives every member a self service portal for their own ports, sessions and graphs.
The image installs the pinned upstream release tag v7.3.1 from the official IXP Manager repository, following the procedure in the project's own Ubuntu 24.04 installer. The full stack is wired together at build time and the database schema is migrated and seeded, so the first page you reach is a working sign-in rather than an installer.
No baked login credential. Nothing usable ships in the image. On first boot ixp-manager-firstboot.service generates a fresh Laravel application key, a fresh MySQL password and a fresh superuser password, all unique to your VM, and writes them to /root/ixp-manager-credentials.txt (mode 0600, root only). The build-time secrets are overwritten with random values that are generated, used once, and discarded, so no image and no person holds a working credential for your machine.
Two-factor authentication is compulsory. IXP Manager enforces 2FA on superuser accounts. Your first sign-in requires you to enrol an authenticator app before anything else renders. No 2FA enrolment ships in the image, so the second factor is genuinely yours alone (see Step 5).
Only the web tier is reachable. MySQL is bound to 127.0.0.1 and memcached to the loopback only, so the database and cache are never exposed off box. Apache refuses to serve the .env file that holds your secrets.
A sample IXP identity you replace. So the application is immediately functional, the image ships a clearly marked sample identity (shortname EXAMPLE, ASN 65535, which is a reserved ASN and deliberately not a real exchange's). Step 8 walks you through replacing it with your own.
What you get:
- IXP Manager 7.3.1 (pinned upstream release tag), a Laravel 12 application.
- Apache 2.4, PHP 8.4, MySQL 8.0 and memcached, configured and enabled.
- A database schema migrated and seeded with the upstream reference data (router vendors, IRRDB sources, contact groups).
- Per-VM secret generation on first boot for the application key, database password and superuser password.
- Compulsory two-factor authentication on the superuser account, with no enrolment baked into the image.
- The upstream task scheduler cron entry, installed and running.
- Unattended security upgrades, left enabled.
Prerequisites
Before you deploy, make sure you have:
- An active Azure subscription, an SSH public key, and a virtual network and subnet in the target region.
- A subscription to the IXP Manager listing on Azure Marketplace.
- Network Security Group rules allowing TCP 22 for administration and TCP 80 for the web portal, both restricted to your own management network.
- An authenticator app (any TOTP app, such as Google Authenticator, 1Password or Aegis) to complete the compulsory 2FA enrolment at first sign-in.
- Recommended virtual machine size:
Standard_B2ms(2 vCPU, 8 GB RAM) for a production exchange. Larger exchanges collecting sflow and generating many route server configurations should useStandard_D2s_v5or larger.
Deploy from the Azure Portal
Search for IXP Manager in Marketplace, select the SecureAnyCloud publisher, and click Create. Configure the Network Security Group to allow TCP 22 and TCP 80 from your management network only.
Do not expose the portal to the whole internet until you have completed Step 9 and put TLS in front of it.
Deploy from the Azure CLI
Accept the Marketplace terms once, then create the virtual machine:
RG="ixp-prod"; LOCATION="eastus"; VM_NAME="ixp-manager" IMAGE_URN="sac1647283583153:ixp-manager-ubuntu-24-04:default:latest" SSH_KEY="$(cat ~/.ssh/id_rsa.pub)" az group create --name "$RG" --location "$LOCATION"
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:ixp-manager-ubuntu-24-04:default:latest
az vm create \
--resource-group "$RG" --name "$VM_NAME" \
--image "$IMAGE_URN" \
--size Standard_B2ms \
--admin-username azureuser \
--ssh-key-values "$SSH_KEY" \
--public-ip-sku StandardFirst boot
On the first boot, the VM generates every secret it needs. ixp-manager-firstboot.service runs once, before Apache starts serving, and does the following:
- Rotates the MySQL password and rewrites
.envin lock step. - Resolves the VM's reachable address from Azure IMDS and sets
APP_URL. - Generates a fresh Laravel
APP_KEYand rebuilds the configuration cache. - Rotates the superuser password.
- Writes everything to
/root/ixp-manager-credentials.txtand drops a sentinel so it never runs again.
Wait about thirty seconds after the VM reports running, then confirm the whole stack is up.
Confirm the stack is running
Check that every service is active:
systemctl is-active apache2.service mysql.service memcached.service ixp-manager-firstboot.serviceAll four report active. ixp-manager-firstboot.service is a oneshot unit with RemainAfterExit=yes, so active means it completed successfully.
Confirm the component versions and that the sign-in page is being served:
php -v | head -1 sudo mysql -N -B -e 'SELECT VERSION();'
sudo php /srv/ixpmanager/artisan --version curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://127.0.0.1/loginRead your per-VM credentials. This file is mode 0600 and readable only by root:
sudo cat /root/ixp-manager-credentials.txtIXP Manager signs in by username, not by email address. The username is admin. The password is the ixpmanager.admin.pass value above, and it is unique to your VM.
First sign in and compulsory 2FA enrolment
Browse to http://<vm-ip>/ and sign in with the username and password from Step 4.
Because IXP Manager enforces two-factor authentication for superusers, the first thing you see after signing in is the 2FA enrolment page, and nothing else renders until you complete it. Scan the QR code with your authenticator app, enter the six-digit code it shows plus your password, and click Enable 2FA.
No 2FA enrolment is baked into the image, so the secret behind that QR code is generated on your VM and known only to you. Store your authenticator recovery method safely, because with 2FA enforced, losing it means losing portal access.
Once you are enrolled, you land on the IXP Manager dashboard.
The aggregate traffic graphs are marked DUMMY. These are IXP Manager's built-in sample graphs. Real graphs appear once you point the statistics backend at your own switches, which is outside the scope of a single VM image.
Review the seeded reference data
The build migrates the schema and seeds the upstream reference data, so the application is populated and usable straight away. Count the seeded rows:
sudo mysql -t ixpmanager -e "SELECT 'infrastructure' AS entity, COUNT(*) AS rows_ FROM infrastructure UNION ALL SELECT 'members (cust)', COUNT(*) FROM cust UNION ALL SELECT 'router vendors', COUNT(*) FROM vendor UNION ALL SELECT 'IRRDB sources', COUNT(*) FROM irrdbconfig UNION ALL SELECT 'contact groups', COUNT(*) FROM contact_group UNION ALL SELECT 'users', COUNT(*) FROM user;" ss -tln | grep -E ':(80|3306|11211)\s'Note that MySQL and memcached listen on the loopback only. Only Apache on port 80 is reachable from off the VM.
The sample member is visible in the portal under Members:
Explore the exchange management features
The Infrastructures page defines the physical and logical exchange fabrics your members connect to:
VLANs carry the IXP peering LANs, each with its IPv4 and IPv6 addressing that IXP Manager allocates to member ports:
The peering matrix is the view members use to see who peers with whom across the exchange:
Replace the sample IXP identity with your own
The image ships a sample identity so the portal works immediately. Replace it with your exchange's real details in .env. First, view the current values:
sudo grep -E '^IDENTITY_|^APP_NAME' /srv/ixpmanager/.envEdit the values (site name, legal name, city, country, support and billing contacts, and corporate URL). Then rebuild the configuration cache and reload Apache so the change takes effect:
sudo php /srv/ixpmanager/artisan config:cache
sudo systemctl reload apache2The exchange entity itself, its ASN and its infrastructures are managed in the portal under IXP Admin Actions, not in .env. Update the seeded EXAMPLE infrastructure and the sample member to match your exchange, or delete them once you have created your own.
Put TLS in front of the portal
The image serves plain HTTP on port 80 so it works the moment it boots. IXP Manager handles member data and superuser sessions, so put TLS in front of it before you expose it beyond your management network.
Point a DNS name at the VM, then obtain a certificate and let the client update the Apache virtual host:
sudo apt-get install -y certbot python3-certbot-apache
sudo certbot --apache -d ixp.your-domain.exampleThen set APP_URL in /srv/ixpmanager/.env to the https:// name, run sudo php /srv/ixpmanager/artisan config:cache, and reload Apache. Restrict the Network Security Group so that ports 80 and 443 are reachable only from the networks that need the portal.
The task scheduler
IXP Manager runs its periodic work through the Laravel scheduler, which the image installs as a system cron entry:
cat /etc/cron.d/ixpmanagerThis entry runs artisan schedule:run every minute as www-data, which is what upstream requires. Leave it in place.
Administration and upgrades
Run any IXP Manager or Laravel command through artisan:
sudo php /srv/ixpmanager/artisan list --raw | grep '^ixp-manager:'The application lives in /srv/ixpmanager, its configuration in /srv/ixpmanager/.env, and its logs in /srv/ixpmanager/storage/logs. Back up both the ixpmanager database and the .env file, because the APP_KEY in .env is required to read anything the application has encrypted.
Operating system and Apache, PHP and MySQL packages continue to receive security updates through unattended upgrades. IXP Manager itself is pinned to the release this image shipped; follow the upstream release notes when you choose to move to a newer version.
Security recommendations
- Keep 2FA enrolled on every superuser account. IXP Manager enforces it, so do not disable the enforcement setting.
- Restrict the Network Security Group so TCP 22 and TCP 80/443 are reachable only from your management networks, and put TLS in front of the portal before wider exposure (Step 9).
- Treat
/root/ixp-manager-credentials.txtas a one-time handover. Record the values in your password manager, then remove the file. - Change the superuser password from the generated one after first sign-in, under My Account, and create named accounts for each operator rather than sharing
admin. - Leave MySQL and memcached bound to the loopback. Nothing outside the VM needs to reach them.
- Back up the
ixpmanagerdatabase and/srv/ixpmanager/.envtogether, and store the backups encrypted.
Support and licensing
IXP Manager is free and open source software, published by INEX under the GNU General Public License version 2.0. The licence text ships with the application at /srv/ixpmanager/LICENSE. Upstream project documentation is at docs.ixpmanager.org.
This image is built and maintained by SecureAnyCloud. Support for the image, including deployment questions and security updates, is available 24/7 through the support channel listed on the Azure Marketplace offer page.
Deploy on Azure
Launch IXP Manager 7.3.1 on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Overview
IXP Manager is the open source platform that operates an Internet Exchange Point. Developed by INEX and in production at over 250 exchanges worldwide, it is the system exchange operators use to run the day-to-day business of peering: onboarding members, allocating ports and addresses, generating device configuration from a single source of truth, and publishing the statistics members care about.
It manages members and their peering ports, the IXP LAN and its VLAN addressing, switches, patch panels and colocated equipment. From that one database it generates route server, route collector and switch configuration, builds IRRDB-based prefix and AS path filters from RIPE, RADB and the other registries, publishes peering matrices and peer-to-peer traffic statistics, exports the IX-F member list that peering databases consume, and gives every member a self service portal.
The SecureAnyCloud image delivers IXP Manager 7.3.1 on a full stack that is already wired together: Apache 2.4 with PHP 8.4, MySQL 8.0 as the database and memcached as the cache. The schema is migrated and seeded with the upstream reference data at build time and a sample exchange identity is in place, so the first page you reach is a working sign-in rather than an installer. Backed by 24/7 SecureAnyCloud support.
What you get:
- IXP Manager 7.3.1 (GPL-2.0, inex/IXP-Manager) at
/srv/ixpmanager, installed from the pinned upstream release tarball. - Apache 2.4 with
mod_rewriteandmod_headers, serving the Laravel front controller from/srv/ixpmanager/public. - PHP 8.4 from the upstream supported
ondrej/phpPPA (IXP Manager v7 requires PHP^8.4), with OPcache and theintl,bcmath,snmp,rrd,ds,yaml,memcached,gdandzipextensions. - MySQL 8.0 and memcached, both bound to the loopback interface only.
composer,rrdtool,bgpq3and the SNMP tooling IXP Manager uses for graphing and switch polling.- The upstream scheduler cron entry, so
artisan schedule:runruns from first boot. - The upstream reference data already seeded: IRRDB sources, switch vendors and contact groups.
- Two dedicated EBS data volumes: the MySQL datadir at
/var/lib/mysqland the application tier at/srv/ixpmanager, each independently resizable and mounted by filesystem UUID. - Per-instance Laravel application key, database password, MySQL maintenance password and administrator password, all generated on first boot into a root-only file. No shared or default credential ships in the image.
- 24/7 SecureAnyCloud support.
Connecting to your instance
Connect over SSH on port 22 using the private key for the key pair you selected at launch. The login user depends on the operating system variant you launched.
For the Ubuntu 24.04 variant, the SSH login user is ubuntu.
ssh -i /path/to/your-key.pem ubuntu@<instance-public-ip>Prerequisites
Before you launch, make sure you have:
- An AWS account subscribed to the IXP Manager listing on AWS Marketplace.
- An EC2 key pair in the region you are launching into.
- A security group allowing inbound TCP 22 from your administrative address range, and inbound TCP 80 (and 443 once you terminate TLS) from the networks that need to reach the portal.
m5.largeor larger is recommended. IXP Manager is a PHP application with a MySQL database and a graph renderer, so it benefits from real memory rather than burstable credit.
Launching the instance
From the AWS Marketplace listing, choose Continue to Subscribe, then Continue to Configuration. Pick your region and the Ubuntu 24.04 delivery option, then choose Continue to Launch. Select your instance type, key pair, subnet and security group, and launch.
To launch the same AMI from the EC2 CLI instead, substitute your own AMI id, key pair, security group and subnet:
aws ec2 run-instances \
--image-id <ami-id> \
--instance-type m5.large \
--key-name your-key-pair \
--security-group-ids sg-your-security-group \
--subnet-id subnet-your-subnet \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=ixp-manager}]'First boot
On its first boot the instance runs ixp-manager-firstboot.service, a oneshot systemd unit that does the following:
- Generates a fresh MySQL application password and rewrites
/srv/ixpmanager/.envin lock step with theALTER USER, then proves the new credential authenticates with a real query. - Generates a fresh MySQL maintenance password for the
debian-sys-maintaccount and rewrites/etc/mysql/debian.cnf, so no baked maintenance credential is shared between instances. - Resolves the instance address from EC2 IMDSv2 and writes it to
APP_URL. - Generates a fresh Laravel
APP_KEYand rebuilds the configuration cache. - Generates a fresh administrator password, stores it as a bcrypt hash, and writes every credential to
/root/ixp-manager-credentials.txtwith mode0600.
First boot normally completes within a minute of the instance reaching the running state. Confirm that the stack is up and check the shipped version:
systemctl is-active apache2.service mysql.service memcached.service php -v | head -1 grep APPLICATION_VERSION /srv/ixpmanager/version.phpactive active active PHP 8.4.23 (cli) (built: Jul 2 2026 18:44:08) (NTS) define( 'APPLICATION_VERSION', '7.3.1' );The portal answers on port 80:
curl -s -o /dev/null -w 'IXP Manager sign-in page: HTTP %{http_code}\n' http://127.0.0.1/loginIXP Manager sign-in page: HTTP 200Retrieving your credentials
Every credential is unique to your instance and is written to a root-only file. The sign-in URL and the administrator username are:
sudo grep -E '^ixpmanager\.(url|admin\.user)=' /root/ixp-manager-credentials.txtixpmanager.url=http://52.207.238.179/ ixpmanager.admin.user=adminThe password is in the same file. Read it on your own instance when you need it, and do not copy it anywhere it can be logged:
sudo grep '^ixpmanager.admin.pass=' /root/ixp-manager-credentials.txt | cut -d= -f2-IXP Manager signs in by USERNAME, not by email address. The account above is a superuser.
Signing in
Browse to http://<instance-public-ip>/ and sign in with the username and password from the credentials file.
The compulsory two-factor enrolment
IXP Manager makes two-factor authentication compulsory for superuser accounts, so your very first sign-in lands on Security / Two Factor Authentication rather than the dashboard. This is deliberate, and it is a feature, not a fault: no 2FA enrolment is baked into the image, so the second factor you enrol is generated on your own instance and belongs to you alone.
Scan the barcode with any Google Authenticator compatible app (the HOTP and TOTP algorithms of RFC 4226 and RFC 6238 are both supported), then enter the six-digit code together with your account password to enable it. Store the recovery detail somewhere safe, because with 2FA compulsory, losing the authenticator means losing administrator access to the portal.
Once you are enrolled, you land on the dashboard, which shows member counts and the aggregate exchange traffic graphs.
What ships already configured
The image ships a sample exchange so every screen is populated while you replace it with your own. The members list carries one internal infrastructure member on AS65535:
Opening it shows the full member record: peering policy, IRRDB filtering state, NOC contact details and prefix limits.
The upstream reference data is already seeded, so IRRDB filter generation and switch modelling work without any further setup:
An infrastructure groups the switches that form a peering LAN:
You can confirm the seeded data from the shell:
sudo mysql -N -B -e "SELECT 'irrdb sources', COUNT(*) FROM ixpmanager.irrdbconfig UNION ALL SELECT 'switch vendors', COUNT(*) FROM ixpmanager.vendor UNION ALL SELECT 'infrastructures', COUNT(*) FROM ixpmanager.infrastructure UNION ALL SELECT 'members', COUNT(*) FROM ixpmanager.cust;"irrdb sources 13 switch vendors 18 infrastructures 1 members 1Replacing the sample identity with your own exchange
The shipped identity is a sample: shortname EXAMPLE, legal name Example Internet Exchange Point, ASN 65535 (a reserved 16-bit ASN, deliberately not a real exchange's). Replace it before you put the portal in front of members.
The branding, contact and support details live in the IDENTITY_ block of the environment file:
sudo grep -E '^IDENTITY_(LEGALNAME|CITY|COUNTRY|SUPPORT_EMAIL)=' /srv/ixpmanager/.envIDENTITY_LEGALNAME="Example Internet Exchange Point" IDENTITY_CITY="Example City" IDENTITY_COUNTRY=IE IDENTITY_SUPPORT_EMAIL="support@example.com"Edit them, then rebuild the configuration cache and reload Apache:
sudo nano /srv/ixpmanager/.env
sudo php /srv/ixpmanager/artisan config:cache
sudo systemctl reload apache2The exchange record itself, including shortname, ASN, IX-F ID and PeeringDB ID, is edited in the web interface under Infrastructures, and your real switches, VLANs, IP address ranges and members are added under the corresponding IXP Admin Actions entries in the left-hand menu. Upstream documentation for each of those areas is at docs.ixpmanager.org.
Storage layout
The database tier and the application tier each sit on their own EBS volume, mounted by filesystem UUID, so either can be resized or snapshotted independently of the operating system disk:
for mp in /var/lib/mysql /srv/ixpmanager; do printf '%-16s ' "$mp"; findmnt -no SOURCE,FSTYPE,SIZE,USED "$mp"; done/var/lib/mysql /dev/nvme1n1 ext4 19.5G 204.6M /srv/ixpmanager /dev/nvme2n1 ext4 19.5G 123.8MTo grow either tier, modify the EBS volume in the EC2 console, then run sudo resize2fs <device> on the instance. The nofail mount option means the instance still boots if a volume is ever detached.
Security notes
MySQL and memcached listen on the loopback interface only, so neither the database nor the cache is reachable from off the instance:
ss -tlnH | awk '{print $4}' | grep -E ':(3306|11211)$' | sort127.0.0.1:11211 127.0.0.1:3306 [::1]:11211The environment file holds your application key and database password, and Apache is configured to refuse to serve it:
CODE=$(curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1/.env) if [ "$CODE" = "200" ]; then echo "UNEXPECTED: the environment file is served over HTTP"; exit 1; else echo "refused (HTTP $CODE) - correct"; firefused (HTTP 403) - correctFurther recommendations:
- Restrict inbound SSH to your administrative address range rather than
0.0.0.0/0. - Put TLS in front of the portal before members use it (see below), because the sign-in form posts a password.
- Enable EBS encryption for data at rest.
- Keep the compulsory 2FA enrolment, and do not disable it.
- Take regular snapshots of the MySQL data volume, or
mysqldumptheixpmanagerschema to object storage.
Enabling HTTPS
The image is TLS ready but ships no certificate, because the certificate has to match your own hostname. There are two supported approaches.
AWS Certificate Manager with a load balancer. Put an Application Load Balancer in front of the instance, attach an ACM certificate for your exchange's hostname, and forward to the instance on port 80. This keeps certificate renewal inside AWS.
Let's Encrypt directly on the instance. Point a DNS record at the instance, open port 443 in the security group, then run:
sudo apt-get update
sudo apt-get install -y certbot python3-certbot-apache
sudo certbot --apache -d ixp.your-domain.exampleEither way, afterwards update APP_URL in /srv/ixpmanager/.env to the https:// form and run sudo php /srv/ixpmanager/artisan config:cache, so links the application generates use the correct scheme.
Scheduled tasks
IXP Manager's scheduled work, including IRRDB updates, statistics aggregation and IX-F export refresh, runs through the Laravel scheduler, installed as a cron entry:
cat /etc/cron.d/ixpmanager# IXP Manager scheduled tasks - sac AWS Marketplace AMI SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin * * * * * www-data /usr/bin/php /srv/ixpmanager/artisan schedule:run >/dev/null 2>&1Database maintenance
The debian-sys-maint maintenance account is re-minted per instance at first boot and its credential is written to /etc/mysql/debian.cnf, so routine MySQL maintenance works out of the box:
sudo mysql --defaults-file=/etc/mysql/debian.cnf -N -B -e "SELECT CONCAT('MySQL ', VERSION(), ' reachable via the per-instance maintenance credential');"MySQL 8.0.46-0ubuntu0.24.04.3 reachable via the per-instance maintenance credentialCommand line administration
Every IXP Manager maintenance command is an artisan command run from /srv/ixpmanager:
sudo php /srv/ixpmanager/artisan list
sudo php /srv/ixpmanager/artisan config:cache
sudo php /srv/ixpmanager/artisan cache:clearApplication logs are under /srv/ixpmanager/storage/logs, and the Apache access and error logs for the portal are /var/log/apache2/ixpmanager-access.log and /var/log/apache2/ixpmanager-error.log.
Upgrading
IXP Manager releases are published on the upstream releases page. Read the upstream upgrade notes for the target release before upgrading, take a snapshot of the MySQL data volume first, and follow the upstream procedure. SecureAnyCloud also publishes refreshed images as new upstream releases land, and 24/7 support can assist with in-place upgrades.
Licensing
IXP Manager is free and open source software published by INEX under the GNU General Public License version 2.0. There is no licence fee and no key to enter. The SecureAnyCloud charge covers packaging, security patching, image maintenance and support.
Support
24/7 support is included with this image. Email sales@secureanycloud.com for help with deployment, replacing the sample identity, route server and IRRDB filter configuration, TLS termination, performance tuning or MySQL administration. Upstream project documentation is at docs.ixpmanager.org.
Deploy on AWS
Launch IXP Manager with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com