Exemplo n.º 1
0
 public VMessForm(VMess server = default)
 {
     server ??= new VMess();
     Server = server;
     CreateTextBox("UserId", "User ID",
                   s => true,
                   s => server.UserID = s,
                   server.UserID);
     CreateTextBox("AlterId", "Alter ID",
                   s => int.TryParse(s, out _),
                   s => server.AlterID = int.Parse(s),
                   server.AlterID.ToString(),
                   76);
     CreateComboBox("EncryptMethod", "Encrypt Method",
                    VMessGlobal.EncryptMethods,
                    s => server.EncryptMethod = s,
                    server.EncryptMethod);
     CreateComboBox("TransferProtocol", "Transfer Protocol",
                    VMessGlobal.TransferProtocols,
                    s => server.TransferProtocol = s,
                    server.TransferProtocol);
     CreateComboBox("FakeType", "Fake Type",
                    VMessGlobal.FakeTypes,
                    s => server.FakeType = s,
                    server.FakeType);
     CreateTextBox("Host", "Host",
                   s => true,
                   s => server.Host = s,
                   server.Host);
     CreateTextBox("Path", "Path",
                   s => true,
                   s => server.Path = s,
                   server.Path);
     CreateComboBox("QUICSecurity", "QUIC Security",
                    VMessGlobal.QUIC,
                    s => server.QUIC = s,
                    server.QUIC);
     CreateTextBox("QUICSecret", "QUIC Secret",
                   s => true,
                   s => server.QUICSecret = s,
                   server.QUICSecret);
     CreateComboBox("UseMux", "Use Mux",
                    new List <string> {
         "", "true", "false"
     },
                    s => server.UseMux = s switch
     {
         "" => null,
         "true" => true,
         "false" => false,
         _ => null
     },
Exemplo n.º 2
0
 public VMessForm(VMess server = default)
 {
     server ??= new VMess();
     Server = server;
     CreateTextBox("UserId", "User ID",
                   s => true,
                   s => server.UserID = (string)s,
                   server.UserID);
     CreateTextBox("AlterId", "Alter ID",
                   s => int.TryParse(s, out _),
                   s => server.AlterID = int.Parse((string)s),
                   server.AlterID.ToString(),
                   76);
     CreateComboBox("EncryptMethod", "Encrypt Method",
                    VMessGlobal.EncryptMethods,
                    s => VMessGlobal.EncryptMethods.Contains(s),
                    s => server.EncryptMethod = (string)s,
                    server.EncryptMethod);
     CreateComboBox("TransferProtocol", "Transfer Protocol",
                    VMessGlobal.TransferProtocols,
                    s => VMessGlobal.TransferProtocols.Contains(s),
                    s => server.TransferProtocol = (string)s,
                    server.TransferProtocol);
     CreateComboBox("FakeType", "Fake Type",
                    VMessGlobal.FakeTypes,
                    s => VMessGlobal.FakeTypes.Contains(s),
                    s => server.FakeType = (string)s,
                    server.FakeType);
     CreateTextBox("Host", "Host",
                   s => true,
                   s => server.Host = (string)s,
                   server.Host);
     CreateTextBox("Path", "Path",
                   s => true,
                   s => server.Path = (string)s,
                   server.Path);
     CreateComboBox("QUICSecurity", "QUIC Security",
                    VMessGlobal.QUIC,
                    s => VMessGlobal.QUIC.Contains(s),
                    s => server.QUIC = (string)s,
                    server.QUIC);
     CreateTextBox("QUICSecret", "QUIC Secret",
                   s => true,
                   s => server.QUICSecret = (string)s,
                   server.QUICSecret);
     CreateCheckBox("UseMux", "Use Mux",
                    s => server.UseMux = (bool)s,
                    server.UseMux);
     CreateCheckBox("TLSSecure", "TLS Secure",
                    s => server.TLSSecure = (bool)s,
                    server.TLSSecure);
 }
Exemplo n.º 3
0
        private static void boundStreamSettings(VMess server, ref StreamSettings streamSettings)
        {
            try
            {
                streamSettings.network = server.TransferProtocol;
                var host = server.Host;
                if (server.TLSSecure)
                {
                    streamSettings.security = "tls";

                    var tlsSettings = new TlsSettings
                    {
                        allowInsecure = Global.Settings.V2RayConfig.AllowInsecure
                    };
                    if (!string.IsNullOrWhiteSpace(host))
                    {
                        tlsSettings.serverName = host;
                    }

                    streamSettings.tlsSettings = tlsSettings;
                }
                else
                {
                    streamSettings.security = "";
                }

                switch (server.TransferProtocol)
                {
                case "kcp":
                    var kcpSettings = new KcpSettings
                    {
                        mtu              = Global.Settings.V2RayConfig.KcpConfig.mtu,
                        tti              = Global.Settings.V2RayConfig.KcpConfig.tti,
                        uplinkCapacity   = Global.Settings.V2RayConfig.KcpConfig.uplinkCapacity,
                        downlinkCapacity = Global.Settings.V2RayConfig.KcpConfig.downlinkCapacity,
                        congestion       = Global.Settings.V2RayConfig.KcpConfig.congestion,
                        readBufferSize   = Global.Settings.V2RayConfig.KcpConfig.readBufferSize,
                        writeBufferSize  = Global.Settings.V2RayConfig.KcpConfig.writeBufferSize,
                        header           = new Header
                        {
                            type = server.FakeType
                        },
                        seed = !string.IsNullOrWhiteSpace(server.Path) ? server.Path : null
                    };


                    streamSettings.kcpSettings = kcpSettings;
                    break;

                case "ws":
                    var path       = server.Path;
                    var wsSettings = new WsSettings
                    {
                        connectionReuse = true,
                        headers         = !string.IsNullOrWhiteSpace(host)
                                ? new Headers
                        {
                            Host = host
                        }
                                : null,
                        path = !string.IsNullOrWhiteSpace(path) ? path : null
                    };

                    streamSettings.wsSettings = wsSettings;
                    break;

                case "h2":
                    var httpSettings = new HttpSettings
                    {
                        host = new List <string>
                        {
                            string.IsNullOrWhiteSpace(server.Host) ? server.Hostname : server.Host
                        },
                        path = server.Path
                    };

                    streamSettings.httpSettings = httpSettings;
                    break;

                case "quic":
                    var quicSettings = new QuicSettings
                    {
                        security = host,
                        key      = server.Path,
                        header   = new Header
                        {
                            type = server.FakeType
                        }
                    };
                    if (server.TLSSecure)
                    {
                        streamSettings.tlsSettings.serverName = server.Hostname;
                    }

                    streamSettings.quicSettings = quicSettings;
                    break;

                case "xtls":
                    streamSettings.security = server.TransferProtocol;

                    var xtlsSettings = new TlsSettings
                    {
                        allowInsecure = Global.Settings.V2RayConfig.AllowInsecure
                    };
                    if (!string.IsNullOrWhiteSpace(host))
                    {
                        xtlsSettings.serverName = host;
                    }

                    streamSettings.xtlsSettings = xtlsSettings;
                    break;

                default:
                    if (server.FakeType == "http")
                    {
                        var tcpSettings = new TcpSettings
                        {
                            connectionReuse = true,
                            header          = new Header
                            {
                                type    = server.FakeType,
                                request = new TCPRequest
                                {
                                    path    = string.IsNullOrWhiteSpace(server.Path) ? "/" : server.Path,
                                    headers = new TCPRequestHeaders
                                    {
                                        Host = string.IsNullOrWhiteSpace(server.Host) ? server.Hostname : server.Host
                                    }
                                }
                            }
                        };

                        streamSettings.tcpSettings = tcpSettings;
                    }

                    break;
                }
            }
            catch
            {
                // ignored
            }
        }
Exemplo n.º 4
0
        private static StreamSettings boundStreamSettings(VMess server)
        {
            // https://xtls.github.io/config/transports

            var streamSettings = new StreamSettings
            {
                network  = server.TransferProtocol,
                security = server.TLSSecureType
            };

            if (server.TLSSecureType != "none")
            {
                var tlsSettings = new TlsSettings
                {
                    allowInsecure = Global.Settings.V2RayConfig.AllowInsecure,
                    serverName    = server.ServerName.ValueOrDefault() ?? server.Hostname
                };

                switch (server.TLSSecureType)
                {
                case "tls":
                    streamSettings.tlsSettings = tlsSettings;
                    break;

                case "xtls":
                    streamSettings.xtlsSettings = tlsSettings;
                    break;
                }
            }

            switch (server.TransferProtocol)
            {
            case "tcp":

                streamSettings.tcpSettings = new TcpSettings
                {
                    header = new
                    {
                        type    = server.FakeType,
                        request = server.FakeType switch
                        {
                            "none" => null,
                            "http" => new
                            {
                                path    = server.Path.SplitOrDefault(),
                                headers = new
                                {
                                    Host = server.Host.SplitOrDefault()
                                }
                            },
                            _ => throw new MessageException($"Invalid tcp type {server.FakeType}")
                        }
                    }
                };

                break;

            case "ws":

                streamSettings.wsSettings = new WsSettings
                {
                    path    = server.Path.ValueOrDefault(),
                    headers = new
                    {
                        Host = server.Host.ValueOrDefault()
                    }
                };

                break;

            case "kcp":

                streamSettings.kcpSettings = new KcpSettings
                {
                    mtu              = Global.Settings.V2RayConfig.KcpConfig.mtu,
                    tti              = Global.Settings.V2RayConfig.KcpConfig.tti,
                    uplinkCapacity   = Global.Settings.V2RayConfig.KcpConfig.uplinkCapacity,
                    downlinkCapacity = Global.Settings.V2RayConfig.KcpConfig.downlinkCapacity,
                    congestion       = Global.Settings.V2RayConfig.KcpConfig.congestion,
                    readBufferSize   = Global.Settings.V2RayConfig.KcpConfig.readBufferSize,
                    writeBufferSize  = Global.Settings.V2RayConfig.KcpConfig.writeBufferSize,
                    header           = new
                    {
                        type = server.FakeType
                    },
                    seed = server.Path.ValueOrDefault()
                };

                break;

            case "h2":

                streamSettings.httpSettings = new HttpSettings
                {
                    host = server.Host.SplitOrDefault(),
                    path = server.Path.ValueOrDefault()
                };

                break;

            case "quic":

                streamSettings.quicSettings = new QuicSettings
                {
                    security = server.QUICSecure,
                    key      = server.QUICSecret,
                    header   = new
                    {
                        type = server.FakeType
                    }
                };

                break;

            case "grpc":

                streamSettings.grpcSettings = new GrpcSettings
                {
                    serviceName = server.Path,
                    multiMode   = server.FakeType == "multi"
                };

                break;

            default:
                throw new MessageException($"transfer protocol \"{server.TransferProtocol}\" not implemented yet");
            }

            return(streamSettings);
        }
Exemplo n.º 5
0
        public VMessForm(Server server = default)
        {
            InitializeComponent();

            _server = (VMess)server ?? new VMess();
        }
Exemplo n.º 6
0
        private VMess GenerateVMessConfigFromEditor()
        {
            // Base Server Config
            if (String.IsNullOrWhiteSpace(textBoxAddress.Text))
            {
                MsgBox.Error(I18n.MsgPleaseInputAddress);
                textBoxAddress.Focus();
                return(null);
            }

            if (String.IsNullOrWhiteSpace(textBoxID.Text) || !Guid.TryParse(textBoxID.Text, out Guid result))
            {
                MsgBox.Error(I18n.MsgPleaseInputId);
                textBoxID.Focus();
                return(null);
            }

            if (!v2rayP.Setting.VmessSecurity.Contains(comboBoxSecurity.Text))
            {
                MsgBox.Error(string.Format(I18n.MsgPleaseSelectGivenValues, "Security"));
                comboBoxSecurity.Focus();
                return(null);
            }

            string remark = String.IsNullOrWhiteSpace(textBoxRemark.Text) ? String.Empty : textBoxRemark.Text;

            var config = new VMess
            {
                Address   = textBoxAddress.Text.Trim(),
                Port      = Convert.ToInt32(numericUpDownPort.Value),
                AlterId   = Convert.ToInt32(numericUpDownAlterID.Value),
                UserId    = textBoxID.Text.Trim(),
                Security  = comboBoxSecurity.Text.Trim(),
                Remark    = remark,
                EnableMux = checkBoxEnableMux.Checked,
            };
            var stream        = new StreamSetting();
            var streamChanged = false;

            // TLS Settings
            var enableTLS = checkBoxEnableTLS.Checked;

            if (enableTLS)
            {
                streamChanged      = true;
                stream.Security    = "tls";
                stream.TlsSettings = new TLSSetting
                {
                    AllowInsecure = checkBoxAllowInsecure.Checked,
                    ServerName    = textBoxTLSServerName.Text.Trim(),
                };
            }

            // TCP Settings
            if (comboBoxNetwork.SelectedIndex == 0)
            {
                stream.Network = "tcp";
                if (comboBoxTCPType.Text == "http")
                {
                    streamChanged = true;

                    object path = null;
                    if (!String.IsNullOrWhiteSpace(textBoxHTTPRequestPaths.Text))
                    {
                        var paths = textBoxHTTPRequestPaths.Text.Split(',').Select(p => p.Trim()).ToArray();
                        if (paths.Length == 1)
                        {
                            path = paths[0];
                        }
                        else
                        {
                            path = paths;
                        }
                    }

                    stream.TcpSettings = new TCPSetting
                    {
                        Header =
                        {
                            Type    = "http",
                            Request =
                            {
                                Version = textBoxHTTPRequestVersion.Text.Trim(),
                                Method  = textBoxHTTPRequestMethod.Text.Trim(),
                                Headers = ParseHeaders(textBoxHTTPRequestHeaders.Text,true),
                                Path    = path,
                            },
                            Response    =
                            {
                                Version = textBoxHTTPResponseVersion.Text.Trim(),
                                Status  = textBoxHTTPResponseStatus.Text.Trim(),
                                Reason  = textBoxHTTPResponseReason.Text.Trim(),
                                Headers = ParseHeaders(textBoxHTTPResponseHeaders.Text,true),
                            }
                        },
                    };
                }
            }

            // KCP Settings
            else if (comboBoxNetwork.SelectedIndex == 1)
            {
                string headerType = comboBoxKCPHeaderType.Text;
                if (!v2rayP.Setting.KCPHeaderTypes.Contains(headerType))
                {
                    MsgBox.Error(string.Format(I18n.MsgPleaseSelectGivenValues, "Header Type"));
                    comboBoxKCPHeaderType.SelectedIndex = 0;
                    return(null);
                }

                stream.Network     = "kcp";
                stream.KcpSettings = new KCPSetting
                {
                    Congestion       = checkBoxCongestion.Checked,
                    Mtu              = Convert.ToInt32(numericUpDownKCPMTU.Value),
                    Tti              = Convert.ToInt32(numericUpDownKCPTTI.Value),
                    UplinkCapacity   = Convert.ToInt32(numericUpDownKCPUplinkCapacity.Value),
                    DownlinkCapacity = Convert.ToInt32(numericUpDownKCPDownlinkCapacity.Value),
                    WriteBufferSize  = Convert.ToInt32(numericUpDownKCPWriteBufferSize.Value),
                    ReadBufferSize   = Convert.ToInt32(numericUpDownKCPReadBufferSize.Value),
                    Header           =
                    {
                        Type = headerType
                    }
                };
                streamChanged = true;
            }

            // WebSocket Settings
            else if (comboBoxNetwork.SelectedIndex == 2)
            {
                stream.Network    = "ws";
                stream.WsSettings = new WebSocketSetting
                {
                    Path    = textBoxWebSocketPath.Text.Trim(),
                    Headers = ParseHeaders(textBoxWebSocketHeaders.Text, false),
                };
                streamChanged = true;
            }

            else
            {
                MsgBox.Error(String.Format(I18n.MsgPleaseSelectGivenValues, "Network Type"));
                comboBoxNetwork.Focus();
                return(null);
            }

            if (streamChanged)
            {
                config.StreamSettings = stream;
            }
            return(config);
        }
Exemplo n.º 7
0
        public bool WriteConfig(VMess server)
        {
            var streamSettings = server?.StreamSettings;

            if (streamSettings?.TlsSettings != null && string.IsNullOrWhiteSpace(streamSettings?.TlsSettings.ServerName))
            {
                streamSettings = new StreamSetting()
                {
                    Network     = server.StreamSettings.Network,
                    Security    = server.StreamSettings.Security,
                    WsSettings  = server.StreamSettings.WsSettings,
                    TcpSettings = server.StreamSettings.TcpSettings,
                    KcpSettings = server.StreamSettings.KcpSettings,
                };

                streamSettings.TlsSettings = new TLSSetting()
                {
                    ServerName    = null,
                    AllowInsecure = server.StreamSettings.TlsSettings.AllowInsecure,
                };
            }

            var dns = new { servers = new string[] { "8.8.8.8", "8.8.4.4", } };

            var log = new
            {
                error    = ErrorLog == null ? null : errorLog,
                access   = AccessLog == null ? null : accessLog,
                loglevel = LogLevel.ToString().ToLower(),
            };

            var inbound = new
            {
                protocol = "socks",
                port     = SocksPort,
                listen   = ListenAddress,
                settings = new
                {
                    auth    = "noauth",
                    udp     = EnableUdp,
                    ip      = ListenAddress,
                    timeout = 300
                }
            };

            var inboundDetour = new object[]
            {
                new {
                    protocol = "http",
                    port     = HttpPort,
                    listen   = ListenAddress,
                    settings = new { timeout = 0 },
                }
            };

            var outbound = new
            {
                tag      = "tag_proxy",
                protocol = "vmess",
                mux      = new
                {
                    enable = server.EnableMux,
                },
                settings = new
                {
                    vnext = new[]
                    {
                        new {
                            address = server?.Address,
                            port    = server?.Port,
                            users   = new []
                            {
                                new {
                                    id       = server?.UserId,
                                    alterId  = server?.AlterId,
                                    security = server?.Security,
                                }
                            }
                        }
                    }
                },
                streamSettings = streamSettings,
            };

            var outboundDetour = new object[]
            {
                new
                {
                    tag      = "tag_block",
                    protocol = "blackhole",
                    settings = new { response = new { type = "http" } },
                },
                new
                {
                    tag      = "tag_direct",
                    protocol = "freedom",
                    settings = new { tiemout = 0 },
                }
            };

            var routing = new
            {
                strategy = "rules",
                settings = new
                {
                    domainStrategy = "IPIfNonMatch",
                    rules          = new[]
                    {
                        new
                        {
                            type        = "field",
                            outboundTag = "tag_direct",
                            ip          = new string[]
                            {
                                "0.0.0.0/8",
                                "10.0.0.0/8",
                                "100.64.0.0/10",
                                "127.0.0.0/8",
                                "169.254.0.0/16",
                                "172.16.0.0/12",
                                "192.0.0.0/24",
                                "192.0.2.0/24",
                                "192.168.0.0/16",
                                "198.18.0.0/15",
                                "198.51.100.0/24",
                                "203.0.113.0/24",
                                "::1/128",
                                "fc00::/7",
                                "fe80::/10",
                            },
                        },
                    },
                },
            };

            var config = new { log, inbound, inboundDetour, outbound, outboundDetour, routing };

            return(JSON.Write(configPath, config));
        }