Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - mlenje

#1
The Monitor IP doesn't need to be your VPN provider's internal DNS address specifically — it just needs to be *some* real host that actually responds to ICMP when routed through that particular tunnel. Mullvad's docs suggesting `10.64.0.1` is just a convenient, known-working example, not a requirement.

Since OPNsense won't let you reuse the same Monitor IP across multiple gateways, the simplest fix is to give each tunnel a different public target — for example:

- Gateway 1: `9.9.9.9` (Quad9)
- Gateway 2: `1.1.1.1` (Cloudflare)
- Gateway 3: `8.8.8.8` (Google)
- Gateway 4: `1.0.0.1` (Cloudflare secondary)

Any of these will work as long as it genuinely answers ping through that specific tunnel — don't just assume it does, confirm it (see below).

One thing worth double-checking based on some fairly extensive troubleshooting I went through recently with a similar multi-gateway WireGuard setup on ProtonVPN: **make sure it's actually the Monitor IP field throwing the duplicate error, and not the Gateway "IP Address" field** (the Far Gateway placeholder). Those are two separate fields on the same System Gateway config screen, and both need to be unique per gateway too — the placeholder "IP Address" also can't be reused across multiple WireGuard gateways on this same box. If you're getting a duplicate error on that field instead of (or in addition to) Monitor IP, you'll need a distinct placeholder value per tunnel as well (e.g. `10.64.1.1`, `10.64.2.1`, `10.64.3.1`, etc. — arbitrary, unused, just needs to be unique).

Also, whichever Monitor IP you land on per gateway, actually verify it before trusting it — this bit me hard on a recent project. Confirm with a packet capture that the ping genuinely traverses the tunnel interface (not silently falling through to WAN):

```
tcpdump -ni <tunnel-interface> icmp
```
while pinging the monitor IP sourced from that tunnel's local address in another window. If nothing shows up on the tunnel interface, the monitor IP isn't actually testing what you think it's testing — regardless of what the dashboard says.

Hope this helps.

I also recommend using Claude as you set it up to help answer questions and troubleshoot.
#2
If you're using a WireGuard client interface as a monitored gateway (for gateway groups, failover, or just health alerting) and your gateway status looks suspiciously *always healthy* — even during a real tunnel outage — check this first. It cost me a long debugging session, and the actual cause turned out to be a simple, easy-to-make configuration mismatch, not a bug.

## The trap

There are **two separate "Gateway" fields**, in two different places, that look related but aren't automatically kept in sync:

1. **VPN > WireGuard > Instances → your instance → "Gateway"** — a field on the WireGuard instance itself.
2. **System > Gateways > Configuration → your gateway object → "IP Address"** — the address you set when creating a monitored gateway for this interface, typically with Far Gateway checked and an arbitrary placeholder IP (since a WireGuard tunnel has no real on-link next-hop).

Nothing in the UI tells you these two need to be the **same address**. If you pick your own arbitrary placeholder for #2 without checking what's already in #1, you end up with two different "gateway" IPs for the same interface — and only the one from #1 actually gets a working route.

## The symptom

