forwarder

package module
v0.0.0-...-8b591b9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 31, 2024 License: MIT Imports: 14 Imported by: 0

README

端口转发工具 (Port Forwarder)

一个高性能的端口转发工具,支持 TCP 和 UDP 协议,提供完整的流量控制、安全检查和监控功能。

主要特性

1. 协议支持
  • TCP 转发(支持 TCP/TCP4/TCP6)
  • UDP 转发(支持 UDP/UDP4/UDP6)
  • 支持多目标地址的负载均衡转发
2. 性能优化
  • TCP 连接优化
    • 自适应缓冲区大小(128KB - 256KB)
    • TCP_NODELAY 和 KeepAlive 优化
    • 连接池复用机制
  • UDP 高性能模式
    • 多工作协程处理(可配置)
    • 基于 channel 的数据包分发
    • 内置缓冲区池,减少内存分配
  • 全局资源管理
    • 统一的缓冲区池管理
    • 连接数限制和监控
    • 协程数量控制
3. 安全特性
  • IP 访问控制
    • 支持白名单模式
    • 支持黑名单模式
    • 本地回环地址自动允许
  • 流量控制
    • 入站/出站流量限速
    • 全局和单端口流量限制
    • 基于令牌桶算法的限速实现
  • 连接保护
    • 全局最大连接数限制(默认 1024)
    • 单端口最大连接数限制(默认 256)
    • 异常连接自动清理(30s 超时)
4. 监控功能
  • 流量统计
    • 实时入站/出站流量
    • 流量速率监控
    • 数据包统计
  • 连接监控
    • 当前活跃连接数
    • TCP/UDP 会话状态
    • 连接建立/断开事件
  • 性能指标
    • 处理延迟统计
    • 缓冲区使用情况
    • 协程数量监控

配置说明

1. 全局配置
DefaultRelayRuleOptions = RelayRuleOptions{
    // UDP 配置
    UDPPackageSize: 65507,                    // UDP 包最大大小
    UDPBufferSize: 4 * 1024 * 1024,          // UDP 缓冲区大小(4MB)
    UDPQueueSize: 10000,                      // UDP 队列大小
    UDPProxyPerformanceMode: true,            // UDP 性能模式
    
    // TCP 配置
    SingleProxyMaxTCPConnections: 256,        // 单端口最大 TCP 连接数
    
    // 安全配置
    SafeMode: SafeModeNone,                   // 安全模式(none/white/black)
    
    // 流量控制
    InRateLimit: 0,                           // 入站流量限制(0表示不限制)
    OutRateLimit: 0,                          // 出站流量限制(0表示不限制)
}
2. 代理创建选项
CreateProxyOptions{
    ProxyType: "tcp",              // 协议类型
    ListenIP: "0.0.0.0",          // 监听地址
    ListenPort: 8080,             // 监听端口
    TargetAddressList: []string{   // 目标地址列表
        "192.168.1.100:80",
    },
    RelayOptions: RelayRuleOptions{
        // 自定义转发规则选项
    },
}

API 接口

REST API
  • GET /forwarders - 获取所有转发器列表
  • POST /forwarders - 创建新的转发器
  • PUT /forwarders/{type}/{id}/status - 更新转发器状态
  • PUT /forwarders/{type}/{id}/ratelimit - 更新转发器流量限制
  • DELETE /forwarders/{type}/{id} - 删除转发器

使用示例

1. 创建 TCP 转发
manager := forwarder.NewManager()
proxy, err := manager.CreateProxy(CreateProxyOptions{
    ProxyType: "tcp",
    ListenIP: "0.0.0.0",
    ListenPort: 8080,
    TargetAddressList: []string{"192.168.1.100:80"},
})
if err != nil {
    log.Fatal(err)
}
proxy.Start()
2. 创建 UDP 转发(性能模式)
proxy, err := manager.CreateProxy(CreateProxyOptions{
    ProxyType: "udp",
    ListenIP: "0.0.0.0",
    ListenPort: 53,
    TargetAddressList: []string{"8.8.8.8:53"},
    RelayOptions: RelayRuleOptions{
        UDPProxyPerformanceMode: true,
        UDPPackageSize: 4096,
    },
})

