From c3948d2f4fe02379c4cf77498d0de2feb834e9b9 Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Fri, 2 May 2025 14:57:41 +0100 Subject: [PATCH] fix: Ignore internal interfaces when probing routes (VPNs) (#7) * Ignore internal assignments for probed routes * Add changeset * Determine internal interfaces with mac address as well --- .changeset/fair-cows-perform.md | 5 +++++ src/index.ts | 6 +++++- src/network.ts | 6 +++++- 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 .changeset/fair-cows-perform.md diff --git a/.changeset/fair-cows-perform.md b/.changeset/fair-cows-perform.md new file mode 100644 index 0000000..b890aca --- /dev/null +++ b/.changeset/fair-cows-perform.md @@ -0,0 +1,5 @@ +--- +'lan-network': patch +--- + +When matching a probed route, ignore internal interfaces. The probed route will match a VPN (virtual) interface when using it to tunnel all traffic, but is unlikely to be considered the local network by users. diff --git a/src/index.ts b/src/index.ts index 81ee0d3..c255314 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,6 +5,7 @@ import { DEFAULT_ASSIGNMENT, interfaceAssignments, matchAssignment, + isInternal, } from './network'; import type { GatewayAssignment } from './types'; @@ -26,7 +27,10 @@ export async function lanNetwork(): Promise { try { const defaultRoute = await probeDefaultRoute(); // If this route matches a known assignment, return it without a gateway - if ((assignment = matchAssignment(assignments, defaultRoute))) { + if ( + (assignment = matchAssignment(assignments, defaultRoute)) && + !isInternal(assignment) + ) { return assignment; } } catch { diff --git a/src/network.ts b/src/network.ts index 2a292b9..59f59f6 100644 --- a/src/network.ts +++ b/src/network.ts @@ -45,6 +45,10 @@ const getSubnetPriority = (addr: string): number => { else return 0; }; +/** Determines if an assignment is internal (indicated by the flag or by a zeroed mac address) */ +export const isInternal = (assignment: NetworkAssignment) => + assignment.internal || parseMacStr(assignment.mac).every(x => !x); + export const interfaceAssignments = (): NetworkAssignment[] => { const candidates: NetworkAssignment[] = []; const interfaces = os.networkInterfaces(); @@ -62,7 +66,7 @@ export const interfaceAssignments = (): NetworkAssignment[] => { // Prioritise external interfaces, then sort by priority, // when priority is equal, sort by raw IP values const sortBy = - +a.internal - +b.internal || + +isInternal(a) - +isInternal(b) || priorityB - priorityA || parseIpStr(b.address) - parseIpStr(a.address); return sortBy; -- 2.51.2