github.com/ipfans/trojan-go@v0.11.0/proxy/nat/nat.go (about)

     1  //go:build linux
     2  // +build linux
     3  
     4  package nat
     5  
     6  import (
     7  	"context"
     8  
     9  	"github.com/ipfans/trojan-go/common"
    10  	"github.com/ipfans/trojan-go/config"
    11  	"github.com/ipfans/trojan-go/proxy"
    12  	"github.com/ipfans/trojan-go/proxy/client"
    13  	"github.com/ipfans/trojan-go/tunnel"
    14  	"github.com/ipfans/trojan-go/tunnel/tproxy"
    15  )
    16  
    17  const Name = "NAT"
    18  
    19  func init() {
    20  	proxy.RegisterProxyCreator(Name, func(ctx context.Context) (*proxy.Proxy, error) {
    21  		cfg := config.FromContext(ctx, Name).(*client.Config)
    22  		if cfg.Router.Enabled {
    23  			return nil, common.NewError("router is not allowed in nat mode")
    24  		}
    25  		ctx, cancel := context.WithCancel(ctx)
    26  		serverStack := []string{tproxy.Name}
    27  		clientStack := client.GenerateClientTree(cfg.TransportPlugin.Enabled, cfg.Mux.Enabled, cfg.Websocket.Enabled, cfg.Shadowsocks.Enabled, false)
    28  		c, err := proxy.CreateClientStack(ctx, clientStack)
    29  		if err != nil {
    30  			cancel()
    31  			return nil, err
    32  		}
    33  		s, err := proxy.CreateServerStack(ctx, serverStack)
    34  		if err != nil {
    35  			cancel()
    36  			return nil, err
    37  		}
    38  		return proxy.NewProxy(ctx, cancel, []tunnel.Server{s}, c), nil
    39  	})
    40  }
    41  
    42  func init() {
    43  	config.RegisterConfigCreator(Name, func() interface{} {
    44  		return new(client.Config)
    45  	})
    46  }