Trusting the tool
Every line is readable
VLANVerify is open source under the MIT License. There is no closed-source component, no obfuscation and no compiled blob: the code you run is the code in the repository.
Tests reachability only
A scan creates VLAN sub-interfaces on the one device it runs on and sends ordinary ICMP pings and TCP connection attempts. It never edits switch, router or firewall configuration, and never blocks, redirects, spoofs or injects traffic on any VLAN.
No telemetry, no automatic external calls
VLANVerify never phones home. The only network activity is the
scan you explicitly run against your own policy file, plus one
deliberate reachability test to whichever
internet_target your policy configures (1.1.1.1 by
default) when a rule targets internet.
Small, named dependencies
Four MIT/BSD-licensed Python libraries (Click, pydantic, PyYAML, Jinja2), each listed with its licence on the documentation page. No third-party source is vendored into the project.
Tested with the network mocked
Live interface orchestration and probing need root and real
hardware, so the test suite exercises the schema, verdict logic
and report rendering entirely against the dry-run/mock
backends. The thin modules that actually touch ip
and open sockets are deliberately the smallest surface.
Fails loudly, not silently
A VLAN that never gets an address, or a rule with no live host
to test against, is reported as such (and marked
INCONCLUSIVE) rather than fabricated or silently
skipped. Live scanning on a non-Linux OS exits with a clear
error instead of pretending to run.
The report is self-contained
report.html has no external CSS, JavaScript, fonts
or images. Opening it fetches nothing, and its content is
entirely determined by your policy file and what the scan
actually measured.
What VLANVerify touches on your machine
A live scan reads your policy YAML file, and writes to two places
you control: temporary VLAN sub-interfaces on the trunk NIC you
point it at (removed again afterwards unless
--keep-interfaces is given), and the HTML report file
at the path you pass to --output. It shells out to the
system ip command to create/delete those
sub-interfaces, and to a DHCP client if a VLAN is configured to try
DHCP. Beyond that, its only network activity is the ICMP pings and
TCP connection attempts your policy's rules describe.
TCP probes are bound to the correct VLAN sub-interface with
SO_BINDTODEVICE rather than relying on the OS routing
table, so a probe can't silently be sent out the wrong VLAN and
invalidate the test it's supposed to be running.
Running as root safely
Creating a tagged VLAN sub-interface requires elevated privileges
(root, or CAP_NET_ADMIN at minimum), so a live
vlanverify scan typically runs under sudo.
VLANVerify does not modify system-wide network configuration, DNS,
routing tables beyond what a sub-interface needs, or any file
outside the report path you specify; sub-interfaces it creates are
torn down at the end of the run unless you explicitly ask it to
keep them.
Destructive actions never happen silently
VLANVerify has no command that deletes data, credentials or
configuration. The closest thing, tearing down the VLAN
sub-interfaces it created for the scan, is the default behaviour at
the end of every run and is announced in the console output;
--keep-interfaces opts out of it entirely.
The honest limit
VLANVerify reports what it actually measured, at the
moment it measured it. A scan is a point-in-time
snapshot, not continuous monitoring: a configuration change made
after a scan could reopen a path that held during it, and an
INCONCLUSIVE verdict means exactly that, not a
disguised pass. A tool that claimed otherwise would be the one
not to trust. Re-scan after any change to segmentation-relevant
configuration.
Trusting this website
vlanverify.com is a static-feeling PHP site whose only job is to document the project and point you at the real artifacts.
- No third-party requests. No analytics, no tag managers, no tracking pixels, no A/B tools, no web fonts and no CDN. Every asset (CSS, JavaScript, images) is served from vlanverify.com itself. The only JavaScript is a small menu toggle and the terminal replay on the home page.
- No cookies, no accounts, no forms. The site sets no cookies and collects nothing from you. There is nothing to log in to and nothing to submit.
- Locked-down headers. A strict
Content-Security-Policybuilt ondefault-src 'self'withobject-src 'none'andframe-ancestors 'none', plusX-Content-Type-Options: nosniff,X-Frame-Options: DENY, a tightReferrer-Policy, aPermissions-Policythat denies camera, microphone and geolocation, and HTTP Strict Transport Security. HTTPS is forced and all plain-HTTP requests are redirected. - The site is open source too. It lives in its own repository under the same MIT licence, so you can read or diff exactly what is serving these pages.
- This site is documentation, not the source of truth. Every install instruction points at GitHub. If this domain ever disappeared, nothing about VLANVerify would change.
Standard web-server access logs (IP, timestamp, requested path, user agent) may be retained for a short period for abuse and reliability purposes. That is the extent of it.
Verifying your download
Install VLANVerify only from this source:
| Source | Canonical location |
|---|---|
| Source & releases | github.com/rosscooney/vlanverify |
VLANVerify is not yet published on PyPI or any other package index; treat anything claiming to be a "VLANVerify" package elsewhere with suspicion until it is. Before you install or upgrade:
- Pin a tag rather than floating on
main, and read the release notes and the diff for that tag on GitHub. - Inspect the source if you want to; it is pure Python with no compiled or obfuscated component. Clone the repository and read it directly.
# Pin an exact tag rather than floating on main
pip install git+https://github.com/rosscooney/[email protected]
# Confirm what you got, offline
vlanverify --help
vlanverify validate --policy policies/example.yaml
Running it well
VLANVerify's usefulness depends on the scan actually testing what you think it's testing:
- Confirm the trunk port really carries every VLAN in your policy
before scanning; a switch port that isn't trunking a VLAN under
test produces misleading
INCONCLUSIVEresults, not a false pass. - Run with
sudo, or grantCAP_NET_ADMINto a non-root user. Without it, VLANVerify cannot create the VLAN sub-interfaces a live scan needs. - Re-scan after any change to switch, firewall or VLAN configuration; see the honest limit above.
- Treat an
INCONCLUSIVEverdict as a gap to close (add atarget_ip, check the VLAN actually got an address), not as a pass. - Keep the policy file that produced a report alongside it; the report records the policy's file hash so the two can be tied together as one piece of evidence.
See the usage documentation for the full command reference.
Reporting a vulnerability
If you believe you have found a security vulnerability in VLANVerify, please report it privately. Do not open a public GitHub issue for security vulnerabilities.
- GitHub private vulnerability reporting: use the “Report a vulnerability” button under the repository's Security tab (Security → Advisories).
- Email: [email protected].
Please include:
- a description of the issue and its impact,
- steps to reproduce or a proof of concept,
- affected version(s) or commit hash,
- any suggested remediation.
In scope, for example: a way for a scan to modify switch, router or firewall configuration, or to send traffic beyond an ICMP ping and a TCP connect attempt to the addresses your policy describes; a way for VLANVerify to bind a probe to the wrong VLAN sub-interface without reporting it; unsafe handling of the policy file or the generated report; a way for the report to embed unsanitised, attacker-controlled content (for example from a device's response) that could execute when opened in a browser; or a way for a live scan to leave VLAN sub-interfaces or other state behind that a subsequent, unrelated scan would silently reuse. Not in scope: “VLANVerify reported INCONCLUSIVE instead of a definitive verdict” on its own is not a vulnerability (it's the intended, honest behaviour when evidence is incomplete), though improvements to discovery or target-resolution coverage are welcome as normal issues or pull requests.
What to expect from us
- Acknowledgement of your report as soon as reasonably possible.
- An assessment of the issue and, where accepted, a fix or mitigation.
- Credit in the release notes if you would like it.
VLANVerify is built and maintained by Stable State Consulting Ltd (www.stablestate.co.uk).