pfSense Commands
Prerequisites
Load secrets before using pfSense commands:
eval "$(dsource d000 dev/network)"
export PFSENSE_HOST="10.50.1.1"
export PFSENSE_API_SECRET="$PFSENSE_HQ_01_API_SECRET"
Required environment variables:
| Variable | Description |
|---|---|
|
pfSense hostname or IP (preferred) |
|
pfSense IP (fallback, deprecated) |
|
API secret key |
DNS Resolver Operations
The dns subcommand manages DNS host overrides in the Unbound resolver.
dns add
Add a DNS host override:
# Add with auto-apply
netapi pfsense dns add -h nas-01 -d inside.domusdigitalis.dev -i 10.50.1.50
# Add with description
netapi pfsense dns add -h printer-01 -d inside.domusdigitalis.dev -i 10.50.1.100 --descr "Office Printer"
# Add without auto-apply (batch changes)
netapi pfsense dns add -h test-01 -d lab.local -i 10.50.2.10 --no-apply
Options:
| Option | Required | Description |
|---|---|---|
|
Yes |
Hostname (e.g., nas-01) |
|
Yes |
Domain (e.g., inside.domusdigitalis.dev) |
|
Yes |
IP address |
|
No |
Description |
|
No |
Apply immediately (default: true) |
dns update
Update an existing DNS host override:
# Update IP address
netapi pfsense dns update --id 5 -h nas-01 -d inside.domusdigitalis.dev -i 10.50.1.51
# Update with new description
netapi pfsense dns update --id 5 -h nas-01 -d inside.domusdigitalis.dev -i 10.50.1.51 --descr "New NAS"
Options:
| Option | Required | Description |
|---|---|---|
|
Yes |
Override ID to update |
|
Yes |
Hostname |
|
Yes |
Domain |
|
Yes |
New IP address |
|
No |
Description |
|
No |
Apply immediately (default: true) |
DNS Domain Overrides
Domain overrides forward entire domain queries to a specific DNS server. Unlike host overrides (individual A records), domain overrides delegate resolution of an entire zone.
dns domain list
List all DNS domain overrides:
netapi pfsense dns domain list
DNS Domain Overrides ┏━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┓ ┃ ID ┃ Domain ┃ IP ┃ Description ┃ ┡━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━┩ │ 0 │ inside.domusdigitalis.dev │ 10.50.1.90 │ BIND DNS (bind-01) │ └────┴───────────────────────────┴────────────┴────────────────────┘
dns domain add
Add a DNS domain override:
# Forward internal domain to BIND server
netapi pfsense dns domain add -d inside.domusdigitalis.dev -i 10.50.1.90 --descr "BIND DNS (bind-01)"
# Forward lab domain to lab DNS
netapi pfsense dns domain add -d lab.local -i 192.168.100.10 --descr "Lab DNS"
Options:
| Option | Required | Description |
|---|---|---|
|
Yes |
Domain to forward (e.g., inside.domusdigitalis.dev) |
|
Yes |
DNS server IP to forward queries to |
|
No |
Description |
|
No |
TLS hostname for DNS-over-TLS |
|
No |
Enable forward TLS upstream |
dns domain delete
Delete a DNS domain override:
netapi pfsense dns domain delete --id 0
Options:
| Option | Required | Description |
|---|---|---|
|
Yes |
Domain override ID to delete |
Use Case: BIND Authoritative DNS
Forward all queries for your internal domain to a BIND server:
# Load credentials
export PFSENSE_HOST="10.50.1.1"
export PFSENSE_API_SECRET="$PFSENSE_HQ_01_API_SECRET"
# Configure domain override
netapi pfsense dns domain add -d inside.domusdigitalis.dev -i 10.50.1.90 --descr "BIND DNS (bind-01)"
# Verify
dig @10.50.1.1 bind-01.inside.domusdigitalis.dev +short
This configures pfSense to forward all inside.domusdigitalis.dev queries to the BIND server at 10.50.1.90.
Certificate Operations
The cert subcommand manages SSL/TLS certificates.
cert set-webgui
Set the WebGUI certificate via SSH:
# Set certificate by refid
netapi pfsense cert set-webgui -r 62a1b2c3d4e5f
# Use specific SSH alias
netapi pfsense cert set-webgui -r 62a1b2c3d4e5f -s pfsense-backup
# Skip webConfigurator restart
netapi pfsense cert set-webgui -r 62a1b2c3d4e5f --no-restart
| The REST API doesn’t support setting the WebGUI certificate, so this uses SSH to run PHP directly on pfSense. |
Options:
| Option | Required | Description |
|---|---|---|
|
Yes |
Certificate refid |
|
No |
pfSense SSH host alias (default: pfsense) |
|
No |
Restart webConfigurator (default: true) |
cert import-from-certmgr
Import certificate from vault-01 to pfSense:
# Import default domain certificate
netapi pfsense cert import-from-certmgr
# Import specific domain
netapi pfsense cert import-from-certmgr -D guest.domusdigitalis.dev
# Import without setting as WebGUI cert
netapi pfsense cert import-from-certmgr --no-webgui
# Custom certmgr host
netapi pfsense cert import-from-certmgr -c 10.50.1.60 --certmgr-user ansible
This command:
-
Fetches certificate from vault-01 via SSH
-
Imports via pfSense REST API
-
Sets as WebGUI certificate via SSH (if
--webguienabled)
Options:
| Option | Required | Description |
|---|---|---|
|
No |
certmgr host (default: 10.50.1.60) |
|
No |
certmgr SSH user (default: ansible) |
|
No |
Certificate domain (default: guest.domusdigitalis.dev) |
|
No |
Certificate description (default: LetsEncrypt) |
|
No |
Set as WebGUI certificate (default: true) |
|
No |
pfSense SSH host alias (default: pfsense) |
Validation Loop
Quick validation of all pfSense commands:
for cmd in info interfaces arp leases; do
echo "=== pfsense $cmd ==="
uv run netapi pfsense $cmd 2>&1 | head -20
echo
done
echo "=== pfsense dns list ==="
uv run netapi pfsense dns list 2>&1 | head -20
echo
echo "=== pfsense cert list ==="
uv run netapi pfsense cert list 2>&1 | head -20