性能优化建议

  1. TCP 转发优化
  • 对于高流量场景,自动启用 256KB 缓冲区
  • 启用 TCP_NODELAY 减少延迟
  • 设置合适的 KeepAlive 时间(默认 30s)
  1. UDP 转发优化
  • 高并发场景开启性能模式(UDPProxyPerformanceMode)
  • 调整 UDPBufferSize 和 UDPQueueSize
  • 根据 CPU 核心数自动设置工作协程数
  1. 系统配置
  • 调整系统最大文件描述符限制
  • 优化网络相关内核参数
  • 合理设置全局最大连接数

注意事项

  1. 安全配置
  • 建议在公网环境启用 IP 白名单模式
  • 合理设置流量限制避免资源耗尽
  • 定期检查连接状态和资源使用
  1. 性能考虑
  • UDP 性能模式会增加内存使用
  • 大量并发连接时注意系统资源限制
  • 监控流量统计避免性能瓶颈

许可证

MIT License

Documentation

Index

Constants

View Source
const (
	SafeModeNone      = ""      // 不启用安全检查
	SafeModeWhitelist = "white" // 白名单模式
	SafeModeBlacklist = "black" // 黑名单模式
)

SafeCheckMode 安全检查模式

Variables

View Source
var DefaultRelayRuleOptions = RelayRuleOptions{

	UDPPackageSize: _DefaultUDPPackageSize,
	SingleProxyMaxUDPReadTargetDataRoutineCount: _DefaultUDPMaxRoutineCount,
	UDPProxyPerformanceMode:                     true,
	UDPShortMode:                                false,

	UDPBufferSize: _DefaultUDPBufferSize,
	UDPQueueSize:  _DefaultUDPQueueSize,

	SingleProxyMaxTCPConnections: _TCPUDPDefaultSingleProxyMaxConnections,

	SafeMode: SafeModeNone,

	InRateLimit:  0,
	OutRateLimit: 0,
}

DefaultRelayRuleOptions 默认的转发规则选项

Functions

func ApplyDefaultOptions

func ApplyDefaultOptions(opts *RelayRuleOptions)

ApplyDefaultOptions 应用默认选项

func ValidateOptions

func ValidateOptions(opts *RelayRuleOptions) error

ValidateOptions 验证配置选项的合理性

Types

type BaseProxy

type BaseProxy struct {
	// TCPUDPProxyCommonConf 包含TCP和UDP代理共用的配置
	TCPUDPProxyCommonConf

	// RelayRuleOptions 字段
	RelayRuleOptions RelayRuleOptions
	// contains filtered or unexported fields
}

BaseProxy TCP、UDP协议的基础代理结构体

func (*BaseProxy) GetBuffer

func (p *BaseProxy) GetBuffer(isUDP bool, size int) []byte

GetBuffer 获取缓冲区

func (*BaseProxy) GetDescription

func (p *BaseProxy) GetDescription() string

GetDescription 获取代理的描述信息

func (*BaseProxy) GetLastUpdateTime

func (p *BaseProxy) GetLastUpdateTime() time.Time

GetLastUpdateTime 获取最后一次流量统计的更新时间

func (*BaseProxy) GetRateLimit

func (p *BaseProxy) GetRateLimit() (inLimit, outLimit float64)

GetRateLimit 获取当前的入站和出站速率限制

@return float64, float64 入站限制和出站限制(KB/s)

func (*BaseProxy) GetStatus

func (p *BaseProxy) GetStatus() (bool, string)

GetStatus 获取代理状态

func (*BaseProxy) GetTrafficIn

func (p *BaseProxy) GetTrafficIn() int64

GetTrafficIn 获取入站流量

func (*BaseProxy) GetTrafficInRate

func (p *BaseProxy) GetTrafficInRate() float64

GetTrafficInRate 计算并返回入站流量速率

@return float64 入站流量速率(字节/秒)

func (*BaseProxy) GetTrafficOut

func (p *BaseProxy) GetTrafficOut() int64

GetTrafficOut 获取出站流量

func (*BaseProxy) GetTrafficOutRate

func (p *BaseProxy) GetTrafficOutRate() float64

GetTrafficOutRate 计算并返回出站流量速率

