Changelog
- fix(portal|website): Fix static paths for website and elixir @jamilbk (#3802)
- fix(connlib): update resource list on resource removal @conectado (#3796)
- Handle disconnect messages in LV @AndrewDryga (#3795)
- feat(snownet): only keep the best possible candidate pair alive @thomaseizinger (#3792)
- refactor(connlib): replace intent timer with explicit throttling @thomaseizinger (#3778)
- feat(snownet): reduce connection setup latency @thomaseizinger (#3772)
- chore: add nix scripts @thomaseizinger (#3771)
- chore(connlib): Tune log filters to enable
debug
in dev andinfo
for gateway deployments @jamilbk (#3788) - chore(snownet): reduce log levels @thomaseizinger (#3777)
- fix(portal|website): Fix favicons for dark mode @jamilbk (#3785)
- chore(repo): Move other dotfiles to reduce directory size of root @jamilbk (#3780)
- feat(android): add settings button to the session view @jasonboukheir (#3755)
- feat(connlib): support resource updates from the portal @conectado (#3754)
- chore: move markdown files into
docs/
directory @thomaseizinger (#3773) - refactor(connlib): unify handling of IP packets @thomaseizinger (#3762)
- chore: remove markdownlint config files @thomaseizinger (#3774)
- fix(gui-client): fix some papercuts @ReactorScram (#3769)
- feat(android): use Android ShareSheet for sharing logs @jasonboukheir (#3756)
- fix(android): delete log zip on finish and on create @jasonboukheir (#3757)
- refactor(connlib): unify peer storage @conectado (#3738)
- fix(connlib): correctly handle GRO @thomaseizinger (#3732)
- refactor(snownet): be more explicit about dispatching messages @thomaseizinger (#3741)
- build: enable Tauri dep for Linux and alphabetize deps @ReactorScram (#3742)
- fix(ci): phoenix channel tests not running @conectado (#3749)
- fix(gui-client): remove duplicated script @ReactorScram (#3745)
- fix(ci): run relay tests @conectado (#3747)
- fix(relay): update tests for current values @conectado (#3746)
- ci: change
cargo chef
call so it will ignore the GUI client @ReactorScram (#3740) - connlib: remove tun mutex @conectado (#3743)
- feat(ci): Test that relay restarts don't break existing connected entities @jamilbk (#3671)
- feat(dev): add dev yml for rust development @conectado (#3670)
- chore: make rtnetlink versions explicit @ReactorScram (#3736)
- chore(snownet): reuse
RingBuffer
@thomaseizinger (#3725) - refactor: rename windows-client to gui-client @ReactorScram (#3721)
- fix(ci): Fix flaky iperf3 "Bad file descriptor" @jamilbk (#3731)
- Remove assertions in sign-in success acceptance tests @bmanifold (#3733)
- refactor(portal): Remove assertions in sign-in success acceptance tests @bmanifold (#3730)
- fix(snownet): don't log addresses twice @thomaseizinger (#3711)
- feat(relay): increase number of allowed requests per nonce @thomaseizinger (#3726)
- refactor(portal): Add website_link component @jamilbk (#3715)
- fix(gateway): expire resources @conectado (#3722)
- feat(snownet): optimise which channels we bind @thomaseizinger (#3709)
- Disable sign up in staging @bmanifold (#3723)
- Add sign-in success page for clients @bmanifold (#3714)
- fix(connlib): set the real packet length before putting it into the device @conectado (#3718)
- fix(ci): Use default NDK on GH runners @jamilbk (#3716)
- fix(ci): Use workflow id to fetch perf results @jamilbk (#3710)
- fix(snownet): make TURN channel bindings more reliable @thomaseizinger (#3708)
- feat(connlib): filter out relays based on our locally created sockets @thomaseizinger (#3705)
- refactor(connlib): simplify resource ordering by implementing Ord trait @conectado (#3696)
- refactor(ci): Merge perf results into one comment @jamilbk (#3707)
- feat!(portal): return relays as plain socket addresses @thomaseizinger (#3665)
- chore(ci): enforce shellscript formatting and style @jamilbk (#3679)
- fix(ci): Fix js typo @jamilbk (#3704)
- fix(connlib): set socket to IPv6 only before binding address @thomaseizinger (#3701)
- fix(ci): Fix typo preventing perf-results from being calculated @jamilbk (#3703)
- fix(ci): Fix result overwrite @jamilbk (#3700)
- fix(ci): Run each perf test in its own matrix job @jamilbk (#3695)
- feat(portal): Billing system @AndrewDryga (#3642)
- refactor(connlib): replace
webrtc-rs
withsnownet
@conectado (#3391) - fix(snownet): don't trigger busy loop upon refreshing allocation @conectado (#3693)
- chore(repo): Update issue template with support links @jamilbk (#3678)
- Revert "feat(portal): Add sign-in success page for clients" @jamilbk (#3692)
- feat(portal): Add sign-in success page for clients @bmanifold (#3659)
- fix(ci): Ensure integration-tests allow for at least 30 seconds to establish a connection @jamilbk (#3676)
- Revert "fix(gateway): Remove
/dev/net/tun
requirement and clean up upgrade script @AndrewDryga (#3691) - fix(android): move log zip file outside of log folder @jasonboukheir (#3677)
- chore(portal): Add okta as IdP in dev @jamilbk (#3675)
- feat(android): Add support for per-app VPN configurable through MDM @jamilbk (#3657)
- fix(ci): Be explicit about service start order @jamilbk (#3673)
- refactor(ci): Use curl for connectivity tests in CI @jamilbk (#3674)
- chore(snownet): expose
Server
andClient
@thomaseizinger (#3664) - feat(snownet): instrument public API using
tracing
@thomaseizinger (#3663) - feat(linux): Control DNS with systemd-resolved @ReactorScram (#3643)
- ci: upgrade iperf @thomaseizinger (#3662)
- fix(snownet): generate candidates only after we accept the ICE answer @conectado (#3658)
- refactor(connlib): move DNS resolution into tunnel @thomaseizinger (#3652)
- refactor(ci): simplify dns resources in ci @jamilbk (#3653)
- fix(gateway): re-implement resource address resolution in eventloop @conectado (#3656)
- feat(linux): Notify systemd when we've started @ReactorScram (#3628)
- feat(android): add Reset to Defaults button and add space to settings activity @jasonboukheir (#3651)
- feat(snownet): timeout connections without a handshake after 20 seconds @thomaseizinger (#3633)
- ci: don't ping gateway before running perf @thomaseizinger (#3649)
- feat(snownet): attempt to make new allocation when refresh fails @thomaseizinger (#3631)
- refactor(gateway): perform DNS resolution of resources in eventloop @thomaseizinger (#3622)
- feat(snownet): invalidate candidates @thomaseizinger (#3604)
- chore(snownet): better logging @thomaseizinger (#3646)
- Update Okta IDP adapter in portal @bmanifold (#3647)
- ci: move tests to bash scripts @thomaseizinger (#3648)
- refactor(android): Clean up tunnel fd establishment @jamilbk (#3645)
- fix(android): prevent null pointer segfault on 32-bit platforms @jamilbk (#3619)
- ci(linux): add CI setup script for NetworkManager @ReactorScram (#3641)
- feat(linux): Add
FIREZONE_DNS_CONTROL
env var to choose which DNS control method to use @ReactorScram (#3629) - fix(snownet): remove
debug_assert!
for timed-out connections @thomaseizinger (#3635) - feat(snownet): only emit
ConnectionEstablished
upon the first connection @thomaseizinger (#3634) - feat(snownet): remove wireguard keep-alives @thomaseizinger (#3630)
- chore(connlib): Make request ioctl mutable @jamilbk (#3644)
- refactor(android): Simplify tunnel implementation and fix tunnel lifecycle @jamilbk (#3583)
- chore(website): Update team @jamilbk (#3638)
- ci(windows): test crash handling as part of smoke test @ReactorScram (#3624)
- chore: bump Rust version to 1.76 @thomaseizinger (#3632)
- Add Okta directory sync @bmanifold (#3614)
- Add dynamic/managed groups and default Everyone one @AndrewDryga (#3346)
- chore(ci): update Node to 20 in the Windows CI jobs @ReactorScram (#3611)
- ci(windows): add 'firezone' to the MSI names @ReactorScram (#3610)
- feat(portal): Broadcast resource sites @AndrewDryga (#3466)
- chore(ci): Fix CI deprecation and workflow warnings @jamilbk (#3612)
- ci(windows): fix warning about CONNLIB_LOG_UPLOAD_INTERVAL_SECS @ReactorScram (#3606)
- chore(apple): Add logs about accessing firezone-id in disk @roop (#3607)
- feat(connlib): remove duplication from logs @thomaseizinger (#3596)
- feat(snownet): refresh allocation upon each new connection @thomaseizinger (#3591)
- fix(snownet): replace
Allocation
if credentials to relay change @thomaseizinger (#3590) - refactor(snownet): introduce
CandidateEvent
@thomaseizinger (#3592) - feat(snownet): instrument the
handle_input
function with tracing @thomaseizinger (#3594) - refactor(connlib): remove unnecessary
Serialize
derive @thomaseizinger (#3595) - fix(snownet): don't try to re-authorize forever @thomaseizinger (#3589)
- feat(windows): split up signing-in state, closes #3597 @ReactorScram (#3599)
- chore(snownet): remove obsolete TODO @thomaseizinger (#3593)
- fix(snownet): don't mangle source IP to determine use of relay @thomaseizinger (#3556)
- fix(snownet): properly cleanup connections before adding a new one @conectado (#3587)
- fix(windows): Ensure crashes, errors, and panics are all logged to file @ReactorScram (#3572)
- fix(ci): wait for Vault to load sign in form before filling it out @jamilbk (#3585)
- Revert "chore(android): Remove i686 android target" @jamilbk (#3586)
- feat(devops): Add Trisha to staging GCP @jamilbk (#3584)
- refactor(portal): log in -> sign in @jamilbk (#3577)
- fix(snownet): don't attempt to bind a channel if we don't have a matching allocation @thomaseizinger (#3575)
- fix: don't initialize relay with non-existent interface @thomaseizinger (#3582)
- fix(snownet): always clear state of failed connections @thomaseizinger (#3581)
- feat(snownet): retry TURN allocations using exponential backoffs @thomaseizinger (#3530)
- chore(portal): Enable Microsoft Entra by default in all envs @jamilbk (#3576)
- ci(windows): run the Windows smoke test in CI @ReactorScram (#3542)
- fix(android): Use persistent device ID @jamilbk (#3566)
- chore(portal): Misc sign in UX fixes @jamilbk (#3564)
- fix(connlib): Enable ansi colors for the windows client debug console @conectado (#3552)
- fix(windows): save actor name to disk and reload it on startup @ReactorScram (#3546)
- feat(windows): add smoke test subcommand @ReactorScram (#3541)
- chore(infra): Limit relays to used regions and expected load @jamilbk (#3540)
- feat(portal): Add Microsoft Entra IDP sync to portal @bmanifold (#3433)
- feat(snownet): return
MutableIpPacket
fromdecapsulate
@thomaseizinger (#3555) - chore(snownet): fix bad caching base after rename @thomaseizinger (#3557)
- feat(snownet): retry STUN bindings using exponential backoff @thomaseizinger (#3529)
- deps: update to latest upstream version of
str0m
@thomaseizinger (#3554) - feat(snownet): automatically discover host candidates @thomaseizinger (#3528)
- feat(windows): check Github for updates on startup @ReactorScram (#3527)
- fix(windows): show user-friendly error if a 2nd instance tries to start @ReactorScram (#3548)
- chore(android): Remove i686 android target @jamilbk (#3547)
- fix(firezone-tunnel(windows)): don't panic if the sending ring buffer is full @ReactorScram (#3544)
- feat(windows): log
have_internet
changes and API base URL at INFO level @ReactorScram (#3543) - fix(android): Load library before starting tunnel only @jamilbk (#3539)
- chore(portal): Add helptext explaning auth identities/tokens @jamilbk (#3515)
- fix(windows): fix counting / exporting / clearing log files @ReactorScram (#3535)
- feat(windows): add CLI flag to test a clickable update notification @ReactorScram (#3526)
- refactor(windows): simplify how CLI args are passed to the GUI @ReactorScram (#3525)
- fix(android): Allow bypassing AlwaysOn VPN @jamilbk (#3522)
- feat(portal): Sync transitive memberships for Google Workspace @AndrewDryga (#3524)
- Fix bug with restoring deleted identities and actors @AndrewDryga (#3523)
- refactor(windows): Add context to errors, add SAFETY comments, update TODOs @ReactorScram (#3517)
- fix(windows): install and load wintun.dll from a well-known path instead of setting the current directory @ReactorScram (#3430)
- Reactorscram/fix webview2 crash @ReactorScram (#3464)
- fix(docs): Fix Docsearch recordExtractors, sitemap, and cookie banner script load @jamilbk (#3512)
- feat(portal): Broadcast state changes to connected clients and gateways @AndrewDryga (#2240)
- fix(android): Fix typo from refactor @jamilbk (#3511)
- chore(ci): Update dependabot android groups @jamilbk (#3501)
- refactor(website): Add punchier website headline @jamilbk (#3473)
- fix(snownet): don't try to allocate a new channel if we already have one @thomaseizinger (#3476)
- fix(snownet): don't use unbound channels for relaying @thomaseizinger (#3474)
- fix(relay): correctly separate channel state for different peers @thomaseizinger (#3472)
- refactor(windows): change some anyhow errors into thiserror errors @ReactorScram (#3461)
- ci(windows): hide bare Windows exe from releases page @ReactorScram (#3471)
- ci(windows): Upload Windows debug symbols @ReactorScram (#3467)
- feat(firezone-tunnel): sort resources alphabetically @ReactorScram (#3465)
- chore(ci): Bump sccache; remove IPC debug build @jamilbk (#3468)
- refactor(windows): remove IPC code which is now unused @ReactorScram (#3469)
- refactor: Remove user-facing parts of STUN-only feature @jamilbk (#3453)
- fix(windows): don't crash if the saved log filter is invalid @ReactorScram (#3460)
- feat(android): Add Android Headless Operation @jasonboukheir (#3438)
- feat(ci): Standardize matrix job names to prevent dupes, move jobs to macos-14 @jamilbk (#3447)
- fix(windows): CSS nit @ReactorScram (#3463)
- fix(windows): Take the default button shade darker a notch @jamilbk (#3462)
- Apple: Add 'debug' to network extension name in debug configuration @roop (#3459)
- fix(ci): Fix perf test names @jamilbk (#3454)
- fix(connlib): handle null-termination of TUN device path string correctly @jamilbk (#3449)
- fix(connection): only emit
Transmit.src
that correspond to local sockets @thomaseizinger (#3411) - feat(relay): allow channel bindings to IPv6 addresses @thomaseizinger (#3434)
- feat(connection): rebrand to
snownet
@thomaseizinger (#3435) - feat(docs): Add docs overview content @jamilbk (#3440)
- docs(windows): Update docs for Windows VM testing / resetting files Firezone creates @ReactorScram (#3448)
- fix(windows): use a well-known path for the crash handler socket @ReactorScram (#3444)
- feat(windows): enable crash handling on release builds @ReactorScram (#3441)
- refactor(windows): handle tray menu events in the main loop @ReactorScram (#3446)
- fix(windows): Ensure production exes / MSIs don't show "-modified" Git versions @ReactorScram (#3432)
- refactor(windows): use 'use' statements better in crash handling @ReactorScram (#3442)
- feat(connection): allocate IPv6 address @thomaseizinger (#3436)
- chore(relay): update docs in regards to spec-compliance @thomaseizinger (#3437)
- feat(apple): Write app and tunnel log to disk @roop (#3322)
- Add SSH public key to AWS Terraform @bmanifold (#3439)
- refactor(windows): set absolute paths for logs and wintun.dll @ReactorScram (#3428)
- feat(phoenix-channel): reconnect on missed heartbeat from portal @thomaseizinger (#3410)
- fix(windows): Show "Signing in..." menu during auto-sign-in @ReactorScram (#3431)
- fix(windows): move crash dumps into logs dir so they get exported in the zip, closes #3263 @ReactorScram (#3426)
- feat(relay): print stats every 10s @thomaseizinger (#3408)
- fix(ci): Increase test nonce length to reduce collisions @jamilbk (#3373)
- feat(ops): Add support provisioning helper @jamilbk (#3422)
- feat(windows): UI notification for reauth (#3329) @ReactorScram (#3416)
- fix(ci): Setup pnpm before use @jamilbk (#3423)
- fix(gateway): Remove
/dev/net/tun
requirement and clean up upgrade script @jamilbk (#3392) - refactor(infra): Make relay and gateway logs sane on prod @jamilbk (#3400)
- fix(portal): fix otlp exporter initialization @Intuinewin (#3375)
- fix(connection): buffer channel bindings until we have an allocation @thomaseizinger (#3417)
- feat(relay): print a log for error responses we send to the client @thomaseizinger (#3413)
- chore(relay): change
run_smoke_test.sh
to use/usr/bin/env
@thomaseizinger (#3409) - feat(connection): introduce keep-alive and expose
last_seen
@thomaseizinger (#3388) - fix(connection): accept relay traffic from non-listening interface @thomaseizinger (#3412)
- feat(connection): add a very basic connection timeout @thomaseizinger (#3397)
- feat(relay): improve logging and error handling @thomaseizinger (#3399)
- feat(gateway): don't print stacktrace upon exit @thomaseizinger (#3404)
- chore: update
str0m
dependency @thomaseizinger (#3402) - fix(connection-tests): avoid rare flakiness of relay test @thomaseizinger (#3394)
- feat: automatically rejoin channel on portal after reconnect @thomaseizinger (#3393)
- fix(gateway): tokio feature dependencies @conectado (#3396)
- fix(ci): Update codespell ignorelist and fix typos @jamilbk (#3398)
- fix(windows): allow user to cancel sign-in flow @ReactorScram (#3385)
- feat(ci): Test client gracefully handles portal and relay disconnects @jamilbk (#3376)
- refactor(gateway): Update gateway logs level @conectado (#3387)
- docs(gateway): Document egress connectivity requirements for Gateways @jamilbk (#3312)
- refactor(android): Move log controls to Logs section of Settings @jasonboukheir (#3315)
- feat(connection): generate TURN candidates from provided relays @thomaseizinger (#3297)
- fix(gateway): Use new prod Docker registry for upgrades @jamilbk (#3386)
- ci(windows): call pnpm so the frontend gets built, closes #3381 @ReactorScram (#3382)
- fix(devops): Fix typo in AWS bastion host TF @bmanifold (#3380)
- refactor(windows): Add logo and version to About window @jamilbk (#3378)
- feat(phoenix-channel): automatically reconnect based on provided
ExponentialBackoff
@thomaseizinger (#3364) - fix(windows): prevent a security issue @ReactorScram (#3326)
- fix(devops): Update AWS gateway TF @bmanifold (#3374)
✨ Features
- feat(linux): If
FIREZONE_DNS_CONTROL
isetc-resolv-conf
, modify '/etc/resolv.conf' @ReactorScram (#3639) - test(linux): Low-risk changes to prepare for Linux DNS support @ReactorScram (#3625)
🐛 Bug Fixes
- revert: 3622 to fix failing DNS CI test @ReactorScram (#3654)
- fix(windows): improve logging around smoke test / log export @ReactorScram (#3600)
- fix(windows): Wrap deep link URLs in
SecureUrl
, don't log them @ReactorScram (#3574) - fix(windows): vt100 seems to panic in CI, just print a warning instead @ReactorScram (#3573)
🧰 Maintenance
- fix: Slow DNS lookups on (at least) Windows by updating to
main
of Hickory @ReactorScram (#3799) - build(deps): Bump socket2 from 0.5.5 to 0.5.6 in /rust @dependabot (#3766)
- build(deps): Bump anyhow from 1.0.79 to 1.0.80 in /rust @dependabot (#3765)
- build(deps): Bump minidumper from 0.8.1 to 0.8.2 in /rust @dependabot (#3764)
- build(deps): Bump tauri-utils from 1.5.2 to 1.5.3 in /rust @dependabot (#3767)
- refactor(ci): enable Linux do-nothing GUI builds (but not tests) in CI/CD, extract scripts for that @ReactorScram (#3735)
- refactor(GUI clients): extract known_dirs module @ReactorScram (#3734)
- test(windows): make sure files are written to the right paths during smoke tests @ReactorScram (#3727)
- refactor(ci): extract scripts for GUI client smoke tests @ReactorScram (#3724)
- test: add mock token storage for CI tests on Ubuntu @ReactorScram (#3720)
- refactor(ci): extract
setup-tauri
action and generalize Windows builds @ReactorScram (#3702) - refactor: move BUNDLE_ID since it won't be Windows-specific @ReactorScram (#3706)
- build(deps): Bump arboard from 3.3.0 to 3.3.1 in /rust @dependabot (#3687)
- build(deps): Bump ring from 0.17.7 to 0.17.8 in /rust @dependabot (#3686)
- build(deps): Bump semver from 1.0.21 to 1.0.22 in /rust @dependabot (#3685)
- build(deps): Bump tokio from 1.35.1 to 1.36.0 in /rust @dependabot (#3561)
- build(deps): Bump crash-handler from 0.6.0 to 0.6.1 in /rust @dependabot (#3623)
- build(deps): Bump time from 0.3.32 to 0.3.34 in /rust @dependabot (#3559)
- fix(windows): keep the main loop running even if a request has an error @ReactorScram (#3569)
- build(deps): Bump minidumper from 0.8.0 to 0.8.1 in /rust @dependabot (#3560)
- build(deps): Bump hashicorp/tfc-workflows-github from 1.1.1 to 1.2.0 @dependabot (#3477)
- build(deps): Bump itertools from 0.12.0 to 0.12.1 in /rust @dependabot (#3507)
- build(deps): Bump libc from 0.2.152 to 0.2.153 in /rust @dependabot (#3508)
- build(deps): Bump time from 0.3.31 to 0.3.32 in /rust @dependabot (#3509)
- build(deps): Bump @types/mdx from 2.0.10 to 2.0.11 in /website @dependabot (#3489)
- build(deps-dev): Bump @types/node from 18.19.8 to 20.11.15 in /rust/windows-client @dependabot (#3502)
- build(deps): Bump @types/react from 18.2.47 to 18.2.51 in /website @dependabot (#3505)
- build(deps): Bump marocchino/tool-versions-action from 1.1.1 to 1.2.0 @dependabot (#3478)
- build(deps): Bump @next/mdx from 14.0.4 to 14.1.0 in /website @dependabot (#3503)
- build(deps): Bump com.google.android.material:material from 1.8.0 to 1.11.0 in /kotlin/android @dependabot (#3483)
- build(deps): Bump com.squareup.moshi:moshi from 1.15.0 to 1.15.1 in /kotlin/android @dependabot (#3481)
- build(deps): Bump androidx.browser:browser from 1.5.0 to 1.7.0 in /kotlin/android @dependabot (#3482)
- build(deps): Bump gradle/wrapper-validation-action from 1 to 2 @dependabot (#3479)
- build(deps): Bump navVersion from 2.7.4 to 2.7.6 in /kotlin/android @dependabot (#3484)
- build(deps): Bump androidx.lifecycle:lifecycle-runtime-ktx from 2.6.1 to 2.7.0 in /kotlin/android @dependabot (#3485)
- build(deps-dev): Bump hastscript from 8.0.0 to 9.0.0 in /website @dependabot (#3487)
- build(deps): Bump react-fast-marquee from 1.6.2 to 1.6.3 in /website @dependabot (#3488)
- build(deps): Bump the google group in /terraform/environments/production with 2 updates @dependabot (#3504)
- build(deps): Bump the google group in /terraform/environments/staging with 2 updates @dependabot (#3510)
- build(deps): Bump tailwindcss from 3.4.0 to 3.4.1 in /website @dependabot (#3490)
- build(deps): Bump gradle/gradle-build-action from 2 to 3 @dependabot (#3480)
- build(deps): Bump serde from 1.0.195 to 1.0.196 in /rust @dependabot (#3421)
- build(deps): Bump keyring from 2.3.1 to 2.3.2 in /rust @dependabot (#3419)
- build(deps): Bump actions/cache from 3 to 4 @dependabot (#3356)
- build(deps): Bump telemetry_metrics from 0.6.1 to 0.6.2 in /elixir @dependabot (#3362)
- build(deps): Bump winreg from 0.51.0 to 0.52.0 in /rust @dependabot (#3420)
- build(deps): Bump plug_cowboy from 2.6.1 to 2.6.2 in /elixir @dependabot (#3358)
- build(deps): Bump env_logger from 0.10.1 to 0.10.2 in /rust @dependabot (#3359)
- build(deps): Bump ex_cldr_numbers from 2.32.3 to 2.32.4 in /elixir @dependabot (#3360)
📝 Documentation
- ci: document and fix a couple things for local Docker testing @ReactorScram (#3672)
- docs(linux): document default DNS setup on Debian 12 and Ubuntu 20.04 @ReactorScram (#3668)
- docs(linux): document test setups for exercising all the Linux code @ReactorScram (#3660)