mirror of
https://github.com/2dust/v2rayN.git
synced 2026-08-09 00:32:04 +03:00
Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
31044f449d | ||
|
|
eacf8b0784 | ||
|
|
f347fe1c03 | ||
|
|
71208eb711 | ||
|
|
339eaa6bfd | ||
|
|
717ef7f0a7 | ||
|
|
4a9d83f9dc | ||
|
|
1ac14d0903 | ||
|
|
08d423e1b4 | ||
|
|
9638b4c368 | ||
|
|
1034ce6e02 |
2
.github/workflows/build-windows-x86.yml
vendored
2
.github/workflows/build-windows-x86.yml
vendored
@@ -146,7 +146,7 @@ jobs:
|
||||
$xrayTag = "v$xrayVer"
|
||||
$singTag = "v$singVer"
|
||||
|
||||
$xrayUrl = "https://github.com/XTLS/Xray-core/releases/download/$xrayTag/Xray-windows-32.zip"
|
||||
$xrayUrl = "https://github.com/autorepobot/Xray/releases/download/$xrayTag/Xray-windows-32.zip"
|
||||
$singUrl = "https://github.com/SagerNet/sing-box/releases/download/$singTag/sing-box-$singVer-windows-386.zip"
|
||||
|
||||
Write-Host "Bundled Xray version: $xrayVer"
|
||||
|
||||
@@ -50,6 +50,8 @@ Read the Wiki for usage guides and configuration details.
|
||||
| Linux | ✅ | - | ✅ | ✅ | ✅ |
|
||||
| macOS | ✅ | - | ✅ | - | - |
|
||||
|
||||
Minimum OS requirements: [Release files introduction](https://github.com/2dust/v2rayN/wiki/Release-files-introduction) / 最低系统要求:[发布文件介绍](https://github.com/2dust/v2rayN/wiki/Release-files-introduction)
|
||||
|
||||
---
|
||||
|
||||
## GPG Verification / GPG 签名校验
|
||||
|
||||
@@ -54,7 +54,7 @@ cat >"$PackagePath/v2rayN.app/Contents/Info.plist" <<-EOF
|
||||
<key>NSHighResolutionCapable</key>
|
||||
<true/>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>13.7</string>
|
||||
<string>13.6</string>
|
||||
</dict>
|
||||
</plist>
|
||||
EOF
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project>
|
||||
|
||||
<PropertyGroup>
|
||||
<Version>7.24.5</Version>
|
||||
<Version>7.24.6</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
|
||||
@@ -6,28 +6,28 @@
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageVersion Include="Avalonia.AvaloniaEdit" Version="12.0.0" />
|
||||
<PackageVersion Include="Avalonia.Controls.DataGrid" Version="12.1.0" />
|
||||
<PackageVersion Include="Avalonia.Desktop" Version="12.1.0" />
|
||||
<PackageVersion Include="Avalonia.Controls.DataGrid" Version="12.1.2" />
|
||||
<PackageVersion Include="Avalonia.Desktop" Version="12.1.1" />
|
||||
<PackageVersion Include="AvaloniaUI.DiagnosticsSupport" Version="2.2.3" />
|
||||
<PackageVersion Include="AwesomeAssertions" Version="9.5.0" />
|
||||
<PackageVersion Include="DialogHost.Avalonia" Version="0.12.3" />
|
||||
<PackageVersion Include="IPNetwork2" Version="4.3.0" />
|
||||
<PackageVersion Include="ReactiveUI.Avalonia" Version="12.1.0" />
|
||||
<PackageVersion Include="CliWrap" Version="3.10.2" />
|
||||
<PackageVersion Include="ReactiveUI.Avalonia" Version="12.1.1" />
|
||||
<PackageVersion Include="CliWrap" Version="3.10.4" />
|
||||
<PackageVersion Include="Downloader" Version="5.9.5" />
|
||||
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.8.1" />
|
||||
<PackageVersion Include="H.NotifyIcon.Wpf" Version="2.4.1" />
|
||||
<PackageVersion Include="MaterialDesignThemes" Version="5.3.2" />
|
||||
<PackageVersion Include="QRCoder" Version="1.8.0" />
|
||||
<PackageVersion Include="ReactiveUI" Version="24.0.0" />
|
||||
<PackageVersion Include="ReactiveUI.SourceGenerators" Version="3.1.0" />
|
||||
<PackageVersion Include="ReactiveUI.WPF" Version="24.0.0" />
|
||||
<PackageVersion Include="Semi.Avalonia" Version="12.1.0" />
|
||||
<PackageVersion Include="ReactiveUI" Version="24.1.0" />
|
||||
<PackageVersion Include="ReactiveUI.SourceGenerators" Version="3.2.0" />
|
||||
<PackageVersion Include="ReactiveUI.WPF" Version="24.1.0" />
|
||||
<PackageVersion Include="Semi.Avalonia" Version="12.1.0.1" />
|
||||
<PackageVersion Include="Semi.Avalonia.AvaloniaEdit" Version="12.0.0" />
|
||||
<PackageVersion Include="Semi.Avalonia.DataGrid" Version="12.1.0" />
|
||||
<PackageVersion Include="Semi.Avalonia.DataGrid" Version="12.1.0.1" />
|
||||
<PackageVersion Include="NLog" Version="6.1.4" />
|
||||
<PackageVersion Include="sqlite-net-e" Version="1.11.285" />
|
||||
<PackageVersion Include="Repobot.SQLite.Unofficial" Version="3.53.3.10" />
|
||||
<PackageVersion Include="Repobot.SQLite.Unofficial" Version="3.53.4.1" />
|
||||
<PackageVersion Include="TaskScheduler" Version="2.12.2" />
|
||||
<PackageVersion Include="WebDav.Client" Version="2.9.0" />
|
||||
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
|
||||
@@ -36,4 +36,4 @@
|
||||
<PackageVersion Include="ZXing.Net.Bindings.SkiaSharp" Version="0.16.22" />
|
||||
<PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="3.119.4" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
|
||||
@@ -753,11 +753,11 @@ public class Utils
|
||||
return false;
|
||||
}
|
||||
|
||||
public static int GetFreePort(int defaultPort = 0)
|
||||
public static int GetFreePort(int defaultPort)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!(defaultPort == 0 || Utils.PortInUse(defaultPort)))
|
||||
if (!PortInUse(defaultPort))
|
||||
{
|
||||
return defaultPort;
|
||||
}
|
||||
|
||||
@@ -54,12 +54,12 @@ internal static class WindowsUtils
|
||||
|
||||
public static async Task RemoveTunDevice()
|
||||
{
|
||||
var tunNameList = new List<string> { "wintunsingbox_tun", "xray_tun" };
|
||||
var tunNameList = new List<string> { "singbox_tun", "xray_tun" };
|
||||
foreach (var tunName in tunNameList)
|
||||
{
|
||||
try
|
||||
{
|
||||
var sum = MD5.HashData(Encoding.UTF8.GetBytes(tunName));
|
||||
var sum = MD5.HashData(Encoding.UTF8.GetBytes($"wintun{tunName}"));
|
||||
var guid = new Guid(sum);
|
||||
var pnpUtilPath = @"C:\Windows\System32\pnputil.exe";
|
||||
var arg = $$""" /remove-device "SWD\Wintun\{{{guid}}}" """;
|
||||
|
||||
@@ -586,7 +586,6 @@ public static class ConfigHandler
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
public static async Task<int> AddCustomOutboundServer(Config config, ProfileItem profileItem, bool blDelete, bool toFile = true)
|
||||
{
|
||||
var fileName = profileItem.Address;
|
||||
@@ -1739,8 +1738,16 @@ public static class ConfigHandler
|
||||
SubItem? subItem)
|
||||
{
|
||||
var subRemarks = subItem?.Remarks;
|
||||
// Safe Mode: Only allow full configuration if it's not from a subscription
|
||||
var lstProfiles = V2rayFmt.ResolveToCustomOutbound(strData, subRemarks);
|
||||
// Prioritize using complete custom parsing, followed by custom outbound parsing.
|
||||
var lstProfiles = V2rayFmt.ResolveToCustom(strData, subRemarks);
|
||||
if (lstProfiles.Count == 0)
|
||||
{
|
||||
lstProfiles = SingboxFmt.ResolveToCustom(strData, subRemarks);
|
||||
}
|
||||
if (lstProfiles.Count == 0)
|
||||
{
|
||||
lstProfiles = V2rayFmt.ResolveToCustomOutbound(strData, subRemarks);
|
||||
}
|
||||
if (lstProfiles.Count == 0)
|
||||
{
|
||||
lstProfiles = SingboxFmt.ResolveToCustomOutbound(strData, subRemarks);
|
||||
@@ -1750,7 +1757,7 @@ public static class ConfigHandler
|
||||
return -1;
|
||||
}
|
||||
|
||||
var count = await AddCustomOutboundServers(config, lstProfiles, subid, isSub);
|
||||
var count = await AddBatchCustomServers(config, lstProfiles, subid, isSub);
|
||||
if (count > 0)
|
||||
{
|
||||
return count;
|
||||
@@ -1786,7 +1793,7 @@ public static class ConfigHandler
|
||||
var subRemarks = subItem.Remarks;
|
||||
var customCoreType = subItem.CustomCoreType!.Value;
|
||||
|
||||
List<ProfileItem>? lstProfiles = customCoreType switch
|
||||
var lstProfiles = customCoreType switch
|
||||
{
|
||||
ECoreType.Xray => V2rayFmt.ResolveToCustom(strData, subRemarks),
|
||||
ECoreType.sing_box => SingboxFmt.ResolveToCustom(strData, subRemarks),
|
||||
@@ -1800,7 +1807,7 @@ public static class ConfigHandler
|
||||
return -1;
|
||||
}
|
||||
|
||||
var count = await AddCustomOutboundServers(config, lstProfiles, subid, isSub);
|
||||
var count = await AddBatchCustomServers(config, lstProfiles, subid, isSub);
|
||||
if (count > 0)
|
||||
{
|
||||
return count;
|
||||
@@ -1810,7 +1817,7 @@ public static class ConfigHandler
|
||||
return await SaveCustomRawFileServer(config, strData, subid, isSub, subItem, customCoreType);
|
||||
}
|
||||
|
||||
private static async Task<int> AddCustomOutboundServers(
|
||||
private static async Task<int> AddBatchCustomServers(
|
||||
Config config,
|
||||
List<ProfileItem> lstProfiles,
|
||||
string subid,
|
||||
@@ -1821,9 +1828,20 @@ public static class ConfigHandler
|
||||
{
|
||||
it.Subid = subid;
|
||||
it.IsSub = isSub;
|
||||
if (await AddCustomOutboundServer(config, it, true) == 0)
|
||||
|
||||
if (it.ConfigType == EConfigType.Custom)
|
||||
{
|
||||
count++;
|
||||
if (await AddCustomServer(config, it, true) == 0)
|
||||
{
|
||||
count++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (await AddCustomOutboundServer(config, it, true) == 0)
|
||||
{
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return count;
|
||||
|
||||
@@ -76,6 +76,7 @@ public class SingboxFmt : BaseFmt
|
||||
var fileName = WriteAllText(JsonUtils.Serialize(jsonObject));
|
||||
var profileItem = new ProfileItem
|
||||
{
|
||||
ConfigType = EConfigType.Custom,
|
||||
CoreType = ECoreType.sing_box,
|
||||
Address = fileName,
|
||||
Remarks = subRemarks ?? "singbox_custom",
|
||||
|
||||
@@ -77,6 +77,7 @@ public class V2rayFmt : BaseFmt
|
||||
|
||||
var profileItem = new ProfileItem
|
||||
{
|
||||
ConfigType = EConfigType.Custom,
|
||||
CoreType = ECoreType.Xray,
|
||||
Address = fileName,
|
||||
Remarks = jsonObject["remarks"]?.ToString() ?? subRemarks ?? "v2ray_custom",
|
||||
|
||||
6
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
6
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
@@ -178,7 +178,7 @@ namespace ServiceLib.Resx {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Failed to import custom configuration Configuration 的本地化字符串。
|
||||
/// 查找类似 Failed to import configuration 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string FailedImportedCustomServer {
|
||||
get {
|
||||
@@ -268,7 +268,7 @@ namespace ServiceLib.Resx {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Please browse to import Configuration configuration 的本地化字符串。
|
||||
/// 查找类似 Please browse to import configuration 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string FillServerAddressCustom {
|
||||
get {
|
||||
@@ -2653,7 +2653,7 @@ namespace ServiceLib.Resx {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Custom configuration Configuration imported successfully 的本地化字符串。
|
||||
/// 查找类似 Custom configuration imported successfully 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string SuccessfullyImportedCustomServer {
|
||||
get {
|
||||
|
||||
@@ -142,7 +142,7 @@
|
||||
<value>Failed to get the default configuration</value>
|
||||
</data>
|
||||
<data name="FailedImportedCustomServer" xml:space="preserve">
|
||||
<value>Failed to import custom configuration Configuration</value>
|
||||
<value>Failed to import configuration</value>
|
||||
</data>
|
||||
<data name="FailedReadConfiguration" xml:space="preserve">
|
||||
<value>Failed to read configuration file</value>
|
||||
@@ -283,7 +283,7 @@
|
||||
<value>Configuration successful. {0}</value>
|
||||
</data>
|
||||
<data name="SuccessfullyImportedCustomServer" xml:space="preserve">
|
||||
<value>Custom configuration Configuration imported successfully</value>
|
||||
<value>Custom configuration imported successfully</value>
|
||||
</data>
|
||||
<data name="SuccessfullyImportedServerViaClipboard" xml:space="preserve">
|
||||
<value>{0} Configurations have been imported from clipboard</value>
|
||||
@@ -385,7 +385,7 @@
|
||||
<value>All</value>
|
||||
</data>
|
||||
<data name="FillServerAddressCustom" xml:space="preserve">
|
||||
<value>Please browse to import Configuration configuration</value>
|
||||
<value>Please browse to import configuration</value>
|
||||
</data>
|
||||
<data name="Speedtesting" xml:space="preserve">
|
||||
<value>Testing...</value>
|
||||
@@ -1860,4 +1860,4 @@ The "Get Certificate" action may fail if a self-signed certificate is used or if
|
||||
<data name="LvCustomCoreType" xml:space="preserve">
|
||||
<value>Custom config core</value>
|
||||
</data>
|
||||
</root>
|
||||
</root>
|
||||
|
||||
@@ -268,7 +268,7 @@
|
||||
<value>Сначала выберите сервер</value>
|
||||
</data>
|
||||
<data name="RemoveDuplicateServerResult" xml:space="preserve">
|
||||
<value>Дедупликация конфигураций завершена. Было: {0}, Стало: {1}.</value>
|
||||
<value>Дедупликация конфигураций завершена. Было: {0}, Стало: {1}</value>
|
||||
</data>
|
||||
<data name="RemoveServer" xml:space="preserve">
|
||||
<value>Вы уверены, что хотите удалить сервер?</value>
|
||||
@@ -1048,7 +1048,7 @@
|
||||
<value>HTTP-заголовки</value>
|
||||
</data>
|
||||
<data name="TipHttpOutboundHeaders" xml:space="preserve">
|
||||
<value>Пользовательские заголовки исходящего HTTP-запроса. Введите JSON-объект, значения которого — строка или массив строк.</value>
|
||||
<value>Пользовательские заголовки исходящего HTTP-запроса. Введите JSON-объект, значения которого — строка или массив строк</value>
|
||||
</data>
|
||||
<data name="LvPrevProfile" xml:space="preserve">
|
||||
<value>Псевдоним предыдущего прокси</value>
|
||||
@@ -1120,28 +1120,28 @@
|
||||
<value>Длина фрагмента</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentLengthTip" xml:space="preserve">
|
||||
<value>Диапазон размера фрагмента в байтах (например, 50-100). Первое значение не больше второго. Пусто = по умолчанию.</value>
|
||||
<value>Диапазон размера фрагмента в байтах (например, 50-100). Первое значение не больше второго. Пусто = по умолчанию</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentInterval" xml:space="preserve">
|
||||
<value>Интервал фрагментации</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentIntervalTip" xml:space="preserve">
|
||||
<value>Задержка между фрагментами в мс (например, 10-20). Диапазон 1-100. Первое значение не больше второго. Пусто = по умолчанию.</value>
|
||||
<value>Задержка между фрагментами в мс (например, 10-20). Диапазон 1-100. Первое значение не больше второго. Пусто = по умолчанию</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentMaxSplit" xml:space="preserve">
|
||||
<value>Макс. разделение</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentMaxSplitTip" xml:space="preserve">
|
||||
<value>Максимальное число разделений (0 = без лимита, 0-10000). Только для Xray-core. Пусто = по умолчанию.</value>
|
||||
<value>Максимальное число разделений (0 = без лимита, 0-10000). Только для Xray-core. Пусто = по умолчанию</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentFallbackDelay" xml:space="preserve">
|
||||
<value>Резервная задержка</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentFallbackDelayTip" xml:space="preserve">
|
||||
<value>Резервная задержка для TLS-фрагмента. Только для sing-box. Пусто = по умолчанию.</value>
|
||||
<value>Резервная задержка для TLS-фрагмента. Только для sing-box. Пусто = по умолчанию</value>
|
||||
</data>
|
||||
<data name="FillFragmentParameterError" xml:space="preserve">
|
||||
<value>Неверный формат диапазона. Используйте 'from-to' (например, 50-100).</value>
|
||||
<value>Неверный формат диапазона. Используйте 'from-to' (например, 50-100)</value>
|
||||
</data>
|
||||
<data name="TbSettingsEnableCacheFile4Sbox" xml:space="preserve">
|
||||
<value>Включить файл кэша для sing-box (файлы наборов правил)</value>
|
||||
@@ -1351,7 +1351,7 @@
|
||||
<value>Пароль sudo системы</value>
|
||||
</data>
|
||||
<data name="TbSettingsLinuxSudoPasswordTip" xml:space="preserve">
|
||||
<value>Пароль sudo будет проверен в терминале. Если из-за ошибки проверки приложение начнёт работать некорректно, перезапустите его. Пароль не сохраняется — его нужно вводить после каждого перезапуска.</value>
|
||||
<value>Пароль sudo будет проверен в терминале. Если из-за ошибки проверки приложение начнёт работать некорректно, перезапустите его. Пароль не сохраняется — его нужно вводить после каждого перезапуска</value>
|
||||
</data>
|
||||
<data name="TransportHeaderType5" xml:space="preserve">
|
||||
<value>XHTTP-режим</value>
|
||||
@@ -1411,7 +1411,7 @@
|
||||
<value>Можно указать псевдоним из конфигурации, убедитесь, что он существует и уникален</value>
|
||||
</data>
|
||||
<data name="SudoIncorrectPasswordTip" xml:space="preserve">
|
||||
<value>Неверный пароль, попробуйте ещё раз.</value>
|
||||
<value>Неверный пароль, попробуйте ещё раз</value>
|
||||
</data>
|
||||
<data name="TbMldsa65Verify" xml:space="preserve">
|
||||
<value>Mldsa65Verify</value>
|
||||
@@ -1492,7 +1492,7 @@
|
||||
<value>Добавляет только конфигурацию Outbound и Endpoint. Нажмите, чтобы открыть документ</value>
|
||||
</data>
|
||||
<data name="TbFullConfigTemplateDesc" xml:space="preserve">
|
||||
<value>Эта функция предназначена для продвинутых пользователей и особых случаев. После включения игнорируются базовые настройки ядра, DNS и маршрутизации. Вы должны самостоятельно корректно задать порт системного прокси, учёт трафика и другие связанные параметры — всё настраивается вручную.</value>
|
||||
<value>Эта функция предназначена для продвинутых пользователей и особых случаев. После включения игнорируются базовые настройки ядра, DNS и маршрутизации. Вы должны самостоятельно корректно задать порт системного прокси, учёт трафика и другие связанные параметры — всё настраивается вручную</value>
|
||||
</data>
|
||||
<data name="MsgStartParsingSubscription" xml:space="preserve">
|
||||
<value>Начинается разбор и обработка содержимого подписки</value>
|
||||
@@ -1501,7 +1501,7 @@
|
||||
<value>Выбрать профиль</value>
|
||||
</data>
|
||||
<data name="TbFakeIPTips" xml:space="preserve">
|
||||
<value>Applies globally by default, and built-in FakeIP filtering is only built into sing-box.</value>
|
||||
<value>Применяется глобально по умолчанию; встроенная фильтрация FakeIP есть только в sing-box</value>
|
||||
</data>
|
||||
<data name="PleaseAddAtLeastOneServer" xml:space="preserve">
|
||||
<value>Добавьте хотя бы одну конфигурацию</value>
|
||||
@@ -1588,7 +1588,7 @@
|
||||
<value>Привязанный сертификат (заполните любое из полей)
|
||||
При указании сертификат будет привязан, а «Пропустить проверку сертификата» отключится.
|
||||
|
||||
Получение сертификата может завершиться неудачей при использовании самоподписанного сертификата или при наличии ненадёжного / вредоносного ЦС в системе.</value>
|
||||
Получение сертификата может завершиться неудачей при использовании самоподписанного сертификата или при наличии ненадёжного / вредоносного ЦС в системе</value>
|
||||
</data>
|
||||
<data name="TbFetchCert" xml:space="preserve">
|
||||
<value>Получить сертификат</value>
|
||||
@@ -1642,10 +1642,10 @@
|
||||
<value>По умолчанию используется только при разрешении имён в процессе маршрутизации; убедитесь, что удалённый сервер может достичь этого DNS</value>
|
||||
</data>
|
||||
<data name="TbDirectResolveStrategyTips" xml:space="preserve">
|
||||
<value>Если не задано или «AsIs», используется системный DNS; иначе — встроенный DNS-модуль.</value>
|
||||
<value>Если не задано или «AsIs», используется системный DNS; иначе — встроенный DNS-модуль</value>
|
||||
</data>
|
||||
<data name="TbRemoteResolveStrategyTips" xml:space="preserve">
|
||||
<value>Если не задано или «AsIs», разрешение DNS выполняется DNS удалённого сервера; иначе — встроенный DNS-модуль.</value>
|
||||
<value>Если не задано или «AsIs», разрешение DNS выполняется DNS удалённого сервера; иначе — встроенный DNS-модуль</value>
|
||||
</data>
|
||||
<data name="TbHopInt7" xml:space="preserve">
|
||||
<value>Интервал смены портов (Port Hopping)</value>
|
||||
@@ -1660,37 +1660,37 @@
|
||||
<value>Правило маршрутизации {0}, исходящий узел {1}, предупреждение: {2}</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeError" xml:space="preserve">
|
||||
<value>Правило маршрутизации {0}, исходящий узел {1}, ошибка: {2}. Используется только прокси-узел.</value>
|
||||
<value>Правило маршрутизации {0}, исходящий узел {1}, ошибка: {2}. Используется только прокси-узел</value>
|
||||
</data>
|
||||
<data name="MsgGroupCycleDependency" xml:space="preserve">
|
||||
<value>Группа {0} имеет циклическую зависимость на дочерний узел {1}. Узел пропущен.</value>
|
||||
<value>Группа {0} имеет циклическую зависимость на дочерний узел {1}. Узел пропущен</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildNodeWarning" xml:space="preserve">
|
||||
<value>Группа {0}: предупреждение дочернего узла {1}: {2}</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildNodeError" xml:space="preserve">
|
||||
<value>Группа {0}: ошибка дочернего узла {1}: {2}. Узел пропущен.</value>
|
||||
<value>Группа {0}: ошибка дочернего узла {1}: {2}. Узел пропущен</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildGroupNodeWarning" xml:space="preserve">
|
||||
<value>Группа {0}: предупреждение дочернего узла группы {1}: {2}</value>
|
||||
</data>
|
||||
<data name="MsgGroupChildGroupNodeError" xml:space="preserve">
|
||||
<value>Группа {0}: ошибка дочернего узла группы {1}: {2}. Узел пропущен.</value>
|
||||
<value>Группа {0}: ошибка дочернего узла группы {1}: {2}. Узел пропущен</value>
|
||||
</data>
|
||||
<data name="MsgGroupNoValidChildNode" xml:space="preserve">
|
||||
<value>У группы {0} нет допустимых дочерних узлов.</value>
|
||||
<value>У группы {0} нет допустимых дочерних узлов</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleEmptyOutboundTag" xml:space="preserve">
|
||||
<value>У правила маршрутизации {0} пустой исходящий тег. Используется только прокси-узел.</value>
|
||||
<value>У правила маршрутизации {0} пустой исходящий тег. Используется только прокси-узел</value>
|
||||
</data>
|
||||
<data name="MsgRoutingRuleOutboundNodeNotFound" xml:space="preserve">
|
||||
<value>Правило маршрутизации {0}, исходящий узел {1} не найден. Используется только прокси-узел.</value>
|
||||
<value>Правило маршрутизации {0}, исходящий узел {1} не найден. Используется только прокси-узел</value>
|
||||
</data>
|
||||
<data name="MsgSubscriptionPrevProfileNotFound" xml:space="preserve">
|
||||
<value>Предыдущий прокси подписки {0} не найден. Пропущено.</value>
|
||||
<value>Предыдущий прокси подписки {0} не найден. Пропущено</value>
|
||||
</data>
|
||||
<data name="MsgSubscriptionNextProfileNotFound" xml:space="preserve">
|
||||
<value>Следующий прокси подписки {0} не найден. Пропущено.</value>
|
||||
<value>Следующий прокси подписки {0} не найден. Пропущено</value>
|
||||
</data>
|
||||
<data name="menuGenGroupServer" xml:space="preserve">
|
||||
<value>Сгенерировать группу политик</value>
|
||||
@@ -1756,7 +1756,7 @@
|
||||
<value>Привязать интерфейс</value>
|
||||
</data>
|
||||
<data name="TbSettingsBindInterfaceTip" xml:space="preserve">
|
||||
<value>Для среды с несколькими сетевыми интерфейсами укажите имя интерфейса для исходящих подключений. На Linux/macOS работает только при включённом TUN.</value>
|
||||
<value>Для среды с несколькими сетевыми интерфейсами укажите имя интерфейса для исходящих подключений. На Linux/macOS работает только при включённом TUN</value>
|
||||
</data>
|
||||
<data name="TbPreSharedKey" xml:space="preserve">
|
||||
<value>Общий ключ (PSK)</value>
|
||||
@@ -1780,13 +1780,13 @@
|
||||
<value>Доступно обновление</value>
|
||||
</data>
|
||||
<data name="MsgAllowInsecureDeprecated" xml:space="preserve">
|
||||
<value>Предупреждение: 1 августа 2026 г. Xray отключит пропуск проверки сертификата (allowInsecure). Как можно скорее перейдите на привязанный отпечаток сертификата (pinnedPeerCertSha256). После этой даты allowInsecure использовать будет нельзя.</value>
|
||||
<value>Предупреждение: 1 августа 2026 г. Xray отключит пропуск проверки сертификата (allowInsecure). Как можно скорее перейдите на привязанный отпечаток сертификата (pinnedPeerCertSha256). После этой даты allowInsecure использовать будет нельзя</value>
|
||||
</data>
|
||||
<data name="TbRouteExcludeAddress" xml:space="preserve">
|
||||
<value>Адреса, исключаемые из маршрутизации</value>
|
||||
</data>
|
||||
<data name="TbRouteExcludeAddressTip" xml:space="preserve">
|
||||
<value>Разделяйте запятыми (,).</value>
|
||||
<value>Разделяйте запятыми (,)</value>
|
||||
</data>
|
||||
<data name="MsgTunRouteExcludeInvalidAddress" xml:space="preserve">
|
||||
<value>Недопустимый адрес в списке исключений маршрутизации TUN: {0}</value>
|
||||
@@ -1798,22 +1798,22 @@
|
||||
<value>Включить финальную фрагментацию (Final Fragment)</value>
|
||||
</data>
|
||||
<data name="TbEnableFinalFragmentTip" xml:space="preserve">
|
||||
<value>Разбивать конец пакетов на более мелкие фрагменты при отправке. Это может влиять на пропускную способность и задержку.</value>
|
||||
<value>Разбивать конец пакетов на более мелкие фрагменты при отправке. Это может влиять на пропускную способность и задержку</value>
|
||||
</data>
|
||||
<data name="TbEnabletDnsViaProxy" xml:space="preserve">
|
||||
<value>DNS через Bridge</value>
|
||||
</data>
|
||||
<data name="MsgInsecureConfiguration" xml:space="preserve">
|
||||
<value>Обнаружена небезопасная конфигурация: AllowInsecure включён, но сертификат не предоставлен. Это может привести к атаке «человек посередине» (MITM).</value>
|
||||
<value>Обнаружена небезопасная конфигурация: AllowInsecure включён, но сертификат не предоставлен. Это может привести к атаке «человек посередине» (MITM)</value>
|
||||
</data>
|
||||
<data name="TbHy2RealmUrl" xml:space="preserve">
|
||||
<value>Realm URL</value>
|
||||
</data>
|
||||
<data name="InvalidHy2RealmUrl" xml:space="preserve">
|
||||
<value>Некорректный Realm URL.</value>
|
||||
<value>Некорректный Realm URL</value>
|
||||
</data>
|
||||
<data name="InvalidHttpOutboundHeaders" xml:space="preserve">
|
||||
<value>Введите корректный JSON заголовков HTTP-запроса.</value>
|
||||
<value>Введите корректный JSON заголовков HTTP-запроса</value>
|
||||
</data>
|
||||
<data name="TbHy2RealmUrlTip" xml:space="preserve">
|
||||
<value>Формат: realm://<token>@<rendezvous-host>[:port]/<realm-name>?stun=<stun-host>[:port]</value>
|
||||
@@ -1822,12 +1822,42 @@
|
||||
<value>Размер пакета Gecko (мин/макс)</value>
|
||||
</data>
|
||||
<data name="TbLegacyProtectTip" xml:space="preserve">
|
||||
<value>Если включено, используется sing-box TUN; иначе — xray TUN.</value>
|
||||
<value>Если включено, используется sing-box TUN; иначе — xray TUN</value>
|
||||
</data>
|
||||
<data name="TbRootCertificateProvider" xml:space="preserve">
|
||||
<value>Поставщик корневых сертификатов</value>
|
||||
</data>
|
||||
<data name="TbRootCertificateProviderTip" xml:space="preserve">
|
||||
<value>Применяется только к загрузкам и сетевым запросам графического интерфейса v2rayN. Не влияет на проверку сертификатов ядром.</value>
|
||||
<value>Применяется только к загрузкам и сетевым запросам графического интерфейса v2rayN. Не влияет на проверку сертификатов ядром</value>
|
||||
</data>
|
||||
<data name="TbProxyDialResolveStrategy" xml:space="preserve">
|
||||
<value>Стратегия разрешения DNS при подключении к прокси</value>
|
||||
</data>
|
||||
<data name="TbProxyDialResolveStrategyTip" xml:space="preserve">
|
||||
<value>Не рекомендуется; может вызвать петли маршрутизации</value>
|
||||
</data>
|
||||
<data name="TbEnableHappyEyeballs" xml:space="preserve">
|
||||
<value>Включить Happy Eyeballs</value>
|
||||
</data>
|
||||
<data name="TbEnableHappyEyeballsTip" xml:space="preserve">
|
||||
<value>Требуется стратегия UseIP. При включении одновременно устанавливаются соединения по IPv4 и IPv6 и автоматически выбирается более быстрый доступный путь</value>
|
||||
</data>
|
||||
<data name="TbIpv6Address" xml:space="preserve">
|
||||
<value>Адрес IPv6</value>
|
||||
</data>
|
||||
<data name="TbIpv4Address" xml:space="preserve">
|
||||
<value>Адрес IPv4</value>
|
||||
</data>
|
||||
<data name="menuAddCustomOutboundServer" xml:space="preserve">
|
||||
<value>Добавить пользовательский outbound</value>
|
||||
</data>
|
||||
<data name="MsgCustomOutboundFileNotFound" xml:space="preserve">
|
||||
<value>Файл пользовательского outbound {0} не найден: {1}</value>
|
||||
</data>
|
||||
<data name="TbCustomOutboundTip" xml:space="preserve">
|
||||
<value>Для xray/sing-box поддерживается только один outbound/endpoint</value>
|
||||
</data>
|
||||
<data name="LvCustomCoreType" xml:space="preserve">
|
||||
<value>Ядро пользовательской конфигурации</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1849,4 +1849,16 @@
|
||||
<data name="TbIpv4Address" xml:space="preserve">
|
||||
<value>Ipv4 位址</value>
|
||||
</data>
|
||||
</root>
|
||||
<data name="menuAddCustomOutboundServer" xml:space="preserve">
|
||||
<value>新增自訂出站</value>
|
||||
</data>
|
||||
<data name="MsgCustomOutboundFileNotFound" xml:space="preserve">
|
||||
<value>自訂出站 {0} 的檔案未找到:{1}</value>
|
||||
</data>
|
||||
<data name="TbCustomOutboundTip" xml:space="preserve">
|
||||
<value>僅支援 xray/sing-box 的單一 outbound/endpoint</value>
|
||||
</data>
|
||||
<data name="LvCustomCoreType" xml:space="preserve">
|
||||
<value>自訂設定核心</value>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -21,26 +21,27 @@ public partial class CoreConfigSingboxService
|
||||
};
|
||||
_coreConfig.inbounds.Add(inbound);
|
||||
|
||||
var inboundConf = _config.Inbound.First();
|
||||
inbound.listen_port = listenPort;
|
||||
|
||||
if (_config.Inbound.First().SecondLocalPortEnabled)
|
||||
if (inboundConf.SecondLocalPortEnabled)
|
||||
{
|
||||
var inbound2 = BuildInbound(inbound, EInboundProtocol.socks2, true);
|
||||
_coreConfig.inbounds.Add(inbound2);
|
||||
}
|
||||
|
||||
if (_config.Inbound.First().AllowLANConn)
|
||||
if (inboundConf.AllowLANConn)
|
||||
{
|
||||
if (_config.Inbound.First().NewPort4LAN)
|
||||
if (inboundConf.NewPort4LAN)
|
||||
{
|
||||
var inbound3 = BuildInbound(inbound, EInboundProtocol.socks3, true);
|
||||
inbound3.listen = listen;
|
||||
_coreConfig.inbounds.Add(inbound3);
|
||||
|
||||
//auth
|
||||
if (_config.Inbound.First().User.IsNotEmpty() && _config.Inbound.First().Pass.IsNotEmpty())
|
||||
if (inboundConf.User.IsNotEmpty() && inboundConf.Pass.IsNotEmpty())
|
||||
{
|
||||
inbound3.users = new() { new() { username = _config.Inbound.First().User, password = _config.Inbound.First().Pass } };
|
||||
inbound3.users = new() { new() { username = inboundConf.User, password = inboundConf.Pass } };
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
@@ -9,37 +9,38 @@ public partial class CoreConfigV2rayService
|
||||
var listen = "0.0.0.0";
|
||||
var listenPort = AppManager.Instance.GetLocalPort(EInboundProtocol.socks);
|
||||
_coreConfig.inbounds = [];
|
||||
var inbound = BuildInbound(_config.Inbound.First(), EInboundProtocol.socks, true);
|
||||
var inboundConf = _config.Inbound.First();
|
||||
var inbound = BuildInbound(inboundConf, EInboundProtocol.socks, true);
|
||||
var isUsingLocalMixedPort = _node.Address == Global.Loopback && _node.Port == listenPort;
|
||||
|
||||
if (!context.IsTunEnabled || !isUsingLocalMixedPort)
|
||||
{
|
||||
_coreConfig.inbounds.Add(inbound);
|
||||
|
||||
if (_config.Inbound.First().SecondLocalPortEnabled)
|
||||
if (inboundConf.SecondLocalPortEnabled)
|
||||
{
|
||||
var inbound2 = BuildInbound(_config.Inbound.First(), EInboundProtocol.socks2, true);
|
||||
var inbound2 = BuildInbound(inboundConf, EInboundProtocol.socks2, true);
|
||||
_coreConfig.inbounds.Add(inbound2);
|
||||
}
|
||||
|
||||
if (_config.Inbound.First().AllowLANConn)
|
||||
if (inboundConf.AllowLANConn)
|
||||
{
|
||||
if (_config.Inbound.First().NewPort4LAN)
|
||||
if (inboundConf.NewPort4LAN)
|
||||
{
|
||||
var inbound3 = BuildInbound(_config.Inbound.First(), EInboundProtocol.socks3, true);
|
||||
var inbound3 = BuildInbound(inboundConf, EInboundProtocol.socks3, true);
|
||||
inbound3.listen = listen;
|
||||
_coreConfig.inbounds.Add(inbound3);
|
||||
|
||||
// auth
|
||||
if (_config.Inbound.First().User.IsNotEmpty() && _config.Inbound.First().Pass.IsNotEmpty())
|
||||
if (inboundConf.User.IsNotEmpty() && inboundConf.Pass.IsNotEmpty())
|
||||
{
|
||||
inbound3.settings.auth = "password";
|
||||
inbound3.settings.accounts =
|
||||
[
|
||||
new()
|
||||
{
|
||||
user = _config.Inbound.First().User,
|
||||
pass = _config.Inbound.First().Pass,
|
||||
user = inboundConf.User,
|
||||
pass = inboundConf.Pass,
|
||||
},
|
||||
|
||||
];
|
||||
@@ -73,14 +74,14 @@ public partial class CoreConfigV2rayService
|
||||
tunInbound.settings.gateway.Add(address6);
|
||||
tunInbound.settings.autoSystemRoutingTable.Add("::/0");
|
||||
}
|
||||
|
||||
|
||||
var bindInterface = _config.CoreBasicItem.BindInterface?.TrimEx();
|
||||
if (!bindInterface.IsNullOrEmpty())
|
||||
{
|
||||
tunInbound.settings.autoOutboundsInterface = bindInterface;
|
||||
}
|
||||
tunInbound.sniffing = inbound.sniffing;
|
||||
tunInbound.sniffing.routeOnly = true;
|
||||
tunInbound.sniffing.routeOnly = inbound.sniffing.routeOnly;
|
||||
|
||||
if (_config.TunModeItem.RouteExcludeAddress is { Count: > 0 })
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user