mirror of
https://github.com/2dust/v2rayN.git
synced 2026-02-28 05:03:02 +00:00
Fix routing
This commit is contained in:
parent
b53507f486
commit
12a46990b5
4 changed files with 96 additions and 63 deletions
|
|
@ -20,10 +20,13 @@ public partial class CoreConfigSingboxService
|
||||||
{
|
{
|
||||||
proxyOutboundList.AddRange(BuildGroupProxyOutbounds(baseTagName));
|
proxyOutboundList.AddRange(BuildGroupProxyOutbounds(baseTagName));
|
||||||
}
|
}
|
||||||
var proxyTags = proxyOutboundList.Where(n => n.tag.StartsWith(Global.ProxyTag)).Select(n => n.tag).ToList();
|
if (withSelector)
|
||||||
if (proxyTags.Count > 1)
|
|
||||||
{
|
{
|
||||||
proxyOutboundList.InsertRange(0, BuildSelectorOutbounds(proxyTags, baseTagName));
|
var proxyTags = proxyOutboundList.Where(n => n.tag.StartsWith(Global.ProxyTag)).Select(n => n.tag).ToList();
|
||||||
|
if (proxyTags.Count > 1)
|
||||||
|
{
|
||||||
|
proxyOutboundList.InsertRange(0, BuildSelectorOutbounds(proxyTags, baseTagName));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return proxyOutboundList;
|
return proxyOutboundList;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -244,6 +244,7 @@ public partial class CoreConfigV2rayService(CoreConfigContext context)
|
||||||
GenLog();
|
GenLog();
|
||||||
GenOutbounds();
|
GenOutbounds();
|
||||||
|
|
||||||
|
_coreConfig.routing.domainStrategy = Global.AsIs;
|
||||||
_coreConfig.routing.rules.Clear();
|
_coreConfig.routing.rules.Clear();
|
||||||
_coreConfig.inbounds.Clear();
|
_coreConfig.inbounds.Clear();
|
||||||
_coreConfig.inbounds.Add(new()
|
_coreConfig.inbounds.Add(new()
|
||||||
|
|
@ -254,6 +255,8 @@ public partial class CoreConfigV2rayService(CoreConfigContext context)
|
||||||
protocol = EInboundProtocol.mixed.ToString(),
|
protocol = EInboundProtocol.mixed.ToString(),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
_coreConfig.routing.rules.Add(BuildFinalRule());
|
||||||
|
|
||||||
ret.Msg = string.Format(ResUI.SuccessfulConfiguration, "");
|
ret.Msg = string.Format(ResUI.SuccessfulConfiguration, "");
|
||||||
ret.Success = true;
|
ret.Success = true;
|
||||||
ret.Data = JsonUtils.Serialize(_coreConfig);
|
ret.Data = JsonUtils.Serialize(_coreConfig);
|
||||||
|
|
|
||||||
|
|
@ -70,17 +70,16 @@ public partial class CoreConfigV2rayService
|
||||||
dnsItem.serveStale = simpleDnsItem?.ServeStale is true ? true : null;
|
dnsItem.serveStale = simpleDnsItem?.ServeStale is true ? true : null;
|
||||||
dnsItem.enableParallelQuery = simpleDnsItem?.ParallelQuery is true ? true : null;
|
dnsItem.enableParallelQuery = simpleDnsItem?.ParallelQuery is true ? true : null;
|
||||||
|
|
||||||
if (_coreConfig.routing.domainStrategy == Global.IPIfNonMatch)
|
// DNS routing
|
||||||
|
var finalRule = BuildFinalRule();
|
||||||
|
dnsItem.tag = Global.DnsTag;
|
||||||
|
_coreConfig.routing.rules.Add(new()
|
||||||
{
|
{
|
||||||
// DNS routing
|
type = "field",
|
||||||
dnsItem.tag = Global.DnsTag;
|
inboundTag = [Global.DnsTag],
|
||||||
_coreConfig.routing.rules.Add(new RulesItem4Ray
|
outboundTag = finalRule.outboundTag,
|
||||||
{
|
balancerTag = finalRule.balancerTag
|
||||||
type = "field",
|
});
|
||||||
inboundTag = new List<string> { Global.DnsTag },
|
|
||||||
outboundTag = Global.ProxyTag,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
_coreConfig.dns = dnsItem;
|
_coreConfig.dns = dnsItem;
|
||||||
}
|
}
|
||||||
|
|
@ -93,45 +92,6 @@ public partial class CoreConfigV2rayService
|
||||||
private void FillDnsServers(Dns4Ray dnsItem)
|
private void FillDnsServers(Dns4Ray dnsItem)
|
||||||
{
|
{
|
||||||
var simpleDNSItem = context.SimpleDnsItem;
|
var simpleDNSItem = context.SimpleDnsItem;
|
||||||
static List<string> ParseDnsAddresses(string? dnsInput, string defaultAddress)
|
|
||||||
{
|
|
||||||
var addresses = dnsInput?.Split(dnsInput.Contains(',') ? ',' : ';')
|
|
||||||
.Select(addr => addr.Trim())
|
|
||||||
.Where(addr => !string.IsNullOrEmpty(addr))
|
|
||||||
.Select(addr => addr.StartsWith("dhcp", StringComparison.OrdinalIgnoreCase) ? "localhost" : addr)
|
|
||||||
.Distinct()
|
|
||||||
.ToList() ?? new List<string> { defaultAddress };
|
|
||||||
return addresses.Count > 0 ? addresses : new List<string> { defaultAddress };
|
|
||||||
}
|
|
||||||
|
|
||||||
static object? CreateDnsServer(string dnsAddress, List<string> domains, List<string>? expectedIPs = null)
|
|
||||||
{
|
|
||||||
var (domain, scheme, port, path) = Utils.ParseUrl(dnsAddress);
|
|
||||||
var domainFinal = dnsAddress;
|
|
||||||
int? portFinal = null;
|
|
||||||
if (scheme.IsNullOrEmpty() || scheme.StartsWith("udp", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
domainFinal = domain;
|
|
||||||
portFinal = port > 0 ? port : null;
|
|
||||||
}
|
|
||||||
else if (scheme.StartsWith("tcp", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
domainFinal = scheme + "://" + domain;
|
|
||||||
portFinal = port > 0 ? port : null;
|
|
||||||
}
|
|
||||||
var dnsServer = new DnsServer4Ray
|
|
||||||
{
|
|
||||||
address = domainFinal,
|
|
||||||
port = portFinal,
|
|
||||||
skipFallback = true,
|
|
||||||
domains = domains.Count > 0 ? domains : null,
|
|
||||||
expectedIPs = expectedIPs?.Count > 0 ? expectedIPs : null
|
|
||||||
};
|
|
||||||
return JsonUtils.SerializeToNode(dnsServer, new JsonSerializerOptions
|
|
||||||
{
|
|
||||||
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
var directDNSAddress = ParseDnsAddresses(simpleDNSItem?.DirectDNS, Global.DomainDirectDNSAddress.First());
|
var directDNSAddress = ParseDnsAddresses(simpleDNSItem?.DirectDNS, Global.DomainDirectDNSAddress.First());
|
||||||
var remoteDNSAddress = ParseDnsAddresses(simpleDNSItem?.RemoteDNS, Global.DomainRemoteDNSAddress.First());
|
var remoteDNSAddress = ParseDnsAddresses(simpleDNSItem?.RemoteDNS, Global.DomainRemoteDNSAddress.First());
|
||||||
|
|
@ -252,17 +212,6 @@ public partial class CoreConfigV2rayService
|
||||||
|
|
||||||
dnsItem.servers ??= [];
|
dnsItem.servers ??= [];
|
||||||
|
|
||||||
void AddDnsServers(List<string> dnsAddresses, List<string> domains, List<string>? expectedIPs = null)
|
|
||||||
{
|
|
||||||
if (domains.Count > 0)
|
|
||||||
{
|
|
||||||
foreach (var dnsAddress in dnsAddresses)
|
|
||||||
{
|
|
||||||
dnsItem.servers.Add(CreateDnsServer(dnsAddress, domains, expectedIPs));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AddDnsServers(remoteDNSAddress, proxyDomainList);
|
AddDnsServers(remoteDNSAddress, proxyDomainList);
|
||||||
AddDnsServers(directDNSAddress, directDomainList);
|
AddDnsServers(directDNSAddress, directDomainList);
|
||||||
AddDnsServers(remoteDNSAddress, proxyGeositeList);
|
AddDnsServers(remoteDNSAddress, proxyGeositeList);
|
||||||
|
|
@ -281,6 +230,59 @@ public partial class CoreConfigV2rayService
|
||||||
|
|
||||||
var defaultDnsServers = useDirectDns ? directDNSAddress : remoteDNSAddress;
|
var defaultDnsServers = useDirectDns ? directDNSAddress : remoteDNSAddress;
|
||||||
dnsItem.servers.AddRange(defaultDnsServers);
|
dnsItem.servers.AddRange(defaultDnsServers);
|
||||||
|
return;
|
||||||
|
|
||||||
|
static List<string> ParseDnsAddresses(string? dnsInput, string defaultAddress)
|
||||||
|
{
|
||||||
|
var addresses = dnsInput?.Split(dnsInput.Contains(',') ? ',' : ';')
|
||||||
|
.Select(addr => addr.Trim())
|
||||||
|
.Where(addr => !string.IsNullOrEmpty(addr))
|
||||||
|
.Select(addr => addr.StartsWith("dhcp", StringComparison.OrdinalIgnoreCase) ? "localhost" : addr)
|
||||||
|
.Distinct()
|
||||||
|
.ToList() ?? [defaultAddress];
|
||||||
|
return addresses.Count > 0 ? addresses : new List<string> { defaultAddress };
|
||||||
|
}
|
||||||
|
|
||||||
|
static object? CreateDnsServer(string dnsAddress, List<string> domains, List<string>? expectedIPs = null)
|
||||||
|
{
|
||||||
|
var (domain, scheme, port, path) = Utils.ParseUrl(dnsAddress);
|
||||||
|
var domainFinal = dnsAddress;
|
||||||
|
int? portFinal = null;
|
||||||
|
if (scheme.IsNullOrEmpty() || scheme.StartsWith("udp", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
domainFinal = domain;
|
||||||
|
portFinal = port > 0 ? port : null;
|
||||||
|
}
|
||||||
|
else if (scheme.StartsWith("tcp", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
domainFinal = scheme + "://" + domain;
|
||||||
|
portFinal = port > 0 ? port : null;
|
||||||
|
}
|
||||||
|
var dnsServer = new DnsServer4Ray
|
||||||
|
{
|
||||||
|
address = domainFinal,
|
||||||
|
port = portFinal,
|
||||||
|
skipFallback = true,
|
||||||
|
domains = domains.Count > 0 ? domains : null,
|
||||||
|
expectedIPs = expectedIPs?.Count > 0 ? expectedIPs : null
|
||||||
|
};
|
||||||
|
return JsonUtils.SerializeToNode(dnsServer, new JsonSerializerOptions
|
||||||
|
{
|
||||||
|
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void AddDnsServers(List<string> dnsAddresses, List<string> domains, List<string>? expectedIPs = null)
|
||||||
|
{
|
||||||
|
if (domains.Count <= 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
foreach (var dnsAddress in dnsAddresses)
|
||||||
|
{
|
||||||
|
dnsItem.servers.Add(CreateDnsServer(dnsAddress, domains, expectedIPs));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FillDnsHosts(Dns4Ray dnsItem)
|
private void FillDnsHosts(Dns4Ray dnsItem)
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@ public partial class CoreConfigV2rayService
|
||||||
rulesItem.outboundTag = null;
|
rulesItem.outboundTag = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_coreConfig.routing.rules.Add(BuildFinalRule());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|
@ -181,4 +182,28 @@ public partial class CoreConfigV2rayService
|
||||||
|
|
||||||
return tag;
|
return tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private RulesItem4Ray BuildFinalRule()
|
||||||
|
{
|
||||||
|
var finalRule = new RulesItem4Ray()
|
||||||
|
{
|
||||||
|
type = "field",
|
||||||
|
network = "tcp,udp",
|
||||||
|
outboundTag = Global.ProxyTag,
|
||||||
|
};
|
||||||
|
var balancer =
|
||||||
|
_coreConfig?.routing?.balancers?.FirstOrDefault(b => b.tag == Global.ProxyTag + Global.BalancerTagSuffix, null);
|
||||||
|
var domainStrategy = _coreConfig.routing?.domainStrategy ?? Global.AsIs;
|
||||||
|
if (balancer is not null)
|
||||||
|
{
|
||||||
|
finalRule.outboundTag = null;
|
||||||
|
finalRule.balancerTag = balancer.tag;
|
||||||
|
}
|
||||||
|
if (domainStrategy == Global.IPIfNonMatch)
|
||||||
|
{
|
||||||
|
finalRule.network = null;
|
||||||
|
finalRule.ip = ["0.0.0.0/0", "::/0"];
|
||||||
|
}
|
||||||
|
return finalRule;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue