Add multi-firewall dynamic targets (pfsense_connect, v1.1.0)

This commit is contained in:
root
2026-06-12 19:24:30 +00:00
parent ee6c626a80
commit 9fa6a0735f
19 changed files with 563 additions and 173 deletions

View File

@@ -4,7 +4,8 @@ Model Context Protocol server for [pfSense](https://www.pfsense.org/) firewall m
## Features
- **55+ tools** covering system status, interfaces, firewall rules, aliases, NAT, DHCP, diagnostics, routing, VPN (OpenVPN/IPsec/WireGuard), and DNS resolver
- **77+ tools** covering system status, interfaces, firewall rules, aliases, NAT, DHCP, diagnostics, routing, VPN (OpenVPN/IPsec/WireGuard), and DNS resolver
- **Multi-firewall**: connect to many pfSense boxes dynamically via `pfsense_connect(url, api_key)` — no static firewall in config required
- **Safety guardrails**: writes disabled by default, dry-run mode, WAN any/any rule blocking, required description prefix
- **Audit logging**: all mutations logged to JSONL
- **`apply` control**: write tools accept `apply=true` to apply immediately, or batch changes and call the apply tool
@@ -53,6 +54,8 @@ cp .env.example .env
### 3. Register with Hermes
No static firewall URL/key required — credentials are provided at runtime via `pfsense_connect`.
```yaml
mcp_servers:
pfsense:
@@ -60,13 +63,43 @@ mcp_servers:
timeout: 120
enabled: true
env:
PFSENSE_URL: "https://your-pfsense"
PFSENSE_API_KEY: "your-api-key"
PFSENSE_VERIFY_SSL: "false"
PFSENSE_ALLOW_WRITES: "false"
```
Then `hermes mcp test pfsense` and `hermes gateway restart`.
Then `hermes gateway restart`. Connect to a firewall in chat:
```text
pfsense_connect(url="https://10.77.50.1", api_key="...", name="branch-office")
pfsense_test_connection()
pfsense_list_firewall_rules()
```
### Multi-firewall workflow
```text
# Register firewalls (name optional — defaults from IP/hostname)
pfsense_connect("https://10.77.50.1", "key-a", name="hq")
pfsense_connect("https://10.77.60.1", "key-b", name="branch")
# List and switch
pfsense_list_targets()
pfsense_use_target("branch")
# Or pass target / inline credentials on any tool
pfsense_get_system_status(target="hq")
pfsense_get_gateway_status(url="https://10.77.60.1", api_key="key-b")
```
| Tool | Purpose |
|------|---------|
| `pfsense_connect` | Register + activate a firewall (url, api_key, name) |
| `pfsense_use_target` | Switch active firewall |
| `pfsense_list_targets` | List registered firewalls |
| `pfsense_get_active_target` | Show current active target |
| `pfsense_disconnect_target` | Remove a registered target |
Optional env defaults (`PFSENSE_URL`, `PFSENSE_API_KEY`) still work as a fallback when no target is connected.
### 4. Register with Cursor (`~/.cursor/mcp.json`)