tuntap: fake TCP mode restoration

This commit is contained in:
ginuerzh 2020-01-11 16:00:37 +08:00
parent c56e4aa7c2
commit 62a17f07f7

View File

@ -15,6 +15,7 @@ import (
"github.com/shadowsocks/go-shadowsocks2/shadowstream" "github.com/shadowsocks/go-shadowsocks2/shadowstream"
"github.com/songgao/water" "github.com/songgao/water"
"github.com/songgao/water/waterutil" "github.com/songgao/water/waterutil"
"github.com/xtaci/tcpraw"
"golang.org/x/net/ipv4" "golang.org/x/net/ipv4"
"golang.org/x/net/ipv6" "golang.org/x/net/ipv6"
) )
@ -157,14 +158,23 @@ func (h *tunHandler) Handle(conn net.Conn) {
err := func() error { err := func() error {
var err error var err error
var pc net.PacketConn var pc net.PacketConn
// fake tcp mode will be ignored when the client specifies a chain.
if raddr != nil && !h.options.Chain.IsEmpty() { if raddr != nil && !h.options.Chain.IsEmpty() {
var cc net.Conn var cc net.Conn
cc, err = getSOCKS5UDPTunnel(h.options.Chain, nil) cc, err = getSOCKS5UDPTunnel(h.options.Chain, nil)
pc = &udpTunnelConn{Conn: cc, raddr: raddr} pc = &udpTunnelConn{Conn: cc, raddr: raddr}
} else {
if h.options.TCPMode {
if raddr != nil {
pc, err = tcpraw.Dial("tcp", raddr.String())
} else {
pc, err = tcpraw.Listen("tcp", h.options.Node.Addr)
}
} else { } else {
laddr, _ := net.ResolveUDPAddr("udp", h.options.Node.Addr) laddr, _ := net.ResolveUDPAddr("udp", h.options.Node.Addr)
pc, err = net.ListenUDP("udp", laddr) pc, err = net.ListenUDP("udp", laddr)
} }
}
if err != nil { if err != nil {
return err return err
} }
@ -515,14 +525,23 @@ func (h *tapHandler) Handle(conn net.Conn) {
err := func() error { err := func() error {
var err error var err error
var pc net.PacketConn var pc net.PacketConn
// fake tcp mode will be ignored when the client specifies a chain.
if raddr != nil && !h.options.Chain.IsEmpty() { if raddr != nil && !h.options.Chain.IsEmpty() {
var cc net.Conn var cc net.Conn
cc, err = getSOCKS5UDPTunnel(h.options.Chain, nil) cc, err = getSOCKS5UDPTunnel(h.options.Chain, nil)
pc = &udpTunnelConn{Conn: cc, raddr: raddr} pc = &udpTunnelConn{Conn: cc, raddr: raddr}
} else {
if h.options.TCPMode {
if raddr != nil {
pc, err = tcpraw.Dial("tcp", raddr.String())
} else {
pc, err = tcpraw.Listen("tcp", h.options.Node.Addr)
}
} else { } else {
laddr, _ := net.ResolveUDPAddr("udp", h.options.Node.Addr) laddr, _ := net.ResolveUDPAddr("udp", h.options.Node.Addr)
pc, err = net.ListenUDP("udp", laddr) pc, err = net.ListenUDP("udp", laddr)
} }
}
if err != nil { if err != nil {
return err return err
} }