Exemplo n.º 1
0
        private static int routingGeo(string ipOrDomain, string code, string tag, ref V2rayConfig v2rayConfig)
        {
            try
            {
                if (!Utils.IsNullOrEmpty(code))
                {
                    //IP
                    if (ipOrDomain == "ip" || ipOrDomain == "")
                    {
                        RulesItem rulesItem = new RulesItem();
                        rulesItem.type        = "field";
                        rulesItem.outboundTag = Global.directTag;
                        rulesItem.ip          = new List <string>();
                        rulesItem.ip.Add($"geoip:{code}");

                        v2rayConfig.routing.rules.Add(rulesItem);
                    }

                    if (ipOrDomain == "domain" || ipOrDomain == "")
                    {
                        RulesItem rulesItem = new RulesItem();
                        rulesItem.type        = "field";
                        rulesItem.outboundTag = Global.directTag;
                        rulesItem.domain      = new List <string>();
                        rulesItem.domain.Add($"geosite:{code}");
                        v2rayConfig.routing.rules.Add(rulesItem);
                    }
                }
            }
            catch
            {
            }
            return(0);
        }
Exemplo n.º 2
0
        /// <summary>
        /// remoteDNS
        /// </summary>
        /// <param name="config"></param>
        /// <param name="v2rayConfig"></param>
        /// <returns></returns>
        private static int dns(Config config, ref V2rayConfig v2rayConfig)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(config.remoteDNS))
                {
                    return(0);
                }
                List <string> servers = new List <string>();

                string[] arrDNS = config.remoteDNS.Split(',');
                foreach (string str in arrDNS)
                {
                    if (Utils.IsIP(str))
                    {
                        servers.Add(str);
                    }
                }
                servers.Add("localhost");
                v2rayConfig.dns.servers = servers;
            }
            catch
            {
            }
            return(0);
        }
Exemplo n.º 3
0
        private static void inbound(Server server, ref V2rayConfig v2rayConfig)
        {
            try
            {
                var inbound = new Inbounds
                {
                    port     = Global.Settings.Socks5LocalPort,
                    protocol = "socks",
                    listen   = Global.Settings.LocalAddress,
                    settings = new Inboundsettings
                    {
                        udp = true
                    }
                };

                v2rayConfig.inbounds = new List <Inbounds>
                {
                    inbound
                };
            }
            catch
            {
                // ignored
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// vmess协议服务器配置
        /// </summary>
        /// <param name="config"></param>
        /// <param name="v2rayConfig"></param>
        /// <returns></returns>
        private static int ServerInbound(Config config, ref V2rayConfig v2rayConfig)
        {
            try
            {
                UsersItem usersItem;
                if (v2rayConfig.inbound.settings.clients.Count <= 0)
                {
                    usersItem = new UsersItem();
                    v2rayConfig.inbound.settings.clients.Add(usersItem);
                }
                else
                {
                    usersItem = v2rayConfig.inbound.settings.clients[0];
                }
                //远程服务器端口
                v2rayConfig.inbound.port = config.port();

                //远程服务器用户ID
                usersItem.id      = config.id();
                usersItem.alterId = config.alterId();

                //远程服务器底层传输配置
                StreamSettings streamSettings = v2rayConfig.inbound.streamSettings;
                boundStreamSettings(config, "in", ref streamSettings);
            }
            catch
            {
            }
            return(0);
        }
Exemplo n.º 5
0
        /// <summary>
        /// 额外的传入连接配置
        /// </summary>
        /// <param name="config"></param>
        /// <param name="v2rayConfig"></param>
        /// <returns></returns>
        private static int inboundDetour(Config config, ref V2rayConfig v2rayConfig)
        {
            try
            {
                //只有一个监听
                if (config.inbound.Count <= 1)
                {
                    return(0);
                }

                List <InboundDetourItem> inboundDetour = new List <InboundDetourItem>();
                v2rayConfig.inboundDetour = inboundDetour;

                //处理额外每个监听
                for (int k = 1; k < config.inbound.Count; k++)
                {
                    InboundDetourItem inbound = new InboundDetourItem();
                    inboundDetour.Add(inbound);

                    inbound.port     = config.inbound[k].localPort.ToString();
                    inbound.listen   = v2rayConfig.inbound.listen;
                    inbound.protocol = config.inbound[k].protocol;

                    Inboundsettings settings = new Inboundsettings();
                    inbound.settings = settings;
                    settings.auth    = v2rayConfig.inbound.settings.auth;
                    settings.udp     = config.inbound[k].udpEnabled;
                    settings.ip      = v2rayConfig.inbound.settings.ip;
                }
            }
            catch
            {
            }
            return(0);
        }
Exemplo n.º 6
0
 /// <summary>
 /// 本地端口
 /// </summary>
 /// <param name="config"></param>
 /// <param name="v2rayConfig"></param>
 /// <returns></returns>
 private static int inbound(Config config, ref V2rayConfig v2rayConfig)
 {
     try
     {
         var inbound = v2rayConfig.inbounds[0];
         //端口
         inbound.port     = config.inbound[0].localPort;
         inbound.protocol = config.inbound[0].protocol;
         if (config.allowLANConn)
         {
             inbound.listen = "0.0.0.0";
         }
         else
         {
             inbound.listen = "127.0.0.1";
         }
         //开启udp
         inbound.settings.udp     = config.inbound[0].udpEnabled;
         inbound.sniffing.enabled = config.inbound[0].sniffingEnabled;
     }
     catch
     {
     }
     return(0);
 }
Exemplo n.º 7
0
        /// <summary>
        /// 生成v2ray的客户端配置文件
        /// </summary>
        /// <param name="config"></param>
        /// <param name="fileName"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        public static int GenerateServerConfig(Config config, string fileName, out string msg)
        {
            msg = string.Empty;

            try
            {
                //检查GUI设置
                if (config == null ||
                    config.index < 0 ||
                    config.vmess.Count <= 0 ||
                    config.index > config.vmess.Count - 1
                    )
                {
                    msg = "请先检查服务器设置";
                    return(-1);
                }

                msg = "初始化配置";

                //取得默认配置
                string result = Utils.GetEmbedText(SampleServer);
                if (Utils.IsNullOrEmpty(result))
                {
                    msg = "取得默认配置失败";
                    return(-1);
                }

                //转成Json
                V2rayConfig v2rayConfig = Utils.FromJson <V2rayConfig>(result);
                if (v2rayConfig == null)
                {
                    msg = "生成默认配置文件失败";
                    return(-1);
                }

                ////开始修改配置
                log(config, ref v2rayConfig, true);

                //vmess协议服务器配置
                ServerInbound(config, ref v2rayConfig);

                //传出设置
                ServerOutbound(config, ref v2rayConfig);

                Utils.ToJsonFile(v2rayConfig, fileName);

                msg = string.Format("配置成功 \r\n{0}", config.getSummary());
            }
            catch
            {
                msg = "异常,生成默认配置文件失败";
                return(-1);
            }
            return(0);
        }
Exemplo n.º 8
0
        /// <summary>
        /// 生成v2ray的客户端配置文件
        /// </summary>
        /// <param name="config"></param>
        /// <param name="fileName"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        public static int GenerateServerConfig(Config config, string fileName, out string msg)
        {
            msg = string.Empty;

            try
            {
                //检查GUI设置
                if (config == null ||
                    config.index < 0 ||
                    config.vmess.Count <= 0 ||
                    config.index > config.vmess.Count - 1
                    )
                {
                    msg = UIRes.I18N("CheckServerSettings");
                    return(-1);
                }

                msg = UIRes.I18N("InitialConfiguration");

                //取得默认配置
                string result = Utils.GetEmbedText(SampleServer);
                if (Utils.IsNullOrEmpty(result))
                {
                    msg = UIRes.I18N("FailedGetDefaultConfiguration");
                    return(-1);
                }

                //转成Json
                V2rayConfig v2rayConfig = Utils.FromJson <V2rayConfig>(result);
                if (v2rayConfig == null)
                {
                    msg = UIRes.I18N("FailedGenDefaultConfiguration");
                    return(-1);
                }

                ////开始修改配置
                log(config, ref v2rayConfig, true);

                //vmess协议服务器配置
                ServerInbound(config, ref v2rayConfig);

                //传出设置
                ServerOutbound(config, ref v2rayConfig);

                Utils.ToJsonFile(v2rayConfig, fileName);

                msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), config.getSummary());
            }
            catch
            {
                msg = UIRes.I18N("FailedGenDefaultConfiguration");
                return(-1);
            }
            return(0);
        }
