pretty logs

This commit is contained in:
rui.zheng 2016-09-07 18:22:57 +08:00
parent ec8cfa44a0
commit f2de67f8c1
6 changed files with 62 additions and 27 deletions

View File

@ -44,20 +44,18 @@ protocol: 代理协议类型(http, socks5, shadowsocks), transport: 数据传输
> ss - 作为shadowsocks服务ss://aes-256-cfb:123456@:8080 > ss - 作为shadowsocks服务ss://aes-256-cfb:123456@:8080
#### 本地端口转发 #### 端口转发
适用于-L参数 适用于-L参数
```bash ```bash
scheme://[bind_address]:port/[host]:hostport scheme://[bind_address]:port/[host]:hostport
``` ```
> scheme - 端口转发类型: tcp, udp > scheme - 端口转发模式, 本地端口转发: tcp, udp; 远程端口转发: rtcp, rudp
> bind_address:port - 本地监听地址 > bind_address:port - 本地/远程绑定地址
> host:hostport - 远程地址 > host:hostport - 目标访问地址
当在bind_address:port上收到连接信息则会(通过转发链)与host:hostport建立连接创建一条数据通道。
#### 开启日志 #### 开启日志
@ -123,7 +121,23 @@ gost -L=udp://:5353/192.168.1.1:53 -F=...
``` ```
将本地UDP端口5353上的数据(通过转发链)转发到192.168.1.1:53上。 将本地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类型代理。**
加密机制 加密机制
------ ------

32
conn.go
View File

@ -17,7 +17,7 @@ import (
"strconv" "strconv"
"strings" "strings"
"sync" "sync"
"sync/atomic" //"sync/atomic"
"time" "time"
) )
@ -76,6 +76,10 @@ func listenAndServe(arg Args) error {
glog.V(LWARNING).Infoln(err) glog.V(LWARNING).Infoln(err)
continue continue
} }
if tc, ok := conn.(*net.TCPConn); ok {
tc.SetKeepAlive(true)
tc.SetKeepAlivePeriod(time.Second * 180)
}
go handleConn(conn, arg) go handleConn(conn, arg)
} }
} }
@ -175,17 +179,19 @@ func serveRUdpForward(arg Args) error {
} }
func handleConn(conn net.Conn, arg Args) { func handleConn(conn net.Conn, arg Args) {
atomic.AddInt32(&connCounter, 1) /*
glog.V(LDEBUG).Infof("%s connected, connections: %d", atomic.AddInt32(&connCounter, 1)
conn.RemoteAddr(), atomic.LoadInt32(&connCounter)) glog.V(LDEBUG).Infof("%s connected, connections: %d",
conn.RemoteAddr(), atomic.LoadInt32(&connCounter))
if glog.V(LDEBUG) { if glog.V(LDEBUG) {
defer func() { defer func() {
glog.Infof("%s disconnected, connections: %d", glog.Infof("%s disconnected, connections: %d",
conn.RemoteAddr(), atomic.LoadInt32(&connCounter)) conn.RemoteAddr(), atomic.LoadInt32(&connCounter))
}() }()
} }
defer atomic.AddInt32(&connCounter, -1) defer atomic.AddInt32(&connCounter, -1)
*/
defer conn.Close() defer conn.Close()
// socks5 server supported methods // 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 { if conn, err = net.DialTimeout("tcp", end.Addr, time.Second*90); err != nil {
return return
} }
tc := conn.(*net.TCPConn)
tc.SetKeepAlive(true)
tc.SetKeepAlivePeriod(time.Second * 180) // 3min
c, err := forward(conn, end) c, err := forward(conn, end)
if err != nil { if err != nil {
return return

View File

@ -246,6 +246,7 @@ func connectRUdpForward(conn net.Conn, arg Args) error {
glog.V(LWARNING).Infof("[rudp] %s -> %s : %s", bindAddr, arg.Remote, err) glog.V(LWARNING).Infof("[rudp] %s -> %s : %s", bindAddr, arg.Remote, err)
return return
} }
glog.V(LDEBUG).Infof("[rudp] %s <<< %s length: %d", arg.Remote, bindAddr, len(dgram.Data))
relay.SetReadDeadline(time.Now().Add(time.Second * 60)) relay.SetReadDeadline(time.Now().Add(time.Second * 60))
n, err := relay.Read(b) n, err := relay.Read(b)
@ -255,6 +256,8 @@ func connectRUdpForward(conn net.Conn, arg Args) error {
} }
relay.SetReadDeadline(time.Time{}) 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)) 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 { 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) glog.V(LWARNING).Infof("[rudp] %s <- %s : %s", bindAddr, arg.Remote, err)

View File

@ -341,9 +341,13 @@ func socks5TunnelUDP(req *gosocks5.Request, conn net.Conn) error {
} }
defer uconn.Close() 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 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()) glog.V(LINFO).Infof("[socks5-udp] %s <-> %s", conn.RemoteAddr(), uconn.LocalAddr())
tunnelUDP(uconn, conn, false) tunnelUDP(uconn, conn, false)

14
ss.go
View File

@ -11,12 +11,14 @@ import (
) )
func handleShadow(conn net.Conn, arg Args) { func handleShadow(conn net.Conn, arg Args) {
glog.V(LINFO).Infof("[ss] %s -> %s", conn.RemoteAddr(), conn.LocalAddr())
if arg.User != nil { if arg.User != nil {
method := arg.User.Username() method := arg.User.Username()
password, _ := arg.User.Password() password, _ := arg.User.Password()
cipher, err := shadowsocks.NewCipher(method, password) cipher, err := shadowsocks.NewCipher(method, password)
if err != nil { if err != nil {
glog.V(LWARNING).Infoln("shadowsocks:", err) glog.V(LWARNING).Infof("[ss] %s - %s : %s", conn.RemoteAddr(), conn.LocalAddr(), err)
return return
} }
conn = shadowsocks.NewConn(conn, cipher) conn = shadowsocks.NewConn(conn, cipher)
@ -24,26 +26,28 @@ func handleShadow(conn net.Conn, arg Args) {
addr, extra, err := getShadowRequest(conn) addr, extra, err := getShadowRequest(conn)
if err != nil { if err != nil {
glog.V(LWARNING).Infoln("shadowsocks:", err) glog.V(LWARNING).Infof("[ss] %s - %s : %s", conn.RemoteAddr(), conn.LocalAddr(), err)
return 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()) sconn, err := Connect(addr.String())
if err != nil { if err != nil {
glog.V(LWARNING).Infoln("shadowsocks:", err) glog.V(LWARNING).Infof("[ss] %s -> %s : %s", conn.RemoteAddr(), addr.String(), err)
return return
} }
defer sconn.Close() defer sconn.Close()
if extra != nil { if extra != nil {
if _, err := sconn.Write(extra); err != 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 return
} }
} }
glog.V(LINFO).Infof("[ss] %s <-> %s", conn.RemoteAddr(), addr.String())
Transport(conn, sconn) 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) { func getShadowRequest(conn net.Conn) (addr *gosocks5.Addr, extra []byte, err error) {

6
ws.go
View File

@ -112,13 +112,13 @@ func NewWs(arg Args) *ws {
} }
func (s *ws) handle(w http.ResponseWriter, r *http.Request) { 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) { if glog.V(LDEBUG) {
dump, err := httputil.DumpRequest(r, false) dump, err := httputil.DumpRequest(r, false)
if err != nil { 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 { } 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) conn, err := s.upgrader.Upgrade(w, r, nil)