@return float64 出站流量速率(字节/秒)

func (*BaseProxy) GetType

func (p *BaseProxy) GetType() string

GetType 获取代理类型

func (*BaseProxy) IsRunning

func (p *BaseProxy) IsRunning() bool

IsRunning 检查代理是否正在运行

func (*BaseProxy) PutBuffer

func (p *BaseProxy) PutBuffer(buf []byte, isUDP bool)

PutBuffer 归还缓冲区

func (*BaseProxy) ReceiveDataCallback

func (p *BaseProxy) ReceiveDataCallback(size int64)

ReceiveDataCallback 接收数据回调

@param size int64 接收到的数据大小

func (*BaseProxy) SendDataCallback

func (p *BaseProxy) SendDataCallback(size int64)

SendDataCallback 发送数据回调

@param size int64 发送的数据大小

func (*BaseProxy) SetDescription

func (p *BaseProxy) SetDescription(desc string)

SetDescription 设置代理的描述信息

func (*BaseProxy) SetRateLimit

func (p *BaseProxy) SetRateLimit(inLimit, outLimit float64)

SetRateLimit 设置入站和出站的速率限制

@param inLimit float64 入站限制(KB/s)

@param outLimit float64 出站限制(KB/s)

type BaseProxyConf

type BaseProxyConf struct {
	// 流量统计
	TrafficIn  int64 // 入站总流量计数器
	TrafficOut int64 // 出站总流量计数器

	ProxyType string // 代理类型 (tcp/tcp4/tcp6/udp/udp4/udp6)
	// contains filtered or unexported fields
}

BaseProxyConf 基础代理配置结构体

func (*BaseProxyConf) GetStatus

func (p *BaseProxyConf) GetStatus() string

GetStatus 获取代理状态

func (*BaseProxyConf) GetTrafficIn

func (p *BaseProxyConf) GetTrafficIn() int64

GetTrafficIn 获取入站总流量

@return int64 入站总流量大小

func (*BaseProxyConf) GetTrafficOut

func (p *BaseProxyConf) GetTrafficOut() int64

GetTrafficOut 获取出站总流量

@return int64 出站总流量大小

func (*BaseProxyConf) GetType

func (p *BaseProxyConf) GetType() string

GetType 获取代理类型

func (*BaseProxyConf) ReceiveDataCallback

func (p *BaseProxyConf) ReceiveDataCallback(nw int64)

ReceiveDataCallback 处理接收数据的回调

@param nw int64 接收到的数据大小

func (*BaseProxyConf) SendDataCallback

func (p *BaseProxyConf) SendDataCallback(nw int64)

SendDataCallback 处理发送数据的回调

@param nw int64 发送的数据大小

type CreateProxyOptions

type CreateProxyOptions struct {
	ProxyType         string           // 代理类型
	ListenIP          string           // 监听IP
	ListenPort        int              // 监听端口
	TargetAddressList []string         // 目标地址列表
	RelayOptions      RelayRuleOptions // 转发规则选项
}

CreateProxyOptions 创建代理的选项

type GlobalManager

type GlobalManager struct {
	// contains filtered or unexported fields
}

GlobalManager 全局管理器

func GetGlobalManager

func GetGlobalManager() *GlobalManager

GetGlobalManager 获取全局管理器实例

func NewGlobalManager

func NewGlobalManager() *GlobalManager

NewGlobalManager 创建全局管理器实例

func (*GlobalManager) GetBufferPool

func (gm *GlobalManager) GetBufferPool() *_BufferPool

GetBufferPool 获取缓冲池管理器

func (*GlobalManager) GetCounters

func (gm *GlobalManager) GetCounters() *_GlobalCounters

GetCounters 获取全局计数器

func (*GlobalManager) GetManager

func (gm *GlobalManager) GetManager() *proxyManager

GetManager 获取指定代理

func (*GlobalManager) GetOrSetLogger

func (gm *GlobalManager) GetOrSetLogger(customLogger ...Logger) Logger

GetOrSetLogger 设置或者获取默认日志记录器

@param customLogger ...Logger 自定义的日志记录器

@return Logger 返回设置的日志记录器

