mirror of
https://github.com/2dust/v2rayN.git
synced 2026-04-14 19:45:45 +00:00
Replace protect-ss with protect-socks (#9052)
This commit is contained in:
parent
a69e407bda
commit
49f65579aa
5 changed files with 37 additions and 60 deletions
|
|
@ -25,14 +25,14 @@ public record CoreConfigContextBuilderAllResult(
|
||||||
[.. MainResult.ValidatorResult.Warnings, .. PreSocksResult?.ValidatorResult.Warnings ?? []]);
|
[.. MainResult.ValidatorResult.Warnings, .. PreSocksResult?.ValidatorResult.Warnings ?? []]);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The main context with TunProtectSsPort/ProxyRelaySsPort and ProtectDomainList merged in
|
/// The main context with TunProtectSocksPort/ProxyRelaySocksPort and ProtectDomainList merged in
|
||||||
/// from the pre-socks result (if any). Pass this to the core runner.
|
/// from the pre-socks result (if any). Pass this to the core runner.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public CoreConfigContext ResolvedMainContext => PreSocksResult is not null
|
public CoreConfigContext ResolvedMainContext => PreSocksResult is not null
|
||||||
? MainResult.Context with
|
? MainResult.Context with
|
||||||
{
|
{
|
||||||
TunProtectSsPort = PreSocksResult.Context.TunProtectSsPort,
|
TunProtectSocksPort = PreSocksResult.Context.TunProtectSocksPort,
|
||||||
ProxyRelaySsPort = PreSocksResult.Context.ProxyRelaySsPort,
|
ProxyRelaySocksPort = PreSocksResult.Context.ProxyRelaySocksPort,
|
||||||
ProtectDomainList = [.. MainResult.Context.ProtectDomainList ?? [], .. PreSocksResult.Context.ProtectDomainList ?? []],
|
ProtectDomainList = [.. MainResult.Context.ProtectDomainList ?? [], .. PreSocksResult.Context.ProtectDomainList ?? []],
|
||||||
}
|
}
|
||||||
: MainResult.Context;
|
: MainResult.Context;
|
||||||
|
|
@ -58,8 +58,8 @@ public class CoreConfigContextBuilder
|
||||||
IsTunEnabled = config.TunModeItem.EnableTun,
|
IsTunEnabled = config.TunModeItem.EnableTun,
|
||||||
SimpleDnsItem = config.SimpleDNSItem,
|
SimpleDnsItem = config.SimpleDNSItem,
|
||||||
ProtectDomainList = [],
|
ProtectDomainList = [],
|
||||||
TunProtectSsPort = 0,
|
TunProtectSocksPort = 0,
|
||||||
ProxyRelaySsPort = 0,
|
ProxyRelaySocksPort = 0,
|
||||||
RawDnsItem = await AppManager.Instance.GetDNSItem(coreType),
|
RawDnsItem = await AppManager.Instance.GetDNSItem(coreType),
|
||||||
RoutingItem = await ConfigHandler.GetDefaultRouting(config),
|
RoutingItem = await ConfigHandler.GetDefaultRouting(config),
|
||||||
};
|
};
|
||||||
|
|
@ -155,28 +155,23 @@ public class CoreConfigContextBuilder
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var tunProtectSsPort = Utils.GetFreePort();
|
var tunProtectSocksPort = Utils.GetFreePort();
|
||||||
var proxyRelaySsPort = Utils.GetFreePort();
|
var proxyRelaySocksPort = Utils.GetFreePort();
|
||||||
var preItem = new ProfileItem()
|
var preItem = new ProfileItem()
|
||||||
{
|
{
|
||||||
CoreType = ECoreType.sing_box,
|
CoreType = ECoreType.sing_box,
|
||||||
ConfigType = EConfigType.Shadowsocks,
|
ConfigType = EConfigType.SOCKS,
|
||||||
Address = Global.Loopback,
|
Address = Global.Loopback,
|
||||||
Port = proxyRelaySsPort,
|
Port = proxyRelaySocksPort,
|
||||||
Password = Global.None,
|
|
||||||
};
|
};
|
||||||
preItem.SetProtocolExtra(preItem.GetProtocolExtra() with
|
|
||||||
{
|
|
||||||
SsMethod = Global.None,
|
|
||||||
});
|
|
||||||
var preResult2 = await Build(nodeContext.AppConfig, preItem);
|
var preResult2 = await Build(nodeContext.AppConfig, preItem);
|
||||||
return preResult2 with
|
return preResult2 with
|
||||||
{
|
{
|
||||||
Context = preResult2.Context with
|
Context = preResult2.Context with
|
||||||
{
|
{
|
||||||
ProtectDomainList = [.. nodeContext.ProtectDomainList ?? [], .. preResult2.Context.ProtectDomainList ?? []],
|
ProtectDomainList = [.. nodeContext.ProtectDomainList ?? [], .. preResult2.Context.ProtectDomainList ?? []],
|
||||||
TunProtectSsPort = tunProtectSsPort,
|
TunProtectSocksPort = tunProtectSocksPort,
|
||||||
ProxyRelaySsPort = proxyRelaySsPort,
|
ProxyRelaySocksPort = proxyRelaySocksPort,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,6 @@ public record CoreConfigContext
|
||||||
// -> tun inbound --(if routing proxy)--> relay outbound
|
// -> tun inbound --(if routing proxy)--> relay outbound
|
||||||
// -> proxy core (relay inbound --> proxy outbound --(dialerProxy)--> protect outbound)
|
// -> proxy core (relay inbound --> proxy outbound --(dialerProxy)--> protect outbound)
|
||||||
// -> protect inbound -> direct proxy outbound data -> internet
|
// -> protect inbound -> direct proxy outbound data -> internet
|
||||||
public int TunProtectSsPort { get; init; } = 0;
|
public int TunProtectSocksPort { get; init; } = 0;
|
||||||
public int ProxyRelaySsPort { get; init; } = 0;
|
public int ProxyRelaySocksPort { get; init; } = 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -62,16 +62,23 @@ public partial class CoreConfigSingboxService(CoreConfigContext context)
|
||||||
|
|
||||||
ret.Data = ApplyFullConfigTemplate();
|
ret.Data = ApplyFullConfigTemplate();
|
||||||
if (!context.AppConfig.TunModeItem.EnableLegacyProtect
|
if (!context.AppConfig.TunModeItem.EnableLegacyProtect
|
||||||
&& context.TunProtectSsPort is > 0 and <= 65535)
|
&& context.TunProtectSocksPort is > 0 and <= 65535)
|
||||||
{
|
{
|
||||||
|
// Replace relay proxy outbound, avoid mux or other feature cause issue, and add a socks inbound for tun protect
|
||||||
|
var relayProxyIndex = _coreConfig.outbounds.FindIndex(o => o.tag == Global.ProxyTag);
|
||||||
|
_coreConfig.outbounds[relayProxyIndex] = new Outbound4Sbox()
|
||||||
|
{
|
||||||
|
type = Global.ProtocolTypes[EConfigType.SOCKS],
|
||||||
|
tag = Global.ProxyTag,
|
||||||
|
server = Global.Loopback,
|
||||||
|
server_port = context.ProxyRelaySocksPort,
|
||||||
|
};
|
||||||
var ssInbound = new
|
var ssInbound = new
|
||||||
{
|
{
|
||||||
type = "shadowsocks",
|
type = "socks",
|
||||||
tag = "tun-protect-ss",
|
tag = "tun-protect-socks",
|
||||||
listen = Global.Loopback,
|
listen = Global.Loopback,
|
||||||
listen_port = context.TunProtectSsPort,
|
listen_port = context.TunProtectSocksPort,
|
||||||
method = "none",
|
|
||||||
password = "none",
|
|
||||||
};
|
};
|
||||||
var directRule = new Rule4Sbox()
|
var directRule = new Rule4Sbox()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -345,14 +345,6 @@ public partial class CoreConfigSingboxService
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// The synthetic TUN relay outbound talks to the local Xray shadowsocks relay.
|
|
||||||
// Xray cannot terminate sing-box h2mux, so muxing here turns local relay traffic
|
|
||||||
// into sp.mux.sing-box.arpa pseudo-destinations and breaks DNS over TUN.
|
|
||||||
if (IsTunRelayProxyOutbound())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var muxEnabled = _node.MuxEnabled ?? _config.CoreBasicItem.MuxEnabled;
|
var muxEnabled = _node.MuxEnabled ?? _config.CoreBasicItem.MuxEnabled;
|
||||||
if (muxEnabled && _config.Mux4SboxItem.Protocol.IsNotEmpty())
|
if (muxEnabled && _config.Mux4SboxItem.Protocol.IsNotEmpty())
|
||||||
{
|
{
|
||||||
|
|
@ -372,21 +364,6 @@ public partial class CoreConfigSingboxService
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool IsTunRelayProxyOutbound()
|
|
||||||
{
|
|
||||||
if (!context.IsTunEnabled
|
|
||||||
|| _node.ConfigType != EConfigType.Shadowsocks
|
|
||||||
|| _node.Address != Global.Loopback
|
|
||||||
|| _node.Port != context.ProxyRelaySsPort
|
|
||||||
|| _node.Password != Global.None)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
var protocolExtra = _node.GetProtocolExtra();
|
|
||||||
return protocolExtra.SsMethod == Global.None;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void FillOutboundTls(Outbound4Sbox outbound)
|
private void FillOutboundTls(Outbound4Sbox outbound)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,8 @@ public partial class CoreConfigV2rayService(CoreConfigContext context)
|
||||||
{
|
{
|
||||||
if (!context.AppConfig.TunModeItem.EnableLegacyProtect
|
if (!context.AppConfig.TunModeItem.EnableLegacyProtect
|
||||||
&& context.IsTunEnabled
|
&& context.IsTunEnabled
|
||||||
&& context.TunProtectSsPort is > 0 and <= 65535
|
&& context.TunProtectSocksPort is > 0 and <= 65535
|
||||||
&& context.ProxyRelaySsPort is > 0 and <= 65535)
|
&& context.ProxyRelaySocksPort is > 0 and <= 65535)
|
||||||
{
|
{
|
||||||
return GenerateClientProxyRelayConfig();
|
return GenerateClientProxyRelayConfig();
|
||||||
}
|
}
|
||||||
|
|
@ -309,17 +309,16 @@ public partial class CoreConfigV2rayService(CoreConfigContext context)
|
||||||
var protectNode = new ProfileItem()
|
var protectNode = new ProfileItem()
|
||||||
{
|
{
|
||||||
CoreType = ECoreType.Xray,
|
CoreType = ECoreType.Xray,
|
||||||
ConfigType = EConfigType.Shadowsocks,
|
ConfigType = EConfigType.SOCKS,
|
||||||
Address = Global.Loopback,
|
Address = Global.Loopback,
|
||||||
Port = context.TunProtectSsPort,
|
Port = context.TunProtectSocksPort,
|
||||||
Password = Global.None,
|
|
||||||
};
|
};
|
||||||
protectNode.SetProtocolExtra(protectNode.GetProtocolExtra() with
|
protectNode.SetProtocolExtra(protectNode.GetProtocolExtra() with
|
||||||
{
|
{
|
||||||
SsMethod = Global.None,
|
SsMethod = Global.None,
|
||||||
});
|
});
|
||||||
|
|
||||||
const string protectTag = "tun-protect-ss";
|
const string protectTag = "tun-protect-socks";
|
||||||
foreach (var outbound in _coreConfig.outbounds
|
foreach (var outbound in _coreConfig.outbounds
|
||||||
.Where(o => o.streamSettings?.sockopt?.dialerProxy?.IsNullOrEmpty() ?? true))
|
.Where(o => o.streamSettings?.sockopt?.dialerProxy?.IsNullOrEmpty() ?? true))
|
||||||
{
|
{
|
||||||
|
|
@ -368,7 +367,7 @@ public partial class CoreConfigV2rayService(CoreConfigContext context)
|
||||||
var hasBalancer = _coreConfig.routing.balancers is { Count: > 0 };
|
var hasBalancer = _coreConfig.routing.balancers is { Count: > 0 };
|
||||||
_coreConfig.routing.rules.Add(new()
|
_coreConfig.routing.rules.Add(new()
|
||||||
{
|
{
|
||||||
inboundTag = ["proxy-relay-ss"],
|
inboundTag = ["proxy-relay-socks"],
|
||||||
outboundTag = hasBalancer ? null : Global.ProxyTag,
|
outboundTag = hasBalancer ? null : Global.ProxyTag,
|
||||||
balancerTag = hasBalancer ? Global.ProxyTag + Global.BalancerTagSuffix : null,
|
balancerTag = hasBalancer ? Global.ProxyTag + Global.BalancerTagSuffix : null,
|
||||||
type = "field"
|
type = "field"
|
||||||
|
|
@ -380,15 +379,14 @@ public partial class CoreConfigV2rayService(CoreConfigContext context)
|
||||||
configNode["inbounds"]!.AsArray().Add(new
|
configNode["inbounds"]!.AsArray().Add(new
|
||||||
{
|
{
|
||||||
listen = Global.Loopback,
|
listen = Global.Loopback,
|
||||||
port = context.ProxyRelaySsPort,
|
port = context.ProxyRelaySocksPort,
|
||||||
protocol = "shadowsocks",
|
protocol = "socks",
|
||||||
settings = new
|
settings = new
|
||||||
{
|
{
|
||||||
network = "tcp,udp",
|
auth = "noauth",
|
||||||
method = Global.None,
|
udp = true,
|
||||||
password = Global.None,
|
|
||||||
},
|
},
|
||||||
tag = "proxy-relay-ss",
|
tag = "proxy-relay-socks",
|
||||||
});
|
});
|
||||||
|
|
||||||
ret.Msg = string.Format(ResUI.SuccessfulConfiguration, "");
|
ret.Msg = string.Format(ResUI.SuccessfulConfiguration, "");
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue