Linux: add option to persist TUN device

This commit is contained in:
Jason
2019-11-06 10:45:07 +08:00
parent 3379244ff7
commit 43a90e00d3
4 changed files with 14 additions and 11 deletions

18
main.go
View File

@@ -37,13 +37,14 @@ var (
type CmdArgs struct { type CmdArgs struct {
// Main // Main
Version *bool Version *bool
TunName *string TunName *string
TunAddr *string TunAddr *string
TunGw *string TunGw *string
TunMask *string TunMask *string
TunDNS *string TunDNS *string
LogLevel *string TunPersist *bool
LogLevel *string
// Proxy // Proxy
ProxyServer *string ProxyServer *string
@@ -74,6 +75,7 @@ func init() {
args.TunGw = flag.String("tunGw", "240.0.0.1", "TUN interface gateway") args.TunGw = flag.String("tunGw", "240.0.0.1", "TUN interface gateway")
args.TunMask = flag.String("tunMask", "255.255.255.0", "TUN interface netmask") args.TunMask = flag.String("tunMask", "255.255.255.0", "TUN interface netmask")
args.TunDNS = flag.String("tunDNS", "8.8.8.8,8.8.4.4", "DNS resolvers for TUN interface (Windows Only)") args.TunDNS = flag.String("tunDNS", "8.8.8.8,8.8.4.4", "DNS resolvers for TUN interface (Windows Only)")
args.TunPersist = flag.Bool("tunPersist", false, "Persist TUN interface after the program exits or the last open file descriptor is closed (Linux only)")
// Proxy // Proxy
args.ProxyServer = flag.String("proxyServer", "", "Proxy server address") args.ProxyServer = flag.String("proxyServer", "", "Proxy server address")
@@ -128,7 +130,7 @@ func main() {
// Open the tun device // Open the tun device
dnsServers := strings.Split(*args.TunDNS, ",") dnsServers := strings.Split(*args.TunDNS, ",")
tunDev, err := tun.OpenTunDevice(*args.TunName, *args.TunAddr, *args.TunGw, *args.TunMask, dnsServers) tunDev, err := tun.OpenTunDevice(*args.TunName, *args.TunAddr, *args.TunGw, *args.TunMask, dnsServers, *args.TunPersist)
if err != nil { if err != nil {
log.Fatalf("failed to open tun device: %v", err) log.Fatalf("failed to open tun device: %v", err)
} }

View File

@@ -30,7 +30,7 @@ func isIPv6(ip net.IP) bool {
return false return false
} }
func OpenTunDevice(name, addr, gw, mask string, dnsServers []string) (io.ReadWriteCloser, error) { func OpenTunDevice(name, addr, gw, mask string, dnsServers []string, persist bool) (io.ReadWriteCloser, error) {
_ = dnsServers _ = dnsServers
tunDev, err := water.New(water.Config{ tunDev, err := water.New(water.Config{
DeviceType: water.TUN, DeviceType: water.TUN,

View File

@@ -8,11 +8,12 @@ import (
"github.com/songgao/water" "github.com/songgao/water"
) )
func OpenTunDevice(name, addr, gw, mask string, dnsServers []string) (io.ReadWriteCloser, error) { func OpenTunDevice(name, addr, gw, mask string, dnsServers []string, persist bool) (io.ReadWriteCloser, error) {
cfg := water.Config{ cfg := water.Config{
DeviceType: water.TUN, DeviceType: water.TUN,
} }
cfg.Name = name cfg.Name = name
cfg.Persist = persist
tunDev, err := water.New(cfg) tunDev, err := water.New(cfg)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@@ -157,7 +157,7 @@ func getTuntapComponentId(ifaceName string) (string, string, error) {
return "", "", errors.New("not found component id") return "", "", errors.New("not found component id")
} }
func OpenTunDevice(name, addr, gw, mask string, dns []string) (io.ReadWriteCloser, error) { func OpenTunDevice(name, addr, gw, mask string, dns []string, persist bool) (io.ReadWriteCloser, error) {
componentId, devName, err := getTuntapComponentId(name) componentId, devName, err := getTuntapComponentId(name)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to get component ID: %v", err) return nil, fmt.Errorf("failed to get component ID: %v", err)