Exemplo n.º 9
0
        private static int routingUserRule(List <string> userRule, string tag, ref V2rayConfig v2rayConfig)
        {
            try
            {
                if (userRule != null &&
                    userRule.Count > 0)
                {
                    //Domain
                    RulesItem rulesDomain = new RulesItem();
                    rulesDomain.type        = "field";
                    rulesDomain.outboundTag = tag;
                    rulesDomain.domain      = new List <string>();

                    //IP
                    RulesItem rulesIP = new RulesItem();
                    rulesIP.type        = "field";
                    rulesIP.outboundTag = tag;
                    rulesIP.ip          = new List <string>();

                    for (int k = 0; k < userRule.Count; k++)
                    {
                        string url = userRule[k].Trim();
                        if (Utils.IsNullOrEmpty(url))
                        {
                            continue;
                        }
                        if (Utils.IsIP(url) || url.StartsWith("geoip:"))
                        {
                            rulesIP.ip.Add(url);
                        }
                        else if (Utils.IsDomain(url) ||
                                 url.StartsWith("geosite:") ||
                                 url.StartsWith("regexp:") ||
                                 url.StartsWith("domain:") ||
                                 url.StartsWith("full:"))
                        {
                            rulesDomain.domain.Add(url);
                        }
                    }
                    if (rulesDomain.domain.Count > 0)
                    {
                        v2rayConfig.routing.settings.rules.Add(rulesDomain);
                    }
                    if (rulesIP.ip.Count > 0)
                    {
                        v2rayConfig.routing.settings.rules.Add(rulesIP);
                    }
                }
            }
            catch
            {
            }
            return(0);
        }
Exemplo n.º 10
0
        /// <summary>
        /// 路由
        /// </summary>
        /// <param name="config"></param>
        /// <param name="v2rayConfig"></param>
        /// <returns></returns>
        private static int routing(Config config, ref V2rayConfig v2rayConfig)
        {
            try
            {
                if (v2rayConfig.routing != null &&
                    v2rayConfig.routing.settings != null &&
                    v2rayConfig.routing.settings.rules != null)
                {
                    //自定义
                    //需代理
                    routingUserRule(config.useragent, Global.agentTag, ref v2rayConfig);
                    //直连
                    routingUserRule(config.userdirect, Global.directTag, ref v2rayConfig);
                    //阻止
                    routingUserRule(config.userblock, Global.blockTag, ref v2rayConfig);

                    //绕过大陆网址
                    if (config.chinasites)
                    {
                        //RulesItem rulesItem = new RulesItem();
                        //rulesItem.type = "chinasites";
                        //rulesItem.outboundTag = Global.directTag;
                        //v2rayConfig.routing.settings.rules.Add(rulesItem);
                        RulesItem rulesItem = new RulesItem();
                        rulesItem.type        = "field";
                        rulesItem.outboundTag = Global.directTag;
                        rulesItem.domain      = new List <string>();
                        rulesItem.domain.Add("geosite:cn");
                        v2rayConfig.routing.settings.rules.Add(rulesItem);
                    }
                    //绕过大陆ip
                    if (config.chinaip)
                    {
                        //RulesItem rulesItem = new RulesItem();
                        //rulesItem.type = "chinaip";
                        //rulesItem.outboundTag = Global.directTag;
                        //v2rayConfig.routing.settings.rules.Add(rulesItem);
                        RulesItem rulesItem = new RulesItem();
                        rulesItem.type        = "field";
                        rulesItem.outboundTag = Global.directTag;
                        rulesItem.ip          = new List <string>();
                        rulesItem.ip.Add("geoip:cn");
                        v2rayConfig.routing.settings.rules.Add(rulesItem);
                    }
                }
            }
            catch
            {
            }
            return(0);
        }
