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 }