func (*GlobalManager) GetProxyKey

func (gm *GlobalManager) GetProxyKey(proxyType, listenIP string, listenPort int) string

GetProxyKey 生成代理的唯一标识键

func (*GlobalManager) GetSecurityManager

func (gm *GlobalManager) GetSecurityManager() *_SecurityManager

GetSecurityManager 获取安全管理器

func (*GlobalManager) GetTCPListener

func (gm *GlobalManager) GetTCPListener(addr string) (net.Listener, error)

GetTCPListener 获取TCP监听器

func (*GlobalManager) GetUDPConn

func (gm *GlobalManager) GetUDPConn(addr string) (net.PacketConn, error)

GetUDPConn 获取UDP连接

type Logger

type Logger interface {
	Debugf(format string, args ...any)
	Infof(format string, args ...any)
	Warnf(format string, args ...any)
	Errorf(format string, args ...any)
}

Logger 日志接口

type Manager

type Manager interface {
	// 代理管理方法
	AddProxy(proxy Proxy)
	RemoveProxy(id int, proxyType string)
	GetProxy(id int, proxyType string) (Proxy, bool)
	GetAllProxiesList() map[int]ProxyInfo

	// TCP代理相关方法
	GetTCPProxy(id int) (*TCPProxy, bool)
	GetAllTCPProxies() map[int]*TCPProxy
	RemoveTCPProxy(id int)

	// UDP代理相关方法
	GetUDPProxy(id int) (*UDPProxy, bool)
	GetAllUDPProxies() map[int]*UDPProxy
	RemoveUDPProxy(id int)

	// 网络连接方法
	GetTCPListener(addr string) (net.Listener, error)
	GetUDPConn(addr string) (net.PacketConn, error)

	// CreateProxy 创建新的代理实例
	CreateProxy(opts CreateProxyOptions) (Proxy, error)
}

Manager 代理管理器接口

func NewManager

func NewManager(opts ...ManagerOptions) Manager

NewManager 创建新的代理管理器实例

type ManagerOptions

type ManagerOptions func(*_MrgConfig)

ManagerOptions 定义管理器配置选项

func WithProtocols

func WithProtocols(protocols []string) ManagerOptions

WithProtocols 设置支持的协议

type Proxy

type Proxy interface {
	// 基本控制方法
	Start() error    // 启动代理
	Stop() error     // 停止代理
	Restart() error  // 重启代理
	IsRunning() bool // 检查代理是否正在运行

	// 流量统计相关方法
	ReceiveDataCallback(int64)  // 接收数据时的回调函数
	SendDataCallback(int64)     // 发送数据时的回调函数
	GetTrafficIn() int64        // 获取入站总流量
	GetTrafficOut() int64       // 获取出站总流量
	GetTrafficInRate() float64  // 获取入站流量速率
	GetTrafficOutRate() float64 // 获取出站流量速率

	// 状态查询方法
	GetTargetAddress() string     // 获取目标地址
	GetType() string              // 获取代理类型
	GetStatus() (ok bool)         // 获取代理状态
	GetCurrentConnections() int64 // 获取当前连接数

	// 配置相关方法
	GetListenIP() string          // 获取监听IP
	GetListenPort() int           // 获取监听端口
	GetKey() string               // 获取代理唯一标识
	GetID() int                   // 获取代理ID
	GetDescription() string       // 获取代理描述
	GetLastUpdateTime() time.Time // 获取代理最后更新时间

	// 安全相关方法
	SafeCheck(ip string) bool               // IP安全检查
	SetRateLimit(inLimit, outLimit float64) // 设置流量限制
	GetRateLimit() (float64, float64)       // 获取流量限制

	String() string // 获取代理的字符串表示
}

Proxy 接口定义了代理的基本操作

type ProxyInfo

