Commit 90e17c84 authored by rui.zheng's avatar rui.zheng

add tls tunnel

parent 38204016
...@@ -11,7 +11,7 @@ gost - GO Simple Tunnel ...@@ -11,7 +11,7 @@ gost - GO Simple Tunnel
5. 多种加密方式(tls,aes-256-cfb,des-cfb,rc4-md5等)。 5. 多种加密方式(tls,aes-256-cfb,des-cfb,rc4-md5等)。
6. 客户端兼容shadowsocks协议,可作为shadowsocks服务器。 6. 客户端兼容shadowsocks协议,可作为shadowsocks服务器。
二进制文件下载:https://bintray.com/ginuerzh/gost/gost/view 二进制文件下载:https://github.com/ginuerzh/gost/releases
Google讨论组: https://groups.google.com/d/forum/go-gost Google讨论组: https://groups.google.com/d/forum/go-gost
......
...@@ -6,6 +6,7 @@ import ( ...@@ -6,6 +6,7 @@ import (
"crypto/tls" "crypto/tls"
"encoding/base64" "encoding/base64"
"encoding/binary" "encoding/binary"
//"encoding/hex"
"errors" "errors"
"fmt" "fmt"
"github.com/ginuerzh/gosocks5" "github.com/ginuerzh/gosocks5"
...@@ -103,7 +104,11 @@ func makeTunnel() (c net.Conn, err error) { ...@@ -103,7 +104,11 @@ func makeTunnel() (c net.Conn, err error) {
if err != nil { if err != nil {
return return
} }
if UseWebsocket {
if UseTLS {
config := &tls.Config{InsecureSkipVerify: true}
c = tls.Client(c, config)
} else if UseWebsocket {
ws, resp, err := websocket.NewClient(c, &url.URL{Host: Saddr}, nil, 8192, 8192) ws, resp, err := websocket.NewClient(c, &url.URL{Host: Saddr}, nil, 8192, 8192)
if err != nil { if err != nil {
c.Close() c.Close()
...@@ -166,6 +171,7 @@ func cliHandle(conn net.Conn) { ...@@ -166,6 +171,7 @@ func cliHandle(conn net.Conn) {
req, err := http.ReadRequest(bufio.NewReader(newReqReader(b[:n], conn))) req, err := http.ReadRequest(bufio.NewReader(newReqReader(b[:n], conn)))
if err != nil { if err != nil {
//log.Println(hex.Dump(b[:n]))
log.Println(err) log.Println(err)
return return
} }
......
package main
import (
"bytes"
"fmt"
"io"
"os"
)
var (
Debug bool
)
type BufferedLog struct {
buffer *bytes.Buffer
w io.WriteCloser
}
func NewLog(buffered bool) *BufferedLog {
log := &BufferedLog{
w: os.Stdout,
}
if buffered {
log.buffer = &bytes.Buffer{}
}
return log
}
func NewFileLog(file *os.File) *BufferedLog {
return &BufferedLog{
buffer: &bytes.Buffer{},
w: file,
}
}
func (log *BufferedLog) Log(a ...interface{}) (int, error) {
if !Debug {
return 0, nil
}
if log.buffer != nil {
return fmt.Fprint(log.buffer, a...)
}
return fmt.Fprint(log.w, a...)
}
func (log *BufferedLog) Logln(a ...interface{}) (int, error) {
if !Debug {
return 0, nil
}
if log.buffer != nil {
return fmt.Fprintln(log.buffer, a...)
}
return fmt.Fprintln(log.w, a...)
}
func (log *BufferedLog) Logf(format string, a ...interface{}) (int, error) {
if !Debug {
return 0, nil
}
if log.buffer != nil {
return fmt.Fprintf(log.buffer, format, a...)
}
return fmt.Fprintf(log.w, format, a...)
}
func (log *BufferedLog) Flush() error {
defer func() {
if log.w != os.Stdout {
log.w.Close()
}
}()
if !Debug || log.buffer == nil {
return nil
}
_, err := log.buffer.WriteTo(log.w)
return err
}
...@@ -9,13 +9,13 @@ import ( ...@@ -9,13 +9,13 @@ import (
) )
var ( var (
Laddr, Saddr, Proxy string Laddr, Saddr, Proxy string
UseWebsocket, UseHttp bool UseWebsocket, UseHttp, UseTLS bool
Shadows bool Shadows bool
SMethod, SPassword string SMethod, SPassword string
Method, Password string Method, Password string
CertFile, KeyFile string CertFile, KeyFile string
PrintVersion bool PrintVersion bool
proxyURL *url.URL proxyURL *url.URL
listenUrl *url.URL listenUrl *url.URL
...@@ -30,6 +30,7 @@ func init() { ...@@ -30,6 +30,7 @@ func init() {
flag.StringVar(&CertFile, "cert", "", "tls cert file") flag.StringVar(&CertFile, "cert", "", "tls cert file")
flag.StringVar(&KeyFile, "key", "", "tls key file") flag.StringVar(&KeyFile, "key", "", "tls key file")
flag.BoolVar(&Shadows, "ss", false, "run as shadowsocks server") flag.BoolVar(&Shadows, "ss", false, "run as shadowsocks server")
flag.BoolVar(&UseTLS, "tls", false, "use ssl/tls tunnel")
flag.BoolVar(&UseWebsocket, "ws", false, "use websocket tunnel") flag.BoolVar(&UseWebsocket, "ws", false, "use websocket tunnel")
flag.BoolVar(&UseHttp, "http", false, "use http tunnel") flag.BoolVar(&UseHttp, "http", false, "use http tunnel")
flag.StringVar(&SMethod, "sm", "rc4-md5", "shadowsocks cipher method") flag.StringVar(&SMethod, "sm", "rc4-md5", "shadowsocks cipher method")
...@@ -59,7 +60,9 @@ func main() { ...@@ -59,7 +60,9 @@ func main() {
if len(Saddr) == 0 { if len(Saddr) == 0 {
var server Server var server Server
if UseWebsocket { if UseTLS {
server = &TlsServer{Addr: laddr, CertFile: CertFile, KeyFile: KeyFile}
} else if UseWebsocket {
server = &WSServer{Addr: laddr} server = &WSServer{Addr: laddr}
} else if UseHttp { } else if UseHttp {
server = &HttpServer{Addr: laddr} server = &HttpServer{Addr: laddr}
......
...@@ -180,7 +180,7 @@ func serveSocks5(conn net.Conn) { ...@@ -180,7 +180,7 @@ func serveSocks5(conn net.Conn) {
//log.Println("connect", req.Addr.String()) //log.Println("connect", req.Addr.String())
tconn, err := connect(req.Addr.String()) tconn, err := connect(req.Addr.String())
if err != nil { if err != nil {
log.Println(err) log.Println("connect", req.Addr.String(), err)
gosocks5.NewReply(gosocks5.HostUnreachable, nil).Write(conn) gosocks5.NewReply(gosocks5.HostUnreachable, nil).Write(conn)
return return
} }
...@@ -198,6 +198,7 @@ func serveSocks5(conn net.Conn) { ...@@ -198,6 +198,7 @@ func serveSocks5(conn net.Conn) {
l, err := net.ListenTCP("tcp", nil) l, err := net.ListenTCP("tcp", nil)
if err != nil { if err != nil {
gosocks5.NewReply(gosocks5.Failure, nil).Write(conn) gosocks5.NewReply(gosocks5.Failure, nil).Write(conn)
log.Println("bind listen", err)
return return
} }
...@@ -207,6 +208,7 @@ func serveSocks5(conn net.Conn) { ...@@ -207,6 +208,7 @@ func serveSocks5(conn net.Conn) {
rep := gosocks5.NewReply(gosocks5.Succeeded, addr) rep := gosocks5.NewReply(gosocks5.Succeeded, addr)
if err := rep.Write(conn); err != nil { if err := rep.Write(conn); err != nil {
log.Println(err) log.Println(err)
l.Close()
return return
} }
...@@ -233,7 +235,7 @@ func serveSocks5(conn net.Conn) { ...@@ -233,7 +235,7 @@ func serveSocks5(conn net.Conn) {
case gosocks5.CmdUdp: case gosocks5.CmdUdp:
uconn, err := net.ListenUDP("udp", nil) uconn, err := net.ListenUDP("udp", nil)
if err != nil { if err != nil {
log.Println(err) log.Println("udp listen", err)
gosocks5.NewReply(gosocks5.Failure, nil).Write(conn) gosocks5.NewReply(gosocks5.Failure, nil).Write(conn)
return return
} }
......
package main
import (
"crypto/tls"
"github.com/ginuerzh/gosocks5"
"net"
)
type TlsServer struct {
Addr string
CertFile, KeyFile string
}
func (s *TlsServer) ListenAndServe() error {
return s.listenAndServeTLS()
}
func (s *TlsServer) listenAndServeTLS() error {
var cert tls.Certificate
var err error
if len(s.CertFile) == 0 || len(s.KeyFile) == 0 {
cert, err = tls.X509KeyPair([]byte(rawCert), []byte(rawKey))
} else {
cert, err = tls.LoadX509KeyPair(s.CertFile, s.KeyFile)
}
if err != nil {
return err
}
config := &tls.Config{Certificates: []tls.Certificate{cert}}
l, err := tls.Listen("tcp", s.Addr, config)
if err != nil {
return err
}
defer l.Close()
for {
conn, err := l.Accept()
if err != nil {
return err
}
go func(c net.Conn) {
c = gosocks5.ServerConn(c, serverConfig)
serveSocks5(c)
}(conn)
}
return nil
}
...@@ -5,7 +5,7 @@ import ( ...@@ -5,7 +5,7 @@ import (
) )
const ( const (
Version = "1.7" Version = "1.8"
) )
func printVersion() { func printVersion() {
......
...@@ -64,7 +64,7 @@ func (s *WSServer) handle(w http.ResponseWriter, r *http.Request) { ...@@ -64,7 +64,7 @@ func (s *WSServer) handle(w http.ResponseWriter, r *http.Request) {
log.Println(err) log.Println(err)
return return
} }
defer conn.Close() //defer conn.Close()
c := gosocks5.ServerConn(NewWSConn(conn), serverConfig) c := gosocks5.ServerConn(NewWSConn(conn), serverConfig)
/* /*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment