A TCP-based traceroute library and tool inspired by the original tcptraceroute.
Built with packetnet and sharppcap.
Note behavior may vary from the original tool, and some options are not supported yet (e.g trackport)
Help
Description:
Usage:
tcptraceroute-net <dst-host> [<dst-port>] [options]
Arguments:
<dst-host>
<dst-port> [default: 80]
Options:
-d debug mode [default: False]
-n do not resolve probe hostname [default: True]
-q, --num-queries <num-queries> [default: 3]
-f, --first-ttl <first-ttl> [default: 1]
--track-port [default: False]
-P, --force-port [default: False]
--dnat [default: False]
-i, --interface <interface>
-l, --packet-len <packet-len> [default: 0]
-m, --max-ttl <max-ttl> [default: 30]
-t, --tos <tos> [default: 0]
-s, --src-address <src-address>
-p, --src-port <src-port> [default: 0]
-w, --wait-time <wait-time> packet read timeout (ms) [default: 3000]
-S set SYN tcp flag [default: True]
-A set ACK tcp flag [default: False]
-E set ECN tcp flag [default: False]
-U set URG tcp flag [default: False]
--version Show version information
-?, -h, --help Show help and usage information
traceroute-net github.com -q 1
Selected device Wi-Fi (Intel(R) Wi-Fi 6 AX201 160MHz), address 192.168.1.56, port 60563 for outgoing packets Tracing the path to github.com (140.82.121.4) on TCP port 80, 30 hops max 1 home-life.hub 1.411 ms 2 151.6.142.56 7.518 ms 3 151.6.57.36 7.175 ms 4 151.6.6.68 9.696 ms 5 151.6.7.181 10.650 ms 6 * * 7 64.125.30.254 26.075 ms 8 ae1.mcs1.fra9.de.eth.zayo.com 32.603 ms 9 82.98.193.29.IPYX-270403-002-ZYO.zip.zayo.com 26.751 ms 10 * * 11 * * 12 lb-140-82-121-4-fra.github.com [open] 26.199 ms
traceroute-net github.com -q 3 -n
Selected device Wi-Fi (Intel(R) Wi-Fi 6 AX201 160MHz), address 192.168.1.56, port 60563 for outgoing packets Tracing the path to github.com (140.82.121.3) on TCP port 80, 30 hops max 1 192.168.1.1 1.873 ms 1.196 ms 1.230 ms 2 151.6.142.56 6.731 ms 7.207 ms 6.189 ms 3 151.6.57.36 6.432 ms 6.351 ms 9.545 ms 4 151.6.6.68 9.502 ms 9.882 ms 9.262 ms 5 151.6.7.181 10.197 ms 11.756 ms 10.146 ms 6 80.81.194.26 25.581 ms 25.906 ms 25.646 ms 7 64.125.30.254 26.460 ms 25.677 ms 25.404 ms 8 64.125.29.65 31.942 ms 32.211 ms 31.858 ms 9 82.98.193.29 25.576 ms 25.550 ms 26.520 ms 10 * * * * 11 * * * * 12 140.82.121.3 [open] 25.800 ms 25.744 ms 835.491 ms
traceroute-net github.com -q 1 -n --dot
Selected device Wi-Fi (Intel(R) Wi-Fi 6 AX201 160MHz), address 192.168.1.56, port 60563 for outgoing packets
Tracing the path to github.com (140.82.121.3) on TCP port 80, 30 hops max
1 192.168.1.1 1.873 ms 1.196 ms 1.230 ms
[...TRUNCATED FOR BREVITY...]
digraph {
{
host
1[label="192.168.1.1" ]
2[label="151.6.142.56" ]
3[label="151.6.57.40" ]
4[label="151.6.0.190" ]
5[label="151.6.7.239" ]
6[label="80.81.194.26" ]
7[label="64.125.30.254" ]
8[label="64.125.29.65" ]
9[label="82.98.193.29" ]
10[label="*" color=red]
11[label="*" color=red]
12[label="140.82.121.4" ]
}
host->1 [label=" 2.228 ms"]
host->2 [label=" 8.137 ms" style=dotted]
1->2 [label=" 10.364 ms"]
host->3 [label=" 6.886 ms" style=dotted]
2->3 [label=" 17.250 ms"]
host->4 [label=" 26.925 ms" style=dotted]
3->4 [label=" 44.175 ms"]
host->5 [label=" 22.965 ms" style=dotted]
4->5 [label=" 67.140 ms"]
host->6 [label=" 23.855 ms" style=dotted]
5->6 [label=" 90.995 ms"]
host->7 [label=" 24.454 ms" style=dotted]
6->7 [label=" 115.449 ms"]
host->8 [label=" 62.802 ms" style=dotted]
7->8 [label=" 178.252 ms"]
host->9 [label=" 19.341 ms" style=dotted]
8->9 [label=" 197.593 ms"]
host->10 [label=" -1.000 ms" style=dotted]
9->10 [label=" 197.593 ms"]
host->11 [label=" -1.000 ms" style=dotted]
10->11 [label=" 197.593 ms"]
host->12 [label=" 19.376 ms" style=dotted]
11->12 [label=" 216.969 ms"]
}
See rendered at:
https://dreampuf.github.io/GraphvizOnline/#digraph%20%7B%0D%0A%20%20%7B%[...TRUNCATED...]
tcptraceroute-net github.com -q 1 --dot
See the Cli - Samples section for more details.
var dstAddress = IPAddress.Parse("8.8.8.8");
var srcAddress = await NetworkHelpers.FindSourceAddress(dstAddress);
var (device, networkInterface) = NetworkHelpers.FindDevice(sourceAddress);
var options = new TcpTraceRouteOptions
{
TcpDestinationPort = 80,
NumQueries = 3,
MaxTtl = 30,
Timeout = TimeSpan.FromMilliseconds(3000),
SourceAddress = srcAddress,
DestinationAddress = dstAddress,
};
using var traceroute = new TcpTraceRouteCapture(device, networkInterface, options);
traceroute.ProbeCompleted += (_, e) =>
{
var p = e.Probe;
Console.WriteLine($"ttl={p.Ttl} q={p.QueryNum} src={p.Address} delta={p.Delta}ms");
};
var result = traceroute.Run();
var destinationReached = result.Probes
.TakeLast(opts.NumQueries)
.Any(p => p.Address.Equals(opts.DestinationAddress));
if (!destinationReached)
{
Console.WriteLine("Destination not reached");
}