Files
v2ray_simple/netLayer/tproxy/tproxy_linux.go
e1732a364fed 996dbe1d98 全面修订代码,文档;修复一系列bug;修改quic配置格式,见下:
修复一处quic的代码缺陷导致速度不高问题。
修复 quic 的 too many open streams 问题。
修复 quic的 early实际未生效的问题。
修复 grpcSimple 的一些导致闪退的bug

quic 的配置中,maxStreamCountInOneSession 改名为 maxStreamsInOneConn
2022-04-29 10:57:56 +08:00

114 lines
2.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package tproxy
import (
"io"
"net"
"os"
"time"
"github.com/e1732a364fed/v2ray_simple/netLayer"
"github.com/e1732a364fed/v2ray_simple/utils"
)
//从一个透明代理tcp连接中读取到实际地址
func HandshakeTCP(tcpConn *net.TCPConn) netLayer.Addr {
targetTCPAddr := tcpConn.LocalAddr().(*net.TCPAddr)
return netLayer.Addr{
IP: targetTCPAddr.IP,
Port: targetTCPAddr.Port,
}
}
var udpMsgConnMap = make(map[netLayer.HashableAddr]*MsgConn)
//从一个透明代理udp连接中读取到实际地址并返回 *MsgConn
func HandshakeUDP(underlay *net.UDPConn) (netLayer.MsgConn, netLayer.Addr, error) {
bs := utils.GetPacket()
n, src, dst, err := ReadFromUDP(underlay, bs)
if err != nil {
return nil, netLayer.Addr{}, err
}
ad := netLayer.NewAddrFromUDPAddr(src)
hash := ad.GetHashable()
conn, found := udpMsgConnMap[hash]
if !found {
conn = &MsgConn{
ourSrcAddr: src,
readChan: make(chan netLayer.AddrData, 5),
closeChan: make(chan struct{}),
}
udpMsgConnMap[hash] = conn
}
conn.readChan <- netLayer.AddrData{Data: bs[:n], Addr: netLayer.NewAddrFromUDPAddr(dst)}
return conn, netLayer.NewAddrFromUDPAddr(dst), nil
}
//implements netLayer.MsgConn
type MsgConn struct {
ourSrcAddr *net.UDPAddr
readChan chan netLayer.AddrData
closeChan chan struct{}
}
func (mc *MsgConn) Close() error {
select {
case <-mc.closeChan:
default:
close(mc.closeChan)
}
return nil
}
func (mc *MsgConn) CloseConnWithRaddr(raddr netLayer.Addr) error {
return nil
}
func (mc *MsgConn) Fullcone() bool {
return true
}
func (mc *MsgConn) ReadMsgFrom() ([]byte, netLayer.Addr, error) {
timeoutChan := time.After(netLayer.UDP_timeout)
select {
case <-mc.closeChan:
return nil, netLayer.Addr{}, io.EOF
case <-timeoutChan:
return nil, netLayer.Addr{}, os.ErrDeadlineExceeded
case newmsg := <-mc.readChan:
return newmsg.Data, newmsg.Addr, nil
}
}
// 通过透明代理 写回 客户端
func (mc *MsgConn) WriteMsgTo(p []byte, addr netLayer.Addr) error {
back, err := DialUDP(
"udp",
&net.UDPAddr{
IP: addr.IP,
Port: addr.Port,
},
mc.ourSrcAddr,
)
if err != nil {
return err
}
_, err = back.Write(p)
if err != nil {
return err
}
back.Close()
return nil
}