Exemplo n.º 11
0
 /// <summary>
 /// 传出设置
 /// </summary>
 /// <param name="config"></param>
 /// <param name="v2rayConfig"></param>
 /// <returns></returns>
 private static int ServerOutbound(Config config, ref V2rayConfig v2rayConfig)
 {
     try
     {
         if (v2rayConfig.outbounds[0] != null)
         {
             v2rayConfig.outbounds[0].settings = null;
         }
     }
     catch
     {
     }
     return(0);
 }
Exemplo n.º 12
0
        private static void routing(Server server, Mode mode, ref V2rayConfig v2rayConfig)
        {
            try
            {
                RulesItem rulesItem;
                if (mode.BypassChina)
                {
                    rulesItem = new RulesItem
                    {
                        type = "field",
                        ip   = new List <string>
                        {
                            "geoip:cn",
                            "geoip:private"
                        },
                        domain = new List <string>
                        {
                            "geosite:cn"
                        },
                        outboundTag = "direct"
                    };
                }
                else
                {
                    rulesItem = new RulesItem
                    {
                        type = "field",
                        ip   = new List <string>
                        {
                            "geoip:private"
                        },
                        outboundTag = "direct"
                    };
                }

                v2rayConfig.routing = new Routing
                {
                    rules = new List <RulesItem>
                    {
                        rulesItem
                    }
                };
            }
            catch
            {
                // ignored
            }
        }
Exemplo n.º 13
0
        /// <summary>
        /// 本地端口
        /// </summary>
        /// <param name="config"></param>
        /// <param name="v2rayConfig"></param>
        /// <returns></returns>
        private static int inbound(Config config, ref V2rayConfig v2rayConfig)
        {
            try
            {
                //端口
                v2rayConfig.inbound.port     = config.inbound[0].localPort;
                v2rayConfig.inbound.protocol = config.inbound[0].protocol;

                //开启udp
                v2rayConfig.inbound.settings.udp = config.inbound[0].udpEnabled;
            }
            catch
            {
            }
            return(0);
        }
Exemplo n.º 14
0
        /// <summary>
        /// vmess协议服务器配置
        /// </summary>
        /// <param name="config"></param>
        /// <param name="v2rayConfig"></param>
        /// <returns></returns>
        private static int outbound(Config config, ref V2rayConfig v2rayConfig)
        {
            try
            {
                VnextItem vnextItem;
                if (v2rayConfig.outbound.settings.vnext.Count <= 0)
                {
                    vnextItem = new VnextItem();
                    v2rayConfig.outbound.settings.vnext.Add(vnextItem);
                }
                else
                {
                    vnextItem = v2rayConfig.outbound.settings.vnext[0];
                }
                //远程服务器地址和端口
                vnextItem.address = config.address();
                vnextItem.port    = config.port();

                UsersItem usersItem;
                if (vnextItem.users.Count <= 0)
                {
                    usersItem = new UsersItem();
                    vnextItem.users.Add(usersItem);
                }
                else
                {
                    usersItem = vnextItem.users[0];
                }
                //远程服务器用户ID
                usersItem.id       = config.id();
                usersItem.alterId  = config.alterId();
                usersItem.security = config.security();

                //Mux
                v2rayConfig.outbound.mux.enabled = config.muxEnabled;

                //远程服务器底层传输配置
                StreamSettings streamSettings = v2rayConfig.outbound.streamSettings;
                boundStreamSettings(config, "out", ref streamSettings);
            }
            catch
            {
            }
            return(0);
        }
Exemplo n.º 15
0
        /// <summary>
        /// 路由
        /// </summary>
        /// <param name="config"></param>
        /// <param name="v2rayConfig"></param>
        /// <returns></returns>
        private static int routing(Config config, ref V2rayConfig v2rayConfig)
        {
            try
            {
                if (v2rayConfig.routing != null &&
                    v2rayConfig.routing.settings != null &&
                    v2rayConfig.routing.settings.rules != null)
                {
                    v2rayConfig.routing.settings.domainStrategy = config.domainStrategy;

                    //自定义
                    //需代理
                    routingUserRule(config.useragent, Global.agentTag, ref v2rayConfig);
                    //直连
                    routingUserRule(config.userdirect, Global.directTag, ref v2rayConfig);
                    //阻止
                    routingUserRule(config.userblock, Global.blockTag, ref v2rayConfig);


                    switch (config.routingMode)
                    {
                    case "0":
                        break;

                    case "1":
                        routingGeo("ip", "private", Global.directTag, ref v2rayConfig);
                        break;

                    case "2":
                        routingGeo("", "cn", Global.directTag, ref v2rayConfig);
                        break;

                    case "3":
                        routingGeo("ip", "private", Global.directTag, ref v2rayConfig);
                        routingGeo("", "cn", Global.directTag, ref v2rayConfig);
                        break;
                    }
                }
            }
            catch
            {
            }
            return(0);
        }
Exemplo n.º 16
0
        public static string GenerateClientConfig(Server server, Mode mode)
        {
            try
            {
                var v2rayConfig = new V2rayConfig();

                inbound(server, ref v2rayConfig);

                routing(server, mode, ref v2rayConfig);

                outbound(server, ref v2rayConfig);

                return(JsonConvert.SerializeObject(v2rayConfig));
            }
            catch
            {
                return("");
            }
        }