type ProxyInfo struct {
	ID          int        `json:"proxyId" toml:"proxyId"`
	Type        string     `json:"proxyType" toml:"proxyType"`
	ListenAddr  string     `json:"listenAddr" toml:"listenAddr"`
	RemoteAddr  string     `json:"remoteAddr" toml:"remoteAddr"`
	Status      bool       `json:"proxyStatus" toml:"proxyStatus"`
	RateIn      float64    `json:"rateIn" toml:"rateIn"`
	RateOut     float64    `json:"rateOut" toml:"rateOut"`
	TrafficIn   int64      `json:"trafficIn" toml:"trafficIn"`
	TrafficOut  int64      `json:"trafficOut" toml:"trafficOut"`
	RateLimit   _RateLimit `json:"rateLimit" toml:"rateLimit"`
	UpdateTime  time.Time  `json:"updateTime" toml:"updateTime"`
	Description string     `json:"description" toml:"description"`
	Connections int64      `json:"connections" toml:"connections"`
}

ProxyInfo 代理信息结构体

type RelayRuleOptions

type RelayRuleOptions struct {
	// UDPPackageSize UDP包大小,用于设置缓冲区大小
	UDPPackageSize int `json:"UDPPackageSize,omitempty"`

	// SingleProxyMaxTCPConnections 单个TCP代理允许的最大连接数
	SingleProxyMaxTCPConnections int64 `json:"SingleProxyMaxTCPConnections,omitempty"`

	// SingleProxyMaxUDPReadTargetDataRoutineCount 单个UDP代理允许的最大目标数据读取协程数
	SingleProxyMaxUDPReadTargetDataRoutineCount int64 `json:"SingleProxyMaxUDPReadTargetDataRoutineCount"`

	// UDPProxyPerformanceMode UDP代理性能模式开关,启用时会优化性能
	UDPProxyPerformanceMode bool `json:"UDPProxyPerformanceMode,omitempty"`

	// UDPShortMode UDP短连接模式开关,启用时会优化短连接场景
	UDPShortMode bool `json:"UDPShortMode,omitempty"`

	// SafeMode 安全模式设置,用于控制访问限制
	SafeMode string `json:"SafeMode,omitempty"`

	// InRateLimit 入站流量限制(单位:KB/s)
	InRateLimit float64 `json:"InRateLimit,omitempty"`

	// OutRateLimit 出站流量限制(单位:KB/s)
	OutRateLimit float64 `json:"OutRateLimit,omitempty"`

	// UDPBufferSize UDP缓冲区大小
	UDPBufferSize int `json:"UDPBufferSize,omitempty"`

	// UDPQueueSize UDP队列大小
	UDPQueueSize int `json:"UDPQueueSize,omitempty"`

	Description string `json:"Description,omitempty"`
}

RelayRuleOptions 定义了转发规则的配置选项

type SafeCheck

type SafeCheck func(mode, ip string) (allowed bool)

SafeCheck 安全检查函数类型

type TCPProxy

type TCPProxy struct {
	BaseProxy
	// contains filtered or unexported fields
}

TCPProxy TCP代理实现

func CreateTCPProxy

func CreateTCPProxy(proxyType, listenIP string, listenPort int, targetAddressList []string, options RelayRuleOptions) (*TCPProxy, error)

CreateTCPProxy 创建新的TCP代理实例

func (*TCPProxy) CheckConnectionsLimit

func (p *TCPProxy) CheckConnectionsLimit() error

CheckConnectionsLimit 检查是否超过连接数限制

func (*TCPProxy) GetStatus

func (p *TCPProxy) GetStatus() (ok bool)

GetStatus 获取TCP代理的当前状态

func (*TCPProxy) Restart

func (p *TCPProxy) Restart() error

Restart 重启TCP代理

func (*TCPProxy) Start

func (p *TCPProxy) Start() error

Start 启动TCP代理

func (*TCPProxy) Stop

func (p *TCPProxy) Stop() error

Stop 停止TCP代理

type TCPUDPProxyCommonConf

type TCPUDPProxyCommonConf struct {
	CurrentConnectionsCount   int64
	SingleProxyMaxConnections int64

	BaseProxyConf
	// contains filtered or unexported fields
}

func (*TCPUDPProxyCommonConf) AddCurrentConnections

func (p *TCPUDPProxyCommonConf) AddCurrentConnections(delta int64)

AddCurrentConnections 增加当前全局连接数

func (*TCPUDPProxyCommonConf) GetCurrentConnections

func (p *TCPUDPProxyCommonConf) GetCurrentConnections() int64

GetCurrentConnections 获取当前连接数

