tuntap: fake TCP mode restoration
This commit is contained in:
parent
c56e4aa7c2
commit
62a17f07f7
27
tuntap.go
27
tuntap.go
@ -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,13 +158,22 @@ 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 {
|
} else {
|
||||||
laddr, _ := net.ResolveUDPAddr("udp", h.options.Node.Addr)
|
if h.options.TCPMode {
|
||||||
pc, err = net.ListenUDP("udp", laddr)
|
if raddr != nil {
|
||||||
|
pc, err = tcpraw.Dial("tcp", raddr.String())
|
||||||
|
} else {
|
||||||
|
pc, err = tcpraw.Listen("tcp", h.options.Node.Addr)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
laddr, _ := net.ResolveUDPAddr("udp", h.options.Node.Addr)
|
||||||
|
pc, err = net.ListenUDP("udp", laddr)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -515,13 +525,22 @@ 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 {
|
} else {
|
||||||
laddr, _ := net.ResolveUDPAddr("udp", h.options.Node.Addr)
|
if h.options.TCPMode {
|
||||||
pc, err = net.ListenUDP("udp", laddr)
|
if raddr != nil {
|
||||||
|
pc, err = tcpraw.Dial("tcp", raddr.String())
|
||||||
|
} else {
|
||||||
|
pc, err = tcpraw.Listen("tcp", h.options.Node.Addr)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
laddr, _ := net.ResolveUDPAddr("udp", h.options.Node.Addr)
|
||||||
|
pc, err = net.ListenUDP("udp", laddr)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
Loading…
Reference in New Issue
Block a user