Exemplo n.º 17
0
 /// <summary>
 /// 传出设置
 /// </summary>
 /// <param name="config"></param>
 /// <param name="v2rayConfig"></param>
 /// <returns></returns>
 private static int ServerOutbound(Config config, ref V2rayConfig v2rayConfig)
 {
     try
     {
         if (v2rayConfig.outbound != null)
         {
             v2rayConfig.outbound.settings = null;
         }
         if (v2rayConfig.outboundDetour != null &&
             v2rayConfig.outboundDetour.Count > 0)
         {
             v2rayConfig.outboundDetour[0].settings = null;
         }
     }
     catch
     {
     }
     return(0);
 }
Exemplo n.º 18
0
        /// <summary>
        /// directDNS
        /// </summary>
        /// <param name="config"></param>
        /// <param name="v2rayConfig"></param>
        /// <returns></returns>
        private static int dns(Config config, ref V2rayConfig v2rayConfig)
        {
            //try
            //{
            //    if (string.IsNullOrWhiteSpace(config.directDNS))
            //    {
            //        return 0;
            //    }
            //    List<string> servers = new List<string>();

            //    string[] arrDNS = config.directDNS.Split(',');
            //    foreach (string str in arrDNS)
            //    {
            //        //if (Utils.IsIP(str))
            //        //{
            //        servers.Add(str);
            //        //}
            //    }
            //    //servers.Add("localhost");
            //    v2rayConfig.dns = new Mode.Dns();
            //    v2rayConfig.dns.servers = servers;
            //}
            //catch
            //{
            //}

            try {
                // defalut overture dns configuration
                List <dnsServer> servers     = new List <dnsServer>();
                dnsServer        overtureDns = new dnsServer();
                overtureDns.address = "127.0.0.1";
                overtureDns.port    = 15333;
                servers.Add(overtureDns);
                v2rayConfig.dns         = new Mode.Dns();
                v2rayConfig.dns.servers = servers;
            }
            catch {
            }

            return(0);
        }
Exemplo n.º 19
0
 /// <summary>
 /// 日志
 /// </summary>
 /// <param name="config"></param>
 /// <param name="v2rayConfig"></param>
 /// <returns></returns>
 private static int log(Config config, ref V2rayConfig v2rayConfig)
 {
     try
     {
         //日志
         if (config.logEnabled)
         {
             v2rayConfig.log.loglevel = config.loglevel;
         }
         else
         {
             v2rayConfig.log.loglevel = "";
             v2rayConfig.log.access   = "";
             v2rayConfig.log.error    = "";
         }
     }
     catch
     {
     }
     return(0);
 }
Exemplo n.º 20
0
 /// <summary>
 /// 日志
 /// </summary>
 /// <param name="config"></param>
 /// <param name="v2rayConfig"></param>
 /// <returns></returns>
 private static int log(Config config, ref V2rayConfig v2rayConfig, bool blExport)
 {
     try
     {
         if (blExport)
         {
             if (config.logEnabled)
             {
                 v2rayConfig.log.loglevel = config.loglevel;
             }
             else
             {
                 v2rayConfig.log.loglevel = config.loglevel;
                 v2rayConfig.log.access   = "";
                 v2rayConfig.log.error    = "";
             }
         }
         else
         {
             if (config.logEnabled)
             {
                 v2rayConfig.log.loglevel = config.loglevel;
                 v2rayConfig.log.access   = Utils.GetPath(v2rayConfig.log.access);
                 v2rayConfig.log.error    = Utils.GetPath(v2rayConfig.log.error);
             }
             else
             {
                 v2rayConfig.log.loglevel = config.loglevel;
                 v2rayConfig.log.access   = "";
                 v2rayConfig.log.error    = "";
             }
         }
     }
     catch
     {
     }
     return(0);
 }
Exemplo n.º 21
0
 /// <summary>
 /// 本地端口
 /// </summary>
 /// <param name="config"></param>
 /// <param name="v2rayConfig"></param>
 /// <returns></returns>
 private static int inbound(Config config, ref V2rayConfig v2rayConfig)
 {
     try
     {
         //端口
         v2rayConfig.inbound.port     = config.inbound[0].localPort;
         v2rayConfig.inbound.protocol = config.inbound[0].protocol;
         if (config.allowLANConn)
         {
             v2rayConfig.inbound.listen = "0.0.0.0";
         }
         else
         {
             v2rayConfig.inbound.listen = "127.0.0.1";
         }
         //开启udp
         v2rayConfig.inbound.settings.udp = config.inbound[0].udpEnabled;
     }
     catch
     {
     }
     return(0);
 }
Exemplo n.º 22
0
    public static async Task <V2rayConfig> GenerateClientConfigAsync(Server server)
    {
        var v2rayConfig = new V2rayConfig
        {
            inbounds = new object[]
            {
                new
                {
                    port     = Global.Settings.Socks5LocalPort,
                    protocol = "socks",
                    listen   = Global.Settings.LocalAddress,
                    settings = new
                    {
                        udp = true
                    }
                }
            }
        };

        v2rayConfig.outbounds = new[] { await outbound(server) };

        return(v2rayConfig);
    }
