mirror of
https://github.com/xjasonlyu/tun2socks.git
synced 2025-10-05 16:56:54 +08:00
Linux: add option to persist TUN device
This commit is contained in:
18
main.go
18
main.go
@@ -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)
|
||||||
}
|
}
|
||||||
|
@@ -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,
|
||||||
|
@@ -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
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user