gfwproxyshadowsocksdocker-imagegogolanggvisornatnetworksocks4socks5tcpip-stacktortun-devicetun2sockstunneludpwireguard
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
2.4 KiB
73 lines
2.4 KiB
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
|
|
"go.uber.org/automaxprocs/maxprocs"
|
|
"gopkg.in/yaml.v3"
|
|
|
|
_ "github.com/xjasonlyu/tun2socks/v2/dns"
|
|
"github.com/xjasonlyu/tun2socks/v2/engine"
|
|
"github.com/xjasonlyu/tun2socks/v2/internal/version"
|
|
"github.com/xjasonlyu/tun2socks/v2/log"
|
|
)
|
|
|
|
var (
|
|
key = new(engine.Key)
|
|
|
|
configFile string
|
|
versionFlag bool
|
|
)
|
|
|
|
func init() {
|
|
flag.IntVar(&key.Mark, "fwmark", 0, "Set firewall MARK (Linux only)")
|
|
flag.IntVar(&key.MTU, "mtu", 0, "Set device maximum transmission unit (MTU)")
|
|
flag.DurationVar(&key.UDPTimeout, "udp-timeout", 0, "Set timeout for each UDP session")
|
|
flag.StringVar(&configFile, "config", "", "YAML format configuration file")
|
|
flag.StringVar(&key.Device, "device", "", "Use this device [driver://]name")
|
|
flag.StringVar(&key.Interface, "interface", "", "Use network INTERFACE (Linux/MacOS only)")
|
|
flag.StringVar(&key.LogLevel, "loglevel", "info", "Log level [debug|info|warn|error|silent]")
|
|
flag.StringVar(&key.Proxy, "proxy", "", "Use this proxy [protocol://]host[:port]")
|
|
flag.StringVar(&key.RestAPI, "restapi", "", "HTTP statistic server listen address")
|
|
flag.StringVar(&key.TCPSendBufferSize, "tcp-sndbuf", "", "Set TCP send buffer size for netstack")
|
|
flag.StringVar(&key.TCPReceiveBufferSize, "tcp-rcvbuf", "", "Set TCP receive buffer size for netstack")
|
|
flag.BoolVar(&key.TCPModerateReceiveBuffer, "tcp-auto-tuning", false, "Enable TCP receive buffer auto-tuning")
|
|
flag.StringVar(&key.MulticastGroups, "multicast-groups", "", "Set multicast groups, separated by commas")
|
|
flag.StringVar(&key.TUNPreUp, "tun-pre-up", "", "Execute a command before TUN device setup")
|
|
flag.StringVar(&key.TUNPostUp, "tun-post-up", "", "Execute a command after TUN device setup")
|
|
flag.BoolVar(&versionFlag, "version", false, "Show version and then quit")
|
|
flag.Parse()
|
|
}
|
|
|
|
func main() {
|
|
maxprocs.Set(maxprocs.Logger(func(string, ...any) {}))
|
|
|
|
if versionFlag {
|
|
fmt.Println(version.String())
|
|
fmt.Println(version.BuildString())
|
|
os.Exit(0)
|
|
}
|
|
|
|
if configFile != "" {
|
|
data, err := os.ReadFile(configFile)
|
|
if err != nil {
|
|
log.Fatalf("Failed to read config file '%s': %v", configFile, err)
|
|
}
|
|
if err = yaml.Unmarshal(data, key); err != nil {
|
|
log.Fatalf("Failed to unmarshal config file '%s': %v", configFile, err)
|
|
}
|
|
}
|
|
|
|
engine.Insert(key)
|
|
|
|
engine.Start()
|
|
defer engine.Stop()
|
|
|
|
sigCh := make(chan os.Signal, 1)
|
|
signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
|
|
<-sigCh
|
|
}
|
|
|