diff --git a/README_zh.md b/README_zh.md index 678638d3..61d1ad64 100644 --- a/README_zh.md +++ b/README_zh.md @@ -380,6 +380,8 @@ frp 提供了一种新的代理类型 **xtcp** 用于应对在希望传输大量 role = visitor # 要访问的 xtcp 代理的名字 server_name = p2p_ssh + # 要访问的 xtcp 代理属于哪个用户 + server_user = test sk = abcdefg # 绑定本地端口用于访问 ssh 服务 bind_addr = 127.0.0.1 diff --git a/cmd/frpc/sub/root.go b/cmd/frpc/sub/root.go index 8f47986a..abddd28e 100644 --- a/cmd/frpc/sub/root.go +++ b/cmd/frpc/sub/root.go @@ -45,6 +45,7 @@ var ( serverAddr string user string + serverUser string // Used to choose custom user's service protocol string token string logLevel string @@ -158,6 +159,7 @@ func parseClientCommonCfgFromCmd() (cfg config.ClientCommonConf, err error) { } cfg.User = user + cfg.ServerUser = serverUser cfg.Protocol = protocol cfg.LogLevel = logLevel cfg.LogFile = logFile @@ -231,3 +233,13 @@ func startService(cfg config.ClientCommonConf, pxyCfgs map[string]config.ProxyCo } return } + +func getProxyPrefix(customServerUser, customUser string) string{ + if customServerUser != "" { + return customServerUser + "." + } + if customUser != "" { + return customUser + "." + } + return "" +} diff --git a/cmd/frpc/sub/stcp.go b/cmd/frpc/sub/stcp.go index 1a04fbf3..7de97bac 100644 --- a/cmd/frpc/sub/stcp.go +++ b/cmd/frpc/sub/stcp.go @@ -27,6 +27,7 @@ import ( func init() { stcpCmd.PersistentFlags().StringVarP(&serverAddr, "server_addr", "s", "127.0.0.1:7000", "frp server's address") stcpCmd.PersistentFlags().StringVarP(&user, "user", "u", "", "user") + stcpCmd.PersistentFlags().StringVarP(&serverUser, "server_user", "", "", "server user") stcpCmd.PersistentFlags().StringVarP(&protocol, "protocol", "p", "tcp", "tcp or kcp or websocket") stcpCmd.PersistentFlags().StringVarP(&token, "token", "t", "", "auth token") stcpCmd.PersistentFlags().StringVarP(&logLevel, "log_level", "", "info", "log level") @@ -61,12 +62,9 @@ var stcpCmd = &cobra.Command{ proxyConfs := make(map[string]config.ProxyConf) visitorConfs := make(map[string]config.VisitorConf) - var prefix string - if user != "" { - prefix = user + "." - } - if role == "server" { + prefix := getProxyPrefix("", user) + cfg := &config.StcpProxyConf{} cfg.ProxyName = prefix + proxyName cfg.ProxyType = consts.StcpProxy @@ -83,6 +81,8 @@ var stcpCmd = &cobra.Command{ } proxyConfs[cfg.ProxyName] = cfg } else if role == "visitor" { + prefix := getProxyPrefix(serverUser, user) + cfg := &config.StcpVisitorConf{} cfg.ProxyName = prefix + proxyName cfg.ProxyType = consts.StcpProxy diff --git a/cmd/frpc/sub/sudp.go b/cmd/frpc/sub/sudp.go index e3e91abc..7397d7c7 100644 --- a/cmd/frpc/sub/sudp.go +++ b/cmd/frpc/sub/sudp.go @@ -27,6 +27,7 @@ import ( func init() { sudpCmd.PersistentFlags().StringVarP(&serverAddr, "server_addr", "s", "127.0.0.1:7000", "frp server's address") sudpCmd.PersistentFlags().StringVarP(&user, "user", "u", "", "user") + stcpCmd.PersistentFlags().StringVarP(&serverUser, "server_user", "", "", "server user") sudpCmd.PersistentFlags().StringVarP(&protocol, "protocol", "p", "tcp", "tcp or kcp or websocket") sudpCmd.PersistentFlags().StringVarP(&token, "token", "t", "", "auth token") sudpCmd.PersistentFlags().StringVarP(&logLevel, "log_level", "", "info", "log level") @@ -61,12 +62,9 @@ var sudpCmd = &cobra.Command{ proxyConfs := make(map[string]config.ProxyConf) visitorConfs := make(map[string]config.VisitorConf) - var prefix string - if user != "" { - prefix = user + "." - } - if role == "server" { + prefix := getProxyPrefix("", user) + cfg := &config.SudpProxyConf{} cfg.ProxyName = prefix + proxyName cfg.ProxyType = consts.SudpProxy @@ -83,6 +81,8 @@ var sudpCmd = &cobra.Command{ } proxyConfs[cfg.ProxyName] = cfg } else if role == "visitor" { + prefix := getProxyPrefix(serverUser, user) + cfg := &config.SudpVisitorConf{} cfg.ProxyName = prefix + proxyName cfg.ProxyType = consts.SudpProxy diff --git a/cmd/frpc/sub/xtcp.go b/cmd/frpc/sub/xtcp.go index 558294da..f1e63fb9 100644 --- a/cmd/frpc/sub/xtcp.go +++ b/cmd/frpc/sub/xtcp.go @@ -27,6 +27,7 @@ import ( func init() { xtcpCmd.PersistentFlags().StringVarP(&serverAddr, "server_addr", "s", "127.0.0.1:7000", "frp server's address") xtcpCmd.PersistentFlags().StringVarP(&user, "user", "u", "", "user") + stcpCmd.PersistentFlags().StringVarP(&serverUser, "server_user", "", "", "server user") xtcpCmd.PersistentFlags().StringVarP(&protocol, "protocol", "p", "tcp", "tcp or kcp or websocket") xtcpCmd.PersistentFlags().StringVarP(&token, "token", "t", "", "auth token") xtcpCmd.PersistentFlags().StringVarP(&logLevel, "log_level", "", "info", "log level") @@ -61,12 +62,9 @@ var xtcpCmd = &cobra.Command{ proxyConfs := make(map[string]config.ProxyConf) visitorConfs := make(map[string]config.VisitorConf) - var prefix string - if user != "" { - prefix = user + "." - } - if role == "server" { + prefix := getProxyPrefix("", user) + cfg := &config.XtcpProxyConf{} cfg.ProxyName = prefix + proxyName cfg.ProxyType = consts.XtcpProxy @@ -83,6 +81,8 @@ var xtcpCmd = &cobra.Command{ } proxyConfs[cfg.ProxyName] = cfg } else if role == "visitor" { + prefix := getProxyPrefix(serverUser, user) + cfg := &config.XtcpVisitorConf{} cfg.ProxyName = prefix + proxyName cfg.ProxyType = consts.XtcpProxy diff --git a/models/config/client_common.go b/models/config/client_common.go index 3f8c485d..b0aa1c66 100644 --- a/models/config/client_common.go +++ b/models/config/client_common.go @@ -85,9 +85,14 @@ type ClientCommonConf struct { // value is true. TcpMux bool `json:"tcp_mux"` // User specifies a prefix for proxy names to distinguish them from other - // clients. If this value is not "", proxy names will automatically be - // changed to "{user}.{proxy_name}". By default, this value is "". + // clients when the value of "server_user" not set. If this value is not "", + // proxy names will automatically be changed to "{user}.{proxy_name}". By + // default, this value is "". User string `json:"user"` + // User specifies a custom prefix for proxy names. If this value is not "", + // proxy names will automatically be changed to "{server_user}.{proxy_name}". + // By default, this value is "". + ServerUser string `json:"server_user"` // DnsServer specifies a DNS server address for FRPC to use. If this value // is "", the default DNS will be used. By default, this value is "". DnsServer string `json:"dns_server"` @@ -137,6 +142,7 @@ func GetDefaultClientConf() ClientCommonConf { PoolCount: 1, TcpMux: true, User: "", + ServerUser: "", DnsServer: "", LoginFailExit: true, Start: make(map[string]struct{}), @@ -244,6 +250,10 @@ func UnmarshalClientConfFromIni(content string) (cfg ClientCommonConf, err error cfg.User = tmpStr } + if tmpStr, ok = conf.Get("common", "server_user"); ok { + cfg.ServerUser = tmpStr + } + if tmpStr, ok = conf.Get("common", "dns_server"); ok { cfg.DnsServer = tmpStr }