- model: VpnSetting 新增 Subnet6 字段,VpnReservation 新增 IPAddress6 - alloc: 处理 /64 等大子网 cidr.AddressCount 溢出,回退 65536 扫描上限 - protocol: initMessage 新增 ip6/prefix6/server_ip6(omitempty 向后兼容) - service: 双分配器 alloc4+alloc6,ApplySettings 配置双 IP 与双路由, Allocate 返回 v4+v6 一对地址 - switch: SwitchConn 新增 AssignedIP6(),Register/Unregister 注册双 key, 反欺骗按 IP 版本分别校验 v4/v6 源地址 - tunnel: tunnelConn 新增 assignedIP6,init 消息填充 v6 字段 - handler: 新增 validateSubnet6(/64~/126),settings/预留 API 全面支持 v6 - diag: 新增 IPv6 forwarding 与 NAT66 masquerade 检测 - install_linux.sh: 新增 VPN_SUBNET6、ipv6 forwarding、nft/ip6tables NAT66 - 前端: v6 子网输入框、v6 预留、v6 诊断卡片、客户端列表 v6 列 - 文档: init 消息、IP 分配、子网约束、TUN 配置、NAT、反欺骗全部更新
57 lines
1.4 KiB
Go
57 lines
1.4 KiB
Go
package vpn
|
|
|
|
import (
|
|
"os"
|
|
"runtime"
|
|
)
|
|
|
|
type DiagResult struct {
|
|
Platform string `json:"platform"`
|
|
IsRoot bool `json:"is_root"`
|
|
HasCapNetAdmin *bool `json:"has_cap_net_admin"`
|
|
CapNetAdminNote string `json:"cap_net_admin_note,omitempty"`
|
|
IPForward *bool `json:"ip_forward"`
|
|
IPForwardNote string `json:"ip_forward_note,omitempty"`
|
|
Masquerade *bool `json:"masquerade"`
|
|
MasqueradeNote string `json:"masquerade_note,omitempty"`
|
|
IP6Forward *bool `json:"ip6_forward"`
|
|
IP6ForwardNote string `json:"ip6_forward_note,omitempty"`
|
|
Masquerade6 *bool `json:"masquerade6"`
|
|
Masquerade6Note string `json:"masquerade6_note,omitempty"`
|
|
TUNCreate string `json:"tun_create"`
|
|
TUNRunning bool `json:"tun_running"`
|
|
TUNName string `json:"tun_name,omitempty"`
|
|
}
|
|
|
|
func Diag(svc *VpnService) DiagResult {
|
|
r := DiagResult{Platform: runtime.GOOS, IsRoot: os.Getuid() == 0}
|
|
|
|
if svc != nil {
|
|
svc.mu.RLock()
|
|
r.TUNRunning = svc.running
|
|
if svc.tun != nil {
|
|
r.TUNName = svc.tun.Name()
|
|
}
|
|
svc.mu.RUnlock()
|
|
}
|
|
|
|
if r.TUNRunning {
|
|
r.TUNCreate = "ok: " + r.TUNName
|
|
} else {
|
|
r.TUNCreate = testTUNCreate()
|
|
}
|
|
|
|
fillPlatformDiag(&r)
|
|
return r
|
|
}
|
|
|
|
func testTUNCreate() string {
|
|
t, err := CreateTUN("")
|
|
if err != nil {
|
|
return "fail: " + err.Error()
|
|
}
|
|
name := t.Name()
|
|
_ = t.Close()
|
|
return "ok: " + name
|
|
}
|