1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-11-19 10:56:06 -05:00
v2fly/app/proxyman/inbound/always.go

149 lines
3.7 KiB
Go
Raw Normal View History

package inbound
import (
"context"
2018-04-11 18:10:14 -04:00
"v2ray.com/core"
"v2ray.com/core/app/proxyman"
2017-04-02 08:06:20 -04:00
"v2ray.com/core/app/proxyman/mux"
2018-02-09 17:07:38 -05:00
"v2ray.com/core/common"
"v2ray.com/core/common/dice"
"v2ray.com/core/common/net"
2018-05-31 05:55:11 -04:00
"v2ray.com/core/common/serial"
"v2ray.com/core/proxy"
)
2018-04-11 18:10:14 -04:00
func getStatCounter(v *core.Instance, tag string) (core.StatCounter, core.StatCounter) {
var uplinkCounter core.StatCounter
var downlinkCounter core.StatCounter
policy := v.PolicyManager()
stats := v.Stats()
if len(tag) > 0 && policy.ForSystem().Stats.InboundUplink {
name := "inbound>>>" + tag + ">>>traffic>>>uplink"
c, _ := core.GetOrRegisterStatCounter(stats, name)
if c != nil {
uplinkCounter = c
}
}
if len(tag) > 0 && policy.ForSystem().Stats.InboundDownlink {
name := "inbound>>>" + tag + ">>>traffic>>>downlink"
c, _ := core.GetOrRegisterStatCounter(stats, name)
if c != nil {
downlinkCounter = c
}
}
return uplinkCounter, downlinkCounter
}
type AlwaysOnInboundHandler struct {
2017-02-03 16:50:01 -05:00
proxy proxy.Inbound
workers []worker
2017-04-02 08:06:20 -04:00
mux *mux.Server
tag string
}
func NewAlwaysOnInboundHandler(ctx context.Context, tag string, receiverConfig *proxyman.ReceiverConfig, proxyConfig interface{}) (*AlwaysOnInboundHandler, error) {
2018-02-09 17:07:38 -05:00
rawProxy, err := common.CreateObject(ctx, proxyConfig)
if err != nil {
return nil, err
}
2018-02-09 17:07:38 -05:00
p, ok := rawProxy.(proxy.Inbound)
if !ok {
return nil, newError("not an inbound proxy.")
}
h := &AlwaysOnInboundHandler{
proxy: p,
2017-04-02 08:06:20 -04:00
mux: mux.NewServer(ctx),
tag: tag,
}
2018-04-11 18:10:14 -04:00
uplinkCounter, downlinkCounter := getStatCounter(core.MustFromContext(ctx), tag)
nl := p.Network()
pr := receiverConfig.PortRange
2017-01-27 17:52:29 -05:00
address := receiverConfig.Listen.AsAddress()
if address == nil {
address = net.AnyIP
}
for port := pr.From; port <= pr.To; port++ {
if nl.HasNetwork(net.Network_TCP) {
2017-12-27 16:25:12 -05:00
newError("creating stream worker on ", address, ":", port).AtDebug().WriteToLog()
worker := &tcpWorker{
2018-04-11 18:10:14 -04:00
address: address,
port: net.Port(port),
proxy: p,
stream: receiverConfig.StreamSettings,
recvOrigDest: receiverConfig.ReceiveOriginalDestination,
tag: tag,
dispatcher: h.mux,
2018-07-16 07:47:00 -04:00
sniffingConfig: receiverConfig.GetEffectiveSniffingSettings(),
2018-04-11 18:10:14 -04:00
uplinkCounter: uplinkCounter,
downlinkCounter: downlinkCounter,
}
h.workers = append(h.workers, worker)
}
if nl.HasNetwork(net.Network_UDP) {
worker := &udpWorker{
2018-04-11 18:10:14 -04:00
tag: tag,
proxy: p,
address: address,
port: net.Port(port),
recvOrigDest: receiverConfig.ReceiveOriginalDestination,
dispatcher: h.mux,
uplinkCounter: uplinkCounter,
downlinkCounter: downlinkCounter,
}
h.workers = append(h.workers, worker)
}
}
return h, nil
}
2018-06-04 08:29:43 -04:00
// Start implements common.Runnable.
func (h *AlwaysOnInboundHandler) Start() error {
for _, worker := range h.workers {
if err := worker.Start(); err != nil {
return err
}
}
return nil
}
2018-06-04 08:29:43 -04:00
// Close implements common.Closable.
2018-02-08 09:39:46 -05:00
func (h *AlwaysOnInboundHandler) Close() error {
2018-05-31 05:55:11 -04:00
var errors []interface{}
for _, worker := range h.workers {
2018-05-31 05:55:11 -04:00
if err := worker.Close(); err != nil {
errors = append(errors, err)
}
}
if err := h.mux.Close(); err != nil {
errors = append(errors, err)
}
if len(errors) > 0 {
return newError("failed to close all resources").Base(newError(serial.Concat(errors...)))
}
2018-02-08 09:39:46 -05:00
return nil
}
func (h *AlwaysOnInboundHandler) GetRandomInboundProxy() (interface{}, net.Port, int) {
if len(h.workers) == 0 {
return nil, 0, 0
}
w := h.workers[dice.Roll(len(h.workers))]
return w.Proxy(), w.Port(), 9999
}
func (h *AlwaysOnInboundHandler) Tag() string {
return h.tag
}
2018-02-05 17:38:24 -05:00
func (h *AlwaysOnInboundHandler) GetInbound() proxy.Inbound {
return h.proxy
}