diff --git a/v2rayN/ServiceLib/Global.cs b/v2rayN/ServiceLib/Global.cs index 94a66fa5..6c22a045 100644 --- a/v2rayN/ServiceLib/Global.cs +++ b/v2rayN/ServiceLib/Global.cs @@ -288,6 +288,16 @@ public class Global "dns" ]; + public static readonly Dictionary KcpHeaderMaskMap = new() + { + { "srtp", "header-srtp" }, + { "utp", "header-utp" }, + { "wechat-video", "header-wechat" }, + { "dtls", "header-dtls" }, + { "wireguard", "header-wireguard" }, + { "dns", "header-dns" } + }; + public static readonly List CoreTypes = [ "Xray", diff --git a/v2rayN/ServiceLib/Models/V2rayConfig.cs b/v2rayN/ServiceLib/Models/V2rayConfig.cs index d9575432..acf17532 100644 --- a/v2rayN/ServiceLib/Models/V2rayConfig.cs +++ b/v2rayN/ServiceLib/Models/V2rayConfig.cs @@ -343,7 +343,7 @@ public class StreamSettings4Ray public HysteriaSettings4Ray? hysteriaSettings { get; set; } - public List? udpmasks { get; set; } + public FinalMask4Ray? finalmask { get; set; } public Sockopt4Ray? sockopt { get; set; } } @@ -388,8 +388,6 @@ public class Header4Ray public object request { get; set; } public object response { get; set; } - - public string? domain { get; set; } } public class KcpSettings4Ray @@ -407,10 +405,6 @@ public class KcpSettings4Ray public int readBufferSize { get; set; } public int writeBufferSize { get; set; } - - public Header4Ray header { get; set; } - - public string seed { get; set; } } public class WsSettings4Ray @@ -484,15 +478,22 @@ public class HysteriaUdpHop4Ray public int? interval { get; set; } } -public class UdpMasks4Ray +public class FinalMask4Ray { - public string type { get; set; } - public UdpMasksSettings4Ray? settings { get; set; } + public List? tcp { get; set; } + public List? udp { get; set; } } -public class UdpMasksSettings4Ray +public class Mask4Ray +{ + public string type { get; set; } + public MaskSettings4Ray? settings { get; set; } +} + +public class MaskSettings4Ray { public string? password { get; set; } + public string? domain { get; set; } } public class AccountsItem4Ray diff --git a/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayOutboundService.cs b/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayOutboundService.cs index 1f5ad4ef..d3575685 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayOutboundService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayOutboundService.cs @@ -365,14 +365,33 @@ public partial class CoreConfigV2rayService kcpSettings.congestion = _config.KcpItem.Congestion; kcpSettings.readBufferSize = _config.KcpItem.ReadBufferSize; kcpSettings.writeBufferSize = _config.KcpItem.WriteBufferSize; - kcpSettings.header = new Header4Ray + streamSettings.finalmask ??= new(); + if (Global.KcpHeaderMaskMap.TryGetValue(node.HeaderType, out var header)) { - type = node.HeaderType, - domain = host.NullIfEmpty() - }; - if (path.IsNotEmpty()) + streamSettings.finalmask.udp = + [ + new Mask4Ray + { + type = header, + settings = node.HeaderType == "dns" && !host.IsNullOrEmpty() ? new MaskSettings4Ray { domain = host } : null + } + ]; + } + streamSettings.finalmask.udp ??= []; + if (path.IsNullOrEmpty()) { - kcpSettings.seed = path; + streamSettings.finalmask.udp.Add(new Mask4Ray + { + type = "mkcp-original" + }); + } + else + { + streamSettings.finalmask.udp.Add(new Mask4Ray + { + type = "mkcp-aes128gcm", + settings = new MaskSettings4Ray { password = path } + }); } streamSettings.kcpSettings = kcpSettings; break; @@ -513,8 +532,15 @@ public partial class CoreConfigV2rayService streamSettings.hysteriaSettings = hysteriaSettings; if (node.Path.IsNotEmpty()) { - streamSettings.udpmasks = - [new() { type = "salamander", settings = new() { password = node.Path.TrimEx(), } }]; + streamSettings.finalmask ??= new(); + streamSettings.finalmask.udp = + [ + new Mask4Ray + { + type = "salamander", + settings = new MaskSettings4Ray { password = node.Path.TrimEx(), } + } + ]; } break;