diff --git a/README.md b/README.md index 57b4938..a675031 100644 --- a/README.md +++ b/README.md @@ -44,20 +44,18 @@ protocol: 代理协议类型(http, socks5, shadowsocks), transport: 数据传输 > ss - 作为shadowsocks服务,ss://aes-256-cfb:123456@:8080 -#### 本地端口转发 +#### 端口转发 适用于-L参数 ```bash scheme://[bind_address]:port/[host]:hostport ``` -> scheme - 端口转发类型: tcp, udp +> scheme - 端口转发模式, 本地端口转发: tcp, udp; 远程端口转发: rtcp, rudp -> bind_address:port - 本地监听地址 +> bind_address:port - 本地/远程绑定地址 -> host:hostport - 远程地址 - -当在bind_address:port上收到连接信息,则会(通过转发链)与host:hostport建立连接,创建一条数据通道。 +> host:hostport - 目标访问地址 #### 开启日志 @@ -123,7 +121,23 @@ gost -L=udp://:5353/192.168.1.1:53 -F=... ``` 将本地UDP端口5353上的数据(通过转发链)转发到192.168.1.1:53上。 -**注: 如果有转发链,则转发链的末端(最后一个-F参数)必须是gost socks5类型代理。** +**注: 转发UDP数据时,如果有转发链,则转发链的末端(最后一个-F参数)必须是gost socks5类型代理。** + +#### 远程端口转发(TCP) + +```bash +gost -L=rtcp://:2222/192.168.1.1:22 -F=... -F=socks://172.24.10.1:1080 +``` +将172.24.10.1:2222上的数据(通过转发链)转发到192.168.1.1:22上。 + +#### 远程端口转发(UDP + +```bash +gost -L=rudp://:5353/192.168.1.1:53 -F=... -F=socks://172.24.10.1:1080 +``` +将172.24.10.1:5353上的数据(通过转发链)转发到192.168.1.1:53上。 + +**注: 若要使用远程端口转发功能,则至少要设置一个-F参数,且转发链的末端(最后一个-F参数)必须是gost socks5类型代理。** 加密机制 ------ diff --git a/conn.go b/conn.go index de66167..d73a988 100644 --- a/conn.go +++ b/conn.go @@ -17,7 +17,7 @@ import ( "strconv" "strings" "sync" - "sync/atomic" + //"sync/atomic" "time" ) @@ -76,6 +76,10 @@ func listenAndServe(arg Args) error { glog.V(LWARNING).Infoln(err) continue } + if tc, ok := conn.(*net.TCPConn); ok { + tc.SetKeepAlive(true) + tc.SetKeepAlivePeriod(time.Second * 180) + } go handleConn(conn, arg) } } @@ -175,17 +179,19 @@ func serveRUdpForward(arg Args) error { } func handleConn(conn net.Conn, arg Args) { - atomic.AddInt32(&connCounter, 1) - glog.V(LDEBUG).Infof("%s connected, connections: %d", - conn.RemoteAddr(), atomic.LoadInt32(&connCounter)) + /* + atomic.AddInt32(&connCounter, 1) + glog.V(LDEBUG).Infof("%s connected, connections: %d", + conn.RemoteAddr(), atomic.LoadInt32(&connCounter)) - if glog.V(LDEBUG) { - defer func() { - glog.Infof("%s disconnected, connections: %d", - conn.RemoteAddr(), atomic.LoadInt32(&connCounter)) - }() - } - defer atomic.AddInt32(&connCounter, -1) + if glog.V(LDEBUG) { + defer func() { + glog.Infof("%s disconnected, connections: %d", + conn.RemoteAddr(), atomic.LoadInt32(&connCounter)) + }() + } + defer atomic.AddInt32(&connCounter, -1) + */ defer conn.Close() // socks5 server supported methods @@ -329,6 +335,10 @@ func forwardChain(chain ...Args) (conn net.Conn, end Args, err error) { if conn, err = net.DialTimeout("tcp", end.Addr, time.Second*90); err != nil { return } + tc := conn.(*net.TCPConn) + tc.SetKeepAlive(true) + tc.SetKeepAlivePeriod(time.Second * 180) // 3min + c, err := forward(conn, end) if err != nil { return diff --git a/forward.go b/forward.go index 877e6e5..3901ed1 100644 --- a/forward.go +++ b/forward.go @@ -246,6 +246,7 @@ func connectRUdpForward(conn net.Conn, arg Args) error { glog.V(LWARNING).Infof("[rudp] %s -> %s : %s", bindAddr, arg.Remote, err) return } + glog.V(LDEBUG).Infof("[rudp] %s <<< %s length: %d", arg.Remote, bindAddr, len(dgram.Data)) relay.SetReadDeadline(time.Now().Add(time.Second * 60)) n, err := relay.Read(b) @@ -255,6 +256,8 @@ func connectRUdpForward(conn net.Conn, arg Args) error { } relay.SetReadDeadline(time.Time{}) + glog.V(LDEBUG).Infof("[rudp] %s >>> %s length: %d", arg.Remote, bindAddr, n) + conn.SetWriteDeadline(time.Now().Add(time.Second * 90)) if err := gosocks5.NewUDPDatagram(gosocks5.NewUDPHeader(uint16(n), 0, dgram.Header.Addr), b[:n]).Write(conn); err != nil { glog.V(LWARNING).Infof("[rudp] %s <- %s : %s", bindAddr, arg.Remote, err) diff --git a/socks.go b/socks.go index 4c60db2..f84958d 100644 --- a/socks.go +++ b/socks.go @@ -341,9 +341,13 @@ func socks5TunnelUDP(req *gosocks5.Request, conn net.Conn) error { } defer uconn.Close() - if err := gosocks5.NewReply(gosocks5.Succeeded, ToSocksAddr(uconn.LocalAddr())).Write(conn); err != nil { + addr := ToSocksAddr(uconn.LocalAddr()) + addr.Host, _, _ = net.SplitHostPort(conn.LocalAddr().String()) + rep := gosocks5.NewReply(gosocks5.Succeeded, addr) + if err := rep.Write(conn); err != nil { return nil } + glog.V(LDEBUG).Infof("[socks5-udp] %s <- %s\n%s", conn.RemoteAddr(), uconn.LocalAddr(), rep) glog.V(LINFO).Infof("[socks5-udp] %s <-> %s", conn.RemoteAddr(), uconn.LocalAddr()) tunnelUDP(uconn, conn, false) diff --git a/ss.go b/ss.go index 4df16fd..be22f7a 100644 --- a/ss.go +++ b/ss.go @@ -11,12 +11,14 @@ import ( ) func handleShadow(conn net.Conn, arg Args) { + glog.V(LINFO).Infof("[ss] %s -> %s", conn.RemoteAddr(), conn.LocalAddr()) + if arg.User != nil { method := arg.User.Username() password, _ := arg.User.Password() cipher, err := shadowsocks.NewCipher(method, password) if err != nil { - glog.V(LWARNING).Infoln("shadowsocks:", err) + glog.V(LWARNING).Infof("[ss] %s - %s : %s", conn.RemoteAddr(), conn.LocalAddr(), err) return } conn = shadowsocks.NewConn(conn, cipher) @@ -24,26 +26,28 @@ func handleShadow(conn net.Conn, arg Args) { addr, extra, err := getShadowRequest(conn) if err != nil { - glog.V(LWARNING).Infoln("shadowsocks:", err) + glog.V(LWARNING).Infof("[ss] %s - %s : %s", conn.RemoteAddr(), conn.LocalAddr(), err) return } - glog.V(LINFO).Infoln("shadowsocks connect:", addr.String()) + glog.V(LINFO).Infof("[ss] %s -> %s", conn.RemoteAddr(), addr.String()) sconn, err := Connect(addr.String()) if err != nil { - glog.V(LWARNING).Infoln("shadowsocks:", err) + glog.V(LWARNING).Infof("[ss] %s -> %s : %s", conn.RemoteAddr(), addr.String(), err) return } defer sconn.Close() if extra != nil { if _, err := sconn.Write(extra); err != nil { - glog.V(LWARNING).Infoln("shadowsocks:", err) + glog.V(LWARNING).Infof("[ss] %s - %s : %s", conn.RemoteAddr(), addr.String(), err) return } } + glog.V(LINFO).Infof("[ss] %s <-> %s", conn.RemoteAddr(), addr.String()) Transport(conn, sconn) + glog.V(LINFO).Infof("[ss] %s >-< %s", conn.RemoteAddr(), addr.String()) } func getShadowRequest(conn net.Conn) (addr *gosocks5.Addr, extra []byte, err error) { diff --git a/ws.go b/ws.go index 4a90106..39c1490 100644 --- a/ws.go +++ b/ws.go @@ -112,13 +112,13 @@ func NewWs(arg Args) *ws { } func (s *ws) handle(w http.ResponseWriter, r *http.Request) { - glog.V(LINFO).Infoln("[ws] %s - %s", r.RemoteAddr, s.arg.Addr) + glog.V(LINFO).Infof("[ws] %s - %s", r.RemoteAddr, s.arg.Addr) if glog.V(LDEBUG) { dump, err := httputil.DumpRequest(r, false) if err != nil { - glog.V(LWARNING).Infoln("[ws] %s - %s : %s", r.RemoteAddr, s.arg.Addr, err) + glog.V(LWARNING).Infof("[ws] %s - %s : %s", r.RemoteAddr, s.arg.Addr, err) } else { - glog.V(LDEBUG).Infoln("[ws] %s - %s\n%s", r.RemoteAddr, s.arg.Addr, string(dump)) + glog.V(LDEBUG).Infof("[ws] %s - %s\n%s", r.RemoteAddr, s.arg.Addr, string(dump)) } } conn, err := s.upgrader.Upgrade(w, r, nil)