Files
goodlink/proxy/proxy_r.go
kony c7bc4b9c4f u
2025-03-28 17:23:38 +08:00

107 lines
2.5 KiB
Go

package proxy
import (
"context"
"encoding/binary"
"fmt"
pool2 "goodlink/pool"
"goodlink/socks5"
"goodlink/utils"
"log"
"net"
"github.com/quic-go/quic-go"
)
func ProcessProxyServer_Quic(remote_addr string, stun_quic_conn quic.Connection) {
log.Printf("转发地址: %s", remote_addr)
for {
new_quic_stream, err := stun_quic_conn.AcceptStream(context.Background())
if err == nil {
new_tcp_conn, err := net.Dial("tcp", remote_addr)
if err == nil {
go ForwardT2Q(new_tcp_conn, new_quic_stream, stun_quic_conn)
go ForwardQ2T(new_quic_stream, new_tcp_conn, stun_quic_conn)
continue
}
break
}
break
}
}
func ProcessProxyServer_Socks5(remote_addr string, stun_quic_conn quic.Connection) {
// Create a SOCKS5 server
socks5_svr, err := socks5.New(&socks5.Config{})
if err != nil {
utils.Log().DebugF("代理模式: %v\n", err)
return
}
log.Println("开启代理模式")
defer log.Println("退出代理模式")
for {
new_quic_stream, err := stun_quic_conn.AcceptStream(context.Background())
if err == nil {
go socks5_svr.ServeConnQuic(new_quic_stream, stun_quic_conn.RemoteAddr().(*net.UDPAddr).IP, stun_quic_conn.RemoteAddr().(*net.UDPAddr).Port)
continue
}
break
}
}
func ProcessProxyServer(stun_quic_conn quic.Connection) {
buf := pool2.Malloc(1500)
defer pool2.Free(buf)
for {
fewfgwegwe:
new_quic_stream, err := stun_quic_conn.AcceptStream(context.Background())
if err != nil {
continue
}
head_len := 2
buf_len := 0
for buf_len < head_len {
log.Printf("读取头部: %d/%d", buf_len, head_len)
buf_len2, err := new_quic_stream.Read(buf[buf_len:])
if err != nil {
log.Println("读取头部失败", err)
new_quic_stream.Close()
goto fewfgwegwe
}
buf_len += buf_len2
}
remotePort := binary.BigEndian.Uint16(buf[:head_len])
remoteAddr := fmt.Sprintf("127.0.0.1:%d", remotePort)
log.Printf("转发地址: %s", remoteAddr)
new_tcp_conn, err := net.Dial("tcp", remoteAddr)
if err == nil {
if buf_len > head_len {
new_tcp_conn.Write(buf[head_len:buf_len])
}
go ForwardT2Q(new_tcp_conn, new_quic_stream, stun_quic_conn)
go ForwardQ2T(new_quic_stream, new_tcp_conn, stun_quic_conn)
continue
}
}
}
func ProcessProxyServer2(remote_addr string, stun_quic_conn quic.Connection) {
if stun_quic_conn == nil {
log.Println(" 隧道建立失败!")
return
}
switch len(remote_addr) {
case 0:
ProcessProxyServer_Socks5(remote_addr, stun_quic_conn)
default:
ProcessProxyServer_Quic(remote_addr, stun_quic_conn)
}
}