feat: 新增 GRE 隧道协议,管理端口调整为 18080

- backend: 新增 GRE 隧道实现(ip tunnel 点对点互联),binmgr 支持 iproute2
- backend: api/identity 调整,各协议 service(gre/ikev2/ipsec/l2tp/openvpn)统一改动
- backend: OpenVPN 认证辅助与用户口令同步逻辑完善
- frontend: 协议图标/向导/编辑器支持 GRE,VPN 用户页重构(234 行)
- frontend: 新增 RouteListInput 路由列表输入组件,Dashboard/Layout 优化
- i18n: 中英文文案同步更新
- test: 新增 binmgr/common/gre 单测,openvpn 测试补充
- docs: README 补充 GRE 说明,默认监听端口 8080 → 18080
- chore: .gitignore 增加 opsx-vpn.previous(构建备份二进制)
This commit is contained in:
opsx committed 2026-10-20 20:58:58 +08:00
1 parent c7f59f2cbf
commit ef7eb378d2
28 files changed
+1363 -439

No files matched your search

+69 -22
View File
@@ -23,7 +23,7 @@
"name": "Name",
"description": "Description",
"username": "Username",
"password": "***",
"password": "Password",
"email": "Email",
"source": "Source",
"local": "Local",
@@ -57,9 +57,9 @@
"login": {
"title": "VPN Management Platform",
"subtitle": "Unified multi-protocol VPN management — simple, secure, and controllable",
"protocols": "WireGuard · IPSec · L2TP · FRP · OpenVPN · Custom Protocol Plugins",
"protocols": "WireGuard · IPSec · IKEv2 · L2TP · GRE · FRP · OpenVPN",
"feature1Title": "Multi-Protocol Unified Management",
"feature1Desc": "WireGuard / IPSec / L2TP / FRP / OpenVPN",
"feature1Desc": "WireGuard / IPSec / IKEv2 / L2TP / GRE / OpenVPN",
"feature2Title": "Enterprise-Grade Security",
"feature2Desc": "AES-GCM encrypted keys + Two-Factor Authentication",
"feature3Title": "One-Click Configuration",
@@ -89,6 +89,10 @@
"totalTraffic": "Total Traffic ↓↑",
"protocolDistribution": "Protocol Distribution",
"protocolEngineStatus": "Protocol Engine Status",
"hostReadinessWarning": "Host prerequisites are incomplete. VPN forwarding or NAT may not work correctly.",
"readinessRoot": "Service is not running as root",
"readinessForwarding": "IPv4 forwarding is disabled",
"readinessRoute": "No default egress route detected",
"depCheckResult": "System dependency check results",
"depReady": "Ready",
"demoMode": "Demo Mode",
@@ -217,6 +221,15 @@
"sensitiveFieldHint": "Sensitive fields like passwords, PSK, and tokens are not displayed. Leave empty to keep the current value.",
"tunnelName": "Tunnel Name",
"protocolType": "Protocol Type",
"coreOptions": "Core Connection Settings",
"advancedOptions": "Detailed Settings",
"trafficMode": "Traffic Egress",
"trafficGateway": "All Traffic via VPN Gateway",
"trafficStatic": "Static Routes Only",
"trafficCustom": "Custom",
"trafficGatewayTip": "Routes all client traffic through the VPN gateway with NAT egress.",
"trafficStaticTip": "Pushes only the target networks below and preserves the client's default Internet route.",
"trafficCustomTip": "Control the default route, static routes, and NAT separately in detailed settings.",
"keepOriginal": "Leave empty to keep original",
"expireTime": "Expiry Time",
"expirePlaceholder": "Leave empty for permanent",
@@ -241,6 +254,14 @@
"namePlaceholder": "e.g., HQ-Branch Interconnect",
"protocolType": "Protocol Type",
"reselect": "Reselect",
"coreOptions": "Core Connection Settings",
"trafficMode": "Traffic Egress",
"trafficGateway": "All Traffic via VPN Gateway",
"trafficStatic": "Static Routes Only",
"trafficCustom": "Custom",
"trafficGatewayTip": "Routes all client traffic through the VPN gateway with NAT egress.",
"trafficStaticTip": "Pushes only the target networks below and preserves the client's default Internet route.",
"trafficCustomTip": "Control the default route, static routes, and NAT separately in detailed settings.",
"advancedOptions": "Advanced Options",
"expireTime": "Expiry Time",
"expirePlaceholder": "Leave empty for permanent",
@@ -337,6 +358,20 @@
"title": "VPN Dial-in Users",
"mfaHint": "OpenVPN Two-Factor Auth (TOTP / Static Challenge / PIN+OTP)",
"addUser": "Add User",
"bulkImport": "Bulk Import",
"bulkImportTitle": "Import Platform Users",
"bulkImportHint": "Only OpenVPN supports platform local or LDAP account imports. Create dedicated accounts for L2TP/IKEv2.",
"importSelected": "Import Selected",
"importedCount": "Imported {count} users",
"importFailed": "Bulk import failed",
"selectOpenVPNTunnel": "Select OpenVPN Tunnel",
"selectTunnelAndUsers": "Select an OpenVPN tunnel and platform users",
"searchPlaceholder": "Search username, name, or email",
"allTunnels": "All Tunnels",
"selectedUsers": "{count} users selected",
"batchDelete": "Bulk Delete",
"batchDeleteConfirm": "Delete the selected {count} VPN dial-in users?",
"batchDeleteDone": "Selected VPN dial-in users deleted",
"displayName": "Name",
"tunnel": "Tunnel",
"otpMfa": "OTP / MFA",
@@ -359,6 +394,14 @@
"clickRowHint": "Click a row to select and auto-fill",
"otpDialogTitle": "Two-Factor Auth — {username}",
"otpHint": "TOTP-based two-factor authentication (SHA1 / base32 / 30s / 6 digits), compatible with major Authenticator apps. Supports static challenge and PIN+OTP combo mode.",
"mfaNotEnabled": "Two-factor authentication is not enabled",
"mfaDisabledHint": "Bind an Authenticator app to require a one-time code when this user signs in to VPN.",
"mfaEnabledHint": "This user must provide both their password and a one-time code to sign in to VPN.",
"mfaSetupIntro": "Bind an Authenticator app to protect this user's VPN dial-in access.",
"manualSetup": "Can't scan? Use a manual key",
"verifySetup": "Confirm Binding",
"verifySetupHint": "After scanning in Authenticator, enter the current 6-digit code to verify the binding.",
"securityDetails": "Security Details",
"bindStatus": "Bind Status",
"boundTotp": "TOTP Bound",
"staticPin": "Static PIN",
@@ -766,13 +809,6 @@
"label": "Machine Auth PSK",
"tip": "Leave empty to auto-generate; shared key for iOS/Android"
},
"username": {
"label": "Default Dial-in User"
},
"password": {
"label": "Default Dial-in Password",
"tip": "Leave empty to auto-generate; add more users in VPN Dial-in Users"
},
"address_pool": {
"label": "Client Address Pool"
},
@@ -800,15 +836,8 @@
"label": "Server Public IP"
},
"psk": {
"label": "IPSec Pre-Shared Key"
},
"username": {
"label": "Default Dial-in Username",
"tip": "Add more users for this tunnel in VPN Dial-in Users"
},
"password": {
"label": "Default Dial-in Password",
"tip": "Leave empty if using only the dial-in user table (at least one method required at creation)"
"label": "IPSec Pre-Shared Key",
"tip": "Leave blank to generate a high-strength random key; retrieve it securely from client configuration after creation"
},
"ip_range": {
"label": "Client Address Pool"
@@ -821,6 +850,22 @@
}
}
},
"gre": {
"name": "GRE Tunnel",
"desc": "Standard IP protocol 47 tunnel for point-to-point Layer 3 connectivity between Linux, routers, and firewalls",
"scenes": "Network Device Interconnect / Site-to-Site Routing",
"fields": {
"local_endpoint": { "label": "Local Public IP" },
"remote_endpoint": { "label": "Remote Public IP" },
"local_tunnel_ip": { "label": "Local Tunnel IP", "tip": "Use a /30, for example 10.255.0.1/30" },
"remote_tunnel_ip": { "label": "Remote Tunnel IP", "tip": "Must share the local tunnel IP subnet" },
"remote_subnet": { "label": "Remote LAN Subnet", "tip": "Adds a static route through the GRE peer" },
"enable_nat": { "label": "NAT Remote Traffic", "tip": "Enable only when the remote subnet needs Internet egress via this host" },
"outbound_interface": { "label": "NAT Egress Interface" },
"ttl": { "label": "TTL" },
"mtu": { "label": "GRE MTU", "tip": "1476 is typical over public Internet GRE; lower it for additional encapsulation" }
}
},
"frp": {
"name": "FRP NAT Traversal",
"desc": "TCP/UDP/HTTP port forwarding and reverse proxy for NAT traversal",
@@ -941,7 +986,7 @@
"tip": "Password mode aligns with verify-client-cert none + username-as-common-name",
"options": {
"certificate": "Certificate Only",
"password": "***",
"password": "Username + Password",
"certificate+password": "Certificate + Password"
}
},
@@ -974,8 +1019,10 @@
"tip": "When off, only pushes internal routes below (common in production)"
},
"push_routes": {
"label": "Push Internal Routes",
"tip": "CIDR, comma-separated"
"label": "Push Routes",
"tip": "One IP or CIDR per line; # comments are supported",
"placeholder": "# VPC networks\n172.16.0.0/16\n# Staging\n43.129.24.233",
"format_error": "Invalid route format: {route}"
},
"enable_nat": {
"label": "Enable NAT Outbound"