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 },
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); }
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 } }
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); }
public VMessForm(Server server = default) { InitializeComponent(); _server = (VMess)server ?? new VMess(); }
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); }
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)); }