···11+---
22+'lan-network': patch
33+---
44+55+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.
+5-1
src/index.ts
···55 DEFAULT_ASSIGNMENT,
66 interfaceAssignments,
77 matchAssignment,
88+ isInternal,
89} from './network';
910import type { GatewayAssignment } from './types';
1011···2627 try {
2728 const defaultRoute = await probeDefaultRoute();
2829 // If this route matches a known assignment, return it without a gateway
2929- if ((assignment = matchAssignment(assignments, defaultRoute))) {
3030+ if (
3131+ (assignment = matchAssignment(assignments, defaultRoute)) &&
3232+ !isInternal(assignment)
3333+ ) {
3034 return assignment;
3135 }
3236 } catch {
+5-1
src/network.ts
···4545 else return 0;
4646};
47474848+/** Determines if an assignment is internal (indicated by the flag or by a zeroed mac address) */
4949+export const isInternal = (assignment: NetworkAssignment) =>
5050+ assignment.internal || parseMacStr(assignment.mac).every(x => !x);
5151+4852export const interfaceAssignments = (): NetworkAssignment[] => {
4953 const candidates: NetworkAssignment[] = [];
5054 const interfaces = os.networkInterfaces();
···6266 // Prioritise external interfaces, then sort by priority,
6367 // when priority is equal, sort by raw IP values
6468 const sortBy =
6565- +a.internal - +b.internal ||
6969+ +isInternal(a) - +isInternal(b) ||
6670 priorityB - priorityA ||
6771 parseIpStr(b.address) - parseIpStr(a.address);
6872 return sortBy;