- 新增 TUN 设备层(water 库),分 linux/darwin 平台配置 IP/路由/MTU - 实现 IP 分配管理:动态池自动分配 + 按用户静态预留,支持热更新 - 实现 PacketSwitch 共享 TUN 包转发:源 IP 防伪、按目的 IP 查表转发、allow-c2c - 重写隧道:自研简化 WS 协议(文本帧 JSON 控制 init/ready,二进制帧=原始 IP 包) - VpnService 单例管理 TUN 生命周期,子网变更踢线重建,预留增删热更新 - 新增 vpn_settings/vpn_reservations 表,AutoMigrate + 默认设置 seed - 新增 Admin API:settings 读写、status、clients、reservations CRUD - 前端新增 VpnView(/admin/vpn):状态面板/设置表单/在线客户端/静态预留 - main.go 启动时按 DB 设置初始化 VPN 服务
43 lines
801 B
Go
43 lines
801 B
Go
package vpn
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
|
|
"github.com/songgao/water"
|
|
)
|
|
|
|
type TUNInterface struct {
|
|
Iface *water.Interface
|
|
}
|
|
|
|
func CreateTUN(name string) (*TUNInterface, error) {
|
|
cfg := water.Config{DeviceType: water.TUN}
|
|
cfg.Name = name
|
|
ifce, err := water.New(cfg)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("创建 TUN 设备失败: %w", err)
|
|
}
|
|
return &TUNInterface{Iface: ifce}, nil
|
|
}
|
|
|
|
func (t *TUNInterface) Name() string {
|
|
return t.Iface.Name()
|
|
}
|
|
|
|
func (t *TUNInterface) Close() error {
|
|
return t.Iface.Close()
|
|
}
|
|
|
|
func execCmd(name string, arg ...string) error {
|
|
cmd := exec.Command(name, arg...)
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stderr = os.Stderr
|
|
if err := cmd.Run(); err != nil {
|
|
return fmt.Errorf("command %s %s: %w", name, strings.Join(arg, " "), err)
|
|
}
|
|
return nil
|
|
}
|