├── .github ├── WinDivert.dll ├── WinDivert64.sys ├── ISSUE_TEMPLATE │ ├── feature-request-功能请求.md │ └── bug-report-错误报告.md └── workflows │ ├── build-macos.yml │ ├── build-windows.yml │ ├── build-linux.yml │ └── build-release.yml ├── Assets ├── Icons │ ├── Icon.icns │ ├── icon.ico │ └── icon.png ├── MapPages │ └── openStreetMap.html └── Scripts │ ├── baiduMap.js │ ├── googleMap.js │ └── openStreetMap.js ├── opentrace.desktop ├── UI ├── Forms │ ├── TextOutputForm.xeto │ ├── TextOutputForm.xeto.cs │ ├── ExceptionalOutputForm.xeto │ └── ExceptionalOutputForm.xeto.cs └── Dialogs │ ├── PreferencesDialog.xeto.cs │ └── PreferencesDialog.xeto ├── Models ├── TracerouteResult.cs └── TracerouteHop.cs ├── traceroute.sln ├── readme_cn.md ├── Services ├── UpdateService.cs ├── IPDBLoader.cs ├── DnsResolverService.cs ├── PlatformService.cs └── NextTraceWrapper.cs ├── readme.md ├── .gitattributes ├── OpenTrace.csproj ├── Infrastructure └── UserSettings.cs ├── Program.cs ├── .gitignore └── Properties ├── Resources.zh-TW.resx ├── Resources.zh-CN.resx ├── Resources.zh-HK.resx └── Resources.es.resx /.github/WinDivert.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Archeb/opentrace/HEAD/.github/WinDivert.dll -------------------------------------------------------------------------------- /.github/WinDivert64.sys: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Archeb/opentrace/HEAD/.github/WinDivert64.sys -------------------------------------------------------------------------------- /Assets/Icons/Icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Archeb/opentrace/HEAD/Assets/Icons/Icon.icns -------------------------------------------------------------------------------- /Assets/Icons/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Archeb/opentrace/HEAD/Assets/Icons/icon.ico -------------------------------------------------------------------------------- /Assets/Icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Archeb/opentrace/HEAD/Assets/Icons/icon.png -------------------------------------------------------------------------------- /opentrace.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=OpenTrace 3 | Exec=opentrace 4 | Icon=opentrace 5 | Type=Application 6 | Categories=Network; -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature-request-功能请求.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 功能请求 3 | about: Suggest an idea for this project 4 | title: "[Feature Request] " 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe. 您所请求的功能是否和某个问题有关?如果有,请说明** 11 | 12 | 13 | **Describe the solution you'd like 描述您想要的功能** 14 | 15 | 16 | **Describe alternatives you've considered (If applicable) 可能备选方案(如果有)** 17 | 18 | 19 | **Additional context 补充说明** 20 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug-report-错误报告.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 错误报告 3 | about: Create a report to help us improve 4 | title: "[BUG] " 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug 描述你遇到的BUG** 11 | (如果您遇到了 websocket: bad handshake,请[参考这里](https://www.github.com/Archeb/opentrace/issues/44)) 12 | 13 | 14 | **To Reproduce 复现方法** 15 | 16 | 17 | **Screenshots (If applicable) 截图(如果有)** 18 | 19 | 20 | **Environment 使用环境** 21 | - OS 操作系统: 22 | - Version 程序版本: 23 | 24 | **Additional context 补充说明** 25 | -------------------------------------------------------------------------------- /UI/Forms/TextOutputForm.xeto: -------------------------------------------------------------------------------- 1 | 2 | 3 |
12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | -------------------------------------------------------------------------------- /Models/TracerouteResult.cs: -------------------------------------------------------------------------------- 1 | namespace OpenTrace.Models 2 | { 3 | class TracerouteResult 4 | { 5 | public TracerouteResult(string no, string ip, string time, string geolocation, string ASNumber, string hostname, string organization, string latitude, string longitude) 6 | { 7 | No = no; 8 | IP = ip; 9 | Time = time; 10 | Geolocation = geolocation; 11 | AS = ASNumber; 12 | Hostname = hostname; 13 | Organization = organization; 14 | Latitude = latitude; 15 | Longitude = longitude; 16 | } 17 | public string No { get; set; } 18 | public string IP { get; set; } 19 | public string Time { get; set; } 20 | public string Geolocation { get; set; } 21 | public string AS { get; set; } 22 | public string Hostname { get; set; } 23 | public string Organization { get; set; } 24 | public string Latitude { get; set; } 25 | public string Longitude { get; set; } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /UI/Forms/TextOutputForm.xeto.cs: -------------------------------------------------------------------------------- 1 | using Eto.Forms; 2 | using Eto.Serialization.Xaml; 3 | using System; 4 | using System.ComponentModel; 5 | using System.Diagnostics; 6 | 7 | namespace OpenTrace.UI.Forms 8 | { 9 | public partial class TextOutputForm : Form 10 | { 11 | private TextArea OutputContainer; 12 | public TextOutputForm() 13 | { 14 | XamlReader.Load(this); 15 | OutputContainer = this.FindChild 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /Assets/MapPages/openStreetMap.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | OpenTrace Map 7 | 10 | 13 | 21 | 22 | 23 |
24 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /UI/Forms/ExceptionalOutputForm.xeto.cs: -------------------------------------------------------------------------------- 1 | using Eto.Forms; 2 | using Eto.Serialization.Xaml; 3 | using System; 4 | using System.ComponentModel; 5 | using System.Diagnostics; 6 | 7 | namespace OpenTrace.UI.Forms 8 | { 9 | public partial class ExceptionalOutputForm : Form 10 | { 11 | private TextArea OutputContainer; 12 | public ExceptionalOutputForm() 13 | { 14 | XamlReader.Load(this); 15 | OutputContainer = this.FindChild 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | -------------------------------------------------------------------------------- /Services/NextTraceWrapper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.ObjectModel; 3 | using System.Diagnostics; 4 | using System.Text; 5 | using System.Text.RegularExpressions; 6 | using System.Threading.Tasks; 7 | using System.IO; 8 | using Resources = OpenTrace.Properties.Resources; 9 | using OpenTrace.Properties; 10 | using System.Collections.Generic; 11 | using OpenTrace.Models; 12 | using OpenTrace.Infrastructure; 13 | using System.Runtime.InteropServices; 14 | using System.Linq; 15 | 16 | namespace OpenTrace.Services 17 | { 18 | class ExceptionalOutputEventArgs : EventArgs 19 | { 20 | public bool IsErrorOutput { get; set; } 21 | public string Output { get; set; } 22 | public ExceptionalOutputEventArgs(bool isErrorOutput, string output) 23 | { 24 | IsErrorOutput = isErrorOutput; 25 | Output = output; 26 | } 27 | } 28 | class AppQuitEventArgs : EventArgs 29 | { 30 | public int ExitCode { get; set; } 31 | public AppQuitEventArgs(int exitCode) 32 | { 33 | ExitCode = exitCode; 34 | } 35 | } 36 | enum AppStatus 37 | { 38 | Init, 39 | Start, 40 | Quit 41 | } 42 | internal class NextTraceWrapper 43 | { 44 | private Process _process; 45 | public AppStatus Status { get; set; } = AppStatus.Init; 46 | public event EventHandler AppStart; 47 | public event EventHandler AppQuit; 48 | public event EventHandler ExceptionalOutput; 49 | private string nexttracePath; 50 | private bool builtinNT = false; 51 | private int errorOutputCount = 0; 52 | public ObservableCollection Output { get; } = new ObservableCollection(); 53 | 54 | public NextTraceWrapper() 55 | { 56 | string curDir = AppDomain.CurrentDomain.BaseDirectory; 57 | if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) 58 | { 59 | // 检查 Windows 平台可执行文件 60 | List winBinaryList = new List { "nexttrace.exe", "nexttrace_windows_amd64.exe", "nexttrace_windows_arm64.exe", "nexttrace_windows_armv7.exe", "nexttrace_windows_386.exe" }; 61 | foreach (string winBinaryName in winBinaryList) 62 | { 63 | if (File.Exists(Path.Combine(curDir, winBinaryName))) 64 | { 65 | // 先检查根目录 66 | nexttracePath = Path.Combine(curDir, winBinaryName); 67 | break; 68 | } 69 | // 再检查PATH变量 70 | string pathVar = Environment.GetEnvironmentVariable("PATH"); 71 | string[] pathDirs = pathVar.Split(Path.PathSeparator); 72 | foreach (string pathDir in pathDirs) 73 | { 74 | if (File.Exists(Path.Combine(pathDir, winBinaryName))) 75 | { 76 | nexttracePath = Path.Combine(pathDir, winBinaryName); 77 | break; 78 | } 79 | } 80 | if (nexttracePath != null) break; 81 | } 82 | } 83 | else 84 | { 85 | // 检查其他平台可执行文件 86 | List otherBinaryList = new List { "nexttrace", "nexttrace_android_arm64", "nexttrace_darwin_amd64", "nexttrace_darwin_arm64", "nexttrace_dragonfly_amd64", "nexttrace_freebsd_386", "nexttrace_freebsd_amd64", "nexttrace_freebsd_arm64", "nexttrace_freebsd_armv7", "nexttrace_linux_386", "nexttrace_linux_amd64", "nexttrace_linux_arm64", "nexttrace_linux_armv5", "nexttrace_linux_armv6", "nexttrace_linux_armv7", "nexttrace_linux_mips", "nexttrace_linux_mips64", "nexttrace_linux_mips64le", "nexttrace_linux_mipsle", "nexttrace_linux_ppc64", "nexttrace_linux_ppc64le", "nexttrace_linux_riscv64", "nexttrace_linux_s390x", "nexttrace_openbsd_386", "nexttrace_openbsd_amd64", "nexttrace_openbsd_arm64", "nexttrace_openbsd_armv7" }; 87 | foreach (string otherBinaryName in otherBinaryList) 88 | { 89 | if (File.Exists(Path.Combine(curDir, "OpenTrace.app/Contents/MacOS", otherBinaryName))) 90 | { 91 | nexttracePath = Path.Combine(curDir, "OpenTrace.app/Contents/MacOS", otherBinaryName); 92 | builtinNT = true; 93 | break; 94 | } 95 | if (File.Exists(Path.Combine(curDir, otherBinaryName))) 96 | { 97 | nexttracePath = Path.Combine(curDir, otherBinaryName); 98 | builtinNT = true; 99 | break; 100 | } 101 | 102 | string pathVar = Environment.GetEnvironmentVariable("PATH"); 103 | string[] pathDirs = pathVar.Split(Path.PathSeparator); 104 | foreach (string pathDir in pathDirs) 105 | { 106 | if (File.Exists(Path.Combine(pathDir, otherBinaryName))) 107 | { 108 | nexttracePath = Path.Combine(pathDir, otherBinaryName); 109 | break; 110 | } 111 | } 112 | if (nexttracePath != null) break; 113 | } 114 | } 115 | 116 | // 检查是否手动指定了可执行文件 117 | if (UserSettings.executablePath != "") 118 | { 119 | if (File.Exists(UserSettings.executablePath)) 120 | { 121 | nexttracePath = UserSettings.executablePath; 122 | } 123 | else 124 | { 125 | throw new IOException(UserSettings.executablePath); 126 | } 127 | } 128 | // 未能找到可执行文件 129 | if (nexttracePath == null) 130 | { 131 | throw new FileNotFoundException("nexttrace.exe not found in any location"); 132 | } 133 | } 134 | 135 | public void Run(string host, bool MTRMode, params string[] extraArgs) 136 | { 137 | Task.Run(() => 138 | { 139 | Console.WriteLine($"Using NextTrace: {nexttracePath}"); 140 | string arguments; 141 | if (MTRMode) 142 | { 143 | arguments = ArgumentBuilder(host, extraArgs.Concat(new string[] { "--queries 1" }).ToArray(), new string[] { "queries" }); 144 | } 145 | else 146 | { 147 | arguments = ArgumentBuilder(host, extraArgs); 148 | } 149 | 150 | #if NET8_0_OR_GREATER 151 | if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) && 152 | Array.Find(extraArgs, e => e == "-T" || e == "-U") != null && 153 | Environment.UserName != "root") 154 | { 155 | FileSystemInfo fa = new FileInfo(nexttracePath); 156 | if ((fa.UnixFileMode & UnixFileMode.SetUser) == 0) 157 | { 158 | if (!builtinNT) 159 | App.app.Invoke(() => { 160 | Eto.Forms.MessageBox.Show(Resources.MISSING_COMP_PRIV_MACOS); 161 | }); 162 | else 163 | { 164 | var elvp = new Process 165 | { 166 | StartInfo = new ProcessStartInfo 167 | { 168 | FileName = "/usr/bin/osascript", 169 | ArgumentList = { 170 | "-e", 171 | $"do shell script \"chown root:admin '{nexttracePath}' && chmod +sx '{nexttracePath}'\" with administrator privileges with prompt \"{Resources.MISSING_PRIV_MACOS}\"", 172 | }, 173 | UseShellExecute = false, 174 | RedirectStandardOutput = false, 175 | RedirectStandardError = false, 176 | CreateNoWindow = true 177 | } 178 | }; 179 | elvp.Start(); 180 | elvp.WaitForExit(); 181 | } 182 | Status = AppStatus.Quit; 183 | AppQuit?.Invoke(this, new AppQuitEventArgs(0)); 184 | return; 185 | } 186 | } 187 | #endif 188 | _process = new Process 189 | { 190 | StartInfo = new ProcessStartInfo 191 | { 192 | FileName = nexttracePath, 193 | Arguments = arguments, 194 | UseShellExecute = false, 195 | StandardOutputEncoding = Encoding.GetEncoding(65001), 196 | RedirectStandardOutput = true, 197 | RedirectStandardError = true, 198 | CreateNoWindow = true 199 | } 200 | }; 201 | 202 | if (UserSettings.IPInsightToken != "") _process.StartInfo.EnvironmentVariables.Add("NEXTTRACE_IPINSIGHT_TOKEN", UserSettings.IPInsightToken); 203 | if (UserSettings.IPInfoToken != "") _process.StartInfo.EnvironmentVariables.Add("NEXTTRACE_IPINFO_TOKEN", UserSettings.IPInfoToken); 204 | if (UserSettings.ChunZhenEndpoint != "") _process.StartInfo.EnvironmentVariables.Add("NEXTTRACE_CHUNZHENURL", UserSettings.ChunZhenEndpoint); 205 | if (UserSettings.LeoMoeAPI_HOSTPORT != "") _process.StartInfo.EnvironmentVariables.Add("NEXTTRACE_HOSTPORT", UserSettings.LeoMoeAPI_HOSTPORT); 206 | if (UserSettings.NextTraceProxy != "") _process.StartInfo.EnvironmentVariables.Add("NEXTTRACE_PROXY", UserSettings.NextTraceProxy); 207 | if (UserSettings.POWProvider != "") _process.StartInfo.EnvironmentVariables.Add("NEXTTRACE_POWPROVIDER", UserSettings.POWProvider); 208 | if (UserSettings.IPAPI_Base != "") _process.StartInfo.EnvironmentVariables.Add("NEXTTRACE_IPAPI_BASE", UserSettings.IPAPI_Base); 209 | 210 | if (MTRMode) // 添加环境变量让NextTrace进入持续追踪模式 211 | _process.StartInfo.EnvironmentVariables.Add("NEXTTRACE_UNINTERRUPTED", "1"); 212 | 213 | Regex match1stLine = new Regex(@"^\d{1,2}\|"); 214 | _process.OutputDataReceived += (sender, e) => 215 | { 216 | if (e.Data != null) 217 | { 218 | // Debug.Print(e.Data); 219 | // 去除输出中的控制字符 220 | Regex formatCleanup = new Regex(@"(\x9B|\x1B\[)[0-?]*[ -\/]*[@-~]"); 221 | string line = formatCleanup.Replace(e.Data, ""); 222 | 223 | Match match1 = match1stLine.Match(line); 224 | if (match1.Success) 225 | { 226 | Output.Add(ProcessLine(line)); 227 | } 228 | else 229 | { 230 | if (line.StartsWith("NextTrace ")) return; 231 | if (line.StartsWith("traceroute to ")) return; 232 | if (line.StartsWith("IP Geo Data Provider")) return; 233 | if (line.StartsWith("[NextTrace API]")) return; 234 | ExceptionalOutput?.Invoke(this, new ExceptionalOutputEventArgs(false, line)); 235 | if (errorOutputCount < 100) 236 | { 237 | errorOutputCount++; 238 | } 239 | else 240 | { 241 | Kill(); // 错误输出过多,强制结束 242 | } 243 | } 244 | } 245 | }; 246 | _process.ErrorDataReceived += (sender, e) => 247 | { 248 | if (e.Data != null) 249 | { 250 | //Debug.Print(e.Data); 251 | ExceptionalOutput?.Invoke(this, new ExceptionalOutputEventArgs(true, e.Data)); 252 | if (errorOutputCount < 100) 253 | { 254 | errorOutputCount++; 255 | } 256 | else 257 | { 258 | Kill(); // 错误输出过多,强制结束 259 | } 260 | } 261 | }; 262 | _process.Exited += (sender, e) => 263 | { 264 | Debug.Print("Exited"); 265 | Status = AppStatus.Quit; 266 | AppQuit?.Invoke(this, new AppQuitEventArgs(_process.ExitCode)); 267 | }; 268 | _process.EnableRaisingEvents = true; 269 | _process.Start(); 270 | _process.BeginOutputReadLine(); 271 | _process.BeginErrorReadLine(); 272 | Status = AppStatus.Start; 273 | AppStart?.Invoke(this, null); 274 | }); 275 | } 276 | private TracerouteResult ProcessLine(string line) 277 | { 278 | string No = ""; 279 | string IP = "*"; 280 | string Time = ""; 281 | string Geolocation = ""; 282 | string AS = ""; 283 | string Hostname = ""; 284 | string Organization = ""; 285 | string Latitude = ""; 286 | string Longitude = ""; 287 | string[] LineData = line.Split('|'); 288 | if (LineData.Length > 7) 289 | { 290 | No = LineData[0]; 291 | if (LineData[1] == "*") 292 | { 293 | Time = "*"; 294 | } 295 | else 296 | { 297 | IP = LineData[1]; 298 | Time = LineData[3]; 299 | Geolocation = LineData[5] + " " + LineData[6] + " " + LineData[7] + " " + LineData[8]; 300 | AS = LineData[4]; 301 | Hostname = LineData[2]; 302 | Organization = LineData[9]; 303 | Latitude = LineData[10]; 304 | Longitude = LineData[11]; 305 | } 306 | } 307 | 308 | // 匹配特定网络地址 309 | if (new Regex(@"^((127\.)|(192\.168\.)|(10\.)|(172\.1[6-9]\.)|(172\.2[0-9]\.)|(172\.3[0-1]\.)|(::1$)|([fF][cCdD]))").IsMatch(IP)) 310 | { 311 | Geolocation = Resources.PRIVATE_ADDR; 312 | } 313 | if (new Regex(@"^((100\.6[4-9]\.)|(100\.[7-9][0-9]\.)|(100\.1[0-1][0-9]\.)|(100\.12[0-7]\.))").IsMatch(IP)) 314 | { 315 | Geolocation = Resources.SHARED_ADDR; 316 | } 317 | if (new Regex(@"^169\.254\.").IsMatch(IP)) 318 | { 319 | Geolocation = Resources.LINKLOCAL_ADDR; 320 | } 321 | if (new Regex(@"^127\.").IsMatch(IP)) 322 | { 323 | Geolocation = Resources.LOOPBACK_ADDR; 324 | } 325 | 326 | // 打码 IP 地址 327 | // maskedHopsMode 设置包含 ip_half, ip_full, ip_geo, all 四种打码模式 328 | // maskedHops 指示打码的跳数 329 | 330 | 331 | if (UserSettings.maskedHops > 0 && int.Parse(No) <= UserSettings.maskedHops) 332 | { 333 | if (UserSettings.maskedHopsMode == "ip_half") 334 | { 335 | if (IP.Contains(":")) 336 | { 337 | // IPv6 全部打码 338 | IP = "****"; 339 | } 340 | else if (IP.Contains(".")) 341 | { 342 | // IPv4 打码后 2 节 343 | IP = string.Join(".", IP.Split('.').Take(2).Concat(new string[] { "xx", "xx" })); 344 | } 345 | // 删除主机名 346 | Hostname = ""; 347 | } 348 | else if (UserSettings.maskedHopsMode == "ip_full") 349 | { 350 | IP = "****"; 351 | // 删除主机名 352 | Hostname = ""; 353 | } 354 | else if (UserSettings.maskedHopsMode == "ip_geo") 355 | { 356 | IP = "****"; 357 | Geolocation = "****"; 358 | // 删除主机名 359 | Hostname = ""; 360 | } 361 | else if (UserSettings.maskedHopsMode == "all") 362 | { 363 | IP = "****"; 364 | Geolocation = "****"; 365 | AS = "****"; 366 | Hostname = ""; 367 | Organization = "****"; 368 | Latitude = "****"; 369 | Longitude = "****"; 370 | } 371 | } 372 | 373 | 374 | return new TracerouteResult(No, IP, Time, Geolocation, AS, Hostname, Organization, Latitude, Longitude); 375 | } 376 | private string ArgumentBuilder(string host, string[] extraArgs, string[] ignoreUserArgs = null) 377 | { 378 | List finalArgs = new List(); 379 | finalArgs.Add(host); 380 | finalArgs.Add("--raw"); 381 | finalArgs.Add("--map"); 382 | var checkArgsFromConfList = new List { "queries", "port", "parallel_requests", "max_hops", "first", "send_time", "ttl_time", "source", "dev" }; 383 | 384 | UserSettings userSettings = new UserSettings(); 385 | foreach (var setting in userSettings.GetType().GetProperties()) 386 | { 387 | if (checkArgsFromConfList.Contains(setting.Name) && (ignoreUserArgs == null || !ignoreUserArgs.Contains(setting.Name))) 388 | { 389 | if ((string)setting.GetValue(userSettings, null) != "") 390 | finalArgs.Add("--" + setting.Name.Replace('_', '-') + " " + (string)setting.GetValue(userSettings, null)); 391 | } 392 | } 393 | if (UserSettings.rdns_mode == "disable") finalArgs.Add("-n"); 394 | if (UserSettings.rdns_mode == "always") finalArgs.Add("-a"); 395 | finalArgs.Add(System.Globalization.CultureInfo.CurrentUICulture.Name.StartsWith("zh") ? "--language cn" : "--language en"); 396 | finalArgs.Add(UserSettings.arguments); 397 | finalArgs.AddRange(extraArgs); 398 | Debug.Print(String.Join(" ", finalArgs)); 399 | return String.Join(" ", finalArgs); 400 | } 401 | public void Kill() 402 | { 403 | try 404 | { 405 | if (_process != null && !_process.HasExited) 406 | _process.Kill(); 407 | } 408 | catch (Exception ex) 409 | { 410 | Debug.Print(ex.Message); 411 | } 412 | } 413 | 414 | // 验证IP有效性,返回处理后的IP(如把IPv6转为缩写形式等)IP无效则返回null。 415 | private string ValidateIP(string IP) 416 | { 417 | return null; 418 | } 419 | } 420 | } 421 | -------------------------------------------------------------------------------- /Properties/Resources.zh-TW.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 關於 122 | 123 | 124 | 附加引數 125 | 126 | 127 | OpenTrace 128 | 129 | 130 | NextTrace需要型態3和11的ICMP封包來建立完整追蹤路徑。Windows 系統防火牆預設阻擋相關封包,以致只有最後一個節點會被顯示。 131 | 132 | 您希望NextTrace幫您增加防火牆例外規則以利運行嗎? 133 | 134 | 若要獲得更多資訊,請參考 https://github.com/nxtrace/Ntrace-core/issues/52 135 | 136 | 137 | (留空自動檢測) 138 | 139 | 140 | 平均延遲 141 | 142 | 143 | 最佳延遲 144 | 145 | 146 | 取消 147 | 148 | 149 | 純真 API 端點 150 | 151 | 152 | 關閉 153 | 154 | 155 | 把地理位置和組織資訊合為一欄 156 | 157 | 158 | 拷貝 159 | 160 | 161 | 複製所有結果 162 | 163 | 164 | 自訂 DNS 解析器 165 | (支援 UDP / DoH) 166 | 167 | 168 | 停用地理位置 169 | 170 | 171 | 目標埠 / 初始序號 172 | 173 | 174 | 主機或 IP 不能為空 175 | 176 | 177 | 使用本地 Ip2region 資料庫 (ip2region.db) 178 | 179 | 180 | 使用本地 IPInfo 資料庫 (ipinfoLocal.mmdb) 181 | 182 | 183 | 錯誤訊息 184 | 185 | 186 | 儲存設定時出錯 187 | 188 | 189 | NextTrace 程式異常退出,請參考錯誤訊息以瞭解更多資訊並及時向我們報告此問題。 退出程式碼: 190 | 191 | 192 | NextTrace 產生了一個或多個異常輸出,請檢查下面的輸出資訊以排查問題。 您可以參考 NextTrace Wiki 來查看是否已經有解答;如未能找到答案,請向我們報告。 193 | 194 | 195 | 報告問題 196 | 197 | 198 | 異常輸出 199 | 200 | 201 | 可執行檔案路徑 202 | 203 | 204 | 匯出 205 | 206 | 207 | 匯出為 208 | 209 | 210 | 新增防火牆規則失敗 211 | 212 | 213 | 檔案 214 | 215 | 216 | 首個躍點 217 | 218 | 219 | 常規設定 220 | 221 | 222 | 地理位置 223 | 224 | 225 | 226 | 227 | 228 | 229 | 表格高度占比 230 | 231 | 232 | 幫助 233 | 234 | 235 | 不再提示新增防火牆規則 236 | 237 | 238 | 隱藏地圖上的資訊視窗 239 | 240 | 241 | 歷史記錄 242 | 243 | 244 | 主機名 245 | 246 | 247 | IPInfo Token (可選) 248 | 249 | 250 | IP 地理位置資料來源 251 | 252 | 253 | 語言 (Language) 254 | 255 | 256 | 當前延遲 257 | 258 | 259 | LeoMoeAPI 反代地址 260 | 261 | 262 | 鏈路本地地址 263 | 264 | 265 | 本地 MMDB 266 | 267 | 268 | 地理位置模板 269 | 270 | 271 | ASN 模板 272 | 273 | 274 | 主機名模板 275 | 276 | 277 | 緯度模板 278 | 279 | 280 | 經度模板 281 | 282 | 283 | 組織模板 284 | 285 | 286 | 本地 MMDB 路徑 287 | 288 | 289 | 預設配置 290 | 291 | 292 | 預覽 MMDB 293 | 294 | 295 | 預覽 IP 296 | 297 | 298 | 選擇 MMDB 檔案 299 | 300 | 301 | 此功能用本地 MMDB 查詢的結果覆蓋原查詢結果 302 | 留空以避免覆寫對應欄位 303 | 模板舉例: {.country}-{.city} 304 | 305 | 306 | 本地迴環地址 307 | 308 | 309 | 丟包率% 310 | 311 | 312 | 地圖資料來源 313 | 314 | 315 | 百度地圖 316 | 317 | 318 | Google地圖 319 | 320 | 321 | OpenStreetMap 322 | 323 | 324 | 最大躍點 325 | 326 | 327 | 元件缺失 328 | 329 | 330 | OpenTrace 需要 NextTrace 才能正常工作,但未能找到可執行檔案。 331 | 您可以把 NextTrace 可執行檔案放置於: 332 | 1. 與 OpenTrace 同一目錄下 333 | 或 334 | 2. PATH 環境變數中的目錄下 335 | 336 | 是否現在下載 NextTrace? 337 | 338 | 339 | OpenTrace 需要 NextTrace 才能正常工作,但未能找到可執行檔案。 340 | 請下載 NextTrace 並設定好權限: 341 | 342 | sudo xattr -r -d com.apple.quarantine /path/to/nexttrace 343 | sudo chown root:admin /path/to/nexttrace 344 | sudo chmod +sx /path/to/nexttrace 345 | 346 | 然後在設定中指定 NextTrace 路徑。 347 | 348 | 是否現在下載 NextTrace? 349 | 350 | 351 | OpenTrace 需要權限才能進行 TCP/UDP 追蹤。 352 | 請為 NextTrace 設定權限: 353 | 354 | sudo xattr -r -d com.apple.quarantine /path/to/nexttrace 355 | sudo chown root:admin /path/to/nexttrace 356 | sudo chmod +sx /path/to/nexttrace 357 | 358 | 359 | OpenTrace 需要權限才能進行 TCP/UDP 追蹤 360 | 361 | 362 | 未能在指定的位置 "{0}" 中找到 NextTrace。 363 | 364 | 365 | MTR 模式 366 | 367 | 368 | 找不到主機 {0}。請檢查該名稱,然後重試。 369 | 370 | 371 | 新建 372 | 373 | 374 | 開啟一個新的 OpenTrace 視窗 375 | 376 | 377 | Proxy 設定 378 | 379 | 380 | 反向 DNS 尋找模式 381 | 382 | 383 | 組織 384 | 385 | 386 | 有些數據源只有在設定 API 端點 / Token 後才能選擇; 387 | 要使用離線資料庫,請參閱 NextTrace 文件進行設定。 388 | 389 | 390 | 分組請求間隔 391 | 392 | 393 | 請求間隔 394 | 395 | 396 | 並行請求數 397 | 398 | 399 | LeoMoeAPI PoW 伺服器 400 | 401 | 402 | api.leo.moe (預設) 403 | 404 | 405 | Nya Labs (中國大陸最佳化) 406 | 407 | 408 | 設定 409 | 410 | 411 | 私有地址(區域網) 412 | 413 | 414 | Traceroute 使用的協議 415 | 416 | 417 | 每躍點探測次數 418 | 419 | 420 | 退出 421 | 422 | 423 | 接收數 424 | 425 | 426 | 部分設定需重啟應用才能生效 427 | 428 | 429 | 儲存 430 | 431 | 432 | 選擇一個 IP 433 | 434 | 435 | 請從下拉選單中選擇一個 IP 436 | 437 | 438 | 已傳送 439 | 440 | 441 | 共享地址 442 | 443 | 444 | 源地址 445 | 446 | 447 | 源介面 448 | 449 | 450 | 開始 451 | 452 | 453 | 標準差 454 | 455 | 456 | 停止 457 | 458 | 459 | 系統 DNS 460 | 461 | 462 | 時間(ms) 463 | 464 | 465 | 保留延遲顯示到整數位 466 | 467 | 468 | 路由追蹤 469 | 470 | 471 | TCP/UDP 模式要求 472 | 473 | 474 | 在 Windows 系統上執行 TCP/UDP Traceroute 需要管理員權限。您是否要以管理員權限重新啟動 OpenTrace? 475 | 476 | 477 | • 未安裝 Npcap 478 | 479 | 480 | • 未找到 WinDivert (應放在和 NextTrace 可執行文件同一目錄) 481 | 482 | 483 | 在 Windows 上使用 TCP/UDP Traceroute 需要滿足以下條件: 484 | 485 | {0} 486 | 487 | 點擊 [是] 直接嘗試執行 NextTrace(並不再提示)。 488 | 點擊 [否] 下載缺失元件 489 | 490 | 491 | ✓ Npcap 已安裝 492 | 493 | 494 | ✓ WinDivert 可用 495 | 496 | 497 | 以系統管理員身份重新執行 498 | 499 | 500 | 最大延遲 501 | 502 | 503 | OpenTrace 被 macOS 隔離,工作可能不完全正常。 504 | 請開啟終端,使用下面的命令釋放 OpenTrace: 505 | 506 | sudo xattr -r -d com.apple.quarantine <將 OpenTrace 拖放至此> 507 | 508 | 並在完成釋放後重啟 OpenTrace. 509 | 510 | 511 | 項目首頁 512 | 513 | 514 | 嘗試擷取完整 rDNS 515 | 516 | 517 | 快速 rDNS(預設) 518 | 519 | 520 | 停用 rDNS 查詢 521 | 522 | 523 | 啟動時檢查更新 524 | 525 | 526 | 下載最新版 OpenTrace 527 | 528 | 529 | (最新版 {0} 已釋出,可到幫助選單下載) 530 | 531 | 532 | 隱私保護 533 | 534 | 535 | 跳的所有訊息 536 | 537 | 538 | 隱藏前 539 | 540 | 541 | 跳的完整 IP 542 | 543 | 544 | 跳的 IP 與地理位置 545 | 546 | 547 | 跳的部分 IP 548 | 549 | 550 | 自動選擇 IP 551 | 552 | 553 | 手動選擇 554 | 555 | 556 | 自動選擇第一個 IPv4 (如果可用) 557 | 558 | 559 | 自動選擇第一個 IPv6 (如果可用) 560 | 561 | -------------------------------------------------------------------------------- /Properties/Resources.zh-CN.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 关于 122 | 123 | 124 | 附加参数 125 | 126 | 127 | OpenTrace 128 | 129 | 130 | NextTrace 需要接收特殊的 ICMP 响应报文来构建完整的 traceroute 信息;但默认情况下,Windows 防火墙会拦截此类消息,导致您只能看到 traceroute 的最后一跳。 131 | 132 | 您可以点击“是”来自动添加防火墙规则,也可以点“否”取消这一操作。 133 | 134 | 若要获得更多信息,请参考 https://github.com/nxtrace/Ntrace-core/issues/52 135 | 136 | 137 | (留空自动检测) 138 | 139 | 140 | 平均延迟 141 | 142 | 143 | 144 | 145 | 146 | 147 | 最佳延迟 148 | 149 | 150 | 取消 151 | 152 | 153 | 纯真 API 端点 154 | 155 | 156 | 关闭 157 | 158 | 159 | 把地理位置和组织信息合为一栏 160 | 161 | 162 | 复制 163 | 164 | 165 | 复制所有结果 166 | 167 | 168 | 自定义DNS服务器 169 | (支持 UDP / DoH) 170 | 171 | 172 | 禁用地理位置 173 | 174 | 175 | 目标端口 / 初始序号 176 | 177 | 178 | 主机或 IP 不能为空 179 | 180 | 181 | 启用 Ip2region 离线库 (ip2region.db) 182 | 183 | 184 | 启用 IPInfo 离线库 (ipinfoLocal.mmdb) 185 | 186 | 187 | 错误消息 188 | 189 | 190 | 保存设置时出错 191 | 192 | 193 | NextTrace 进程异常退出,请参考错误消息以了解更多信息并及时向我们报告此问题。 退出代码: 194 | 195 | 196 | NextTrace 产生了一个或多个异常输出,请检查下面的输出信息以排查问题。您可以参考 NextTrace Wiki 来查看是否已经有解答;如未能找到答案,请向我们报告。 197 | 198 | 199 | 报告问题 200 | 201 | 202 | 异常输出 203 | 204 | 205 | 可执行文件路径 206 | 207 | 208 | 导出 209 | 210 | 211 | 导出为 212 | 213 | 214 | 添加防火墙规则失败 215 | 216 | 217 | 文件 218 | 219 | 220 | 首个跃点 221 | 222 | 223 | 常规设置 224 | 225 | 226 | 地理位置 227 | 228 | 229 | 表格高度占比 230 | 231 | 232 | 帮助 233 | 234 | 235 | 不再提示添加防火墙规则 236 | 237 | 238 | 隐藏地图上的信息窗口 239 | 240 | 241 | 历史记录 242 | 243 | 244 | 主机名 245 | 246 | 247 | IPInfo Token (可选) 248 | 249 | 250 | IP 地理位置数据源 251 | 252 | 253 | 语言 (Language) 254 | 255 | 256 | 当前延迟 257 | 258 | 259 | LeoMoeAPI 反代地址 260 | 261 | 262 | 链路本地地址 263 | 264 | 265 | 本地 MMDB 覆写 266 | 267 | 268 | 地理位置模板 269 | 270 | 271 | ASN 模板 272 | 273 | 274 | 主机名模板 275 | 276 | 277 | 纬度模板 278 | 279 | 280 | 经度模板 281 | 282 | 283 | 组织模板 284 | 285 | 286 | 本地 MMDB 路径 287 | 288 | 289 | 预设配置 290 | 291 | 292 | 预览 MMDB 293 | 294 | 295 | 预览 IP 296 | 297 | 298 | 选择 MMDB 文件 299 | 300 | 301 | 此功能用本地 MMDB 查询的结果覆盖原查询结果 302 | 留空以避免覆写对应字段 303 | 模板举例: {.country}-{.city} 304 | 305 | 306 | 307 | 本地回环地址 308 | 309 | 310 | 丢包率% 311 | 312 | 313 | 地图数据源 314 | 315 | 316 | 百度地图 317 | 318 | 319 | 谷歌地图 320 | 321 | 322 | OpenStreetMap 323 | 324 | 325 | 最大跃点 326 | 327 | 328 | 组件缺失 329 | 330 | 331 | OpenTrace 需要 NextTrace 才能正常工作,但未能找到可执行文件。 332 | 您可以把 NextTrace 可执行文件放置于: 333 | 1. 与 OpenTrace 同一目录下 334 | 或 335 | 2. PATH 环境变量中的目录下 336 | 337 | 是否现在下载 NextTrace? 338 | 339 | 340 | OpenTrace 需要 NextTrace 才能正常工作,但未能找到可执行文件。 341 | 请下载 NextTrace 并设置好权限: 342 | 343 | sudo xattr -r -d com.apple.quarantine /path/to/nexttrace 344 | sudo chown root:admin /path/to/nexttrace 345 | sudo chmod +sx /path/to/nexttrace 346 | 347 | 然后在设置中指定 NextTrace 路径。 348 | 349 | 是否现在下载 NextTrace? 350 | 351 | 352 | OpenTrace 需要权限才能进行 TCP/UDP 追踪。 353 | 请为 NextTrace 设置权限: 354 | 355 | sudo xattr -r -d com.apple.quarantine /path/to/nexttrace 356 | sudo chown root:admin /path/to/nexttrace 357 | sudo chmod +sx /path/to/nexttrace 358 | 359 | 360 | OpenTrace 需要权限才能进行 TCP/UDP 追踪 361 | 362 | 363 | 未能在指定的位置 "{0}" 中找到 NextTrace。 364 | 365 | 366 | MTR 模式 367 | 368 | 369 | 找不到主机 {0}。请检查该名称,然后重试。 370 | 371 | 372 | 新建 373 | 374 | 375 | 打开一个新的 OpenTrace 窗口 376 | 377 | 378 | 代理设置 379 | 380 | 381 | 反向 DNS 查询模式 382 | 383 | 384 | 组织 385 | 386 | 387 | 部分数据源只有在设置了 API 端点 / Token 之后才可被选择; 388 | 若要使用离线数据库,请参考 NextTrace 文档进行设置。 389 | 390 | 391 | 分组请求间隔 392 | 393 | 394 | 请求间隔 395 | 396 | 397 | 并行请求数 398 | 399 | 400 | LeoMoeAPI PoW 服务器 401 | 402 | 403 | api.leo.moe (默认) 404 | 405 | 406 | Nya Labs (中国大陆优化) 407 | 408 | 409 | 设置 410 | 411 | 412 | 私有地址(局域网) 413 | 414 | 415 | Traceroute 使用的协议 416 | 417 | 418 | 每跃点探测次数 419 | 420 | 421 | 退出 422 | 423 | 424 | 接收数 425 | 426 | 427 | 部分设置需重启应用才能生效 428 | 429 | 430 | 保存 431 | 432 | 433 | 选择一个 IP 434 | 435 | 436 | 请从下拉菜单中选择一个 IP 437 | 438 | 439 | 已发送 440 | 441 | 442 | 共享地址 443 | 444 | 445 | 源地址 446 | 447 | 448 | 源接口 449 | 450 | 451 | 开始 452 | 453 | 454 | 标准差 455 | 456 | 457 | 停止 458 | 459 | 460 | 系统 DNS 461 | 462 | 463 | 时间(ms) 464 | 465 | 466 | 保留延迟显示到整数位 467 | 468 | 469 | 路由追踪 470 | 471 | 472 | TCP/UDP 模式要求 473 | 474 | 475 | 在 Windows 上使用 TCP/UDP Traceroute 需要管理员权限,是否以管理员身份重新运行 OpenTrace? 476 | 477 | 478 | • 未安装 Npcap 479 | 480 | 481 | • 未找到 WinDivert (应放在和 NextTrace 可执行文件同一目录) 482 | 483 | 484 | 在 Windows 上使用 TCP/UDP Traceroute 需要满足以下条件: 485 | 486 | {0} 487 | 488 | 点击 [是] 直接尝试运行 NextTrace(以后不再提示) 489 | 点击 [否] 下载缺失组件 490 | 491 | 492 | ✓ Npcap 已安装 493 | 494 | 495 | ✓ WinDivert 可用 496 | 497 | 498 | 以管理员身份重新运行 499 | 500 | 501 | 最大延迟 502 | 503 | 504 | OpenTrace 被 macOS 隔离,工作可能不完全正常。 505 | 请打开终端,使用下面的命令释放 OpenTrace: 506 | 507 | sudo xattr -r -d com.apple.quarantine <将 OpenTrace 拖放至此> 508 | 509 | 并在完成释放后重启 OpenTrace. 510 | 511 | 512 | 项目主页 513 | 514 | 515 | 尝试获取完整 rDNS 516 | 517 | 518 | 快速 rDNS(默认) 519 | 520 | 521 | 禁用 rDNS 查询 522 | 523 | 524 | 启动时检查更新 525 | 526 | 527 | 下载最新版 OpenTrace 528 | 529 | 530 | (最新版 {0} 已发布,可到帮助菜单下载) 531 | 532 | 533 | 隐私保护 534 | 535 | 536 | 跳的所有信息 537 | 538 | 539 | 打码前 540 | 541 | 542 | 跳的完整 IP 543 | 544 | 545 | 跳的 IP 和地理位置 546 | 547 | 548 | 跳的部分 IP 549 | 550 | 551 | 自动选择 IP 552 | 553 | 554 | 手动选择 555 | 556 | 557 | 自动选择首个 IPv4 (如果可用) 558 | 559 | 560 | 自动选择首个 IPv6 (如果可用) 561 | 562 | -------------------------------------------------------------------------------- /Properties/Resources.zh-HK.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 關於 122 | 123 | 124 | 附加參數 125 | 126 | 127 | OpenTrace 128 | 129 | 130 | NextTrace 需要接收特殊的 ICMP 響應報文來構建完整的 traceroute 信息;但默認情況下,Windows 防火牆會攔截此類消息,導致您只能看到 traceroute 的最後一跳。 131 | 132 | 您可以點擊“是”來自動添加防火牆規則,也可以點“否”取消這一操作。 133 | 134 | 若要獲得更多信息,請參考 https://github.com/nxtrace/Ntrace-core/issues/52 135 | 136 | 137 | (留空自動檢測) 138 | 139 | 140 | 平均延遲 141 | 142 | 143 | 最佳延遲 144 | 145 | 146 | 取消 147 | 148 | 149 | 純真 API 端點 150 | 151 | 152 | 關閉 153 | 154 | 155 | 把地理位置和組織信息合為一欄 156 | 157 | 158 | 拷貝 159 | 160 | 161 | 複製所有結果 162 | 163 | 164 | 自定義 DNS 解析器 165 | (支持 UDP / DoH) 166 | 167 | 168 | 禁用地理位置 169 | 170 | 171 | 目標端口 / 初始序號 172 | 173 | 174 | 主機或 IP 不能為空 175 | 176 | 177 | 使用本地 Ip2region 數據庫 (ip2region.db) 178 | 179 | 180 | 使用本地 IPInfo 數據庫 (ipinfoLocal.mmdb) 181 | 182 | 183 | 錯誤消息 184 | 185 | 186 | 保存設置時出錯 187 | 188 | 189 | NextTrace 進程異常退出,請參考錯誤消息以瞭解更多信息並及時向我們報告此問題。 退出代碼: 190 | 191 | 192 | NextTrace 產生了一個或多個異常輸出,請檢查下面的輸出資訊以排查問題。 您可以參考 NextTrace Wiki 來查看是否已經有解答;如未能找到答案,請向我們報告。 193 | 194 | 195 | 報告問題 196 | 197 | 198 | 異常輸出 199 | 200 | 201 | 可執行文件路徑 202 | 203 | 204 | 導出 205 | 206 | 207 | 導出為 208 | 209 | 210 | 新增防火墻規則失敗 211 | 212 | 213 | 文件 214 | 215 | 216 | 首個躍點 217 | 218 | 219 | 常規設置 220 | 221 | 222 | 地理位置 223 | 224 | 225 | 226 | 227 | 228 | 229 | 表格高度占比 230 | 231 | 232 | 幫助 233 | 234 | 235 | 不再提示新增防火牆規則 236 | 237 | 238 | 隱藏地圖上的信息窗口 239 | 240 | 241 | 歷史記錄 242 | 243 | 244 | 主機名 245 | 246 | 247 | IPInfo Token (可選) 248 | 249 | 250 | IP 地理位置數據源 251 | 252 | 253 | 語言 (Language) 254 | 255 | 256 | 當前延遲 257 | 258 | 259 | LeoMoeAPI 反代地址 260 | 261 | 262 | 鏈路本地地址 263 | 264 | 265 | 本地 MMDB 266 | 267 | 268 | 地理位置模板 269 | 270 | 271 | ASN 模板 272 | 273 | 274 | 主機名模板 275 | 276 | 277 | 緯度模板 278 | 279 | 280 | 經度模板 281 | 282 | 283 | 組織模板 284 | 285 | 286 | 本地 MMDB 路徑 287 | 288 | 289 | 預設配置 290 | 291 | 292 | 預覽 MMDB 293 | 294 | 295 | 預覽 IP 296 | 297 | 298 | 選擇 MMDB 文件 299 | 300 | 301 | 此功能用本地 MMDB 查詢的結果覆蓋原查詢結果 302 | 留空以避免覆寫對應字段 303 | 模板舉例: {.country}-{.city} 304 | 305 | 306 | 本地迴環地址 307 | 308 | 309 | 丟包率% 310 | 311 | 312 | 地圖數據源 313 | 314 | 315 | 百度地圖 316 | 317 | 318 | 谷歌地圖 319 | 320 | 321 | OpenStreetMap 322 | 323 | 324 | 最大躍點 325 | 326 | 327 | 組件缺失 328 | 329 | 330 | OpenTrace 需要 NextTrace 才能正常工作,但未能找到可執行文件。 331 | 您可以把 NextTrace 可執行文件放置於: 332 | 1. 與 OpenTrace 同一目錄下 333 | 或 334 | 2. PATH 環境變量中的目錄下 335 | 336 | 是否現在下載 NextTrace? 337 | 338 | 339 | OpenTrace 需要 NextTrace 才能正常工作,但未能找到可執行文件。 340 | 請下載 NextTrace 並設置好權限: 341 | 342 | sudo xattr -r -d com.apple.quarantine /path/to/nexttrace 343 | sudo chown root:admin /path/to/nexttrace 344 | sudo chmod +sx /path/to/nexttrace 345 | 346 | 然後在設置中指定 NextTrace 路徑。 347 | 348 | 是否現在下載 NextTrace? 349 | 350 | 351 | OpenTrace 需要權限才能進行 TCP/UDP 追蹤。 352 | 請為 NextTrace 設置權限: 353 | 354 | sudo xattr -r -d com.apple.quarantine /path/to/nexttrace 355 | sudo chown root:admin /path/to/nexttrace 356 | sudo chmod +sx /path/to/nexttrace 357 | 358 | 359 | OpenTrace 需要權限才能進行 TCP/UDP 追蹤 360 | 361 | 362 | 未能在指定的位置 "{0}" 中找到 NextTrace。 363 | 364 | 365 | MTR 模式 366 | 367 | 368 | 找不到主機 {0}。請檢查該名稱,然後重試。 369 | 370 | 371 | 新建 372 | 373 | 374 | 打開一個新的 OpenTrace 窗口 375 | 376 | 377 | 代理設置 378 | 379 | 380 | 反向 DNS 查找模式 381 | 382 | 383 | 組織 384 | 385 | 386 | 有些數據源只有在設置 API 端點 / Token 後才能選擇; 387 | 要使用離線數據庫,請參閱 NextTrace 文檔進行設置。 388 | 389 | 390 | 分組請求間隔 391 | 392 | 393 | 請求間隔 394 | 395 | 396 | 並行請求數 397 | 398 | 399 | LeoMoeAPI PoW 服務器 400 | 401 | 402 | api.leo.moe (默認) 403 | 404 | 405 | Nya Labs (中國大陸優化) 406 | 407 | 408 | 設置 409 | 410 | 411 | 私有地址(局域網) 412 | 413 | 414 | Traceroute 使用的協議 415 | 416 | 417 | 每躍點探測次數 418 | 419 | 420 | 退出 421 | 422 | 423 | 接收數 424 | 425 | 426 | 部分設置需重啓應用才能生效 427 | 428 | 429 | 保存 430 | 431 | 432 | 選擇一個 IP 433 | 434 | 435 | 請從下拉菜單中選擇一個 IP 436 | 437 | 438 | 已發送 439 | 440 | 441 | 共享地址 442 | 443 | 444 | 源地址 445 | 446 | 447 | 源接口 448 | 449 | 450 | 開始 451 | 452 | 453 | 標準差 454 | 455 | 456 | 停止 457 | 458 | 459 | 系統 DNS 460 | 461 | 462 | 時間(ms) 463 | 464 | 465 | 保留延遲顯示到整數位 466 | 467 | 468 | 路由追蹤 469 | 470 | 471 | TCP/UDP 模式要求 472 | 473 | 474 | 在 Windows 系統上執行 TCP/UDP Traceroute 需要管理員權限。您是否要以管理員權限重新啟動 OpenTrace? 475 | 476 | 477 | • 未安裝 Npcap 478 | 479 | 480 | • 未找到 WinDivert (應放在和 NextTrace 可執行文件同一目錄) 481 | 482 | 483 | 在 Windows 上使用 TCP/UDP Traceroute 需要滿足以下條件: 484 | 485 | {0} 486 | 487 | 點擊 [是] 直接嘗試運行 NextTrace(並不再提示) 488 | 點擊 [否] 下載缺失組件 489 | 490 | 491 | ✓ Npcap 已安裝 492 | 493 | 494 | ✓ WinDivert 可用 495 | 496 | 497 | 以管理員身份重新運行 498 | 499 | 500 | 最大延遲 501 | 502 | 503 | OpenTrace 被 macOS 隔離,工作可能不完全正常。 504 | 請打開終端,使用下面的命令釋放 OpenTrace: 505 | 506 | sudo xattr -r -d com.apple.quarantine <將 OpenTrace 拖放至此> 507 | 508 | 並在完成釋放後重啓 OpenTrace. 509 | 510 | 511 | 項目主頁 512 | 513 | 514 | 嘗試獲取完整 rDNS 515 | 516 | 517 | 快速 rDNS(默認) 518 | 519 | 520 | 禁用 rDNS 查詢 521 | 522 | 523 | 啟動時檢查更新 524 | 525 | 526 | 下載最新版 OpenTrace 527 | 528 | 529 | (最新版 {0} 已發佈,可到幫助菜單下載) 530 | 531 | 532 | 私隱保護 533 | 534 | 535 | 跳的所有訊息 536 | 537 | 538 | 隱藏前 539 | 540 | 541 | 跳的完整 IP 542 | 543 | 544 | 跳的 IP 與地理位置 545 | 546 | 547 | 跳的部分 IP 548 | 549 | 550 | 自動選擇 IP 551 | 552 | 553 | 手動選擇 554 | 555 | 556 | 自動選擇第一個 IPv4 (如果可用) 557 | 558 | 559 | 自動選擇第一個 IPv6 (如果可用) 560 | 561 | -------------------------------------------------------------------------------- /Properties/Resources.es.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | Acerca de... 122 | 123 | 124 | Args. adicionales 125 | 126 | 127 | OpenTrace 128 | 129 | 130 | NextTrace requiere ICMP (tipos 11/3) para rutas completas. Windows lo bloquea por defecto, limitando la visibilidad de saltos. 131 | ¿Añadir regla al cortafuegos para NextTrace? 132 | 133 | 134 | (Auto) 135 | 136 | 137 | Prom. 138 | 139 | 140 | 141 | ..\Assets\Scripts\baiduMap.js;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 142 | 143 | 144 | Mín. 145 | 146 | 147 | Cancelar 148 | 149 | 150 | Endpoint CHUNZHEN 151 | 152 | 153 | Cerrar 154 | 155 | 156 | Combinar Geo y Org en una columna 157 | 158 | 159 | Copiar 160 | 161 | 162 | Copiar todo 163 | 164 | 165 | DNS personalizados 166 | (DNS/DoH) 167 | 168 | 169 | Desactivado 170 | 171 | 172 | Puerto dest. / Seq. inicial 173 | 174 | 175 | Host o IP vacíos 176 | 177 | 178 | BD offline Ip2region (ip2region.db) 179 | 180 | 181 | BD offline IPInfo (ipinfoLocal.mmdb) 182 | 183 | 184 | Mensaje de error 185 | 186 | 187 | Error al guardar ajustes. 188 | 189 | 190 | NextTrace cerró de forma inesperada. Revise el error e informe del problema. Código: 191 | 192 | 193 | NextTrace generó salidas inesperadas. Revise el log o la Wiki de NextTrace para solucionar el problema. 194 | 195 | 196 | Informar error 197 | 198 | 199 | Salida inesperada 200 | 201 | 202 | Ruta ejecutable 203 | 204 | 205 | Exportar 206 | 207 | 208 | Exportar a 209 | 210 | 211 | Error en reglas cortafuegos. 212 | 213 | 214 | Archivo 215 | 216 | 217 | Primer salto TTL 218 | 219 | 220 | General 221 | 222 | 223 | Geolocalización 224 | 225 | 226 | ..\Assets\Scripts\googleMap.js;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 227 | 228 | 229 | Altura de cuadrícula 230 | 231 | 232 | Ayuda 233 | 234 | 235 | No avisar sobre reglas de cortafuegos 236 | 237 | 238 | Ocultar info del mapa 239 | 240 | 241 | Historial 242 | 243 | 244 | Hostname 245 | 246 | 247 | Token IPInfo (Opc.) 248 | 249 | 250 | Proveedor Geo IP 251 | 252 | 253 | Idioma (Language) 254 | 255 | 256 | Últ. 257 | 258 | 259 | Proxy LeoMoeAPI 260 | 261 | 262 | Dirección link-local 263 | 264 | 265 | Sobrescribir MMDB local 266 | 267 | 268 | Plantilla dir. 269 | 270 | 271 | Plantilla ASN 272 | 273 | 274 | Plantilla host 275 | 276 | 277 | Plantilla lat. 278 | 279 | 280 | Plantilla lon. 281 | 282 | 283 | Plantilla org. 284 | 285 | 286 | Ruta MMDB local 287 | 288 | 289 | Preajustes 290 | 291 | 292 | Previsualizar MMDB 293 | 294 | 295 | Previsualizar IP 296 | 297 | 298 | Elegir archivo MMDB 299 | 300 | 301 | Usa MMDB local para sobrescribir resultados. Vacío para no sobrescribir. 302 | Ej: {.country}-{.city} 303 | 304 | 305 | Dirección loopback 306 | 307 | 308 | %Pérd. 309 | 310 | 311 | Mapas 312 | 313 | 314 | Baidu 315 | 316 | 317 | Google 318 | 319 | 320 | OpenStreetMap 321 | 322 | 323 | Saltos máx. 324 | 325 | 326 | Falta componente 327 | 328 | 329 | Falta NextTrace. Colóquelo en: 330 | 1. El directorio de OpenTrace 331 | 2. Un directorio del PATH 332 | 333 | ¿Descargar ahora? 334 | 335 | 336 | Falta NextTrace. Descárguelo y ejecute: 337 | sudo xattr -r -d com.apple.quarantine /ruta/a/nexttrace 338 | sudo chown root:admin /ruta/a/nexttrace 339 | sudo chmod +sx /ruta/a/nexttrace 340 | 341 | Indique la ruta en ajustes. ¿Descargar? 342 | 343 | 344 | Modo MTR 345 | 346 | 347 | Host {0} no hallado. Revise el nombre. 348 | 349 | 350 | Nuevo 351 | 352 | 353 | Nueva ventana de OpenTrace. 354 | 355 | 356 | Proxy 357 | 358 | 359 | Modo rDNS 360 | 361 | 362 | Organización 363 | 364 | 365 | Fuentes con API/Token requieren ajuste previo. 366 | Para bases offline, ver documentación de NextTrace. 367 | 368 | 369 | Int. grupo paquetes 370 | 371 | 372 | Int. paquetes 373 | 374 | 375 | Peticiones paralelas 376 | 377 | 378 | Proveedor PoW LeoMoeAPI 379 | 380 | 381 | api.leo.moe (Defecto) 382 | 383 | 384 | Nya Labs (Optimizado China) 385 | 386 | 387 | Ajustes 388 | 389 | 390 | Dir. privada (LAN) 391 | 392 | 393 | Protocolo de rastreo 394 | 395 | 396 | Sondas por salto 397 | 398 | 399 | Salir 400 | 401 | 402 | Recv 403 | 404 | 405 | Reinicie para aplicar cambios 406 | 407 | 408 | Guardar 409 | 410 | 411 | Elegir IP 412 | 413 | 414 | Elija una IP de la lista. 415 | 416 | 417 | Env. 418 | 419 | 420 | Dir. compartida 421 | 422 | 423 | Dir. origen 424 | 425 | 426 | Interfaz origen 427 | 428 | 429 | Iniciar 430 | 431 | 432 | D.E. 433 | 434 | 435 | Detener 436 | 437 | 438 | DNS Sistema 439 | 440 | 441 | Tiempo(ms) 442 | 443 | 444 | Redondear latencia a entero 445 | 446 | 447 | Rastreo (Traceroute) 448 | 449 | 450 | Requisitos TCP/UDP 451 | 452 | 453 | TCP/UDP requiere administrador. ¿Reiniciar con privilegios? 454 | 455 | 456 | • Falta Npcap 457 | 458 | 459 | • Falta WinDivert (en dir. NextTrace) 460 | 461 | 462 | Requisitos TCP/UDP en Windows: 463 | {0} 464 | ¿Ejecutar directamente [Sí] o descargar [No]? 465 | 466 | 467 | ✓ Npcap instalado 468 | 469 | 470 | ✓ WinDivert disponible 471 | 472 | 473 | Ejecutar como Admin 474 | 475 | 476 | Máx. 477 | 478 | 479 | App en cuarentena. Use terminal: 480 | sudo xattr -r -d com.apple.quarantine <arrastre app aquí> 481 | Y reinicie OpenTrace. 482 | 483 | 484 | Web 485 | 486 | 487 | rDNS completo 488 | 489 | 490 | rDNS rápido (Defecto) 491 | 492 | 493 | Sin rDNS 494 | 495 | 496 | Buscar actualizaciones al inicio 497 | 498 | 499 | Descargar última versión 500 | 501 | 502 | (Versión {0} lista. Menú Ayuda.) 503 | 504 | 505 | Privacidad 506 | 507 | 508 | saltos: ocultar todo 509 | 510 | 511 | Ocultar primeros 512 | 513 | 514 | saltos: IP completa 515 | 516 | 517 | saltos: IP y Geo 518 | 519 | 520 | saltos: IP parcial 521 | 522 | 523 | Selección de IP 524 | 525 | 526 | Manual 527 | 528 | 529 | Auto: 1ª IPv4 disp. 530 | 531 | 532 | Auto: 1ª IPv6 disp. 533 | 534 | --------------------------------------------------------------------------------