Skip to content

Commit

Permalink
feat: add routes from rules
Browse files Browse the repository at this point in the history
  • Loading branch information
Mythologyli committed Oct 22, 2023
1 parent 1467ba1 commit 2f6ecd2
Show file tree
Hide file tree
Showing 11 changed files with 148 additions and 38 deletions.
1 change: 1 addition & 0 deletions config.toml.example
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ socks_user = ""
socks_passwd = ""
http_bind = ":1081"
tun_mode = false
add_route = false
dns_ttl = 3600
disable_keep_alive = false
zju_dns_server = "10.10.0.21"
Expand Down
20 changes: 20 additions & 0 deletions core/EasyConnectClient.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ var SocksUser string
var SocksPasswd string
var HttpBind string
var TunMode bool
var AddRoute bool
var DebugDump bool
var ParseServConfig bool
var ParseZjuConfig bool
Expand Down Expand Up @@ -144,6 +145,20 @@ func StartClient(host string, port int, username string, password string, twfId
client.tunEndpoint = &EasyConnectTunEndpoint{}
SetupTunStack(ip, client.tunEndpoint)

// Add routes
if AddRoute && config.IsIpv4SetAvailable() {
ipv4Set := config.GetIpv4Set()

if err != nil {
log.Printf("Cannot get ipset: %v", err)
} else {
for _, prefix := range ipv4Set.Prefixes() {
log.Printf("Add route to %s", prefix.String())
_ = client.tunEndpoint.AddRoute(prefix.String())
}
}
}

StartProtocolWithTun(client.tunEndpoint, client.server, client.token, &[4]byte{client.clientIp[3], client.clientIp[2], client.clientIp[1], client.clientIp[0]}, DebugDump)
} else {
// Use Gvisor stack
Expand Down Expand Up @@ -260,6 +275,11 @@ func (client *EasyConnectClient) ParseAllConfig() {
parser.ParseZjuIpv4Rules(DebugDump)
parser.ParseZjuForceProxyRules(DebugDump)
}

err := config.GenerateIpv4Set()
if err != nil {
return
}
}

func (client *EasyConnectClient) GetClientIp() ([]byte, error) {
Expand Down
6 changes: 6 additions & 0 deletions core/config/DnsRules.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (

// domain[ip]
var dnsRules *hashmap.Map[string, string]
var dnsIps []string

func AppendSingleDnsRule(domain, ip string, debug bool) {
if dnsRules == nil {
Expand All @@ -19,6 +20,7 @@ func AppendSingleDnsRule(domain, ip string, debug bool) {
}

dnsRules.Set(domain, ip)
dnsIps = append(dnsIps, ip)
}

func GetSingleDnsRule(domain string) (string, bool) {
Expand All @@ -36,3 +38,7 @@ func GetDnsRuleLen() int {
return 0
}
}

func GetDnsIps() []string {
return dnsIps
}
48 changes: 48 additions & 0 deletions core/config/Ipv4Set.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package config

import (
"inet.af/netaddr"
"strings"
)

var Ipv4Set *netaddr.IPSet

func GenerateIpv4Set() error {
ipv4SetBuilder := netaddr.IPSetBuilder{}

dnsIps := GetDnsIps()
if dnsIps != nil {
for _, ip := range dnsIps {
ipv4SetBuilder.Add(netaddr.MustParseIP(ip))
}
}

ipv4RangeRules := GetIpv4Rules()
if ipv4RangeRules != nil {
for _, rule := range *ipv4RangeRules {
if rule.CIDR {
ipv4SetBuilder.AddPrefix(netaddr.MustParseIPPrefix(rule.Rule))
} else {
ip1 := netaddr.MustParseIP(strings.Split(rule.Rule, "~")[0])
ip2 := netaddr.MustParseIP(strings.Split(rule.Rule, "~")[1])
ipv4SetBuilder.AddRange(netaddr.IPRangeFrom(ip1, ip2))
}
}
}

var err error
Ipv4Set, err = ipv4SetBuilder.IPSet()
if err != nil {
return err
}

return nil
}

func IsIpv4SetAvailable() bool {
return Ipv4Set != nil
}

func GetIpv4Set() *netaddr.IPSet {
return Ipv4Set
}
40 changes: 8 additions & 32 deletions core/dialer.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package core

import (
"bytes"
"context"
"errors"
"github.com/mythologyli/zju-connect/core/config"
"gvisor.dev/gvisor/pkg/tcpip"
"gvisor.dev/gvisor/pkg/tcpip/adapters/gonet"
"gvisor.dev/gvisor/pkg/tcpip/header"
"inet.af/netaddr"
"log"
"net"
"strconv"
Expand Down Expand Up @@ -77,39 +77,15 @@ func (dialer *Dialer) DialIpAndPort(ctx context.Context, network, addr string) (
}
}

if !useProxy && config.IsIpv4RuleAvailable() {
if !useProxy && config.IsIpv4SetAvailable() {
if DebugDump {
log.Printf("IPv4 rule is available ")
log.Printf("IPv4 set is available ")
}
for _, rule := range *config.GetIpv4Rules() {
if rule.CIDR {
_, cidr, _ := net.ParseCIDR(rule.Rule)
if DebugDump {
log.Printf("CIDR test: %s %s %v", target.IP, rule.Rule, cidr.Contains(target.IP))
}

if cidr.Contains(target.IP) {
if DebugDump {
log.Printf("CIDR matched: %s %s", target.IP, rule.Rule)
}

useProxy = true
}
} else {
if DebugDump {
log.Printf("Raw match test: %s %s", target.IP, rule.Rule)
}

ip1 := net.ParseIP(strings.Split(rule.Rule, "~")[0])
ip2 := net.ParseIP(strings.Split(rule.Rule, "~")[1])

if bytes.Compare(target.IP, ip1) >= 0 && bytes.Compare(target.IP, ip2) <= 0 {
if DebugDump {
log.Printf("Raw matched: %s %s", ip1, ip2)
}

useProxy = true
}
ipv4Set := config.GetIpv4Set()
ip, ok := netaddr.FromStdIP(target.IP)
if ok {
if ipv4Set.Contains(ip) {
useProxy = true
}
}
}
Expand Down
12 changes: 11 additions & 1 deletion core/tun_stack_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,16 @@ func (ep *EasyConnectTunEndpoint) Read(buf []byte) (int, error) {
return ep.ifce.Read(buf)
}

func (ep *EasyConnectTunEndpoint) AddRoute(target string) error {
command := exec.Command("route", "-n", "add", "-net", target, "-interface", ep.ifce.Name())
err := command.Run()
if err != nil {
return err
}

return nil
}

func SetupTunStack(ip []byte, endpoint *EasyConnectTunEndpoint) {
ifce, err := water.New(water.Config{
DeviceType: water.TUN,
Expand All @@ -32,7 +42,7 @@ func SetupTunStack(ip []byte, endpoint *EasyConnectTunEndpoint) {

endpoint.ifce = ifce

cmd := exec.Command("/sbin/ifconfig", ifce.Name(), fmt.Sprintf("%d.%d.%d.%d/8", ip[0], ip[1], ip[2], ip[3]), "up")
cmd := exec.Command("ifconfig", ifce.Name(), fmt.Sprintf("%d.%d.%d.%d/8", ip[0], ip[1], ip[2], ip[3]), "up")
err = cmd.Run()
if err != nil {
log.Printf("Run %s failed: %v", cmd.String(), err)
Expand Down
10 changes: 10 additions & 0 deletions core/tun_stack_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,16 @@ func (ep *EasyConnectTunEndpoint) Read(buf []byte) (int, error) {
return ep.ifce.Read(buf)
}

func (ep *EasyConnectTunEndpoint) AddRoute(target string) error {
command := exec.Command("ip", "route", "add", target, "dev", ep.ifce.Name())
err := command.Run()
if err != nil {
return err
}

return nil
}

func SetupTunStack(ip []byte, endpoint *EasyConnectTunEndpoint) {
ifce, err := water.New(water.Config{
DeviceType: water.TUN,
Expand Down
14 changes: 9 additions & 5 deletions core/tun_stack_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ import (
)

type EasyConnectTunEndpoint struct {
dev tun.Device
dev tun.Device
selfIp string
}

func (ep *EasyConnectTunEndpoint) Write(buf []byte) error {
Expand Down Expand Up @@ -44,7 +45,7 @@ func (ep *EasyConnectTunEndpoint) Read(buf []byte) (int, error) {
return sizes[0], nil
}

func AddRoute(target string, interfaceIp string, metric string) error {
func (ep *EasyConnectTunEndpoint) AddRoute(target string) error {
ipaddr, ipv4Net, err := net.ParseCIDR(target)
if err != nil {
return err
Expand All @@ -55,7 +56,7 @@ func AddRoute(target string, interfaceIp string, metric string) error {
return fmt.Errorf("not a valid IPv4 address")
}

command := exec.Command("route", "add", ip.String(), "mask", net.IP(ipv4Net.Mask).String(), interfaceIp, "metric", metric)
command := exec.Command("route", "add", ip.String(), "mask", net.IP(ipv4Net.Mask).String(), ep.selfIp, "metric", "1")
err = command.Run()
if err != nil {
return err
Expand Down Expand Up @@ -83,6 +84,8 @@ func SetupTunStack(ip []byte, endpoint *EasyConnectTunEndpoint) {

ipStr := fmt.Sprintf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3])

endpoint.selfIp = ipStr

prefix, err := netip.ParsePrefix(ipStr + "/8")
if err != nil {
log.Printf("Parse prefix failed: %v", err)
Expand All @@ -93,9 +96,10 @@ func SetupTunStack(ip []byte, endpoint *EasyConnectTunEndpoint) {
log.Printf("Set IP address failed: %v", err)
}

err = AddRoute("0.0.0.0/0", ipStr, "9999")
command := exec.Command("route", "add", "0.0.0.0", "mask", "0.0.0.0", ipStr, "metric", "9999")
err = command.Run()
if err != nil {
log.Printf("Add route failed: %v", err)
log.Printf("Run %s failed: %v", command.String(), err)
}

if TunDnsServer != "" {
Expand Down
3 changes: 3 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ require (
golang.zx2c4.com/wireguard v0.0.0-20231022001213-2e0774f246fb
golang.zx2c4.com/wireguard/windows v0.5.3
gvisor.dev/gvisor v0.0.0-20231020174304-b8a429915ff1
inet.af/netaddr v0.0.0-20230525184311-b8eac61e914a
)

require (
Expand All @@ -28,6 +29,8 @@ require (
github.com/google/btree v1.1.2 // indirect
github.com/klauspost/compress v1.17.1 // indirect
github.com/quic-go/quic-go v0.39.1 // indirect
go4.org/intern v0.0.0-20211027215823-ae77deb06f29 // indirect
go4.org/unsafe/assume-no-moving-gc v0.0.0-20230525183740-e7c30c78aeb2 // indirect
golang.org/x/crypto v0.14.0 // indirect
golang.org/x/mod v0.13.0 // indirect
golang.org/x/text v0.13.0 // indirect
Expand Down
29 changes: 29 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dlclark/regexp2 v1.10.0 h1:+/GIL799phkJqYW+3YbOd8LCcbHzT0Pbo8zl70MHsq0=
github.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw=
github.com/gaukas/godicttls v0.0.4 h1:NlRaXb3J6hAnTmWdsEKb9bcSBD6BvcIjdGdeb0zfXbk=
github.com/gaukas/godicttls v0.0.4/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67deKr9/NCI=
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
Expand Down Expand Up @@ -48,24 +49,50 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/things-go/go-socks5 v0.0.4 h1:jMQjIc+qhD4z9cITOMnBiwo9dDmpGuXmBlkRFrl/qD0=
github.com/things-go/go-socks5 v0.0.4/go.mod h1:sh4K6WHrmHZpjxLTCHyYtXYH8OUuD+yZun41NomR1IQ=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go4.org/intern v0.0.0-20211027215823-ae77deb06f29 h1:UXLjNohABv4S58tHmeuIZDO6e3mHpW2Dx33gaNt03LE=
go4.org/intern v0.0.0-20211027215823-ae77deb06f29/go.mod h1:cS2ma+47FKrLPdXFpr7CuxiTW3eyJbWew4qx0qtQWDA=
go4.org/unsafe/assume-no-moving-gc v0.0.0-20211027215541-db492cf91b37/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E=
go4.org/unsafe/assume-no-moving-gc v0.0.0-20230525183740-e7c30c78aeb2 h1:WJhcL4p+YeDxmZWg141nRm7XC8IDmhz7lk5GpadO1Sg=
go4.org/unsafe/assume-no-moving-gc v0.0.0-20230525183740-e7c30c78aeb2/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY=
golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ=
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc=
golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 h1:B82qJJgjvYKsXS9jeunTOisW56dUokqW/FOteYJJ/yg=
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI=
golang.zx2c4.com/wireguard v0.0.0-20231022001213-2e0774f246fb h1:c5tyN8sSp8jSDxdCCDXVOpJwYXXhmTkNMt+g0zTSOic=
Expand All @@ -76,3 +103,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gvisor.dev/gvisor v0.0.0-20231020174304-b8a429915ff1 h1:qDCwdCWECGnwQSQC01Dpnp09fRHxJs9PbktotUqG+hs=
gvisor.dev/gvisor v0.0.0-20231020174304-b8a429915ff1/go.mod h1:8hmigyCdYtw5xJGfQDJzSH5Ju8XEIDBnpyi8+O6GRt8=
inet.af/netaddr v0.0.0-20230525184311-b8eac61e914a h1:1XCVEdxrvL6c0TGOhecLuB7U9zYNdxZEjvOqJreKZiM=
inet.af/netaddr v0.0.0-20230525184311-b8eac61e914a/go.mod h1:e83i32mAQOW1LAqEIweALsuK2Uw4mhQadA5r7b0Wobo=
3 changes: 3 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ type (
SocksPasswd *string `toml:"socks_passwd"`
HttpBind *string `toml:"http_bind"`
TunMode *bool `toml:"tun_mode"`
AddRoute *bool `toml:"add_route"`
DnsTTL *uint64 `toml:"dns_ttl"`
DisableKeepAlive *bool `toml:"disable_keep_alive"`
ZjuDnsServer *string `toml:"zju_dns_server"`
Expand Down Expand Up @@ -81,6 +82,7 @@ func main() {
flag.StringVar(&core.SocksPasswd, "socks-passwd", "", "SOCKS5 password, default is don't use auth")
flag.StringVar(&core.HttpBind, "http-bind", ":1081", "The address HTTP server listens on (e.g. 127.0.0.1:1081)")
flag.BoolVar(&core.TunMode, "tun-mode", false, "Enable TUN mode (experimental)")
flag.BoolVar(&core.AddRoute, "add-route", false, "Add route from rules for TUN interface")
flag.Uint64Var(&core.DnsTTL, "dns-ttl", 3600, "DNS record time to live, unit is second")
flag.BoolVar(&core.DebugDump, "debug-dump", false, "Enable traffic debug dump (only for debug usage)")
flag.StringVar(&tcpPortForwarding, "tcp-port-forwarding", "", "TCP port forwarding (e.g. 0.0.0.0:9898-10.10.98.98:80,127.0.0.1:9899-10.10.98.98:80)")
Expand Down Expand Up @@ -124,6 +126,7 @@ func main() {
core.SocksPasswd = getTomlVal(conf.SocksPasswd, "")
core.HttpBind = getTomlVal(conf.HttpBind, ":1081")
core.TunMode = getTomlVal(conf.TunMode, false)
core.AddRoute = getTomlVal(conf.AddRoute, false)
core.DnsTTL = getTomlVal(conf.DnsTTL, uint64(3600))
core.DebugDump = getTomlVal(conf.DebugDump, false)
core.EnableKeepAlive = !getTomlVal(conf.DisableKeepAlive, false)
Expand Down

0 comments on commit 2f6ecd2

Please sign in to comment.