Files
v2ray_simple/proxy/dokodemo/server.go
hahahrfool f8ef685bdd 解决readv内存泄漏问题;解决转发时断连后的悬垂链接问题
在四点链接的情况下,我们只终端中间两点是不够的,要切三刀;
总之实践很简单,就是copy完成之后,要Close所有的链接

readv的话,系统readv数组和buffer不要在put进pool后相互引用

添加-bl 选项,可以自定义buf大小;注意越小可能越慢,建议buf大小保持在4k以上

添加-pp选项,可以生成cpu.pprof文件

修复其它小问题.
2022-03-31 01:32:58 +08:00

88 lines
2.7 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 dokodemo implements a dokodemo-door proxy.Server.
Server that wants to relay data to a dokodemo target address.
dokodemo 是 dokodemo-door 协议的实现。目前不含透明代理功能。
dokodemo 是 listen端, 监听一个普通的tcp端口试图将一切流量转发到特定的预定义的地址. 并不是直接转发而是转发到dial。
dokodemo 属于 “单目标”代理而其它proxy.Server 一般都属于 “泛目标”代理。
内部实际上就是 指定了目标的 纯tcp/udp协议属于监听协议中最简单、最纯粹的一种。
Example 应用例子
使用 dokodemo 做监听用direct 拨号指定一个target那么实际上就是把 该监听的节点 与远程target间建立了一个信道;
dokodemo 每监听到一个新连接, 就会新增一条 与 target 间的信道.
所以可能比较适合 中转机的情况,
比如如果有两个服务器 A和 B 和客户C。
我们只告诉C 服务器B 的地址然后告诉它B使用vless协议。然后C就会用vless协议对B 拨号。
此时B我们实际配置 为用 dokodemo 监听而不是用vless监听然后 dokodemo 的目标 指向 服务器A 的 vless监听端口.
这样就形成了一个中转机制.
实际例子:
https://www.40huo.cn/blog/wireguard-over-vless.html
就是说,任意门把客户数据的出口、自己的入口点从本地搬到了某个代理服务器的入口,然后指定了该数据的实际远程目标;就好像数据是从代理服务器直接发出的一样
到底是哪个代理服务器由outbound即本作的dial以及routing配置决定的。如果没有配置routing那就是默认走第一个dial.
*/
package dokodemo
import (
"errors"
"io"
"net"
"net/url"
"github.com/hahahrfool/v2ray_simple/netLayer"
"github.com/hahahrfool/v2ray_simple/proxy"
)
const name = "dokodemo"
func init() {
proxy.RegisterServer(name, &ServerCreator{})
}
type ServerCreator struct{}
// NewServerFromURL returns "Not implemented".
//因为 tcp:// 这种url没法轻易放在 url的query里还需转义所以不实用
func (_ ServerCreator) NewServerFromURL(*url.URL) (proxy.Server, error) {
return nil, errors.New("Not implemented")
}
// use lc.TargetAddr
func (_ ServerCreator) NewServer(lc *proxy.ListenConf) (proxy.Server, error) {
ta, e := netLayer.NewAddrByURL(lc.TargetAddr)
if e != nil {
return nil, e
}
s := &Server{
targetAddr: ta,
}
return s, nil
}
type Server struct {
proxy.ProxyCommonStruct
targetAddr *netLayer.Addr
}
func NewServer() (proxy.Server, error) {
d := &Server{}
return d, nil
}
func (d *Server) Name() string { return name }
func (s *Server) Handshake(underlay net.Conn) (io.ReadWriteCloser, *netLayer.Addr, error) {
return underlay, s.targetAddr, nil
}