Exemplo n.º 23
0
        /// <summary>
        /// 导入v2ray服务端配置
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        public static VmessItem ImportFromServerConfig(string fileName, out string msg)
        {
            msg = string.Empty;
            VmessItem vmessItem = new VmessItem();

            try
            {
                //载入配置文件
                string result = Utils.LoadResource(fileName);
                if (Utils.IsNullOrEmpty(result))
                {
                    msg = "读取配置文件失败";
                    return(null);
                }

                //转成Json
                V2rayConfig v2rayConfig = Utils.FromJson <V2rayConfig>(result);
                if (v2rayConfig == null)
                {
                    msg = "转换配置文件失败";
                    return(null);
                }

                if (v2rayConfig.inbound == null ||
                    Utils.IsNullOrEmpty(v2rayConfig.inbound.protocol) ||
                    v2rayConfig.inbound.protocol != "vmess" ||
                    v2rayConfig.inbound.settings == null ||
                    v2rayConfig.inbound.settings.clients == null ||
                    v2rayConfig.inbound.settings.clients.Count <= 0)
                {
                    msg = "不是正确的服务端配置文件,请检查";
                    return(null);
                }

                vmessItem.security   = Global.DefaultSecurity;
                vmessItem.network    = Global.DefaultNetwork;
                vmessItem.headerType = Global.None;
                vmessItem.address    = string.Empty;
                vmessItem.port       = v2rayConfig.inbound.port;
                vmessItem.id         = v2rayConfig.inbound.settings.clients[0].id;
                vmessItem.alterId    = v2rayConfig.inbound.settings.clients[0].alterId;

                vmessItem.remarks = string.Format("import@{0}", DateTime.Now.ToShortDateString());

                //tcp or kcp
                if (v2rayConfig.inbound.streamSettings != null &&
                    v2rayConfig.inbound.streamSettings.network != null &&
                    !Utils.IsNullOrEmpty(v2rayConfig.inbound.streamSettings.network))
                {
                    vmessItem.network = v2rayConfig.inbound.streamSettings.network;
                }

                //tcp伪装http
                if (v2rayConfig.inbound.streamSettings != null &&
                    v2rayConfig.inbound.streamSettings.tcpSettings != null &&
                    v2rayConfig.inbound.streamSettings.tcpSettings.header != null &&
                    !Utils.IsNullOrEmpty(v2rayConfig.inbound.streamSettings.tcpSettings.header.type))
                {
                    if (v2rayConfig.inbound.streamSettings.tcpSettings.header.type.Equals(Global.TcpHeaderHttp))
                    {
                        vmessItem.headerType = v2rayConfig.inbound.streamSettings.tcpSettings.header.type;
                        string request = Convert.ToString(v2rayConfig.inbound.streamSettings.tcpSettings.header.request);
                        if (!Utils.IsNullOrEmpty(request))
                        {
                            V2rayTcpRequest v2rayTcpRequest = Utils.FromJson <V2rayTcpRequest>(request);
                            if (v2rayTcpRequest != null &&
                                v2rayTcpRequest.headers != null &&
                                v2rayTcpRequest.headers.Host != null &&
                                v2rayTcpRequest.headers.Host.Count > 0)
                            {
                                vmessItem.requestHost = v2rayTcpRequest.headers.Host[0];
                            }
                        }
                    }
                }
                //kcp伪装
                //if (v2rayConfig.outbound.streamSettings != null
                //    && v2rayConfig.outbound.streamSettings.kcpSettings != null
                //    && v2rayConfig.outbound.streamSettings.kcpSettings.header != null
                //    && !Utils.IsNullOrEmpty(v2rayConfig.outbound.streamSettings.kcpSettings.header.type))
                //{
                //    cmbHeaderType.Text = v2rayConfig.outbound.streamSettings.kcpSettings.header.type;
                //}

                //ws
                if (v2rayConfig.inbound.streamSettings != null &&
                    v2rayConfig.inbound.streamSettings.wsSettings != null)
                {
                    if (!Utils.IsNullOrEmpty(v2rayConfig.inbound.streamSettings.wsSettings.path))
                    {
                        vmessItem.path = v2rayConfig.inbound.streamSettings.wsSettings.path;
                    }
                    if (v2rayConfig.inbound.streamSettings.wsSettings.headers != null &&
                        !Utils.IsNullOrEmpty(v2rayConfig.inbound.streamSettings.wsSettings.headers.Host))
                    {
                        vmessItem.requestHost = v2rayConfig.inbound.streamSettings.wsSettings.headers.Host;
                    }
                }

                //h2
                if (v2rayConfig.inbound.streamSettings != null &&
                    v2rayConfig.inbound.streamSettings.httpSettings != null)
                {
                    if (!Utils.IsNullOrEmpty(v2rayConfig.inbound.streamSettings.httpSettings.path))
                    {
                        vmessItem.path = v2rayConfig.inbound.streamSettings.httpSettings.path;
                    }
                    if (v2rayConfig.inbound.streamSettings.httpSettings.host != null &&
                        v2rayConfig.inbound.streamSettings.httpSettings.host.Count > 0)
                    {
                        vmessItem.requestHost = Utils.List2String(v2rayConfig.inbound.streamSettings.httpSettings.host);
                    }
                }
            }
            catch
            {
                msg = "异常,不是正确的客户端配置文件,请检查";
                return(null);
            }
            return(vmessItem);
        }