func (*TCPUDPProxyCommonConf) GetID

func (p *TCPUDPProxyCommonConf) GetID() int

GetID 获取代理ID

func (*TCPUDPProxyCommonConf) GetKey

func (p *TCPUDPProxyCommonConf) GetKey() string

GetKey 获取代理键

func (*TCPUDPProxyCommonConf) GetListenAddress

func (p *TCPUDPProxyCommonConf) GetListenAddress() string

GetListenAddress 获取监听地址

func (*TCPUDPProxyCommonConf) GetListenIP

func (p *TCPUDPProxyCommonConf) GetListenIP() string

GetListenIP 获取监听IP

func (*TCPUDPProxyCommonConf) GetListenPort

func (p *TCPUDPProxyCommonConf) GetListenPort() int

GetListenPort 获取监听端口

func (*TCPUDPProxyCommonConf) GetSafeMode

func (p *TCPUDPProxyCommonConf) GetSafeMode() string

GetSafeMode 获取安全模式

func (*TCPUDPProxyCommonConf) GetTargetAddress

func (p *TCPUDPProxyCommonConf) GetTargetAddress() string

GetTargetAddress 获取目标地址

func (*TCPUDPProxyCommonConf) SafeCheck

func (p *TCPUDPProxyCommonConf) SafeCheck(remoteAddr string) bool

SafeCheck 执行安全检查

func (*TCPUDPProxyCommonConf) SetMaxConnections

func (p *TCPUDPProxyCommonConf) SetMaxConnections(max int64)

SetMaxConnections 设置最大连接数

func (*TCPUDPProxyCommonConf) String

func (p *TCPUDPProxyCommonConf) String() string

String 返回代理的字符串表示

type UDPProxy

type UDPProxy struct {
	BaseProxy

	Upm       bool
	ShortMode bool

	SingleProxyMaxUDPReadTargetDatagoroutineCount int64
	// contains filtered or unexported fields
}

UDPProxy UDP代理实现

func CreateUDPProxy

func CreateUDPProxy(proxyType, listenIP string, listenPort int, targetAddressList []string, options RelayRuleOptions) (*UDPProxy, error)

CreateUDPProxy 创建新的UDP代理实例

func (*UDPProxy) CheckReadTargetDataRoutineLimit

func (p *UDPProxy) CheckReadTargetDataRoutineLimit() error

CheckReadTargetDataRoutineLimit 检查读取目标数据的例程限制

func (*UDPProxy) CheckTargetUDPConnectSessions

func (p *UDPProxy) CheckTargetUDPConnectSessions()

CheckTargetUDPConnectSessions 检查目标UDP连接会话

func (*UDPProxy) Forwarder

func (p *UDPProxy) Forwarder(replyCh chan *udpPackage)

Forwarder 转发器

func (*UDPProxy) GetStatus

func (p *UDPProxy) GetStatus() (ok bool)

GetStatus 获取UDP代理的当前状态

func (*UDPProxy) GetTargetUDPAddr

func (p *UDPProxy) GetTargetUDPAddr() *net.UDPAddr

GetTargetUDPAddr 获取目标UDP地址

func (*UDPProxy) GetUDPPacketSize

func (p *UDPProxy) GetUDPPacketSize() int

GetUDPPacketSize 获取UDP包大小

func (*UDPProxy) ListenHandler

func (p *UDPProxy) ListenHandler(ln net.PacketConn)

ListenHandler 监听处理器

func (*UDPProxy) ReadFromTargetOnce

func (p *UDPProxy) ReadFromTargetOnce() bool

ReadFromTargetOnce 判断是否只从目标读取一次

func (*UDPProxy) Restart

func (p *UDPProxy) Restart() error

Restart 重启UDP代理

func (*UDPProxy) SetUDPPacketSize

func (p *UDPProxy) SetUDPPacketSize(size int)

SetUDPPacketSize 设置UDP包大小

func (*UDPProxy) Start

func (p *UDPProxy) Start() error

Start 启动UDP代理

func (*UDPProxy) Stop

func (p *UDPProxy) Stop() error

Stop 停止UDP代理

Directories

Path Synopsis
examples
client command
manager command
server command

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL