mirror of
https://github.com/nadoo/glider.git
synced 2025-02-23 17:35:40 +08:00
ss: add udp over tcp support
This commit is contained in:
parent
0e8263ddfa
commit
aeb0acab33
@ -41,7 +41,7 @@ General:
|
||||
- Rule proxy based on destinations: [Config Examples](config/examples)
|
||||
|
||||
TODO:
|
||||
- [ ] UDP over TCP
|
||||
- [x] UDP over TCP (ss)
|
||||
- [ ] UDP Tunnel
|
||||
- [ ] Linux tproxy support & UDP Relay
|
||||
- [ ] TUN/TAP device support
|
||||
|
@ -57,6 +57,9 @@ func ServerFromURL(s string, sDialer Dialer) (Server, error) {
|
||||
case "dnstun":
|
||||
d := strings.Split(addr, "=")
|
||||
return NewDNSTun(d[0], d[1], sDialer)
|
||||
case "uottun":
|
||||
d := strings.Split(addr, "=")
|
||||
return NewUoTTun(d[0], d[1], sDialer)
|
||||
}
|
||||
|
||||
return nil, errors.New("unknown schema '" + u.Scheme + "'")
|
||||
|
42
ss.go
42
ss.go
@ -12,7 +12,7 @@ import (
|
||||
"github.com/shadowsocks/go-shadowsocks2/socks"
|
||||
)
|
||||
|
||||
const udpBufSize = 64 * 1024
|
||||
const udpBufSize = 65536
|
||||
|
||||
// SS .
|
||||
type SS struct {
|
||||
@ -40,7 +40,7 @@ func NewSS(addr, method, pass string, cDialer Dialer, sDialer Dialer) (*SS, erro
|
||||
|
||||
// ListenAndServe serves ss requests.
|
||||
func (s *SS) ListenAndServe() {
|
||||
go s.ListenAndServeUDP()
|
||||
// go s.ListenAndServeUDP()
|
||||
s.ListenAndServeTCP()
|
||||
}
|
||||
|
||||
@ -80,6 +80,37 @@ func (s *SS) ServeTCP(c net.Conn) {
|
||||
return
|
||||
}
|
||||
|
||||
// udp over tcp
|
||||
if UoT(tgt[0]) {
|
||||
rc, err := net.ListenPacket("udp", "")
|
||||
if err != nil {
|
||||
logf("UDP remote listen error: %v", err)
|
||||
}
|
||||
defer rc.Close()
|
||||
|
||||
req := make([]byte, udpBufSize)
|
||||
n, err := c.Read(req)
|
||||
if err != nil {
|
||||
logf("error in ioutil.ReadAll: %s\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
tgtAddr, _ := net.ResolveUDPAddr("udp", tgt.String())
|
||||
rc.WriteTo(req[:n], tgtAddr)
|
||||
|
||||
buf := make([]byte, udpBufSize)
|
||||
n, _, err = rc.ReadFrom(buf)
|
||||
if err != nil {
|
||||
logf("proxy-uottun read error: %v", err)
|
||||
}
|
||||
|
||||
c.Write(buf[:n])
|
||||
|
||||
logf("proxy-ss %s <-tcp-> %s <-> %s <-udp-> %s ", c.RemoteAddr(), c.LocalAddr(), rc.LocalAddr(), tgt)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
rc, err := s.sDialer.Dial("tcp", tgt.String())
|
||||
if err != nil {
|
||||
logf("proxy-ss failed to connect to target: %v", err)
|
||||
@ -171,7 +202,12 @@ func (s *SS) Dial(network, addr string) (net.Conn, error) {
|
||||
return nil, errors.New("Unable to parse address: " + addr)
|
||||
}
|
||||
|
||||
c, err := s.cDialer.Dial(network, s.addr)
|
||||
// udp over tcp tag
|
||||
if network == "udp" {
|
||||
target[0] = target[0] | 0x8
|
||||
}
|
||||
|
||||
c, err := s.cDialer.Dial("tcp", s.addr)
|
||||
if err != nil {
|
||||
logf("dial to %s error: %s", s.addr, err)
|
||||
return nil, err
|
||||
|
Loading…
Reference in New Issue
Block a user