mirror of
https://github.com/xjasonlyu/tun2socks.git
synced 2025-10-13 20:44:12 +08:00
update session & fakeDNS
This commit is contained in:
34
cmd/main.go
34
cmd/main.go
@@ -29,12 +29,10 @@ var (
|
|||||||
version = "unknown version"
|
version = "unknown version"
|
||||||
description = "A tun2socks implementation written in Go."
|
description = "A tun2socks implementation written in Go."
|
||||||
|
|
||||||
args = new(CmdArgs)
|
args = new(CmdArgs)
|
||||||
|
|
||||||
postFlagsInitFn []func()
|
postFlagsInitFn []func()
|
||||||
|
|
||||||
lwipWriter io.Writer
|
fakeDNS dns.FakeDNS
|
||||||
fakeDns dns.FakeDns
|
|
||||||
sessionStater stats.SessionStater
|
sessionStater stats.SessionStater
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -45,7 +43,7 @@ type CmdArgs struct {
|
|||||||
TunAddr *string
|
TunAddr *string
|
||||||
TunGw *string
|
TunGw *string
|
||||||
TunMask *string
|
TunMask *string
|
||||||
TunDns *string
|
TunDNS *string
|
||||||
LogLevel *string
|
LogLevel *string
|
||||||
|
|
||||||
// Proxy
|
// Proxy
|
||||||
@@ -53,11 +51,11 @@ type CmdArgs struct {
|
|||||||
UdpTimeout *time.Duration
|
UdpTimeout *time.Duration
|
||||||
|
|
||||||
// FakeDNS
|
// FakeDNS
|
||||||
EnableFakeDns *bool
|
EnableFakeDNS *bool
|
||||||
DnsCacheSize *int
|
DNSCacheSize *int
|
||||||
FakeIPRange *string
|
FakeIPRange *string
|
||||||
FakeDnsAddr *string
|
FakeDNSAddr *string
|
||||||
FakeDnsHosts *string
|
FakeDNSHosts *string
|
||||||
|
|
||||||
// Stats
|
// Stats
|
||||||
Stats *bool
|
Stats *bool
|
||||||
@@ -76,7 +74,7 @@ func init() {
|
|||||||
args.TunAddr = flag.String("tunAddr", "240.0.0.2", "TUN interface address")
|
args.TunAddr = flag.String("tunAddr", "240.0.0.2", "TUN interface address")
|
||||||
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, it should be a prefix length (a number) for IPv6 address")
|
args.TunMask = flag.String("tunMask", "255.255.255.0", "TUN interface netmask, it should be a prefix length (a number) for IPv6 address")
|
||||||
args.TunDns = flag.String("tunDns", "1.1.1.1", "DNS resolvers for TUN interface (Windows Only)")
|
args.TunDNS = flag.String("tunDNS", "1.1.1.1", "DNS resolvers for TUN interface (Windows Only)")
|
||||||
|
|
||||||
// Proxy
|
// Proxy
|
||||||
args.ProxyServer = flag.String("proxyServer", "", "Proxy server address")
|
args.ProxyServer = flag.String("proxyServer", "", "Proxy server address")
|
||||||
@@ -117,16 +115,16 @@ 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)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("failed to open tun device: %v", err)
|
log.Fatalf("failed to open tun device: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup TCP/IP stack.
|
// Setup TCP/IP stack.
|
||||||
|
var lwipWriter = core.NewLWIPStack().(io.Writer)
|
||||||
// Wrap a writer to delay ICMP packets.
|
// Wrap a writer to delay ICMP packets.
|
||||||
w := core.NewLWIPStack().(io.Writer)
|
lwipWriter = filter.NewICMPFilter(lwipWriter).(io.Writer)
|
||||||
lwipWriter = filter.NewICMPFilter(w).(io.Writer)
|
|
||||||
|
|
||||||
// Register TCP and UDP handlers to handle accepted connections.
|
// Register TCP and UDP handlers to handle accepted connections.
|
||||||
proxyAddr, err := net.ResolveTCPAddr("tcp", *args.ProxyServer)
|
proxyAddr, err := net.ResolveTCPAddr("tcp", *args.ProxyServer)
|
||||||
@@ -135,8 +133,8 @@ func main() {
|
|||||||
}
|
}
|
||||||
proxyHost := proxyAddr.IP.String()
|
proxyHost := proxyAddr.IP.String()
|
||||||
proxyPort := proxyAddr.Port
|
proxyPort := proxyAddr.Port
|
||||||
core.RegisterTCPConnHandler(proxy.NewTCPHandler(proxyHost, proxyPort, fakeDns, sessionStater))
|
core.RegisterTCPConnHandler(proxy.NewTCPHandler(proxyHost, proxyPort, fakeDNS, sessionStater))
|
||||||
core.RegisterUDPConnHandler(proxy.NewUDPHandler(proxyHost, proxyPort, *args.UdpTimeout, fakeDns, sessionStater))
|
core.RegisterUDPConnHandler(proxy.NewUDPHandler(proxyHost, proxyPort, *args.UdpTimeout, fakeDNS, sessionStater))
|
||||||
|
|
||||||
// Register an output callback to write packets output from lwip stack to tun
|
// Register an output callback to write packets output from lwip stack to tun
|
||||||
// device, output function should be set before input any packets.
|
// device, output function should be set before input any packets.
|
||||||
@@ -157,6 +155,12 @@ func main() {
|
|||||||
signal.Notify(osSignals, os.Interrupt, os.Kill, syscall.SIGTERM, syscall.SIGHUP)
|
signal.Notify(osSignals, os.Interrupt, os.Kill, syscall.SIGTERM, syscall.SIGHUP)
|
||||||
<-osSignals
|
<-osSignals
|
||||||
|
|
||||||
|
// Stop fakeDNS server
|
||||||
|
if fakeDNS != nil {
|
||||||
|
fakeDNS.Stop()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop session stater
|
||||||
if sessionStater != nil {
|
if sessionStater != nil {
|
||||||
sessionStater.Stop()
|
sessionStater.Stop()
|
||||||
}
|
}
|
||||||
|
@@ -17,7 +17,7 @@ func init() {
|
|||||||
sessionStater = session.NewSimpleSessionStater()
|
sessionStater = session.NewSimpleSessionStater()
|
||||||
|
|
||||||
// stats variables
|
// stats variables
|
||||||
session.StatsAddr = *args.StatsAddr
|
session.ServeAddr = *args.StatsAddr
|
||||||
session.StatsVersion = version
|
session.StatsVersion = version
|
||||||
|
|
||||||
// start session stater
|
// start session stater
|
||||||
|
@@ -6,6 +6,7 @@ import (
|
|||||||
|
|
||||||
D "github.com/miekg/dns"
|
D "github.com/miekg/dns"
|
||||||
"github.com/xjasonlyu/tun2socks/common/fakeip"
|
"github.com/xjasonlyu/tun2socks/common/fakeip"
|
||||||
|
"github.com/xjasonlyu/tun2socks/common/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -13,6 +14,10 @@ const (
|
|||||||
dnsDefaultTTL uint32 = 600
|
dnsDefaultTTL uint32 = 600
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ServeAddr = "127.0.0.1:5353"
|
||||||
|
)
|
||||||
|
|
||||||
type Server struct {
|
type Server struct {
|
||||||
*D.Server
|
*D.Server
|
||||||
p *fakeip.Pool
|
p *fakeip.Pool
|
||||||
@@ -28,13 +33,14 @@ func (s *Server) ServeDNS(w D.ResponseWriter, r *D.Msg) {
|
|||||||
s.h(w, r)
|
s.h(w, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) StartServer(addr string) error {
|
func (s *Server) Start() error {
|
||||||
_, port, err := net.SplitHostPort(addr)
|
log.Debugf("Start fake DNS server")
|
||||||
|
_, port, err := net.SplitHostPort(ServeAddr)
|
||||||
if port == "0" || port == "" || err != nil {
|
if port == "0" || port == "" || err != nil {
|
||||||
return errors.New("address format error")
|
return errors.New("address format error")
|
||||||
}
|
}
|
||||||
|
|
||||||
udpAddr, err := net.ResolveUDPAddr("udp", addr)
|
udpAddr, err := net.ResolveUDPAddr("udp", ServeAddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -44,12 +50,16 @@ func (s *Server) StartServer(addr string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
s.Server = &D.Server{Addr: addr, PacketConn: p, Handler: s}
|
s.Server = &D.Server{Addr: ServeAddr, PacketConn: p, Handler: s}
|
||||||
go s.ActivateAndServe()
|
go s.ActivateAndServe()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Server) Stop() error {
|
||||||
|
log.Debugf("Stop fake DNS server")
|
||||||
|
return s.Shutdown()
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Server) IPToHost(ip net.IP) (string, bool) {
|
func (s *Server) IPToHost(ip net.IP) (string, bool) {
|
||||||
return s.p.LookBack(ip)
|
return s.p.LookBack(ip)
|
||||||
}
|
}
|
||||||
|
@@ -17,8 +17,8 @@ import (
|
|||||||
const maxCompletedSessions = 100
|
const maxCompletedSessions = 100
|
||||||
|
|
||||||
var (
|
var (
|
||||||
StatsAddr = "localhost:6001"
|
ServeAddr = "localhost:6001"
|
||||||
StatsPath = "/stats/session/plain"
|
ServePath = "/stats/session/plain"
|
||||||
|
|
||||||
StatsVersion = ""
|
StatsVersion = ""
|
||||||
)
|
)
|
||||||
@@ -98,20 +98,21 @@ table, th, td {
|
|||||||
_ = w.Flush()
|
_ = w.Flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *simpleSessionStater) Start() {
|
func (s *simpleSessionStater) Start() error {
|
||||||
log.Debugf("Start session stater")
|
log.Debugf("Start session stater")
|
||||||
mux := http.NewServeMux()
|
mux := http.NewServeMux()
|
||||||
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||||||
http.Redirect(w, r, StatsPath, 301)
|
http.Redirect(w, r, ServePath, 301)
|
||||||
})
|
})
|
||||||
mux.HandleFunc(StatsPath, s.sessionStatsHandler)
|
mux.HandleFunc(ServePath, s.sessionStatsHandler)
|
||||||
s.server = &http.Server{Addr: StatsAddr, Handler: mux}
|
s.server = &http.Server{Addr: ServeAddr, Handler: mux}
|
||||||
go s.server.ListenAndServe()
|
go s.server.ListenAndServe()
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *simpleSessionStater) Stop() {
|
func (s *simpleSessionStater) Stop() error {
|
||||||
log.Debugf("Stop session stater")
|
log.Debugf("Stop session stater")
|
||||||
s.server.Close()
|
return s.server.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *simpleSessionStater) AddSession(key interface{}, session *stats.Session) {
|
func (s *simpleSessionStater) AddSession(key interface{}, session *stats.Session) {
|
||||||
|
@@ -8,8 +8,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type SessionStater interface {
|
type SessionStater interface {
|
||||||
Start()
|
Start() error
|
||||||
Stop()
|
Stop() error
|
||||||
AddSession(key interface{}, session *Session)
|
AddSession(key interface{}, session *Session)
|
||||||
GetSession(key interface{}) *Session
|
GetSession(key interface{}) *Session
|
||||||
RemoveSession(key interface{})
|
RemoveSession(key interface{})
|
||||||
|
Reference in New Issue
Block a user