Files
v2ray_simple/netLayer/tproxy/tproxy_linux.go
e1732a364fed f28f0d0bee 修订代码, 默认loglevel 改为 Log_info.
对一般用户而言,还是需要使用Info等级 来了解一下 一般的 日志情况,等到使用熟练之后,且确认运行没有错误后, 可以自行调为 warning 来提升性能

发现 bubble包 还自己引入了 命令行参数,这十分不可取,所以我们还是直接使用其代码。

将其它包中 的 命令行参数 统一 移动 到 cmd/verysimple 中;tls lazy 特性因为还在 调试阶段,所以 命令行参数 仍然放到 v2ray_simple 包中。
2022-04-26 13:22:18 +08:00

112 lines
2.1 KiB
Go

package tproxy
import (
"io"
"net"
"os"
"time"
"github.com/e1732a364fed/v2ray_simple/netLayer"
"github.com/e1732a364fed/v2ray_simple/utils"
)
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)
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
}