Exemplo n.º 24
0
        private static void outbound(Server server, ref V2rayConfig v2rayConfig)
        {
            try
            {
                var outbound = new Outbounds
                {
                    settings       = new Outboundsettings(),
                    mux            = new Mux(),
                    streamSettings = new StreamSettings
                    {
                        network = "tcp"
                    }
                };

                switch (server)
                {
                case Socks5.Socks5 socks5:
                {
                    var serversItem = new ServersItem
                    {
                        users = new List <SocksUsersItem>()
                    };
                    outbound.settings.servers = new List <ServersItem>
                    {
                        serversItem
                    };

                    serversItem.address  = server.AutoResolveHostname();
                    serversItem.port     = server.Port;
                    serversItem.method   = null;
                    serversItem.password = null;

                    if (socks5.Auth())
                    {
                        var socksUsersItem = new SocksUsersItem
                        {
                            user  = socks5.Username,
                            pass  = socks5.Password,
                            level = 1
                        };

                        serversItem.users.Add(socksUsersItem);
                    }

                    outbound.mux.enabled     = false;
                    outbound.mux.concurrency = -1;
                    outbound.protocol        = "socks";
                    break;
                }

                case VLESS.VLESS vless:
                {
                    var vnextItem = new VnextItem
                    {
                        users = new List <UsersItem>()
                    };
                    outbound.settings.vnext = new List <VnextItem>
                    {
                        vnextItem
                    };

                    vnextItem.address = server.AutoResolveHostname();
                    vnextItem.port    = server.Port;

                    var usersItem = new UsersItem();
                    vnextItem.users.Add(usersItem);

                    usersItem.id         = vless.UserID;
                    usersItem.alterId    = 0;
                    usersItem.flow       = string.Empty;
                    usersItem.encryption = vless.EncryptMethod;

                    outbound.mux.enabled     = vless.UseMux;
                    outbound.mux.concurrency = vless.UseMux ? 8 : -1;

                    var streamSettings = outbound.streamSettings;
                    boundStreamSettings(vless, ref streamSettings);

                    if (vless.TransferProtocol == "xtls")
                    {
                        usersItem.flow = string.IsNullOrEmpty(vless.Flow) ? "xtls-rprx-origin" : vless.Flow;

                        outbound.mux.enabled     = false;
                        outbound.mux.concurrency = -1;
                    }

                    outbound.protocol         = "vless";
                    outbound.settings.servers = null;
                    break;
                }

                case VMess vmess:
                {
                    var vnextItem = new VnextItem
                    {
                        users = new List <UsersItem>()
                    };
                    outbound.settings.vnext = new List <VnextItem>
                    {
                        vnextItem
                    };

                    vnextItem.address = server.AutoResolveHostname();
                    vnextItem.port    = server.Port;

                    var usersItem = new UsersItem();
                    vnextItem.users.Add(usersItem);

                    usersItem.id       = vmess.UserID;
                    usersItem.alterId  = vmess.AlterID;
                    usersItem.security = vmess.EncryptMethod;

                    outbound.mux.enabled     = vmess.UseMux;
                    outbound.mux.concurrency = vmess.UseMux ? 8 : -1;

                    var streamSettings = outbound.streamSettings;
                    boundStreamSettings(vmess, ref streamSettings);

                    outbound.protocol = "vmess";
                    break;
                }
                }

                v2rayConfig.outbounds = new List <Outbounds> {
                    outbound
                };
            }
            catch
            {
                // ignored
            }
        }
Exemplo n.º 25
0
        /// <summary>
        /// 生成v2ray的客户端配置文件
        /// </summary>
        /// <param name="config"></param>
        /// <param name="fileName"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        public static int GenerateClientConfig(Config config, string fileName, bool blExport, out string msg)
        {
            msg = string.Empty;

            try
            {
                //检查GUI设置
                if (config == null ||
                    config.index < 0 ||
                    config.vmess.Count <= 0 ||
                    config.index > config.vmess.Count - 1
                    )
                {
                    msg = UIRes.I18N("CheckServerSettings");
                    return(-1);
                }

                msg = UIRes.I18N("InitialConfiguration");
                if (config.configType() == (int)EConfigType.Custom)
                {
                    return(GenerateClientCustomConfig(config, fileName, out msg));
                }

                //取得默认配置
                string result = Utils.GetEmbedText(SampleClient);
                if (Utils.IsNullOrEmpty(result))
                {
                    msg = UIRes.I18N("FailedGetDefaultConfiguration");
                    return(-1);
                }

                //转成Json
                V2rayConfig v2rayConfig = Utils.FromJson <V2rayConfig>(result);
                if (v2rayConfig == null)
                {
                    msg = UIRes.I18N("FailedGenDefaultConfiguration");
                    return(-1);
                }

                //开始修改配置
                log(config, ref v2rayConfig, blExport);

                //本地端口
                inbound(config, ref v2rayConfig);

                //路由
                routing(config, ref v2rayConfig);

                //outbound
                outbound(config, ref v2rayConfig);

                //dns
                dns(config, ref v2rayConfig);

                Utils.ToJsonFile(v2rayConfig, fileName);

                msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), config.getSummary());
            }
            catch
            {
                msg = UIRes.I18N("FailedGenDefaultConfiguration");
                return(-1);
            }
            return(0);
        }
Exemplo n.º 26
0
        /// <summary>
        /// vmess协议服务器配置
        /// </summary>
        /// <param name="config"></param>
        /// <param name="v2rayConfig"></param>
        /// <returns></returns>
        private static int outbound(Config config, ref V2rayConfig v2rayConfig)
        {
            try
            {
                if (config.configType() == (int)EConfigType.Vmess)
                {
                    VnextItem vnextItem;
                    if (v2rayConfig.outbound.settings.vnext.Count <= 0)
                    {
                        vnextItem = new VnextItem();
                        v2rayConfig.outbound.settings.vnext.Add(vnextItem);
                    }
                    else
                    {
                        vnextItem = v2rayConfig.outbound.settings.vnext[0];
                    }
                    //远程服务器地址和端口
                    vnextItem.address = config.address();
                    vnextItem.port    = config.port();

                    UsersItem usersItem;
                    if (vnextItem.users.Count <= 0)
                    {
                        usersItem = new UsersItem();
                        vnextItem.users.Add(usersItem);
                    }
                    else
                    {
                        usersItem = vnextItem.users[0];
                    }
                    //远程服务器用户ID
                    usersItem.id       = config.id();
                    usersItem.alterId  = config.alterId();
                    usersItem.email    = Global.userEMail;
                    usersItem.security = config.security();

                    //Mux
                    v2rayConfig.outbound.mux.enabled = config.muxEnabled;

                    //远程服务器底层传输配置
                    StreamSettings streamSettings = v2rayConfig.outbound.streamSettings;
                    boundStreamSettings(config, "out", ref streamSettings);

                    v2rayConfig.outbound.protocol         = "vmess";
                    v2rayConfig.outbound.settings.servers = null;
                }
                else if (config.configType() == (int)EConfigType.Shadowsocks)
                {
                    ServersItem serversItem;
                    if (v2rayConfig.outbound.settings.servers.Count <= 0)
                    {
                        serversItem = new ServersItem();
                        v2rayConfig.outbound.settings.servers.Add(serversItem);
                    }
                    else
                    {
                        serversItem = v2rayConfig.outbound.settings.servers[0];
                    }
                    //远程服务器地址和端口
                    serversItem.address  = config.address();
                    serversItem.port     = config.port();
                    serversItem.password = config.id();
                    serversItem.method   = config.security();

                    serversItem.ota   = false;
                    serversItem.level = 1;

                    v2rayConfig.outbound.mux.enabled = false;

                    v2rayConfig.outbound.protocol       = "shadowsocks";
                    v2rayConfig.outbound.settings.vnext = null;
                }
            }
            catch
            {
            }
            return(0);
        }
