update register

This commit is contained in:
Jason
2019-08-16 14:49:20 +08:00
parent a182fa8bde
commit 8fa4541d05
7 changed files with 73 additions and 63 deletions

View File

@@ -137,9 +137,12 @@ func main() {
// Wrap a writer to delay ICMP packets // Wrap a writer to delay ICMP packets
lwipWriter = filter.NewICMPFilter(lwipWriter).(io.Writer) lwipWriter = filter.NewICMPFilter(lwipWriter).(io.Writer)
// Register modules to proxy
proxy.RegisterFakeDNS(fakeDNS)
proxy.RegisterMonitor(monitor)
// Register TCP and UDP handlers to handle accepted connections. // Register TCP and UDP handlers to handle accepted connections.
core.RegisterTCPConnHandler(proxy.NewTCPHandler(proxyHost, proxyPort, fakeDNS, monitor)) core.RegisterTCPConnHandler(proxy.NewTCPHandler(proxyHost, proxyPort))
core.RegisterUDPConnHandler(proxy.NewUDPHandler(proxyHost, proxyPort, *args.UdpTimeout, fakeDNS, monitor)) core.RegisterUDPConnHandler(proxy.NewUDPHandler(proxyHost, proxyPort, *args.UdpTimeout))
// 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.

View File

@@ -134,13 +134,6 @@ func (s *Server) AddSession(key interface{}, session *Session) {
s.activeSessionMap.Store(key, session) s.activeSessionMap.Store(key, session)
} }
func (s *Server) GetSession(key interface{}) *Session {
if sess, ok := s.activeSessionMap.Load(key); ok {
return sess.(*Session)
}
return nil
}
func (s *Server) RemoveSession(key interface{}) { func (s *Server) RemoveSession(key interface{}) {
if sess, ok := s.activeSessionMap.Load(key); ok { if sess, ok := s.activeSessionMap.Load(key); ok {
// move to completed sessions // move to completed sessions

View File

@@ -13,7 +13,6 @@ type Monitor interface {
// METHODS // METHODS
AddSession(key interface{}, session *Session) AddSession(key interface{}, session *Session)
GetSession(key interface{}) *Session
RemoveSession(key interface{}) RemoveSession(key interface{})
} }

58
proxy/proxy.go Normal file
View File

@@ -0,0 +1,58 @@
package proxy
import (
"errors"
"net"
D "github.com/xjasonlyu/tun2socks/component/fakedns"
S "github.com/xjasonlyu/tun2socks/component/session"
)
var (
fakeDNS D.FakeDNS
monitor S.Monitor
)
func RegisterFakeDNS(d D.FakeDNS) {
fakeDNS = d
}
func RegisterMonitor(m S.Monitor) {
monitor = m
}
// DNS lookup
func lookupHost(target net.Addr) (targetHost string, err error) {
var targetIP net.IP
switch addr := target.(type) {
case *net.TCPAddr:
targetIP = addr.IP
case *net.UDPAddr:
targetIP = addr.IP
default:
err = errors.New("invalid target type")
return
}
targetHost = targetIP.String()
// Replace with a domain name if target address IP is a fake IP.
if fakeDNS != nil {
if host, exist := fakeDNS.IPToHost(targetIP); exist {
targetHost = host
}
}
return
}
// Session Operation
func addSession(key interface{}, session *S.Session) {
if monitor != nil {
monitor.AddSession(key, session)
}
}
func removeSession(key interface{}) {
if monitor != nil {
monitor.RemoveSession(key)
}
}

View File

@@ -12,24 +12,18 @@ import (
"github.com/xjasonlyu/tun2socks/core" "github.com/xjasonlyu/tun2socks/core"
"github.com/xjasonlyu/tun2socks/log" "github.com/xjasonlyu/tun2socks/log"
D "github.com/xjasonlyu/tun2socks/component/fakedns"
S "github.com/xjasonlyu/tun2socks/component/session" S "github.com/xjasonlyu/tun2socks/component/session"
) )
type tcpHandler struct { type tcpHandler struct {
proxyHost string proxyHost string
proxyPort int proxyPort int
fakeDNS D.FakeDNS
monitor S.Monitor
} }
func NewTCPHandler(proxyHost string, proxyPort int, fakeDNS D.FakeDNS, monitor S.Monitor) core.TCPConnHandler { func NewTCPHandler(proxyHost string, proxyPort int) core.TCPConnHandler {
return &tcpHandler{ return &tcpHandler{
proxyHost: proxyHost, proxyHost: proxyHost,
proxyPort: proxyPort, proxyPort: proxyPort,
fakeDNS: fakeDNS,
monitor: monitor,
} }
} }
@@ -77,9 +71,7 @@ func (h *tcpHandler) relay(localConn, remoteConn net.Conn) {
wg.Wait() // Wait for Up Link done wg.Wait() // Wait for Up Link done
// Remove session // Remove session
if h.monitor != nil { removeSession(localConn)
h.monitor.RemoveSession(localConn)
}
} }
func (h *tcpHandler) Handle(conn net.Conn, target *net.TCPAddr) error { func (h *tcpHandler) Handle(conn net.Conn, target *net.TCPAddr) error {
@@ -87,7 +79,7 @@ func (h *tcpHandler) Handle(conn net.Conn, target *net.TCPAddr) error {
var localConn = conn var localConn = conn
// Lookup fakeDNS host record // Lookup fakeDNS host record
targetHost, err := lookupHost(h.fakeDNS, target) targetHost, err := lookupHost(target)
if err != nil { if err != nil {
log.Warnf("lookup target host error: %v", err) log.Warnf("lookup target host error: %v", err)
return err return err
@@ -104,7 +96,7 @@ func (h *tcpHandler) Handle(conn net.Conn, target *net.TCPAddr) error {
// Get name of the process // Get name of the process
var process = lsof.GetProcessName(localConn.LocalAddr()) var process = lsof.GetProcessName(localConn.LocalAddr())
if h.monitor != nil { if monitor != nil {
session := &S.Session{ session := &S.Session{
Process: process, Process: process,
Network: localConn.LocalAddr().Network(), Network: localConn.LocalAddr().Network(),
@@ -115,8 +107,7 @@ func (h *tcpHandler) Handle(conn net.Conn, target *net.TCPAddr) error {
DownloadBytes: 0, DownloadBytes: 0,
SessionStart: time.Now(), SessionStart: time.Now(),
} }
h.monitor.AddSession(localConn, session) addSession(localConn, session)
remoteConn = &S.Conn{Session: session, Conn: remoteConn} remoteConn = &S.Conn{Session: session, Conn: remoteConn}
} }

View File

@@ -12,7 +12,6 @@ import (
"github.com/xjasonlyu/tun2socks/core" "github.com/xjasonlyu/tun2socks/core"
"github.com/xjasonlyu/tun2socks/log" "github.com/xjasonlyu/tun2socks/log"
D "github.com/xjasonlyu/tun2socks/component/fakedns"
S "github.com/xjasonlyu/tun2socks/component/session" S "github.com/xjasonlyu/tun2socks/component/session"
) )
@@ -23,17 +22,12 @@ type udpHandler struct {
remoteAddrMap sync.Map remoteAddrMap sync.Map
remoteConnMap sync.Map remoteConnMap sync.Map
fakeDNS D.FakeDNS
monitor S.Monitor
} }
func NewUDPHandler(proxyHost string, proxyPort int, timeout time.Duration, fakeDNS D.FakeDNS, monitor S.Monitor) core.UDPConnHandler { func NewUDPHandler(proxyHost string, proxyPort int, timeout time.Duration) core.UDPConnHandler {
return &udpHandler{ return &udpHandler{
proxyHost: proxyHost, proxyHost: proxyHost,
proxyPort: proxyPort, proxyPort: proxyPort,
fakeDNS: fakeDNS,
monitor: monitor,
timeout: timeout, timeout: timeout,
} }
} }
@@ -65,7 +59,7 @@ func (h *udpHandler) fetchUDPInput(conn core.UDPConn, input net.PacketConn, addr
func (h *udpHandler) Connect(conn core.UDPConn, target *net.UDPAddr) error { func (h *udpHandler) Connect(conn core.UDPConn, target *net.UDPAddr) error {
// Lookup fakeDNS host record // Lookup fakeDNS host record
targetHost, err := lookupHost(h.fakeDNS, target) targetHost, err := lookupHost(target)
if err != nil { if err != nil {
log.Warnf("lookup target host error: %v", err) log.Warnf("lookup target host error: %v", err)
return err return err
@@ -82,7 +76,7 @@ func (h *udpHandler) Connect(conn core.UDPConn, target *net.UDPAddr) error {
// Get name of the process // Get name of the process
var process = lsof.GetProcessName(conn.LocalAddr()) var process = lsof.GetProcessName(conn.LocalAddr())
if h.monitor != nil { if monitor != nil {
session := &S.Session{ session := &S.Session{
Process: process, Process: process,
Network: conn.LocalAddr().Network(), Network: conn.LocalAddr().Network(),
@@ -93,8 +87,7 @@ func (h *udpHandler) Connect(conn core.UDPConn, target *net.UDPAddr) error {
DownloadBytes: 0, DownloadBytes: 0,
SessionStart: time.Now(), SessionStart: time.Now(),
} }
h.monitor.AddSession(conn, session) addSession(conn, session)
remoteConn = &S.PacketConn{Session: session, PacketConn: remoteConn} remoteConn = &S.PacketConn{Session: session, PacketConn: remoteConn}
} }
@@ -152,7 +145,5 @@ func (h *udpHandler) Close(conn core.UDPConn) {
conn.Close() conn.Close()
// Remove session // Remove session
if h.monitor != nil { removeSession(conn)
h.monitor.RemoveSession(conn)
}
} }

View File

@@ -1,40 +1,15 @@
package proxy package proxy
import ( import (
"errors"
"fmt" "fmt"
"io" "io"
"io/ioutil" "io/ioutil"
"net" "net"
"time" "time"
D "github.com/xjasonlyu/tun2socks/component/fakedns"
"github.com/xjasonlyu/tun2socks/proxy/socks" "github.com/xjasonlyu/tun2socks/proxy/socks"
) )
// DNS lookup
func lookupHost(fakeDNS D.FakeDNS, target net.Addr) (targetHost string, err error) {
var targetIP net.IP
switch addr := target.(type) {
case *net.TCPAddr:
targetIP = addr.IP
case *net.UDPAddr:
targetIP = addr.IP
default:
err = errors.New("invalid target type")
return
}
targetHost = targetIP.String()
// Replace with a domain name if target address IP is a fake IP.
if fakeDNS != nil {
if host, exist := fakeDNS.IPToHost(targetIP); exist {
targetHost = host
}
}
return
}
// TCP functions // TCP functions
type duplexConn interface { type duplexConn interface {
net.Conn net.Conn