- `dpinger_status()` reports the gateway as healthy (`status => none`, `loss => 0.0%`) even when the tunnel is genuinely down.
- Packet capture on the tunnel interface shows *nothing* — your monitor traffic is silently falling through to your WAN default route instead of the tunnel (confirmed via `tcpdump` + checking source-NAT'd traffic on the WAN interface).
- The kernel routing table never gets a route for your Monitor IP via the tunnel, no matter how many times you reload services or reboot.
- No error appears in the general system log — the actual failure is logged in `/var/log/wireguard/latest.log`, not `/var/log/system/latest.log`, and reads something like:
  ```
  route: message indicates error: Invalid argument
  add host <monitor-ip>: gateway <your-placeholder-ip> fib 0: Invalid argument
  ```

## The fix

Check VPN > WireGuard > Instances → your instance → "Gateway" field. Whatever address is there, use **that exact address** as the "IP Address" in your System > Gateways configuration for this interface — don't invent your own placeholder.

In my case, the instance's Gateway field was `10.2.0.3`; I'd used `10.2.0.1` for the System Gateway object. Changing the System Gateway to `10.2.0.3` fixed it completely — no manual static routes needed, confirmed via packet capture that monitor traffic now genuinely traverses the tunnel, and `dpinger_status()` correctly reports real loss/downtime.

## Why this happens (briefly, for the curious)

OPNsense's interface-route-building logic (`system_interface_route()` in `system.inc`) checks whether *any* host route already exists on the device with a link-level gateway before attempting to add its own — but doesn't check whether that existing route is for the specific address it needs. WireGuard's own instance logic already creates a correct route for its own Gateway field; if your System Gateway uses a different address, that unrelated route satisfies the "something already exists" check and the actual route you need is silently never created.

Not a bug, technically — just a very easy trap to fall into, and one the UI doesn't warn you about. Worth checking if your WireGuard gateway monitoring has ever felt "too quiet."

**Update:** if you've fixed the Gateway-field mismatch described above and your gateway *still* seems to never detect a real outage, check one more thing before assuming something's still wrong: dpinger's advanced parameters need to be adjusted too, not just the IP Address.

When I built a second site, I matched the System Gateway's IP Address to the WireGuard instance's Gateway field correctly from the start — no leak, route table looked right — but disabling the peer still didn't flip the status to down within any reasonable time. Turned out the advanced settings on System > Gateways > Configuration (Probe Interval, Time Period, Loss Interval, Data Length, Packet Loss/Latency thresholds, and the **Failover States** checkbox) were left at looser defaults than my known-working gateway. With those loose enough, dpinger just hadn't gathered enough samples yet to trip the alarm — it looked exactly like the routing bug above, but was a completely separate, simpler issue.

**Fix:** when setting up a new WireGuard gateway for monitoring, adjust the *entire* advanced parameter set, not just IP Address / Far Gateway / Monitor IP. In my case, the values that worked for my setup were:

- Failover States: **checked**
- Latency Low/High Threshold: 200 / 500
- Packet Loss Low/High Threshold: 20 / 50
- Probe Interval: 2
- Time Period: *(left blank — uses default)*
- Loss Interval: 4
- Data Length: *(left blank — uses default)*

Notably, leaving Time Period and Data Length **blank** (rather than setting an explicit value) was part of what worked — an explicit value there was one of the things that made detection sluggish on the misconfigured gateway.

TL;DR: "gateway always shows healthy" has (at least) two independent causes — a routing mismatch (see above) and a detection-sensitivity mismatch (this). Worth ruling out both.
#3
26.7 Series / Can't find Speedtest
July 22, 2026, 02:40:24 AM
I use the os-speedtest-community plugin from mimugmail repository.  I am setting up a new firewall with v26.7, and I cannot find it in the plugins list.  It's alive and working on my older firewall that I upgraded to v26.7 with speedtest already installed.  Thoughts?
#5
Hi,

I was just wondering the loginc behind allowing Policy based white listing but not allowing Exempted VLANs & Networks in the Free Edition.  I would prefer to use the Exempted Network feature, if possible.

Thanks!
#6
26.1, 26,4 Series / Re: Did Monit Settings Change?
July 06, 2026, 07:28:23 PM
Ticket created.
#7
26.1, 26,4 Series / Re: Did Monit Settings Change?
July 05, 2026, 04:31:09 AM
Still persists with v26.1.11_6
#8
26.1, 26,4 Series / Re: Did Monit Settings Change?
July 05, 2026, 03:07:02 AM
I am on 26.1.11_5... will update to 26.1.11_6 and see if that helps.
#9
26.1, 26,4 Series / Did Monit Settings Change?
July 05, 2026, 12:36:23 AM
It was working perfectly, but now I am getting an error in the Alert Setting for the Mail Format free text field that says "Text may not contain spaces or tabs."

Monit 5.35.2 on OPNsense v26.1.11
#10
I migrated the rules this morning, and the process was surprisingly easy.  I took screenshots of all my exiting rules beforehand, followed the migration assistant making snapshot and downloading the configuration.  It went smoothly.  I was stressed for nothing!
#11
I just read that the 26.7 release is planned for July 15. Does that mean we need to migrate firewall rules before then?
#12
This time, when I clicked update from the WebGUI, the install/deinstall loop happened, but only for graphite2, not libdeflate.

Then I forced an update to the repositories using "pkg update -f"

I checked and graphite2 was not in the SunnyValley repository

Then I installed graphite2

root@firewall:~ # pkg install graphite2
Updating OPNsense repository catalogue...
OPNsense repository is up to date.
Updating SunnyValley repository catalogue...
Fetching meta.conf:  0%
Fetching data.pkg:  0%
SunnyValley repository is up to date.
Updating mimugmail repository catalogue...
Fetching meta.conf: 100%    179 B  0.2kB/s    00:01
mimugmail repository is up to date.
All repositories are up to date.
The following 1 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        graphite2: 1.3.14 [OPNsense]

Number of packages to be installed: 1

105 KiB to be downloaded.

Proceed with this action? [y/N]: y
[1/1] Fetching graphite2-1.3.14.pkg: 100%  105 KiB 107.1kB/s    00:01
Checking integrity... done (0 conflicting)
[1/1] Installing graphite2-1.3.14...
[1/1] Extracting graphite2-1.3.14: 100%

Then when I checked for updates on the WebUI, it said everything was up to date.
#13
Here is the output...

root@firewall:~ # opnsense-version
OPNsense 26.1.10 (amd64)

root@firewall:~ # pkg -d search -r SunnyValley opnsense
DBG(1)[78206]> PkgRepo: verifying update for SunnyValley
DBG(1)[78206]> Pkgrepo, begin update of '/var/db/pkg/repos/SunnyValley/db'
DBG(1)[78206]> (fetch) Request to fetch https://updates.zenarmor.net/opnsense/FreeBSD:14:amd64/26.1/86cd79bf-0b68-486c-b7a2-50f7df0f6a8b/meta.conf
DBG(1)[78206]> (fetch) Fetch: fetcher used: https
DBG(1)[78206]> (fetch) Request to fetch https://updates.zenarmor.net/opnsense/FreeBSD:14:amd64/26.1/86cd79bf-0b68-486c-b7a2-50f7df0f6a8b/data.pkg
DBG(1)[78206]> (fetch) Fetch: fetcher used: https

root@firewall:~ # pkg -d search -r OPNsense graphite2
DBG(1)[90247]> PkgRepo: verifying update for OPNsense
DBG(1)[90247]> Pkgrepo, begin update of '/var/db/pkg/repos/OPNsense/db'
DBG(1)[90247]> (fetch) Request to fetch https://pkg.opnsense.org/FreeBSD:14:amd64/26.1/latest/meta.conf
DBG(1)[90247]> (fetch) Fetch: fetcher used: https
DBG(1)[90247]> (fetch) Request to fetch https://pkg.opnsense.org/FreeBSD:14:amd64/26.1/latest/data.pkg
DBG(1)[90247]> (fetch) Fetch: fetcher used: https
graphite2-1.3.14              Rendering capabilities for complex non-Roman writing systems

root@firewall:~ # pkg -d search -r SunnyValley libdeflate
DBG(1)[24]> PkgRepo: verifying update for SunnyValley
DBG(1)[24]> Pkgrepo, begin update of '/var/db/pkg/repos/SunnyValley/db'
DBG(1)[24]> (fetch) Request to fetch https://updates.zenarmor.net/opnsense/FreeBSD:14:amd64/26.1/86cd79bf-0b68-486c-b7a2-50f7df0f6a8b/meta.conf
DBG(1)[24]> (fetch) Fetch: fetcher used: https
DBG(1)[24]> (fetch) Request to fetch https://updates.zenarmor.net/opnsense/FreeBSD:14:amd64/26.1/86cd79bf-0b68-486c-b7a2-50f7df0f6a8b/data.pkg
DBG(1)[24]> (fetch) Fetch: fetcher used: https
libdeflate-1.25                Fast, whole-buffer DEFLATE-based compression library

root@firewall:~ # pkg -d search -r OPNsense libdeflate
DBG(1)[76198]> PkgRepo: verifying update for OPNsense
DBG(1)[76198]> Pkgrepo, begin update of '/var/db/pkg/repos/OPNsense/db'
DBG(1)[76198]> (fetch) Request to fetch https://pkg.opnsense.org/FreeBSD:14:amd64/26.1/latest/meta.conf
DBG(1)[76198]> (fetch) Fetch: fetcher used: https
DBG(1)[76198]> (fetch) Request to fetch https://pkg.opnsense.org/FreeBSD:14:amd64/26.1/latest/data.pkg
DBG(1)[76198]> (fetch) Fetch: fetcher used: https
libdeflate-1.25                Fast, whole-buffer DEFLATE-based compression library

It looks like your suspicion was correct. libdeflate-1.25 is currently populated in both repositories simultaneously.

Please let me know if you need any further diagnostic logs.

Thank you!
#14
I can confirm this is the output of pkg info -d elasticsearch8
 
elasticsearch8-8.11.3:
        bash-5.3.15
        openjdk17-17.0.10+7.1_1
        jna-5.15.0_2
#15
Hello OPNsense Community & Developers,

I am experiencing a persistent update loop with two minor upstream shared libraries: graphite2 (v1.3.14) and libdeflate (v1.25). The WebGUI firmware status page continually prompts that these updates are available. When the update is triggered, pkg successfully fetches and extracts the files, but immediately removes them during the automatic post-install cleanup phase. Consequently, the packages reappear as missing "New" (N/A) entries on the next update check.

Environment Details:
OPNsense Version: 26.1.10-amd64
OS: FreeBSD 14.3-RELEASE-p4
OpenSSL: 3.0.18
Plugins Active: Zenarmor (Home Subscription) using a Local Elasticsearch 8.11.3 reporting database instance, running alongside Java (openjdk17).
The Behavior / Update Log CLI Output:
When running the update via the root shell, the package manager successfully pulls the files, but then explicitly lists them under Installed packages to be REMOVED directly afterward:

Processing candidates (6 candidates): .... done
The following 2 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
   graphite2: 1.3.14 [OPNsense]
   libdeflate: 1.25 [OPNsense]

Number of packages to be installed: 2

181 KiB to be downloaded.
[1/2] Fetching libdeflate-1.25.pkg: ....... done
[2/2] Fetching graphite2-1.3.14.pkg: .......... done
Checking integrity... done (0 conflicting)
[1/2] Installing graphite2-1.3.14...
[1/2] Extracting graphite2-1.3.14: .......... done
[2/2] Installing libdeflate-1.25...
[2/2] Extracting libdeflate-1.25: .......... done
Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 2 packages:

Installed packages to be REMOVED:
   graphite2: 1.3.14
   libdeflate: 1.25

Number of packages to be removed: 2
[1/2] Deinstalling graphite2-1.3.14...
[1/2] Deleting files for graphite2-1.3.14: .......... done
[2/2] Deinstalling libdeflate-1.25...
[2/2] Deleting files for libdeflate-1.25: .......... done
Checking all packages: .......... done
The following package files will be deleted:
   /var/cache/pkg/openjdk17-17.0.10+7.1_1.pkg
   /var/cache/pkg/elasticsearch8-8.11.3~ff6f5709d3.pkg
   /var/cache/pkg/libdeflate-1.25.pkg
   /var/cache/pkg/graphite2-1.3.14.pkg
   /var/cache/pkg/elasticsearch8-8.11.3.pkg
...
The cleanup will free 295 MiB
Deleting files: .......... done
Nothing to do.
Flushing temporary package files... done
***DONE***

Has anyone else utilizing local Elasticsearch deployments run into this package manager looping pattern? Is there an upcoming repository metadata sync planned to align the Java/Elasticsearch dependency tags with these specific library versions on the FreeBSD 14.3 base?

Thank you for your time and continued incredible work on the OPNsense ecosystem!