Exemplo n.º 27
0
        /// <summary>
        /// 生成v2ray的客户端配置文件
        /// </summary>
        /// <param name="config"></param>
        /// <param name="fileName"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        public static int GenerateClientConfig(Config config, string fileName, bool blExport, out string msg)
        {
            msg = string.Empty;

            try
            {
                //检查GUI设置
                if (config == null ||
                    config.index < 0 ||
                    config.vmess.Count <= 0 ||
                    config.index > config.vmess.Count - 1
                    )
                {
                    msg = "请先检查服务器设置";
                    return(-1);
                }

                msg = "初始化配置";
                if (config.configType() == (int)EConfigType.Custom)
                {
                    return(GenerateClientCustomConfig(config, fileName, out msg));
                }

                //取得默认配置
                string result = Utils.GetEmbedText(SampleClient);
                if (Utils.IsNullOrEmpty(result))
                {
                    msg = "取得默认配置失败";
                    return(-1);
                }

                //转成Json
                V2rayConfig v2rayConfig = Utils.FromJson <V2rayConfig>(result);
                if (v2rayConfig == null)
                {
                    msg = "生成默认配置文件失败";
                    return(-1);
                }

                //开始修改配置
                log(config, ref v2rayConfig, blExport);

                //本地端口
                inbound(config, ref v2rayConfig);

                //额外的传入连接配置
                inboundDetour(config, ref v2rayConfig);

                //路由
                routing(config, ref v2rayConfig);

                //outbound
                outbound(config, ref v2rayConfig);

                //dns
                dns(config, ref v2rayConfig);

                Utils.ToJsonFile(v2rayConfig, fileName);

                msg = string.Format("配置成功 \r\n{0}", config.getSummary());
            }
            catch
            {
                msg = "异常,生成默认配置文件失败";
                return(-1);
            }
            return(0);
        }
Exemplo n.º 28
0
        private static int AddBatchServers4Custom(ref Config config, string clipboardData, string subid, List <VmessItem> lstOriSub, string groupId)
        {
            if (Utils.IsNullOrEmpty(clipboardData))
            {
                return(-1);
            }

            VmessItem vmessItem = new VmessItem();
            //Is v2ray configuration
            V2rayConfig v2rayConfig = Utils.FromJson <V2rayConfig>(clipboardData);

            if (v2rayConfig != null &&
                v2rayConfig.inbounds != null &&
                v2rayConfig.inbounds.Count > 0 &&
                v2rayConfig.outbounds != null &&
                v2rayConfig.outbounds.Count > 0)
            {
                var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.json");
                File.WriteAllText(fileName, clipboardData);

                vmessItem.coreType = ECoreType.Xray;
                vmessItem.address  = fileName;
                vmessItem.remarks  = "v2ray_custom";
            }
            //Is Clash configuration
            else if (clipboardData.IndexOf("port") >= 0 &&
                     clipboardData.IndexOf("socks-port") >= 0 &&
                     clipboardData.IndexOf("proxies") >= 0)
            {
                var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.yaml");
                File.WriteAllText(fileName, clipboardData);

                vmessItem.coreType = ECoreType.clash;
                vmessItem.address  = fileName;
                vmessItem.remarks  = "clash_custom";
            }

            if (!Utils.IsNullOrEmpty(subid))
            {
                RemoveServerViaSubid(ref config, subid);
            }
            if (lstOriSub != null && lstOriSub.Count == 1)
            {
                vmessItem.indexId = lstOriSub[0].indexId;
            }
            vmessItem.subid   = subid;
            vmessItem.groupId = groupId;

            if (Utils.IsNullOrEmpty(vmessItem.address))
            {
                return(-1);
            }

            if (AddCustomServer(ref config, vmessItem, true) == 0)
            {
                return(1);
            }
            else
            {
                return(-1);
            }
        }
