From 627e989faa1a0a82c13518e9fd296e0052936202 Mon Sep 17 00:00:00 2001 From: TaurusXin Date: Mon, 13 Oct 2025 11:40:57 +0800 Subject: [PATCH] feat: show NAT type of all nodes in GUI (#1464) --- .../frontend-lib/src/components/Status.vue | 65 +++++++++++-------- easytier-web/frontend-lib/src/locales/cn.yaml | 1 + easytier-web/frontend-lib/src/locales/en.yaml | 1 + 3 files changed, 40 insertions(+), 27 deletions(-) diff --git a/easytier-web/frontend-lib/src/components/Status.vue b/easytier-web/frontend-lib/src/components/Status.vue index 37cec2f..63df868 100644 --- a/easytier-web/frontend-lib/src/components/Status.vue +++ b/easytier-web/frontend-lib/src/components/Status.vue @@ -22,6 +22,7 @@ const peerRouteInfos = computed(() => { ipv4_addr: my_node_info?.virtual_ipv4, hostname: my_node_info?.hostname, version: my_node_info?.version, + stun_info: my_node_info?.stun_info }, }, ...(props.curNetworkInst.detail?.peer_route_pairs || [])] } @@ -145,6 +146,34 @@ interface Chip { icon: string } +// udp nat type +enum NatType { + // has NAT; but own a single public IP, port is not changed + Unknown = 0, + OpenInternet = 1, + NoPAT = 2, + FullCone = 3, + Restricted = 4, + PortRestricted = 5, + Symmetric = 6, + SymUdpFirewall = 7, + SymmetricEasyInc = 8, + SymmetricEasyDec = 9, +}; + +const udpNatTypeStrMap = { + [NatType.Unknown]: 'Unknown', + [NatType.OpenInternet]: 'Open Internet', + [NatType.NoPAT]: 'No PAT', + [NatType.FullCone]: 'Full Cone', + [NatType.Restricted]: 'Restricted', + [NatType.PortRestricted]: 'Port Restricted', + [NatType.Symmetric]: 'Symmetric', + [NatType.SymUdpFirewall]: 'Symmetric UDP Firewall', + [NatType.SymmetricEasyInc]: 'Symmetric Easy Inc', + [NatType.SymmetricEasyDec]: 'Symmetric Easy Dec', +} + const myNodeInfoChips = computed(() => { if (!props.curNetworkInst) return [] @@ -213,35 +242,8 @@ const myNodeInfoChips = computed(() => { } as Chip) } - // udp nat type - enum NatType { - // has NAT; but own a single public IP, port is not changed - Unknown = 0, - OpenInternet = 1, - NoPAT = 2, - FullCone = 3, - Restricted = 4, - PortRestricted = 5, - Symmetric = 6, - SymUdpFirewall = 7, - SymmetricEasyInc = 8, - SymmetricEasyDec = 9, - }; const udpNatType: NatType = my_node_info.stun_info?.udp_nat_type if (udpNatType !== undefined) { - const udpNatTypeStrMap = { - [NatType.Unknown]: 'Unknown', - [NatType.OpenInternet]: 'Open Internet', - [NatType.NoPAT]: 'No PAT', - [NatType.FullCone]: 'Full Cone', - [NatType.Restricted]: 'Restricted', - [NatType.PortRestricted]: 'Port Restricted', - [NatType.Symmetric]: 'Symmetric', - [NatType.SymUdpFirewall]: 'Symmetric UDP Firewall', - [NatType.SymmetricEasyInc]: 'Symmetric Easy Inc', - [NatType.SymmetricEasyDec]: 'Symmetric Easy Dec', - } - chips.push({ label: `UDP NAT Type: ${udpNatTypeStrMap[udpNatType]}`, icon: '', @@ -272,6 +274,14 @@ function rxGlobalSum() { return globalSumCommon('stats.rx_bytes') } +function natType(info: PeerRoutePair): string { + const udpNatType = info.route?.stun_info?.udp_nat_type; + if (udpNatType !== undefined) + return udpNatTypeStrMap[udpNatType as NatType] + + return '' +} + const peerCount = computed(() => { if (!peerRouteInfos.value) return 0 @@ -439,6 +449,7 @@ function showEventLogs() { +