|
|
|
@ -419,6 +419,15 @@ func (h *socks5Handler) handleConnect(conn net.Conn, req *gosocks5.Request) { |
|
|
|
} |
|
|
|
return |
|
|
|
} |
|
|
|
if h.options.Bypass.Contains(addr) { |
|
|
|
log.Logf("[socks5-connect] [bypass] %s", addr) |
|
|
|
rep := gosocks5.NewReply(gosocks5.NotAllowed, nil) |
|
|
|
rep.Write(conn) |
|
|
|
if Debug { |
|
|
|
log.Logf("[socks5-connect] %s <- %s\n%s", conn.RemoteAddr(), req.Addr, rep) |
|
|
|
} |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
cc, err := h.options.Chain.Dial(addr) |
|
|
|
if err != nil { |
|
|
|
@ -716,6 +725,10 @@ func (h *socks5Handler) transportUDP(relay, peer *net.UDPConn) (err error) { |
|
|
|
if err != nil { |
|
|
|
continue // drop silently
|
|
|
|
} |
|
|
|
if h.options.Bypass.Contains(raddr.String()) { |
|
|
|
log.Log("[socks5-udp] [bypass] write to", raddr) |
|
|
|
continue // bypass
|
|
|
|
} |
|
|
|
if _, err := peer.WriteToUDP(dgram.Data, raddr); err != nil { |
|
|
|
errc <- err |
|
|
|
return |
|
|
|
@ -738,6 +751,10 @@ func (h *socks5Handler) transportUDP(relay, peer *net.UDPConn) (err error) { |
|
|
|
if clientAddr == nil { |
|
|
|
continue |
|
|
|
} |
|
|
|
if h.options.Bypass.Contains(raddr.String()) { |
|
|
|
log.Log("[socks5-udp] [bypass] read from", raddr) |
|
|
|
continue // bypass
|
|
|
|
} |
|
|
|
buf := bytes.Buffer{} |
|
|
|
dgram := gosocks5.NewUDPDatagram(gosocks5.NewUDPHeader(0, 0, toSocksAddr(raddr)), b[:n]) |
|
|
|
dgram.Write(&buf) |
|
|
|
@ -785,6 +802,11 @@ func (h *socks5Handler) tunnelClientUDP(uc *net.UDPConn, cc net.Conn) (err error |
|
|
|
if clientAddr == nil { |
|
|
|
clientAddr = addr |
|
|
|
} |
|
|
|
raddr := dgram.Header.Addr.String() |
|
|
|
if h.options.Bypass.Contains(raddr) { |
|
|
|
log.Log("[udp-tun] [bypass] write to", raddr) |
|
|
|
continue // bypass
|
|
|
|
} |
|
|
|
dgram.Header.Rsv = uint16(len(dgram.Data)) |
|
|
|
if err := dgram.Write(cc); err != nil { |
|
|
|
errc <- err |
|
|
|
@ -809,6 +831,11 @@ func (h *socks5Handler) tunnelClientUDP(uc *net.UDPConn, cc net.Conn) (err error |
|
|
|
if clientAddr == nil { |
|
|
|
continue |
|
|
|
} |
|
|
|
raddr := dgram.Header.Addr.String() |
|
|
|
if h.options.Bypass.Contains(raddr) { |
|
|
|
log.Log("[udp-tun] [bypass] read from", raddr) |
|
|
|
continue // bypass
|
|
|
|
} |
|
|
|
dgram.Header.Rsv = 0 |
|
|
|
|
|
|
|
buf := bytes.Buffer{} |
|
|
|
@ -903,6 +930,10 @@ func (h *socks5Handler) tunnelServerUDP(cc net.Conn, uc *net.UDPConn) (err error |
|
|
|
errc <- err |
|
|
|
return |
|
|
|
} |
|
|
|
if h.options.Bypass.Contains(addr.String()) { |
|
|
|
log.Log("[udp-tun] [bypass] read from", addr) |
|
|
|
continue // bypass
|
|
|
|
} |
|
|
|
|
|
|
|
// pipe from peer to tunnel
|
|
|
|
dgram := gosocks5.NewUDPDatagram( |
|
|
|
@ -932,6 +963,10 @@ func (h *socks5Handler) tunnelServerUDP(cc net.Conn, uc *net.UDPConn) (err error |
|
|
|
if err != nil { |
|
|
|
continue // drop silently
|
|
|
|
} |
|
|
|
if h.options.Bypass.Contains(addr.String()) { |
|
|
|
log.Log("[udp-tun] [bypass] write to", addr) |
|
|
|
continue // bypass
|
|
|
|
} |
|
|
|
if _, err := uc.WriteToUDP(dgram.Data, addr); err != nil { |
|
|
|
log.Logf("[udp-tun] %s -> %s : %s", cc.RemoteAddr(), addr, err) |
|
|
|
errc <- err |
|
|
|
@ -1116,7 +1151,16 @@ func (h *socks4Handler) handleConnect(conn net.Conn, req *gosocks4.Request) { |
|
|
|
|
|
|
|
if !Can("tcp", addr, h.options.Whitelist, h.options.Blacklist) { |
|
|
|
log.Logf("[socks4-connect] Unauthorized to tcp connect to %s", addr) |
|
|
|
rep := gosocks5.NewReply(gosocks4.Rejected, nil) |
|
|
|
rep := gosocks4.NewReply(gosocks4.Rejected, nil) |
|
|
|
rep.Write(conn) |
|
|
|
if Debug { |
|
|
|
log.Logf("[socks4-connect] %s <- %s\n%s", conn.RemoteAddr(), req.Addr, rep) |
|
|
|
} |
|
|
|
return |
|
|
|
} |
|
|
|
if h.options.Bypass.Contains(addr) { |
|
|
|
log.Log("[socks4-connect] [bypass]", addr) |
|
|
|
rep := gosocks4.NewReply(gosocks4.Rejected, nil) |
|
|
|
rep.Write(conn) |
|
|
|
if Debug { |
|
|
|
log.Logf("[socks4-connect] %s <- %s\n%s", conn.RemoteAddr(), req.Addr, rep) |
|
|
|
|