Exemplo n.º 29
0
        /// <summary>
        /// 导入v2ray客户端配置
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        public static VmessItem ImportFromClientConfig(string fileName, out string msg)
        {
            msg = string.Empty;
            VmessItem vmessItem = new VmessItem();

            try
            {
                //载入配置文件
                string result = Utils.LoadResource(fileName);
                if (Utils.IsNullOrEmpty(result))
                {
                    msg = UIRes.I18N("FailedReadConfiguration");
                    return(null);
                }

                //转成Json
                V2rayConfig v2rayConfig = Utils.FromJson <V2rayConfig>(result);
                if (v2rayConfig == null)
                {
                    msg = UIRes.I18N("FailedConversionConfiguration");
                    return(null);
                }

                if (v2rayConfig.outbounds == null ||
                    v2rayConfig.outbounds.Count <= 0)
                {
                    msg = UIRes.I18N("IncorrectClientConfiguration");
                    return(null);
                }

                var outbound = v2rayConfig.outbounds[0];
                if (outbound == null ||
                    Utils.IsNullOrEmpty(outbound.protocol) ||
                    outbound.protocol != "vmess" ||
                    outbound.settings == null ||
                    outbound.settings.vnext == null ||
                    outbound.settings.vnext.Count <= 0 ||
                    outbound.settings.vnext[0].users == null ||
                    outbound.settings.vnext[0].users.Count <= 0)
                {
                    msg = UIRes.I18N("IncorrectClientConfiguration");
                    return(null);
                }

                vmessItem.security   = Global.DefaultSecurity;
                vmessItem.network    = Global.DefaultNetwork;
                vmessItem.headerType = Global.None;
                vmessItem.address    = outbound.settings.vnext[0].address;
                vmessItem.port       = outbound.settings.vnext[0].port;
                vmessItem.id         = outbound.settings.vnext[0].users[0].id;
                vmessItem.alterId    = outbound.settings.vnext[0].users[0].alterId;
                vmessItem.remarks    = string.Format("import@{0}", DateTime.Now.ToShortDateString());

                //tcp or kcp
                if (outbound.streamSettings != null &&
                    outbound.streamSettings.network != null &&
                    !Utils.IsNullOrEmpty(outbound.streamSettings.network))
                {
                    vmessItem.network = outbound.streamSettings.network;
                }

                //tcp伪装http
                if (outbound.streamSettings != null &&
                    outbound.streamSettings.tcpSettings != null &&
                    outbound.streamSettings.tcpSettings.header != null &&
                    !Utils.IsNullOrEmpty(outbound.streamSettings.tcpSettings.header.type))
                {
                    if (outbound.streamSettings.tcpSettings.header.type.Equals(Global.TcpHeaderHttp))
                    {
                        vmessItem.headerType = outbound.streamSettings.tcpSettings.header.type;
                        string request = Convert.ToString(outbound.streamSettings.tcpSettings.header.request);
                        if (!Utils.IsNullOrEmpty(request))
                        {
                            V2rayTcpRequest v2rayTcpRequest = Utils.FromJson <V2rayTcpRequest>(request);
                            if (v2rayTcpRequest != null &&
                                v2rayTcpRequest.headers != null &&
                                v2rayTcpRequest.headers.Host != null &&
                                v2rayTcpRequest.headers.Host.Count > 0)
                            {
                                vmessItem.requestHost = v2rayTcpRequest.headers.Host[0];
                            }
                        }
                    }
                }
                //kcp伪装
                if (outbound.streamSettings != null &&
                    outbound.streamSettings.kcpSettings != null &&
                    outbound.streamSettings.kcpSettings.header != null &&
                    !Utils.IsNullOrEmpty(outbound.streamSettings.kcpSettings.header.type))
                {
                    vmessItem.headerType = outbound.streamSettings.kcpSettings.header.type;
                }

                //ws
                if (outbound.streamSettings != null &&
                    outbound.streamSettings.wsSettings != null)
                {
                    if (!Utils.IsNullOrEmpty(outbound.streamSettings.wsSettings.path))
                    {
                        vmessItem.path = outbound.streamSettings.wsSettings.path;
                    }
                    if (outbound.streamSettings.wsSettings.headers != null &&
                        !Utils.IsNullOrEmpty(outbound.streamSettings.wsSettings.headers.Host))
                    {
                        vmessItem.requestHost = outbound.streamSettings.wsSettings.headers.Host;
                    }
                }

                //h2
                if (outbound.streamSettings != null &&
                    outbound.streamSettings.httpSettings != null)
                {
                    if (!Utils.IsNullOrEmpty(outbound.streamSettings.httpSettings.path))
                    {
                        vmessItem.path = outbound.streamSettings.httpSettings.path;
                    }
                    if (outbound.streamSettings.httpSettings.host != null &&
                        outbound.streamSettings.httpSettings.host.Count > 0)
                    {
                        vmessItem.requestHost = Utils.List2String(outbound.streamSettings.httpSettings.host);
                    }
                }
            }
            catch
            {
                msg = UIRes.I18N("IncorrectClientConfiguration");
                return(null);
            }

            return(vmessItem);
        }
Exemplo n.º 30
0
        /// <summary>
        /// 生成v2ray的客户端配置文件
        /// </summary>
        /// <param name="config"></param>
        /// <param name="fileName"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        public static int GenerateClientConfig(Config config, string fileName, out string msg)
        {
            msg = string.Empty;

            try
            {
                //检查GUI设置
                if (config == null ||
                    config.index < 0 ||
                    config.vmess.Count <= 0 ||
                    config.index > config.vmess.Count - 1
                    )
                {
                    msg = "请先检查服务器设置";
                    return(-1);
                }

                msg = "初始化配置";

                //取得默认配置
                string result = Utils.GetEmbedText(SampleClient);
                if (Utils.IsNullOrEmpty(result))
                {
                    msg = "取得默认配置失败";
                    return(-1);
                }

                //转成Json
                V2rayConfig v2rayConfig = Utils.FromJson <V2rayConfig>(result);
                if (v2rayConfig == null)
                {
                    msg = "生成默认配置文件失败";
                    return(-1);
                }

                //开始修改配置
                log(config, ref v2rayConfig);

                //本地端口
                inbound(config, ref v2rayConfig);

                //额外的传入连接配置
                inboundDetour(config, ref v2rayConfig);

                //路由
                routing(config, ref v2rayConfig);

                //vmess协议服务器配置
                outbound(config, ref v2rayConfig);

                Utils.ToJsonFile(v2rayConfig, fileName);

                msg = string.Format("配置成功 \r\n{0}({1}:{2})", config.remarks(), config.address(), config.port());
            }
            catch
            {
                msg = "异常,生成默认配置文件失败";
                return(-1);
            }
            return(0);
        }