diff --git a/README.md b/README.md
index 92fc2f2..a83b7f5 100644
--- a/README.md
+++ b/README.md
@@ -28,6 +28,9 @@ Nylon targets under 10 seconds of convergence time after a link failure, as you
Download the latest release binary from the [releases page](https://github.com/encodeous/nylon/releases), then head to the [docs](https://nylon.jq.ax) for setup instructions.
+> **[Read the full documentation at nylon.jq.ax](https://nylon.jq.ax)**
+> includes configuration reference, guides for connecting WireGuard clients, port forwarding, and comparisons with Tailscale/Nebula.
+
Sample systemd service and launchctl plist files can be found under the `examples` directory.
> [!NOTE]
diff --git a/demo/record.sh b/demo/record.sh
index 20f4c05..3fb1354 100755
--- a/demo/record.sh
+++ b/demo/record.sh
@@ -137,11 +137,14 @@ BCYAN="\033[1;36m"
# Helpers
START=$(date +%s)
elapsed() { echo "$(( $(date +%s) - START ))s"; }
+marker() { echo "$(( $(date +%s) - START )) $1" >> /tmp/markers.txt; }
header() { echo -e "${BYELLOW}── $* ──${R}"; }
ok() { echo -e "${BGREEN} [$(elapsed)] ✓ $*${R}"; }
info() { echo -e "${DIM} $*${R}"; }
fail() { echo -e "${BRED} [$(elapsed)] ✗ $*${R}"; }
+> /tmp/markers.txt
+
# ── Topology diagrams ──
topo_normal() {
echo -e " ${BOLD}alice${R} .1 ────── ${BOLD}charlie${R} .3"
@@ -184,12 +187,14 @@ done
echo -e "${R}"
ok "mesh converged"
+marker "Mesh converged"
info "route: alice → charlie (direct, 1 hop)"
echo ""
sleep 5
header "cutting direct link"
+marker "Link cut"
echo ""
topo_broken
echo ""
@@ -205,11 +210,12 @@ while true; do
break
fi
echo -ne "."
- sleep 0.5
+ sleep 1
done
echo -e "${R}"
ok "rerouted through bob!"
+marker "Rerouted via bob"
info "route: alice → bob → charlie (2 hops)"
echo ""
topo_rerouted
@@ -218,6 +224,7 @@ echo ""
sleep 5
header "restoring direct link"
+marker "Link restored"
echo ""
echo " $ iptables -F"
iptables -F
@@ -230,11 +237,12 @@ for i in $(seq 1 30); do
break
fi
echo -ne "."
- sleep 0.5
+ sleep 1
done
echo -e "${R}"
ok "direct link restored"
+marker "Direct route restored"
info "route: alice → charlie (direct, 1 hop)"
echo ""
topo_restored
@@ -299,12 +307,58 @@ info "Recording complete."
# ── Step 4: Extract the cast file ──────────────────────────────────
docker cp nylon-demo-alice:/tmp/demo.cast "$OUTPUT_DIR/demo.cast"
+docker cp nylon-demo-alice:/tmp/markers.txt "$OUTPUT_DIR/markers.txt" 2>/dev/null || true
if [ ! -f "$OUTPUT_DIR/demo.cast" ]; then
echo "Error: cast file was not created."
exit 1
fi
+# Inject markers into the cast file
+if [ -f "$OUTPUT_DIR/markers.txt" ]; then
+ info "Injecting markers into cast..."
+ python3 -c "
+import json, sys
+
+markers_file = '$OUTPUT_DIR/markers.txt'
+cast_file = '$OUTPUT_DIR/demo.cast'
+
+# Read markers
+markers = []
+with open(markers_file) as f:
+ for line in f:
+ parts = line.strip().split(' ', 1)
+ if len(parts) == 2:
+ markers.append((float(parts[0]), parts[1]))
+
+# Read cast
+with open(cast_file) as f:
+ lines = f.readlines()
+
+# Parse header to get recording start offset
+header = json.loads(lines[0])
+
+# Build new cast with markers injected
+events = []
+for line in lines[1:]:
+ events.append(json.loads(line))
+
+for ts, label in markers:
+ events.append([ts, 'm', label])
+
+# Sort by timestamp
+events.sort(key=lambda e: e[0])
+
+# Write back
+with open(cast_file, 'w') as f:
+ f.write(json.dumps(header) + '\n')
+ for event in events:
+ f.write(json.dumps(event) + '\n')
+
+print(f' Injected {len(markers)} markers')
+"
+fi
+
info "Cast file saved to $OUTPUT_DIR/demo.cast"
# ── Step 5: Convert to GIF ─────────────────────────────────────────
diff --git a/docs/assets/demo.cast b/docs/assets/demo.cast
new file mode 100644
index 0000000..e374734
--- /dev/null
+++ b/docs/assets/demo.cast
@@ -0,0 +1,262 @@
+{"version": 2, "width": 140, "height": 35, "timestamp": 1779069629, "env": {"SHELL": null, "TERM": "xterm-256color"}}
+[0.024677, "o", "\u001b[?1049h\u001b[22;0;0t\u001b[?1h\u001b=\u001b[H\u001b[2J\u001b[?12l\u001b[?25h\u001b[?1000l\u001b[?1002l\u001b[?1003l\u001b[?1006l\u001b[?1005l\u001b[?2004h\u001b(B\u001b[m\u001b[?12l\u001b[?25h\u001b[?1006l\u001b[?1000l\u001b[?1002l\u001b[?1003l\u001b[1;1H\u001b[1;35r\u001b[c\u001b[>c\u001b[>q\u001b]10;?\u001b\\\u001b]11;?\u001b\\\u001b[15;1H"]
+[0.025286, "o", "\u001b[?25l\u001b[1;85H\u2502\u001b[2;85H\u2502\u001b[3;85H\u2502\u001b[4;85H\u2502\u001b[5;85H\u2502\u001b[6;85H\u2502\u001b[7;85H\u2502\u001b[8;85H\u2502\u001b[9;85H\u2502\u001b[10;85H\u2502\u001b[11;85H\u2502\u001b[12;85H\u2502\u001b[13;85H\u2502\r\n\u001b[32m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u001b[15;85H\u2502\u001b[16;85H\u2502\u001b[17;85H\u2502\u001b[18;85H\u2502\u001b[19;85H\u2502\u001b[20;85H\u2502\u001b[21;85H\u2502\u001b[22;85H\u2502\u001b[23;85H\u2502\u001b[24;85H\u2502\u001b[25;85H\u251c\u001b[39m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[26;85H\u001b[32m\u2502\u001b[27;85H\u2502\u001b[28;85H\u2502\u001b[29;85H\u2502\u001b[30;85H\u2502\u001b[31;85H\u2502\u001b[32;85H\u2502\u001b[33;85H\u2502\u001b[34;85H\u2502\u001b(B\u001b[m\u001b[1;84H\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\u001b[2B\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\u001b[36m\u001b[1m\u001b[1;86H# nylon \u2014 self-healing WireGuard mesh\u001b(B\u001b[m\u001b[K\u001b[2;86H\u001b[K\u001b[33m\u001b[1m\n\u2500\u2500 topology \u2500\u2500\u001b(B\u001b[m\u001b[K\u001b[4;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u2500\u2500\u2500\u2500\u2500\u2500 \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[6;86H | |\u001b[K\u001b[7;86H \u001b[1mbob\u001b(B\u001b[m .2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[K\u001b[8;86H\u001b[K\u001b[90m\n [0s] waiting for mesh convergence.\u001b[39m\u001b[K\u001b[10;86H\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\u001b[2B\u001b[K\u001b[33m\u001b[1m\n nodes\u001b(B\u001b[m\u001b[K\u001b[28;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m 10.99.0.1 (172.31.0.10)\u001b[K\u001b[30;86H \u001b[1mbob\u001b(B\u001b[m 10.99.0.2 (172.31.0.11)\u001b[K\u001b[31;86H \u001b[1mcharlie\u001b(B\u001b[m 10.99.0.3 (172.31.0.12)\u001b[K\u001b[32;86H\u001b[K\u001b[90m\n tunnel ip (docker ip)\u001b[39m\u001b[K\u001b[34;86H\u001b[K\u001b[30m\u001b[42m\r\n[demo] 0:bash* \"alice\" 02:00 18-May-26\u001b(B\u001b[m\u001b[?12l\u001b[?25h\u001b[15;1H"]
+[0.025343, "o", "\u001b(B\u001b[m\u001b[?12l\u001b[?25h\u001b[?1006l\u001b[?1000l\u001b[?1002l\u001b[?1003l\u001b[1;1H\u001b[1;35r\u001b[15;1H"]
+[0.025839, "o", "\u001b[?25l\u001b[1;85H\u2502\u001b[2;85H\u2502\u001b[3;85H\u2502\u001b[4;85H\u2502\u001b[5;85H\u2502\u001b[6;85H\u2502\u001b[7;85H\u2502\u001b[8;85H\u2502\u001b[9;85H\u2502\u001b[10;85H\u2502\u001b[11;85H\u2502\u001b[12;85H\u2502\u001b[13;85H\u2502\r\n\u001b[32m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u001b[15;85H\u2502\u001b[16;85H\u2502\u001b[17;85H\u2502\u001b[18;85H\u2502\u001b[19;85H\u2502\u001b[20;85H\u2502\u001b[21;85H\u2502\u001b[22;85H\u2502\u001b[23;85H\u2502\u001b[24;85H\u2502\u001b[25;85H\u251c\u001b[39m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[26;85H\u001b[32m\u2502\u001b[27;85H\u2502\u001b[28;85H\u2502\u001b[29;85H\u2502\u001b[30;85H\u2502\u001b[31;85H\u2502\u001b[32;85H\u2502\u001b[33;85H\u2502\u001b[34;85H\u2502\u001b(B\u001b[m\u001b[1;84H\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\u001b[2B\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\u001b[36m\u001b[1m\u001b[1;86H# nylon \u2014 self-healing WireGuard mesh\u001b(B\u001b[m\u001b[K\u001b[2;86H\u001b[K\u001b[33m\u001b[1m\n\u2500\u2500 topology \u2500\u2500\u001b(B\u001b[m\u001b[K\u001b[4;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u2500\u2500\u2500\u2500\u2500\u2500 \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[6;86H | |\u001b[K\u001b[7;86H \u001b[1mbob\u001b(B\u001b[m .2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[K\u001b[8;86H\u001b[K\u001b[90m\n [0s] waiting for mesh convergence.\u001b[39m\u001b[K\u001b[10;86H\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\u001b[2B\u001b[K\u001b[33m\u001b[1m\n nodes\u001b(B\u001b[m\u001b[K\u001b[28;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m 10.99.0.1 (172.31.0.10)\u001b[K\u001b[30;86H \u001b[1mbob\u001b(B\u001b[m 10.99.0.2 (172.31.0.11)\u001b[K\u001b[31;86H \u001b[1mcharlie\u001b(B\u001b[m 10.99.0.3 (172.31.0.12)\u001b[K\u001b[32;86H\u001b[K\u001b[90m\n tunnel ip (docker ip)\u001b[39m\u001b[K\u001b[34;86H\u001b[K\u001b[30m\u001b[42m\r\n[demo] 0:bash* \"alice\" 02:00 18-May-26\u001b(B\u001b[m\u001b[?12l\u001b[?25h\u001b[15;1H"]
+[1.523664, "o", "\u001b[9;122H\u001b[90m.\u001b[15;1H\u001b(B\u001b[m"]
+[2.0, "m", "Mesh converged"]
+[2.024834, "o", "\u001b[?25l\u001b[1;30H\u001b[1K\u001b[1m\u001b[C My traceroute [v0.95]\u001b(B\u001b[m\u001b[31X\r\nalice (10.99.0.1) -> 10.99.0.3 (10.99.0.3)\u001b[17X\u001b[17C2026-05-18T02:00:31+0000\u001b[1X\r\nKeys: \u001b[1mH\u001b(B\u001b[melp \u001b[1mD\u001b(B\u001b[misplay mode \u001b[1mR\u001b(B\u001b[mestart statistics \u001b[1mO\u001b(B\u001b[mrder of fields \u001b[1mq\u001b(B\u001b[muit\u001b[12X\u001b[4;40H\u001b[1K\u001b[1m\u001b[C Packets Pings\u001b(B\u001b[m\u001b[14X\u001b[1m\r\n Host\u001b(B\u001b[m\u001b[35X\u001b[1m\u001b[35C Loss% Snt Last Avg Best Wrst StDev\u001b(B\u001b[m\u001b[1X\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\u001b[?12l\u001b[?25h\u001b[15;1H"]
+[2.027127, "o", "\u001b[10;86H\u001b[32m\u001b[1m [2s] \u2713 mesh converged\u001b[15;1H\u001b(B\u001b[m"]
+[2.02825, "o", "\u001b[11;86H\u001b[90m route: alice \u2192 charlie (direct, 1 hop)\u001b[15;1H\u001b(B\u001b[m"]
+[2.030092, "o", "\u2500\u2500 ping alice (10.99.0.1) \u2192 charlie (10.99.0.3) \u2500\u2500\u001b[17;1H"]
+[2.031249, "o", "10.99.0.3 : [0], 64 bytes, 0.233 ms (0.233 avg, 0% loss)\r\n"]
+[2.075382, "o", "\u001b[2;78H2\u001b[6;1H 1. 10.99.0.3\u001b[29C0.0% 1 0.3 0.3 0.3 0.3 0.0\u001b[18;1H"]
+[2.626688, "o", "\u001b[6;52H2\u001b[18;1H"]
+[2.626982, "o", "\u001b[?25l\u001b[1;85H\u2502\u001b[2;85H\u2502\u001b[3;85H\u2502\u001b[4;85H\u2502\u001b[5;85H\u2502\u001b[6;85H\u2502\u001b[7;85H\u2502\u001b[8;85H\u2502\u001b[9;85H\u2502\u001b[10;85H\u2502\u001b[11;85H\u2502\u001b[12;85H\u2502\u001b[13;85H\u2502\r\n\u001b[32m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u001b[15;85H\u2502\u001b[16;85H\u2502\u001b[17;85H\u2502\u001b[18;85H\u2502\u001b[19;85H\u2502\u001b[20;85H\u2502\u001b[21;85H\u2502\u001b[22;85H\u2502\u001b[23;85H\u2502\u001b[24;85H\u2502\u001b[25;85H\u251c\u001b[39m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[26;85H\u001b[32m\u2502\u001b[27;85H\u2502\u001b[28;85H\u2502\u001b[29;85H\u2502\u001b[30;85H\u2502\u001b[31;85H\u2502\u001b[32;85H\u2502\u001b[33;85H\u2502\u001b[34;85H\u2502\u001b(B\u001b[m\u001b[30m\u001b[42m\r\n[demo] 0:fping* \"alice\" 02:00 18-May-26\u001b(B\u001b[m\u001b[?12l\u001b[?25h\u001b[18;1H"]
+[3.031837, "o", "10.99.0.3 : [1], 64 bytes, 0.255 ms (0.244 avg, 0% loss)\r\n"]
+[3.126283, "o", "\u001b[2;78H3\u001b[19;1H"]
+[3.126581, "o", "\u001b[6;52H3\u001b[19;1H"]
+[3.627209, "o", "\u001b[6;52H4\u001b[6C2\u001b[11C2\u001b[19;1H"]
+[4.031833, "o", "10.99.0.3 : [2], 64 bytes, 0.269 ms (0.252 avg, 0% loss)\r\n"]
+[4.127547, "o", "\u001b[2;78H4\u001b[20;1H"]
+[4.127995, "o", "\u001b[6;52H5\u001b[6C3\u001b[20;1H"]
+[4.628488, "o", "\u001b[6;52H6\u001b[20;1H"]
+[5.026032, "o", "\u001b[?7727h\u001b(B\u001b[m\u001b[?12l\u001b[?25h\u001b[?1006l\u001b[?1000l\u001b[?1002l\u001b[?1003l\u001b[1;1H\u001b[1;35r\u001b[20;1H"]
+[5.026362, "o", "\u001b[?25l\u001b[1;85H\u2502\u001b[2;85H\u2502\u001b[3;85H\u2502\u001b[4;85H\u2502\u001b[5;85H\u2502\u001b[6;85H\u2502\u001b[7;85H\u2502\u001b[8;85H\u2502\u001b[9;85H\u2502\u001b[10;85H\u2502\u001b[11;85H\u2502\u001b[12;85H\u2502\u001b[13;85H\u2502\r\n\u001b[32m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u001b[15;85H\u2502\u001b[16;85H\u2502\u001b[17;85H\u2502\u001b[18;85H\u2502\u001b[19;85H\u2502\u001b[20;85H\u2502\u001b[21;85H\u2502\u001b[22;85H\u2502\u001b[23;85H\u2502\u001b[24;85H\u2502\u001b[25;85H\u251c\u001b[39m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u001b[26;85H\u001b[32m\u2502\u001b[27;85H\u2502\u001b[28;85H\u2502\u001b[29;85H\u2502\u001b[30;85H\u2502\u001b[31;85H\u2502\u001b[32;85H\u2502\u001b[33;85H\u2502\u001b[34;85H\u2502\u001b(B\u001b[m\u001b[1;30H\u001b[1K\u001b[1m\u001b[C My traceroute [v0.95]\u001b(B\u001b[m\u001b[31X\r\nalice (10.99.0.1) -> 10.99.0.3 (10.99.0.3)\u001b[17X\u001b[17C2026-05-18T02:00:34+0000\u001b[1X\r\nKeys: \u001b[1mH\u001b(B\u001b[melp \u001b[1mD\u001b(B\u001b[misplay mode \u001b[1mR\u001b(B\u001b[mestart statistics \u001b[1mO\u001b(B\u001b[mrder of fields \u001b[1mq\u001b(B\u001b[muit\u001b[12X\u001b[4;40H\u001b[1K\u001b[1m\u001b[C Packets Pings\u001b(B\u001b[m\u001b[14X\u001b[1m\r\n Host\u001b(B\u001b[m\u001b[35X\u001b[1m\u001b[35C Loss% Snt Last Avg Best Wrst StDev\u001b(B\u001b[m\u001b[1X\r\n 1. 10.99.0.3\u001b[29X\u001b[29C0.0% 6 0.3 0.3 0.2 0.3 0.0\u001b[1X\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\u001b[15;1H\u2500\u2500 ping alice (10.99.0.1) \u2192 charlie (10.99.0.3) \u2500\u2500\u001b[34X\u001b[16;84H\u001b[1K\r\n10.99.0.3 : [0], 64 bytes, 0.233 ms (0.233 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [1], 64 bytes, 0.255 ms (0.244 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [2], 64 bytes, 0.269 ms (0.252 avg, 0% loss)\u001b[28X\u001b[20;84H\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\u001b[36m\u001b[1m\u001b[1;86H# nylon \u2014 self-healing WireGuard mesh\u001b(B\u001b[m\u001b[K\u001b[2;86H\u001b[K\u001b[33m\u001b[1m\n\u2500\u2500 topology \u2500\u2500\u001b(B\u001b[m\u001b[K\u001b[4;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u2500\u2500\u2500\u2500\u2500\u2500 \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[6;86H | |\u001b[K\u001b[7;86H \u001b[1mbob\u001b(B\u001b[m .2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[K\u001b[8;86H\u001b[K\u001b[90m\n [0s] waiting for mesh convergence..\u001b[39m\u001b[K\u001b[32m\u001b[1m\u001b[10;86H [2s] \u2713 mesh converged\u001b(B\u001b[m\u001b[K\u001b[90m\u001b[11;86H route: alice \u2192 charlie (direct, 1 hop)\u001b[39m\u001b[K\u001b[12;86H\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\n\u001b[K\u001b[2B\u001b[K\u001b[33m\u001b[1m\n nodes\u001b(B\u001b[m\u001b[K\u001b[28;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m 10.99.0.1 (172.31.0.10)\u001b[K\u001b[30;86H \u001b[1mbob\u001b(B\u001b[m 10.99.0.2 (172.31.0.11)\u001b[K\u001b[31;86H \u001b[1mcharlie\u001b(B\u001b[m 10.99.0.3 (172.31.0.12)\u001b[K\u001b[32;86H\u001b[K\u001b[90m\n tunnel ip (docker ip)\u001b[39m\u001b[K\u001b[34;86H\u001b[K\u001b[30m\u001b[42m\r\n[demo] 0:fping* \"alice\" 02:00 18-May-26\u001b(B\u001b[m\u001b[?12l\u001b[?25h\u001b[20;1H"]
+[5.031801, "o", "10.99.0.3 : [3], 64 bytes, 0.313 ms (0.267 avg, 0% loss)\r\n"]
+[5.128688, "o", "\u001b[2;78H5\u001b[21;1H"]
+[5.129147, "o", "\u001b[6;52H7\u001b[6C4\u001b[17C4 0.1\u001b[21;1H"]
+[5.629694, "o", "\u001b[6;52H8\u001b[6C3\u001b[23C0\u001b[21;1H"]
+[6.031798, "o", "10.99.0.3 : [4], 64 bytes, 0.239 ms (0.262 avg, 0% loss)\r\n"]
+[6.129894, "o", "\u001b[2;78H6\u001b[22;1H"]
+[6.130277, "o", "\u001b[6;52H9\u001b[22;1H"]
+[6.630894, "o", "\u001b[6;51H10\u001b[22;1H"]
+[7.0, "m", "Link cut"]
+[7.029349, "o", "\u001b[13;86H\u001b[33m\u001b[1m\u2500\u001b(B\u001b[m\u001b[?12l\u001b[?25h\u001b[?1006l\u001b[?1000l\u001b[?1002l\u001b[?1003l\u001b[1;1H\u001b[1;35r\u001b[13;87H\u001b[33m\u001b[1m\u2500 cutting direct link \u2500\u2500\u001b[22;1H\u001b(B\u001b[m"]
+[7.03021, "o", "\u001b[15;86H \u001b[1malice\u001b(B\u001b[m .1 \u001b[31m\u2500\u2500\u2717\u2500\u2500\u2500\u001b[39m \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[16;86H | |\u001b[22;1H"]
+[7.030223, "o", "\u001b[17;86H \u001b[1mbob\u001b(B\u001b[m .2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[19;86H $ iptables -A INPUT -s 172.31.0.12 -j DROP\u001b[22;1H"]
+[7.031284, "o", "\u001b[20;86H $ iptables -A OUTPUT -d 172.31.0.12 -j DROP\u001b[22;1H"]
+[7.033006, "o", "\u001b[85C\u001b[90m [7s] waiting for reroute\r\u001b(B\u001b[m"]
+[7.041297, "o", "10.99.0.3 : [5], timed out (0.262 avg, 16% loss)\r\n"]
+[7.131106, "o", "\u001b[2;78H7\u001b[23;1H"]
+[7.631299, "o", "\u001b[6;52H1\u001b[23;1H"]
+[8.034155, "o", "\u001b[22;112H\u001b[90m.\r\n\u001b(B\u001b[m"]
+[8.042187, "o", "10.99.0.3 : [6], timed out (0.262 avg, 28% loss)\r\n"]
+[8.132017, "o", "\u001b[2;78H8\u001b[6;5H\u001b[1m10.99.0.3\u001b[29C\u001b(B\u001b[m9.1\u001b[6C2\u001b[24;1H"]
+[8.63269, "o", "\u001b[6;42H16.7\u001b[6C3\u001b[24;1H"]
+[9.042179, "o", "10.99.0.3 : [7], timed out (0.262 avg, 37% loss)\r\n"]
+[9.133313, "o", "\u001b[2;78H9\u001b[6;42H23.1\u001b[6C4\u001b[25;1H"]
+[9.634034, "o", "\u001b[6;43H8.6\u001b[6C5\u001b[25;1H"]
+[10.036574, "o", "\u001b[22;113H\u001b[90m.\u001b[25;1H\u001b(B\u001b[m"]
+[10.042143, "o", "10.99.0.3 : [8], timed out (0.262 avg, 44% loss)\r\n"]
+[10.134679, "o", "\u001b[2;77H40\u001b[6;42H33.3\u001b[6C6\u001b[26;1H"]
+[10.635326, "o", "\u001b[6;43H7.5\u001b[6C7\u001b[26;1H"]
+[11.042245, "o", "10.99.0.3 : [9], timed out (0.262 avg, 50% loss)\r\n"]
+[11.13592, "o", "\u001b[2;78H1\u001b[6;42H41.2\u001b[6C8\u001b[27;1H"]
+[11.63663, "o", "\u001b[6;43H4.4\u001b[6C9\u001b[27;1H"]
+[12.039277, "o", "\u001b[22;114H\u001b[90m.\u001b[27;1H\u001b(B\u001b[m"]
+[12.042135, "o", "10.99.0.3 : [10], timed out (0.262 avg, 54% loss)\r\n"]
+[12.137288, "o", "\u001b[2;78H2\u001b[6;43H7\u001b[7C20\u001b[28;1H"]
+[12.637882, "o", "\u001b[6;42H50.0\u001b[6C1\u001b[28;1H"]
+[13.042243, "o", "10.99.0.3 : [11], timed out (0.262 avg, 58% loss)\r\n"]
+[13.138581, "o", "\u001b[2;78H3\u001b[6;43H2.4\u001b[6C2\u001b[29;1H"]
+[13.63923, "o", "\u001b[6;43H4.5\u001b[6C3\u001b[29;1H"]
+[14.041422, "o", "\u001b[22;115H\u001b[90m.\u001b[29;1H\u001b(B\u001b[m"]
+[14.042187, "o", "10.99.0.3 : [12], timed out (0.262 avg, 61% loss)\r\n"]
+[14.139837, "o", "\u001b[2;78H4\u001b[6;43H6\u001b[8C4\u001b[30;1H"]
+[14.640574, "o", "\u001b[6;43H8.3\u001b[6C5\u001b[30;1H"]
+[15.0, "m", "Rerouted via bob"]
+[15.032606, "o", "10.99.0.3 : [13], 64 bytes, 0.494 ms (0.300 avg, 57% loss)\r\n"]
+[15.045596, "o", "\u001b[23;86H\u001b[32m\u001b[1m [15s] \u2713 rerouted through bob!\u001b[31;1H\u001b(B\u001b[m"]
+[15.046676, "o", "\u001b[24;86H\u001b[90m route: alice \u2192 bob \u2192\u001b[31;1H\u001b(B\u001b[m"]
+[15.046754, "o", "\u001b[?25l\u001b[1;86H \u001b[1mbob\u001b(B\u001b[m .2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[K\u001b[2;86H\u001b[K\u001b[90m\n [0s] waiting for mesh convergence..\u001b[39m\u001b[K\u001b[32m\u001b[1m\u001b[4;86H [2s] \u2713 mesh converged\u001b(B\u001b[m\u001b[K\u001b[90m\u001b[5;86H route: alice \u2192 charlie (direct, 1 hop)\u001b[39m\u001b[K\u001b[6;86H\u001b[K\u001b[33m\u001b[1m\n\u2500\u2500 cutting direct link \u2500\u2500\u001b(B\u001b[m\u001b[K\u001b[8;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u001b[31m\u2500\u2500\u2717\u2500\u2500\u2500\u001b[39m \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[10;86H | |\u001b[K\u001b[11;86H \u001b[1mbob\u001b(B\u001b[m .2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[K\u001b[12;86H\u001b[K\n $ iptables -A INPUT -s 172.31.0.12 -j DROP\u001b[K\u001b[14;86H $ iptables -A OUTPUT -d 172.31.0.12 -j DROP\u001b[K\u001b[15;86H\u001b[K\u001b[90m\n [7s] waiting for reroute....\u001b[39m\u001b[K\u001b[32m\u001b[1m\u001b[17;86H [15s] \u2713 rerouted through bob!\u001b(B\u001b[m\u001b[K\u001b[90m\u001b[18;86H route: alice \u2192 bob \u2192 charlie (2 hops)\u001b[39m\u001b[K\u001b[19;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u001b[31m\u2500\u2500\u2717\u2500\u2500\u2500\u001b[39m \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[21;86H \u001b[32m|\u001b[39m \u001b[32m|\u001b[39m\u001b[K\u001b[22;86H \u001b[32m\u001b[1mbob\u001b(B\u001b[m .2 \u001b[32m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[39m\u001b[K\u001b[23;86H\u001b[K\n\u001b[K\u001b[?12l\u001b[?25h\u001b[31;1H"]
+[15.141263, "o", "\u001b[2;78H5\u001b[6;42H60.0\u001b[6C6\u001b[31;1H"]
+[15.141719, "o", "\u001b[6;5H10.99.0.2\u001b[28C59.3\u001b[6C7\u001b[7;5H10.99.0.3\r\n 2. 10.99.0.3\u001b[29C0.0% 1 0.2 0.2 0.2 0.2 0.0\u001b[31;1H"]
+[15.642166, "o", "\u001b[6;43H7.1\u001b[6C8\u001b[6C2\u001b[31;1H"]
+[16.032024, "o", "10.99.0.3 : [14], 64 bytes, 0.472 ms (0.325 avg, 53% loss)\r\n"]
+[16.142436, "o", "\u001b[2;78H6\u001b[32;1H"]
+[16.142903, "o", "\u001b[8;52H2\u001b[6C5 0.3\u001b[11C5 0.2\u001b[32;1H"]
+[16.393353, "o", "\u001b[6;43H5.2\u001b[6C9\u001b[6C4\u001b[32;1H"]
+[16.643837, "o", "\u001b[8;52H3\u001b[12C4\u001b[17C1\u001b[32;1H"]
+[16.893875, "o", "\u001b[6;43H3.3% 30\u001b[6C3\u001b[32;1H"]
+[17.031731, "o", "10.99.0.3 : [15], 64 bytes, 0.462 ms (0.342 avg, 50% loss)\r\n"]
+[17.131426, "o", "\u001b[2;78H7\u001b[33;1H"]
+[17.131914, "o", "\u001b[8;52H4\u001b[6C4\u001b[33;1H"]
+[17.382297, "o", "\u001b[6;43H1.6\u001b[6C1\u001b[33;1H"]
+[17.63246, "o", "\u001b[8;52H5\u001b[6C5\u001b[33;1H"]
+[17.882606, "o", "\u001b[6;43H0.0\u001b[6C2\u001b[33;1H"]
+[18.031723, "o", "10.99.0.3 : [16], 64 bytes, 0.476 ms (0.357 avg, 47% loss)\r\n"]
+[18.132287, "o", "\u001b[2;78H8\u001b[34;1H"]
+[18.132786, "o", "\u001b[8;52H6\u001b[34;1H"]
+[18.383165, "o", "\u001b[6;42H48.5\u001b[6C3\u001b[34;1H"]
+[18.63309, "o", "\u001b[8;52H7\u001b[34;1H"]
+[18.883994, "o", "\u001b[6;43H7.1\u001b[6C4\u001b[6C4\u001b[34;1H"]
+[19.031766, "o", "\u001b[?25l\u001b[15;84H\u001b[1K\r\n10.99.0.3 : [0], 64 bytes, 0.233 ms (0.233 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [1], 64 bytes, 0.255 ms (0.244 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [2], 64 bytes, 0.269 ms (0.252 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [3], 64 bytes, 0.313 ms (0.267 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [4], 64 bytes, 0.239 ms (0.262 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [5], timed out (0.262 avg, 16% loss)\u001b[36X\r\n10.99.0.3 : [6], timed out (0.262 avg, 28% loss)\u001b[36X\r\n10.99.0.3 : [7], timed out (0.262 avg, 37% loss)\u001b[36X\r\n10.99.0.3 : [8], timed out (0.262 avg, 44% loss)\u001b[36X\r\n10.99.0.3 : [9], timed out (0.262 avg, 50% loss)\u001b[36X\r\n10.99.0.3 : [10], timed out (0.262 avg, 54% loss)\u001b[35X\r\n10.99.0.3 : [11], timed out (0.262 avg, 58% loss)\u001b[35X\r\n10.99.0.3 : [12], timed out (0.262 avg, 61% loss)\u001b[35X\r\n10.99.0.3 : [13], 64 bytes, 0.494 ms (0.300 avg, 57% loss)\u001b[26X\r\n10.99.0.3 : [14], 64 bytes, 0.472 ms (0.325 avg, 53% loss)\u001b[26X\r\n10.99.0.3 : [15], 64 bytes, 0.462 ms (0.342 avg, 50% loss)\u001b[26X\r\n10.99.0.3 : [16], 64 bytes, 0.476 ms (0.357 avg, 47% loss)\u001b[26X\r\n10.99.0.3 : [17], 64 bytes, 0.464 ms (0.368 avg, 44% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[19.133679, "o", "\u001b[2;78H9\u001b[34;1H"]
+[19.134106, "o", "\u001b[8;52H8\u001b[6C4\u001b[34;1H"]
+[19.387941, "o", "\u001b[6;43H5.7\u001b[6C5\u001b[6C3\u001b[34;1H"]
+[19.634418, "o", "\u001b[8;52H9\u001b[34;1H"]
+[19.635869, "o", "\u001b[8;57H1.5 0.5\u001b[9C1\u001b[7C4\u001b[34;1H"]
+[19.885124, "o", "\u001b[6;43H4.4\u001b[6C6\u001b[34;1H"]
+[20.0, "m", "Link restored"]
+[20.031856, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [0], 64 bytes, 0.233 ms (0.233 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [1], 64 bytes, 0.255 ms (0.244 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [2], 64 bytes, 0.269 ms (0.252 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [3], 64 bytes, 0.313 ms (0.267 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [4], 64 bytes, 0.239 ms (0.262 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [5], timed out (0.262 avg, 16% loss)\u001b[36X\r\n10.99.0.3 : [6], timed out (0.262 avg, 28% loss)\u001b[36X\r\n10.99.0.3 : [7], timed out (0.262 avg, 37% loss)\u001b[36X\r\n10.99.0.3 : [8], timed out (0.262 avg, 44% loss)\u001b[36X\r\n10.99.0.3 : [9], timed out (0.262 avg, 50% loss)\u001b[36X\r\n10.99.0.3 : [10], timed out (0.262 avg, 54% loss)\u001b[35X\r\n10.99.0.3 : [11], timed out (0.262 avg, 58% loss)\u001b[35X\r\n10.99.0.3 : [12], timed out (0.262 avg, 61% loss)\u001b[35X\r\n10.99.0.3 : [13], 64 bytes, 0.494 ms (0.300 avg, 57% loss)\u001b[26X\r\n10.99.0.3 : [14], 64 bytes, 0.472 ms (0.325 avg, 53% loss)\u001b[26X\r\n10.99.0.3 : [15], 64 bytes, 0.462 ms (0.342 avg, 50% loss)\u001b[26X\r\n10.99.0.3 : [16], 64 bytes, 0.476 ms (0.357 avg, 47% loss)\u001b[26X\r\n10.99.0.3 : [17], 64 bytes, 0.464 ms (0.368 avg, 44% loss)\u001b[26X\r\n10.99.0.3 : [18], 64 bytes, 0.439 ms (0.374 avg, 42% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[20.047754, "o", "\u001b[24;86H\u001b[33m\u001b[1m\u2500\u001b(B\u001b[m\u001b[?12l\u001b[?25h\u001b[?1006l\u001b[?1000l\u001b[?1002l\u001b[?1003l\u001b[1;1H\u001b[1;35r\u001b[24;87H\u001b[33m\u001b[1m\u2500 restoring direct link \u2500\u2500\u001b[34;1H\u001b(B\u001b[m"]
+[20.047814, "o", "\u001b[?25l\u001b[1;86H\u001b[K\u001b[90m\n [0s] waiting for mesh convergence..\u001b[39m\u001b[K\u001b[32m\u001b[1m\u001b[3;86H [2s] \u2713 mesh converged\u001b(B\u001b[m\u001b[K\u001b[90m\u001b[4;86H route: alice \u2192 charlie (direct, 1 hop)\u001b[39m\u001b[K\u001b[5;86H\u001b[K\u001b[33m\u001b[1m\n\u2500\u2500 cutting direct link \u2500\u2500\u001b(B\u001b[m\u001b[K\u001b[7;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u001b[31m\u2500\u2500\u2717\u2500\u2500\u2500\u001b[39m \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[9;86H | |\u001b[K\u001b[10;86H \u001b[1mbob\u001b(B\u001b[m .2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[K\u001b[11;86H\u001b[K\n $ iptables -A INPUT -s 172.31.0.12 -j DROP\u001b[K\u001b[13;86H $ iptables -A OUTPUT -d 172.31.0.12 -j DROP\u001b[K\u001b[14;86H\u001b[K\u001b[90m\n [7s] waiting for reroute....\u001b[39m\u001b[K\u001b[32m\u001b[1m\u001b[16;86H [15s] \u2713 rerouted through bob!\u001b(B\u001b[m\u001b[K\u001b[90m\u001b[17;86H route: alice \u2192 bob \u2192 charlie (2 hops)\u001b[39m\u001b[K\u001b[18;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u001b[31m\u2500\u2500\u2717\u2500\u2500\u2500\u001b[39m \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[20;86H \u001b[32m|\u001b[39m \u001b[32m|\u001b[39m\u001b[K\u001b[21;86H \u001b[32m\u001b[1mbob\u001b(B\u001b[m .2 \u001b[32m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[39m\u001b[K\u001b[22;86H\u001b[K\u001b[33m\u001b[1m\n\u2500\u2500 restoring direct link \u2500\u2500\u001b(B\u001b[m\u001b[K\u001b[24;86H\u001b[K\u001b[?12l\u001b[?25h\u001b[34;1H"]
+[20.048637, "o", "\u001b[?25l\u001b[32m\u001b[1m\u001b[1;86H [2s] \u2713 mesh converged\u001b(B\u001b[m\u001b[K\u001b[90m\u001b[2;86H route: alice \u2192 charlie (direct, 1 hop)\u001b[39m\u001b[K\u001b[3;86H\u001b[K\u001b[33m\u001b[1m\n\u2500\u2500 cutting direct link \u2500\u2500\u001b(B\u001b[m\u001b[K\u001b[5;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u001b[31m\u2500\u2500\u2717\u2500\u2500\u2500\u001b[39m \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[7;86H | |\u001b[K\u001b[8;86H \u001b[1mbob\u001b(B\u001b[m .2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[K\u001b[9;86H\u001b[K\n $ iptables -A INPUT -s 172.31.0.12 -j DROP\u001b[K\u001b[11;86H $ iptables -A OUTPUT -d 172.31.0.12 -j DROP\u001b[K\u001b[12;86H\u001b[K\u001b[90m\n [7s] waiting for reroute....\u001b[39m\u001b[K\u001b[32m\u001b[1m\u001b[14;86H [15s] \u2713 rerouted through bob!\u001b(B\u001b[m\u001b[K\u001b[90m\u001b[15;86H route: alice \u2192 bob \u2192 charlie (2 hops)\u001b[39m\u001b[K\u001b[16;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u001b[31m\u2500\u2500\u2717\u2500\u2500\u2500\u001b[39m \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[18;86H \u001b[32m|\u001b[39m \u001b[32m|\u001b[39m\u001b[K\u001b[19;86H \u001b[32m\u001b[1mbob\u001b(B\u001b[m .2 \u001b[32m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[39m\u001b[K\u001b[20;86H\u001b[K\u001b[33m\u001b[1m\n\u2500\u2500 restoring direct link \u2500\u2500\u001b(B\u001b[m\u001b[K\u001b[22;86H\u001b[K\n $ iptables -F\u001b[K\u001b[24;86H\u001b[K\u001b[?12l\u001b[?25h\u001b[34;1H"]
+[20.066352, "o", "\u001b[?25l\u001b[90m\u001b[1;86H route: alice \u2192 charlie (direct, 1 hop)\u001b[39m\u001b[K\u001b[2;86H\u001b[K\u001b[33m\u001b[1m\n\u2500\u2500 cutting direct link \u2500\u2500\u001b(B\u001b[m\u001b[K\u001b[4;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u001b[31m\u2500\u2500\u2717\u2500\u2500\u2500\u001b[39m \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[6;86H | |\u001b[K\u001b[7;86H \u001b[1mbob\u001b(B\u001b[m .2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[K\u001b[8;86H\u001b[K\n $ iptables -A INPUT -s 172.31.0.12 -j DROP\u001b[K\u001b[10;86H $ iptables -A OUTPUT -d 172.31.0.12 -j DROP\u001b[K\u001b[11;86H\u001b[K\u001b[90m\n [7s] waiting for reroute....\u001b[39m\u001b[K\u001b[32m\u001b[1m\u001b[13;86H [15s] \u2713 rerouted through bob!\u001b(B\u001b[m\u001b[K\u001b[90m\u001b[14;86H route: alice \u2192 bob \u2192 charlie (2 hops)\u001b[39m\u001b[K\u001b[15;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u001b[31m\u2500\u2500\u2717\u2500\u2500\u2500\u001b[39m \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[17;86H \u001b[32m|\u001b[39m \u001b[32m|\u001b[39m\u001b[K\u001b[18;86H \u001b[32m\u001b[1mbob\u001b(B\u001b[m .2 \u001b[32m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[39m\u001b[K\u001b[19;86H\u001b[K\u001b[33m\u001b[1m\n\u2500\u2500 restoring direct link \u2500\u2500\u001b(B\u001b[m\u001b[K\u001b[21;86H\u001b[K\n $ iptables -F\u001b[K\u001b[23;86H\u001b[K\n\u001b[K\u001b[?12l\u001b[?25h\u001b[34;1H"]
+[20.067745, "o", "\u001b[24;86H\u001b[90m [20s] waiting for direct route\u001b[34;1H\u001b(B\u001b[m"]
+[20.070027, "o", "\u001b[24;118H\u001b[90m.\u001b[34;1H\u001b(B\u001b[m"]
+[20.135008, "o", "\u001b[2;77H50\u001b[34;1H"]
+[20.135504, "o", "\u001b[8;51H10 0\u001b[25C3\u001b[34;1H"]
+[20.385864, "o", "\u001b[6;43H3.2\u001b[6C7\u001b[34;1H"]
+[20.635854, "o", "\u001b[8;52H1\u001b[34;1H"]
+[20.636384, "o", "\u001b[8;59H6\u001b[34;1H"]
+[21.031998, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [1], 64 bytes, 0.255 ms (0.244 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [2], 64 bytes, 0.269 ms (0.252 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [3], 64 bytes, 0.313 ms (0.267 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [4], 64 bytes, 0.239 ms (0.262 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [5], timed out (0.262 avg, 16% loss)\u001b[36X\r\n10.99.0.3 : [6], timed out (0.262 avg, 28% loss)\u001b[36X\r\n10.99.0.3 : [7], timed out (0.262 avg, 37% loss)\u001b[36X\r\n10.99.0.3 : [8], timed out (0.262 avg, 44% loss)\u001b[36X\r\n10.99.0.3 : [9], timed out (0.262 avg, 50% loss)\u001b[36X\r\n10.99.0.3 : [10], timed out (0.262 avg, 54% loss)\u001b[35X\r\n10.99.0.3 : [11], timed out (0.262 avg, 58% loss)\u001b[35X\r\n10.99.0.3 : [12], timed out (0.262 avg, 61% loss)\u001b[35X\r\n10.99.0.3 : [13], 64 bytes, 0.494 ms (0.300 avg, 57% loss)\u001b[26X\r\n10.99.0.3 : [14], 64 bytes, 0.472 ms (0.325 avg, 53% loss)\u001b[26X\r\n10.99.0.3 : [15], 64 bytes, 0.462 ms (0.342 avg, 50% loss)\u001b[26X\r\n10.99.0.3 : [16], 64 bytes, 0.476 ms (0.357 avg, 47% loss)\u001b[26X\r\n10.99.0.3 : [17], 64 bytes, 0.464 ms (0.368 avg, 44% loss)\u001b[26X\r\n10.99.0.3 : [18], 64 bytes, 0.439 ms (0.374 avg, 42% loss)\u001b[26X\r\n10.99.0.3 : [19], 64 bytes, 0.425 ms (0.378 avg, 40% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[21.07287, "o", "\u001b[24;119H\u001b[90m.\u001b[34;1H\u001b(B\u001b[m"]
+[21.136199, "o", "\u001b[2;78H1\u001b[6;52H8\u001b[34;1H"]
+[21.136809, "o", "\u001b[8;52H2\u001b[34;1H"]
+[21.387069, "o", "\u001b[6;45H6\u001b[6C9\u001b[6C4\u001b[34;1H"]
+[21.637116, "o", "\u001b[8;52H3\u001b[34;1H"]
+[21.637504, "o", "\u001b[8;59H5\u001b[34;1H"]
+[22.032084, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [2], 64 bytes, 0.269 ms (0.252 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [3], 64 bytes, 0.313 ms (0.267 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [4], 64 bytes, 0.239 ms (0.262 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [5], timed out (0.262 avg, 16% loss)\u001b[36X\r\n10.99.0.3 : [6], timed out (0.262 avg, 28% loss)\u001b[36X\r\n10.99.0.3 : [7], timed out (0.262 avg, 37% loss)\u001b[36X\r\n10.99.0.3 : [8], timed out (0.262 avg, 44% loss)\u001b[36X\r\n10.99.0.3 : [9], timed out (0.262 avg, 50% loss)\u001b[36X\r\n10.99.0.3 : [10], timed out (0.262 avg, 54% loss)\u001b[35X\r\n10.99.0.3 : [11], timed out (0.262 avg, 58% loss)\u001b[35X\r\n10.99.0.3 : [12], timed out (0.262 avg, 61% loss)\u001b[35X\r\n10.99.0.3 : [13], 64 bytes, 0.494 ms (0.300 avg, 57% loss)\u001b[26X\r\n10.99.0.3 : [14], 64 bytes, 0.472 ms (0.325 avg, 53% loss)\u001b[26X\r\n10.99.0.3 : [15], 64 bytes, 0.462 ms (0.342 avg, 50% loss)\u001b[26X\r\n10.99.0.3 : [16], 64 bytes, 0.476 ms (0.357 avg, 47% loss)\u001b[26X\r\n10.99.0.3 : [17], 64 bytes, 0.464 ms (0.368 avg, 44% loss)\u001b[26X\r\n10.99.0.3 : [18], 64 bytes, 0.439 ms (0.374 avg, 42% loss)\u001b[26X\r\n10.99.0.3 : [19], 64 bytes, 0.425 ms (0.378 avg, 40% loss)\u001b[26X\r\n10.99.0.3 : [20], 64 bytes, 0.463 ms (0.385 avg, 38% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[22.076005, "o", "\u001b[24;120H\u001b[90m.\u001b[34;1H\u001b(B\u001b[m"]
+[22.137535, "o", "\u001b[2;78H2\u001b[6;51H40\u001b[34;1H"]
+[22.137975, "o", "\u001b[8;52H4\u001b[6C4\u001b[34;1H"]
+[22.388379, "o", "\u001b[6;45H9\u001b[6C1\u001b[34;1H"]
+[22.638401, "o", "\u001b[8;52H5\u001b[34;1H"]
+[22.638785, "o", "\u001b[8;59H5\u001b[34;1H"]
+[23.032157, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [3], 64 bytes, 0.313 ms (0.267 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [4], 64 bytes, 0.239 ms (0.262 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [5], timed out (0.262 avg, 16% loss)\u001b[36X\r\n10.99.0.3 : [6], timed out (0.262 avg, 28% loss)\u001b[36X\r\n10.99.0.3 : [7], timed out (0.262 avg, 37% loss)\u001b[36X\r\n10.99.0.3 : [8], timed out (0.262 avg, 44% loss)\u001b[36X\r\n10.99.0.3 : [9], timed out (0.262 avg, 50% loss)\u001b[36X\r\n10.99.0.3 : [10], timed out (0.262 avg, 54% loss)\u001b[35X\r\n10.99.0.3 : [11], timed out (0.262 avg, 58% loss)\u001b[35X\r\n10.99.0.3 : [12], timed out (0.262 avg, 61% loss)\u001b[35X\r\n10.99.0.3 : [13], 64 bytes, 0.494 ms (0.300 avg, 57% loss)\u001b[26X\r\n10.99.0.3 : [14], 64 bytes, 0.472 ms (0.325 avg, 53% loss)\u001b[26X\r\n10.99.0.3 : [15], 64 bytes, 0.462 ms (0.342 avg, 50% loss)\u001b[26X\r\n10.99.0.3 : [16], 64 bytes, 0.476 ms (0.357 avg, 47% loss)\u001b[26X\r\n10.99.0.3 : [17], 64 bytes, 0.464 ms (0.368 avg, 44% loss)\u001b[26X\r\n10.99.0.3 : [18], 64 bytes, 0.439 ms (0.374 avg, 42% loss)\u001b[26X\r\n10.99.0.3 : [19], 64 bytes, 0.425 ms (0.378 avg, 40% loss)\u001b[26X\r\n10.99.0.3 : [20], 64 bytes, 0.463 ms (0.385 avg, 38% loss)\u001b[26X\r\n10.99.0.3 : [21], 64 bytes, 0.493 ms (0.393 avg, 36% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[23.078544, "o", "\u001b[24;121H\u001b[90m.\u001b[34;1H\u001b(B\u001b[m"]
+[23.138854, "o", "\u001b[2;78H3\u001b[6;52H2\u001b[8;52H6\u001b[34;1H"]
+[23.3896, "o", "\u001b[6;43H4.2\u001b[6C3\u001b[6C3\u001b[34;1H"]
+[23.639696, "o", "\u001b[8;52H7\u001b[34;1H"]
+[24.032163, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [4], 64 bytes, 0.239 ms (0.262 avg, 0% loss)\u001b[28X\r\n10.99.0.3 : [5], timed out (0.262 avg, 16% loss)\u001b[36X\r\n10.99.0.3 : [6], timed out (0.262 avg, 28% loss)\u001b[36X\r\n10.99.0.3 : [7], timed out (0.262 avg, 37% loss)\u001b[36X\r\n10.99.0.3 : [8], timed out (0.262 avg, 44% loss)\u001b[36X\r\n10.99.0.3 : [9], timed out (0.262 avg, 50% loss)\u001b[36X\r\n10.99.0.3 : [10], timed out (0.262 avg, 54% loss)\u001b[35X\r\n10.99.0.3 : [11], timed out (0.262 avg, 58% loss)\u001b[35X\r\n10.99.0.3 : [12], timed out (0.262 avg, 61% loss)\u001b[35X\r\n10.99.0.3 : [13], 64 bytes, 0.494 ms (0.300 avg, 57% loss)\u001b[26X\r\n10.99.0.3 : [14], 64 bytes, 0.472 ms (0.325 avg, 53% loss)\u001b[26X\r\n10.99.0.3 : [15], 64 bytes, 0.462 ms (0.342 avg, 50% loss)\u001b[26X\r\n10.99.0.3 : [16], 64 bytes, 0.476 ms (0.357 avg, 47% loss)\u001b[26X\r\n10.99.0.3 : [17], 64 bytes, 0.464 ms (0.368 avg, 44% loss)\u001b[26X\r\n10.99.0.3 : [18], 64 bytes, 0.439 ms (0.374 avg, 42% loss)\u001b[26X\r\n10.99.0.3 : [19], 64 bytes, 0.425 ms (0.378 avg, 40% loss)\u001b[26X\r\n10.99.0.3 : [20], 64 bytes, 0.463 ms (0.385 avg, 38% loss)\u001b[26X\r\n10.99.0.3 : [21], 64 bytes, 0.493 ms (0.393 avg, 36% loss)\u001b[26X\r\n10.99.0.3 : [22], 64 bytes, 0.487 ms (0.399 avg, 34% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[24.08153, "o", "\u001b[24;122H\u001b[90m.\u001b[34;1H\u001b(B\u001b[m"]
+[24.1401, "o", "\u001b[2;78H4\u001b[6;52H4\u001b[34;1H\u001b[8;52H8\u001b[34;1H"]
+[24.140685, "o", "\u001b[8;83H2\u001b[34;1H"]
+[24.390855, "o", "\u001b[6;45H4\u001b[6C5\u001b[34;1H"]
+[24.640992, "o", "\u001b[8;52H9\u001b[34;1H"]
+[24.641505, "o", "\u001b[8;59H6\u001b[34;1H"]
+[25.032127, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [5], timed out (0.262 avg, 16% loss)\u001b[36X\r\n10.99.0.3 : [6], timed out (0.262 avg, 28% loss)\u001b[36X\r\n10.99.0.3 : [7], timed out (0.262 avg, 37% loss)\u001b[36X\r\n10.99.0.3 : [8], timed out (0.262 avg, 44% loss)\u001b[36X\r\n10.99.0.3 : [9], timed out (0.262 avg, 50% loss)\u001b[36X\r\n10.99.0.3 : [10], timed out (0.262 avg, 54% loss)\u001b[35X\r\n10.99.0.3 : [11], timed out (0.262 avg, 58% loss)\u001b[35X\r\n10.99.0.3 : [12], timed out (0.262 avg, 61% loss)\u001b[35X\r\n10.99.0.3 : [13], 64 bytes, 0.494 ms (0.300 avg, 57% loss)\u001b[26X\r\n10.99.0.3 : [14], 64 bytes, 0.472 ms (0.325 avg, 53% loss)\u001b[26X\r\n10.99.0.3 : [15], 64 bytes, 0.462 ms (0.342 avg, 50% loss)\u001b[26X\r\n10.99.0.3 : [16], 64 bytes, 0.476 ms (0.357 avg, 47% loss)\u001b[26X\r\n10.99.0.3 : [17], 64 bytes, 0.464 ms (0.368 avg, 44% loss)\u001b[26X\r\n10.99.0.3 : [18], 64 bytes, 0.439 ms (0.374 avg, 42% loss)\u001b[26X\r\n10.99.0.3 : [19], 64 bytes, 0.425 ms (0.378 avg, 40% loss)\u001b[26X\r\n10.99.0.3 : [20], 64 bytes, 0.463 ms (0.385 avg, 38% loss)\u001b[26X\r\n10.99.0.3 : [21], 64 bytes, 0.493 ms (0.393 avg, 36% loss)\u001b[26X\r\n10.99.0.3 : [22], 64 bytes, 0.487 ms (0.399 avg, 34% loss)\u001b[26X\r\n10.99.0.3 : [23], 64 bytes, 0.430 ms (0.401 avg, 33% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[25.08478, "o", "\u001b[24;123H\u001b[90m.\u001b[34;1H\u001b(B\u001b[m"]
+[25.141497, "o", "\u001b[2;78H5\u001b[6;52H6\u001b[34;1H"]
+[25.144551, "o", "\u001b[8;51H20\u001b[6C5\u001b[34;1H"]
+[25.392341, "o", "\u001b[6;45H7\u001b[6C7\u001b[6C4\u001b[34;1H"]
+[25.642905, "o", "\u001b[8;52H1\u001b[6C6\u001b[34;1H"]
+[26.031747, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [6], timed out (0.262 avg, 28% loss)\u001b[36X\r\n10.99.0.3 : [7], timed out (0.262 avg, 37% loss)\u001b[36X\r\n10.99.0.3 : [8], timed out (0.262 avg, 44% loss)\u001b[36X\r\n10.99.0.3 : [9], timed out (0.262 avg, 50% loss)\u001b[36X\r\n10.99.0.3 : [10], timed out (0.262 avg, 54% loss)\u001b[35X\r\n10.99.0.3 : [11], timed out (0.262 avg, 58% loss)\u001b[35X\r\n10.99.0.3 : [12], timed out (0.262 avg, 61% loss)\u001b[35X\r\n10.99.0.3 : [13], 64 bytes, 0.494 ms (0.300 avg, 57% loss)\u001b[26X\r\n10.99.0.3 : [14], 64 bytes, 0.472 ms (0.325 avg, 53% loss)\u001b[26X\r\n10.99.0.3 : [15], 64 bytes, 0.462 ms (0.342 avg, 50% loss)\u001b[26X\r\n10.99.0.3 : [16], 64 bytes, 0.476 ms (0.357 avg, 47% loss)\u001b[26X\r\n10.99.0.3 : [17], 64 bytes, 0.464 ms (0.368 avg, 44% loss)\u001b[26X\r\n10.99.0.3 : [18], 64 bytes, 0.439 ms (0.374 avg, 42% loss)\u001b[26X\r\n10.99.0.3 : [19], 64 bytes, 0.425 ms (0.378 avg, 40% loss)\u001b[26X\r\n10.99.0.3 : [20], 64 bytes, 0.463 ms (0.385 avg, 38% loss)\u001b[26X\r\n10.99.0.3 : [21], 64 bytes, 0.493 ms (0.393 avg, 36% loss)\u001b[26X\r\n10.99.0.3 : [22], 64 bytes, 0.487 ms (0.399 avg, 34% loss)\u001b[26X\r\n10.99.0.3 : [23], 64 bytes, 0.430 ms (0.401 avg, 33% loss)\u001b[26X\r\n10.99.0.3 : [24], 64 bytes, 0.474 ms (0.405 avg, 32% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[26.08763, "o", "\u001b[24;124H\u001b[90m.\u001b[34;1H\u001b(B\u001b[m"]
+[26.142941, "o", "\u001b[2;78H6\u001b[6;52H8\u001b[34;1H"]
+[26.14352, "o", "\u001b[8;52H2\u001b[6C5\u001b[34;1H"]
+[26.393895, "o", "\u001b[6;45H9\u001b[6C9\u001b[34;1H"]
+[26.644429, "o", "\u001b[8;52H3\u001b[34;1H"]
+[27.032208, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [7], timed out (0.262 avg, 37% loss)\u001b[36X\r\n10.99.0.3 : [8], timed out (0.262 avg, 44% loss)\u001b[36X\r\n10.99.0.3 : [9], timed out (0.262 avg, 50% loss)\u001b[36X\r\n10.99.0.3 : [10], timed out (0.262 avg, 54% loss)\u001b[35X\r\n10.99.0.3 : [11], timed out (0.262 avg, 58% loss)\u001b[35X\r\n10.99.0.3 : [12], timed out (0.262 avg, 61% loss)\u001b[35X\r\n10.99.0.3 : [13], 64 bytes, 0.494 ms (0.300 avg, 57% loss)\u001b[26X\r\n10.99.0.3 : [14], 64 bytes, 0.472 ms (0.325 avg, 53% loss)\u001b[26X\r\n10.99.0.3 : [15], 64 bytes, 0.462 ms (0.342 avg, 50% loss)\u001b[26X\r\n10.99.0.3 : [16], 64 bytes, 0.476 ms (0.357 avg, 47% loss)\u001b[26X\r\n10.99.0.3 : [17], 64 bytes, 0.464 ms (0.368 avg, 44% loss)\u001b[26X\r\n10.99.0.3 : [18], 64 bytes, 0.439 ms (0.374 avg, 42% loss)\u001b[26X\r\n10.99.0.3 : [19], 64 bytes, 0.425 ms (0.378 avg, 40% loss)\u001b[26X\r\n10.99.0.3 : [20], 64 bytes, 0.463 ms (0.385 avg, 38% loss)\u001b[26X\r\n10.99.0.3 : [21], 64 bytes, 0.493 ms (0.393 avg, 36% loss)\u001b[26X\r\n10.99.0.3 : [22], 64 bytes, 0.487 ms (0.399 avg, 34% loss)\u001b[26X\r\n10.99.0.3 : [23], 64 bytes, 0.430 ms (0.401 avg, 33% loss)\u001b[26X\r\n10.99.0.3 : [24], 64 bytes, 0.474 ms (0.405 avg, 32% loss)\u001b[26X\r\n10.99.0.3 : [25], 64 bytes, 0.513 ms (0.411 avg, 30% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[27.090827, "o", "\u001b[24;125H\u001b[90m.\u001b[34;1H\u001b(B\u001b[m"]
+[27.144431, "o", "\u001b[2;78H7\u001b[6;51H50\u001b[34;1H"]
+[27.145027, "o", "\u001b[8;52H4\u001b[6C6\u001b[34;1H"]
+[27.395172, "o", "\u001b[6;43H5.1\u001b[6C1\u001b[6C3\u001b[34;1H"]
+[27.645601, "o", "\u001b[8;52H5\u001b[6C4\u001b[34;1H"]
+[28.031965, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [8], timed out (0.262 avg, 44% loss)\u001b[36X\r\n10.99.0.3 : [9], timed out (0.262 avg, 50% loss)\u001b[36X\r\n10.99.0.3 : [10], timed out (0.262 avg, 54% loss)\u001b[35X\r\n10.99.0.3 : [11], timed out (0.262 avg, 58% loss)\u001b[35X\r\n10.99.0.3 : [12], timed out (0.262 avg, 61% loss)\u001b[35X\r\n10.99.0.3 : [13], 64 bytes, 0.494 ms (0.300 avg, 57% loss)\u001b[26X\r\n10.99.0.3 : [14], 64 bytes, 0.472 ms (0.325 avg, 53% loss)\u001b[26X\r\n10.99.0.3 : [15], 64 bytes, 0.462 ms (0.342 avg, 50% loss)\u001b[26X\r\n10.99.0.3 : [16], 64 bytes, 0.476 ms (0.357 avg, 47% loss)\u001b[26X\r\n10.99.0.3 : [17], 64 bytes, 0.464 ms (0.368 avg, 44% loss)\u001b[26X\r\n10.99.0.3 : [18], 64 bytes, 0.439 ms (0.374 avg, 42% loss)\u001b[26X\r\n10.99.0.3 : [19], 64 bytes, 0.425 ms (0.378 avg, 40% loss)\u001b[26X\r\n10.99.0.3 : [20], 64 bytes, 0.463 ms (0.385 avg, 38% loss)\u001b[26X\r\n10.99.0.3 : [21], 64 bytes, 0.493 ms (0.393 avg, 36% loss)\u001b[26X\r\n10.99.0.3 : [22], 64 bytes, 0.487 ms (0.399 avg, 34% loss)\u001b[26X\r\n10.99.0.3 : [23], 64 bytes, 0.430 ms (0.401 avg, 33% loss)\u001b[26X\r\n10.99.0.3 : [24], 64 bytes, 0.474 ms (0.405 avg, 32% loss)\u001b[26X\r\n10.99.0.3 : [25], 64 bytes, 0.513 ms (0.411 avg, 30% loss)\u001b[26X\r\n10.99.0.3 : [26], 64 bytes, 0.427 ms (0.412 avg, 29% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[28.093674, "o", "\u001b[24;126H\u001b[90m.\u001b[34;1H\u001b(B\u001b[m"]
+[28.145804, "o", "\u001b[2;78H8\u001b[6;52H2\u001b[34;1H"]
+[28.146364, "o", "\u001b[8;52H6\u001b[6C5\u001b[34;1H"]
+[28.396603, "o", "\u001b[6;45H3\u001b[6C3\u001b[34;1H"]
+[28.647156, "o", "\u001b[8;52H7\u001b[34;1H"]
+[29.031781, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [9], timed out (0.262 avg, 50% loss)\u001b[36X\r\n10.99.0.3 : [10], timed out (0.262 avg, 54% loss)\u001b[35X\r\n10.99.0.3 : [11], timed out (0.262 avg, 58% loss)\u001b[35X\r\n10.99.0.3 : [12], timed out (0.262 avg, 61% loss)\u001b[35X\r\n10.99.0.3 : [13], 64 bytes, 0.494 ms (0.300 avg, 57% loss)\u001b[26X\r\n10.99.0.3 : [14], 64 bytes, 0.472 ms (0.325 avg, 53% loss)\u001b[26X\r\n10.99.0.3 : [15], 64 bytes, 0.462 ms (0.342 avg, 50% loss)\u001b[26X\r\n10.99.0.3 : [16], 64 bytes, 0.476 ms (0.357 avg, 47% loss)\u001b[26X\r\n10.99.0.3 : [17], 64 bytes, 0.464 ms (0.368 avg, 44% loss)\u001b[26X\r\n10.99.0.3 : [18], 64 bytes, 0.439 ms (0.374 avg, 42% loss)\u001b[26X\r\n10.99.0.3 : [19], 64 bytes, 0.425 ms (0.378 avg, 40% loss)\u001b[26X\r\n10.99.0.3 : [20], 64 bytes, 0.463 ms (0.385 avg, 38% loss)\u001b[26X\r\n10.99.0.3 : [21], 64 bytes, 0.493 ms (0.393 avg, 36% loss)\u001b[26X\r\n10.99.0.3 : [22], 64 bytes, 0.487 ms (0.399 avg, 34% loss)\u001b[26X\r\n10.99.0.3 : [23], 64 bytes, 0.430 ms (0.401 avg, 33% loss)\u001b[26X\r\n10.99.0.3 : [24], 64 bytes, 0.474 ms (0.405 avg, 32% loss)\u001b[26X\r\n10.99.0.3 : [25], 64 bytes, 0.513 ms (0.411 avg, 30% loss)\u001b[26X\r\n10.99.0.3 : [26], 64 bytes, 0.427 ms (0.412 avg, 29% loss)\u001b[26X\r\n10.99.0.3 : [27], 64 bytes, 0.428 ms (0.413 avg, 28% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[29.096412, "o", "\u001b[24;127H\u001b[90m.\u001b[34;1H\u001b(B\u001b[m"]
+[29.147287, "o", "\u001b[2;78H9\u001b[6;52H4\u001b[34;1H"]
+[29.147813, "o", "\u001b[8;52H8\u001b[34;1H"]
+[29.39816, "o", "\u001b[6;45H5\u001b[6C5\u001b[6C4\u001b[34;1H"]
+[29.648512, "o", "\u001b[8;52H9\u001b[34;1H"]
+[30.031989, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [10], timed out (0.262 avg, 54% loss)\u001b[35X\r\n10.99.0.3 : [11], timed out (0.262 avg, 58% loss)\u001b[35X\r\n10.99.0.3 : [12], timed out (0.262 avg, 61% loss)\u001b[35X\r\n10.99.0.3 : [13], 64 bytes, 0.494 ms (0.300 avg, 57% loss)\u001b[26X\r\n10.99.0.3 : [14], 64 bytes, 0.472 ms (0.325 avg, 53% loss)\u001b[26X\r\n10.99.0.3 : [15], 64 bytes, 0.462 ms (0.342 avg, 50% loss)\u001b[26X\r\n10.99.0.3 : [16], 64 bytes, 0.476 ms (0.357 avg, 47% loss)\u001b[26X\r\n10.99.0.3 : [17], 64 bytes, 0.464 ms (0.368 avg, 44% loss)\u001b[26X\r\n10.99.0.3 : [18], 64 bytes, 0.439 ms (0.374 avg, 42% loss)\u001b[26X\r\n10.99.0.3 : [19], 64 bytes, 0.425 ms (0.378 avg, 40% loss)\u001b[26X\r\n10.99.0.3 : [20], 64 bytes, 0.463 ms (0.385 avg, 38% loss)\u001b[26X\r\n10.99.0.3 : [21], 64 bytes, 0.493 ms (0.393 avg, 36% loss)\u001b[26X\r\n10.99.0.3 : [22], 64 bytes, 0.487 ms (0.399 avg, 34% loss)\u001b[26X\r\n10.99.0.3 : [23], 64 bytes, 0.430 ms (0.401 avg, 33% loss)\u001b[26X\r\n10.99.0.3 : [24], 64 bytes, 0.474 ms (0.405 avg, 32% loss)\u001b[26X\r\n10.99.0.3 : [25], 64 bytes, 0.513 ms (0.411 avg, 30% loss)\u001b[26X\r\n10.99.0.3 : [26], 64 bytes, 0.427 ms (0.412 avg, 29% loss)\u001b[26X\r\n10.99.0.3 : [27], 64 bytes, 0.428 ms (0.413 avg, 28% loss)\u001b[26X\r\n10.99.0.3 : [28], 64 bytes, 0.453 ms (0.415 avg, 27% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[30.099245, "o", "\u001b[24;128H\u001b[90m.\u001b[34;1H\u001b(B\u001b[m"]
+[30.148698, "o", "\u001b[2;75H1:00\u001b[6;52H6\u001b[34;1H"]
+[30.149247, "o", "\u001b[8;51H30\u001b[34;1H"]
+[30.39953, "o", "\u001b[6;45H6\u001b[6C7\u001b[6C3\u001b[34;1H"]
+[30.649975, "o", "\u001b[8;52H1\u001b[34;1H"]
+[31.032018, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [11], timed out (0.262 avg, 58% loss)\u001b[35X\r\n10.99.0.3 : [12], timed out (0.262 avg, 61% loss)\u001b[35X\r\n10.99.0.3 : [13], 64 bytes, 0.494 ms (0.300 avg, 57% loss)\u001b[26X\r\n10.99.0.3 : [14], 64 bytes, 0.472 ms (0.325 avg, 53% loss)\u001b[26X\r\n10.99.0.3 : [15], 64 bytes, 0.462 ms (0.342 avg, 50% loss)\u001b[26X\r\n10.99.0.3 : [16], 64 bytes, 0.476 ms (0.357 avg, 47% loss)\u001b[26X\r\n10.99.0.3 : [17], 64 bytes, 0.464 ms (0.368 avg, 44% loss)\u001b[26X\r\n10.99.0.3 : [18], 64 bytes, 0.439 ms (0.374 avg, 42% loss)\u001b[26X\r\n10.99.0.3 : [19], 64 bytes, 0.425 ms (0.378 avg, 40% loss)\u001b[26X\r\n10.99.0.3 : [20], 64 bytes, 0.463 ms (0.385 avg, 38% loss)\u001b[26X\r\n10.99.0.3 : [21], 64 bytes, 0.493 ms (0.393 avg, 36% loss)\u001b[26X\r\n10.99.0.3 : [22], 64 bytes, 0.487 ms (0.399 avg, 34% loss)\u001b[26X\r\n10.99.0.3 : [23], 64 bytes, 0.430 ms (0.401 avg, 33% loss)\u001b[26X\r\n10.99.0.3 : [24], 64 bytes, 0.474 ms (0.405 avg, 32% loss)\u001b[26X\r\n10.99.0.3 : [25], 64 bytes, 0.513 ms (0.411 avg, 30% loss)\u001b[26X\r\n10.99.0.3 : [26], 64 bytes, 0.427 ms (0.412 avg, 29% loss)\u001b[26X\r\n10.99.0.3 : [27], 64 bytes, 0.428 ms (0.413 avg, 28% loss)\u001b[26X\r\n10.99.0.3 : [28], 64 bytes, 0.453 ms (0.415 avg, 27% loss)\u001b[26X\r\n10.99.0.3 : [29], 64 bytes, 0.410 ms (0.415 avg, 26% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[31.102219, "o", "\u001b[24;129H\u001b[90m.\u001b[34;1H\u001b(B\u001b[m"]
+[31.149905, "o", "\u001b[2;78H1\u001b[6;52H8\u001b[34;1H"]
+[31.150458, "o", "\u001b[8;52H2\u001b[34;1H"]
+[31.400561, "o", "\u001b[6;45H8\u001b[6C9\u001b[34;1H"]
+[31.651297, "o", "\u001b[8;52H3\u001b[34;1H"]
+[32.032024, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [12], timed out (0.262 avg, 61% loss)\u001b[35X\r\n10.99.0.3 : [13], 64 bytes, 0.494 ms (0.300 avg, 57% loss)\u001b[26X\r\n10.99.0.3 : [14], 64 bytes, 0.472 ms (0.325 avg, 53% loss)\u001b[26X\r\n10.99.0.3 : [15], 64 bytes, 0.462 ms (0.342 avg, 50% loss)\u001b[26X\r\n10.99.0.3 : [16], 64 bytes, 0.476 ms (0.357 avg, 47% loss)\u001b[26X\r\n10.99.0.3 : [17], 64 bytes, 0.464 ms (0.368 avg, 44% loss)\u001b[26X\r\n10.99.0.3 : [18], 64 bytes, 0.439 ms (0.374 avg, 42% loss)\u001b[26X\r\n10.99.0.3 : [19], 64 bytes, 0.425 ms (0.378 avg, 40% loss)\u001b[26X\r\n10.99.0.3 : [20], 64 bytes, 0.463 ms (0.385 avg, 38% loss)\u001b[26X\r\n10.99.0.3 : [21], 64 bytes, 0.493 ms (0.393 avg, 36% loss)\u001b[26X\r\n10.99.0.3 : [22], 64 bytes, 0.487 ms (0.399 avg, 34% loss)\u001b[26X\r\n10.99.0.3 : [23], 64 bytes, 0.430 ms (0.401 avg, 33% loss)\u001b[26X\r\n10.99.0.3 : [24], 64 bytes, 0.474 ms (0.405 avg, 32% loss)\u001b[26X\r\n10.99.0.3 : [25], 64 bytes, 0.513 ms (0.411 avg, 30% loss)\u001b[26X\r\n10.99.0.3 : [26], 64 bytes, 0.427 ms (0.412 avg, 29% loss)\u001b[26X\r\n10.99.0.3 : [27], 64 bytes, 0.428 ms (0.413 avg, 28% loss)\u001b[26X\r\n10.99.0.3 : [28], 64 bytes, 0.453 ms (0.415 avg, 27% loss)\u001b[26X\r\n10.99.0.3 : [29], 64 bytes, 0.410 ms (0.415 avg, 26% loss)\u001b[26X\r\n10.99.0.3 : [30], 64 bytes, 0.405 ms (0.414 avg, 25% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[32.105093, "o", "\u001b[24;130H\u001b[90m.\u001b[34;1H\u001b(B\u001b[m"]
+[32.151094, "o", "\u001b[2;78H2\u001b[6;51H60\u001b[34;1H"]
+[32.151595, "o", "\u001b[8;52H4\u001b[34;1H"]
+[32.401952, "o", "\u001b[6;45H9\u001b[6C1\u001b[34;1H"]
+[32.652464, "o", "\u001b[8;52H5\u001b[34;1H"]
+[33.032157, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [13], 64 bytes, 0.494 ms (0.300 avg, 57% loss)\u001b[26X\r\n10.99.0.3 : [14], 64 bytes, 0.472 ms (0.325 avg, 53% loss)\u001b[26X\r\n10.99.0.3 : [15], 64 bytes, 0.462 ms (0.342 avg, 50% loss)\u001b[26X\r\n10.99.0.3 : [16], 64 bytes, 0.476 ms (0.357 avg, 47% loss)\u001b[26X\r\n10.99.0.3 : [17], 64 bytes, 0.464 ms (0.368 avg, 44% loss)\u001b[26X\r\n10.99.0.3 : [18], 64 bytes, 0.439 ms (0.374 avg, 42% loss)\u001b[26X\r\n10.99.0.3 : [19], 64 bytes, 0.425 ms (0.378 avg, 40% loss)\u001b[26X\r\n10.99.0.3 : [20], 64 bytes, 0.463 ms (0.385 avg, 38% loss)\u001b[26X\r\n10.99.0.3 : [21], 64 bytes, 0.493 ms (0.393 avg, 36% loss)\u001b[26X\r\n10.99.0.3 : [22], 64 bytes, 0.487 ms (0.399 avg, 34% loss)\u001b[26X\r\n10.99.0.3 : [23], 64 bytes, 0.430 ms (0.401 avg, 33% loss)\u001b[26X\r\n10.99.0.3 : [24], 64 bytes, 0.474 ms (0.405 avg, 32% loss)\u001b[26X\r\n10.99.0.3 : [25], 64 bytes, 0.513 ms (0.411 avg, 30% loss)\u001b[26X\r\n10.99.0.3 : [26], 64 bytes, 0.427 ms (0.412 avg, 29% loss)\u001b[26X\r\n10.99.0.3 : [27], 64 bytes, 0.428 ms (0.413 avg, 28% loss)\u001b[26X\r\n10.99.0.3 : [28], 64 bytes, 0.453 ms (0.415 avg, 27% loss)\u001b[26X\r\n10.99.0.3 : [29], 64 bytes, 0.410 ms (0.415 avg, 26% loss)\u001b[26X\r\n10.99.0.3 : [30], 64 bytes, 0.405 ms (0.414 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [31], 64 bytes, 0.508 ms (0.418 avg, 25% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[33.1079, "o", "\u001b[24;131H\u001b[90m.\u001b[34;1H\u001b(B\u001b[m"]
+[33.152296, "o", "\u001b[2;78H3\u001b[6;52H2\u001b[34;1H"]
+[33.152852, "o", "\u001b[8;52H6\u001b[34;1H"]
+[33.40309, "o", "\u001b[6;43H6.0\u001b[6C3\u001b[34;1H"]
+[33.653518, "o", "\u001b[8;52H7\u001b[6C4\u001b[34;1H"]
+[34.032055, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [14], 64 bytes, 0.472 ms (0.325 avg, 53% loss)\u001b[26X\r\n10.99.0.3 : [15], 64 bytes, 0.462 ms (0.342 avg, 50% loss)\u001b[26X\r\n10.99.0.3 : [16], 64 bytes, 0.476 ms (0.357 avg, 47% loss)\u001b[26X\r\n10.99.0.3 : [17], 64 bytes, 0.464 ms (0.368 avg, 44% loss)\u001b[26X\r\n10.99.0.3 : [18], 64 bytes, 0.439 ms (0.374 avg, 42% loss)\u001b[26X\r\n10.99.0.3 : [19], 64 bytes, 0.425 ms (0.378 avg, 40% loss)\u001b[26X\r\n10.99.0.3 : [20], 64 bytes, 0.463 ms (0.385 avg, 38% loss)\u001b[26X\r\n10.99.0.3 : [21], 64 bytes, 0.493 ms (0.393 avg, 36% loss)\u001b[26X\r\n10.99.0.3 : [22], 64 bytes, 0.487 ms (0.399 avg, 34% loss)\u001b[26X\r\n10.99.0.3 : [23], 64 bytes, 0.430 ms (0.401 avg, 33% loss)\u001b[26X\r\n10.99.0.3 : [24], 64 bytes, 0.474 ms (0.405 avg, 32% loss)\u001b[26X\r\n10.99.0.3 : [25], 64 bytes, 0.513 ms (0.411 avg, 30% loss)\u001b[26X\r\n10.99.0.3 : [26], 64 bytes, 0.427 ms (0.412 avg, 29% loss)\u001b[26X\r\n10.99.0.3 : [27], 64 bytes, 0.428 ms (0.413 avg, 28% loss)\u001b[26X\r\n10.99.0.3 : [28], 64 bytes, 0.453 ms (0.415 avg, 27% loss)\u001b[26X\r\n10.99.0.3 : [29], 64 bytes, 0.410 ms (0.415 avg, 26% loss)\u001b[26X\r\n10.99.0.3 : [30], 64 bytes, 0.405 ms (0.414 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [31], 64 bytes, 0.508 ms (0.418 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [32], 64 bytes, 0.482 ms (0.421 avg, 24% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[34.111062, "o", "\u001b[24;132H\u001b[90m.\u001b[34;1H\u001b(B\u001b[m"]
+[34.15341, "o", "\u001b[2;78H4\u001b[6;52H4\u001b[34;1H"]
+[34.153877, "o", "\u001b[8;52H8\u001b[34;1H"]
+[34.404287, "o", "\u001b[6;45H2\u001b[6C5\u001b[34;1H"]
+[34.654685, "o", "\u001b[8;52H9\u001b[34;1H"]
+[34.90473, "o", "\u001b[1;13r\u001b[9;84H\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\n\u001b[1K\u001b[5A\u001b[1K\u001b[6;13H3\u001b[29C5.5\u001b[6C6\u001b[7;13H2\u001b[1;35r\u001b[34;1H"]
+[35.031624, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [15], 64 bytes, 0.462 ms (0.342 avg, 50% loss)\u001b[26X\r\n10.99.0.3 : [16], 64 bytes, 0.476 ms (0.357 avg, 47% loss)\u001b[26X\r\n10.99.0.3 : [17], 64 bytes, 0.464 ms (0.368 avg, 44% loss)\u001b[26X\r\n10.99.0.3 : [18], 64 bytes, 0.439 ms (0.374 avg, 42% loss)\u001b[26X\r\n10.99.0.3 : [19], 64 bytes, 0.425 ms (0.378 avg, 40% loss)\u001b[26X\r\n10.99.0.3 : [20], 64 bytes, 0.463 ms (0.385 avg, 38% loss)\u001b[26X\r\n10.99.0.3 : [21], 64 bytes, 0.493 ms (0.393 avg, 36% loss)\u001b[26X\r\n10.99.0.3 : [22], 64 bytes, 0.487 ms (0.399 avg, 34% loss)\u001b[26X\r\n10.99.0.3 : [23], 64 bytes, 0.430 ms (0.401 avg, 33% loss)\u001b[26X\r\n10.99.0.3 : [24], 64 bytes, 0.474 ms (0.405 avg, 32% loss)\u001b[26X\r\n10.99.0.3 : [25], 64 bytes, 0.513 ms (0.411 avg, 30% loss)\u001b[26X\r\n10.99.0.3 : [26], 64 bytes, 0.427 ms (0.412 avg, 29% loss)\u001b[26X\r\n10.99.0.3 : [27], 64 bytes, 0.428 ms (0.413 avg, 28% loss)\u001b[26X\r\n10.99.0.3 : [28], 64 bytes, 0.453 ms (0.415 avg, 27% loss)\u001b[26X\r\n10.99.0.3 : [29], 64 bytes, 0.410 ms (0.415 avg, 26% loss)\u001b[26X\r\n10.99.0.3 : [30], 64 bytes, 0.405 ms (0.414 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [31], 64 bytes, 0.508 ms (0.418 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [32], 64 bytes, 0.482 ms (0.421 avg, 24% loss)\u001b[26X\r\n10.99.0.3 : [33], 64 bytes, 0.312 ms (0.416 avg, 23% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[35.114068, "o", "\u001b[?25l\u001b[1;86H\u001b[K\u001b[33m\u001b[1m\n\u2500\u2500 cutting direct link \u2500\u2500\u001b(B\u001b[m\u001b[K\u001b[3;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u001b[31m\u2500\u2500\u2717\u2500\u2500\u2500\u001b[39m \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[5;86H | |\u001b[K\u001b[6;86H \u001b[1mbob\u001b(B\u001b[m .2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[K\u001b[7;86H\u001b[K\n $ iptables -A INPUT -s 172.31.0.12 -j DROP\u001b[K\u001b[9;86H $ iptables -A OUTPUT -d 172.31.0.12 -j DROP\u001b[K\u001b[10;86H\u001b[K\u001b[90m\n [7s] waiting for reroute....\u001b[39m\u001b[K\u001b[32m\u001b[1m\u001b[12;86H [15s] \u2713 rerouted through bob!\u001b(B\u001b[m\u001b[K\u001b[90m\u001b[13;86H route: alice \u2192 bob \u2192 charlie (2 hops)\u001b[39m\u001b[K\u001b[14;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u001b[31m\u2500\u2500\u2717\u2500\u2500\u2500\u001b[39m \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[16;86H \u001b[32m|\u001b[39m \u001b[32m|\u001b[39m\u001b[K\u001b[17;86H \u001b[32m\u001b[1mbob\u001b(B\u001b[m .2 \u001b[32m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[39m\u001b[K\u001b[18;86H\u001b[K\u001b[33m\u001b[1m\n\u2500\u2500 restoring direct link \u2500\u2500\u001b(B\u001b[m\u001b[K\u001b[20;86H\u001b[K\n $ iptables -F\u001b[K\u001b[22;86H\u001b[K\u001b[90m\n [20s] waiting for direct route...............\u001b[39m\u001b[K\u001b[24;86H\u001b[K\u001b[?12l\u001b[?25h\u001b[34;1H"]
+[35.11508, "o", "\u001b[24;86H\u001b[32m\u001b[1m [36s] \u2713\u001b[34;1H\u001b(B\u001b[m"]
+[35.115148, "o", "\u001b[?25l\u001b[33m\u001b[1m\u001b[1;86H\u2500\u2500 cutting direct link \u2500\u2500\u001b(B\u001b[m\u001b[K\u001b[2;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u001b[31m\u2500\u2500\u2717\u2500\u2500\u2500\u001b[39m \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[4;86H | |\u001b[K\u001b[5;86H \u001b[1mbob\u001b(B\u001b[m .2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[K\u001b[6;86H\u001b[K\n $ iptables -A INPUT -s 172.31.0.12 -j DROP\u001b[K\u001b[8;86H $ iptables -A OUTPUT -d 172.31.0.12 -j DROP\u001b[K\u001b[9;86H\u001b[K\u001b[90m\n [7s] waiting for reroute....\u001b[39m\u001b[K\u001b[32m\u001b[1m\u001b[11;86H [15s] \u2713 rerouted through bob!\u001b(B\u001b[m\u001b[K\u001b[90m\u001b[12;86H route: alice \u2192 bob \u2192 charlie (2 hops)\u001b[39m\u001b[K\u001b[13;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u001b[31m\u2500\u2500\u2717\u2500\u2500\u2500\u001b[39m \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[15;86H \u001b[32m|\u001b[39m \u001b[32m|\u001b[39m\u001b[K\u001b[16;86H \u001b[32m\u001b[1mbob\u001b(B\u001b[m .2 \u001b[32m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[39m\u001b[K\u001b[17;86H\u001b[K\u001b[33m\u001b[1m\n\u2500\u2500 restoring direct link \u2500\u2500\u001b(B\u001b[m\u001b[K\u001b[19;86H\u001b[K\n $ iptables -F\u001b[K\u001b[21;86H\u001b[K\u001b[90m\n [20s] waiting for direct route...............\u001b[39m\u001b[K\u001b[32m\u001b[1m\u001b[23;86H [36s] \u2713 direct link restored\u001b(B\u001b[m\u001b[K\u001b[24;86H\u001b[K\u001b[?12l\u001b[?25h\u001b[34;1H"]
+[35.115844, "o", "\u001b[24;86H\u001b[90m route: alice \u2192\u001b[34;1H\u001b(B\u001b[m"]
+[35.115895, "o", "\u001b[?25l\u001b[1;86H | |\u001b[K\u001b[2;86H \u001b[1mbob\u001b(B\u001b[m .2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[K\u001b[3;86H\u001b[K\n $ iptables -A INPUT -s 172.31.0.12 -j DROP\u001b[K\u001b[5;86H $ iptables -A OUTPUT -d 172.31.0.12 -j DROP\u001b[K\u001b[6;86H\u001b[K\u001b[90m\n [7s] waiting for reroute....\u001b[39m\u001b[K\u001b[32m\u001b[1m\u001b[8;86H [15s] \u2713 rerouted through bob!\u001b(B\u001b[m\u001b[K\u001b[90m\u001b[9;86H route: alice \u2192 bob \u2192 charlie (2 hops)\u001b[39m\u001b[K\u001b[10;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u001b[31m\u2500\u2500\u2717\u2500\u2500\u2500\u001b[39m \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[12;86H \u001b[32m|\u001b[39m \u001b[32m|\u001b[39m\u001b[K\u001b[13;86H \u001b[32m\u001b[1mbob\u001b(B\u001b[m .2 \u001b[32m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[39m\u001b[K\u001b[14;86H\u001b[K\u001b[33m\u001b[1m\n\u2500\u2500 restoring direct link \u2500\u2500\u001b(B\u001b[m\u001b[K\u001b[16;86H\u001b[K\n $ iptables -F\u001b[K\u001b[18;86H\u001b[K\u001b[90m\n [20s] waiting for direct route...............\u001b[39m\u001b[K\u001b[32m\u001b[1m\u001b[20;86H [36s] \u2713 direct link restored\u001b(B\u001b[m\u001b[K\u001b[90m\u001b[21;86H route: alice \u2192 charlie (direct, 1 hop)\u001b[39m\u001b[K\u001b[22;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u001b[32m\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[24;86H\u001b[K\u001b[?12l\u001b[?25h\u001b[34;1H"]
+[35.115945, "o", "\u001b[?25l\u001b[90m\u001b[1;86H [7s] waiting for reroute....\u001b[39m\u001b[K\u001b[32m\u001b[1m\u001b[2;86H [15s] \u2713 rerouted through bob!\u001b(B\u001b[m\u001b[K\u001b[90m\u001b[3;86H route: alice \u2192 bob \u2192 charlie (2 hops)\u001b[39m\u001b[K\u001b[4;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u001b[31m\u2500\u2500\u2717\u2500\u2500\u2500\u001b[39m \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[6;86H \u001b[32m|\u001b[39m \u001b[32m|\u001b[39m\u001b[K\u001b[7;86H \u001b[32m\u001b[1mbob\u001b(B\u001b[m .2 \u001b[32m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[39m\u001b[K\u001b[8;86H\u001b[K\u001b[33m\u001b[1m\n\u2500\u2500 restoring direct link \u2500\u2500\u001b(B\u001b[m\u001b[K\u001b[10;86H\u001b[K\n $ iptables -F\u001b[K\u001b[12;86H\u001b[K\u001b[90m\n [20s] waiting for direct route...............\u001b[39m\u001b[K\u001b[32m\u001b[1m\u001b[14;86H [36s] \u2713 direct link restored\u001b(B\u001b[m\u001b[K\u001b[90m\u001b[15;86H route: alice \u2192 charlie (direct, 1 hop)\u001b[39m\u001b[K\u001b[16;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u001b[32m\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[18;86H | |\u001b[K\u001b[19;86H \u001b[1mbob\u001b(B\u001b[m .2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[K\u001b[20;86H\u001b[K\u001b[36m\u001b[1m\n Zero config changes. Routes healed automatically.\u001b(B\u001b[m\u001b[K\u001b[36m\u001b[1m\u001b[22;86H https://github.com/encodeous/nylon\u001b(B\u001b[m\u001b[K\u001b[23;86H\u001b[K\n\u001b[K\u001b[?12l\u001b[?25h\u001b[34;1H"]
+[35.11686, "o", "\u001b[24;86H\u001b[90m exiting in 10s... \u001b[34;1H\u001b(B\u001b[m"]
+[35.154548, "o", "\u001b[2;78H5\u001b[34;1H"]
+[35.405329, "o", "\u001b[6;43H4.8\u001b[6C7\u001b[34;1H"]
+[35.905422, "o", "\u001b[6;45H1\u001b[6C8\u001b[34;1H"]
+[36.0, "m", "Direct route restored"]
+[36.031671, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [16], 64 bytes, 0.476 ms (0.357 avg, 47% loss)\u001b[26X\r\n10.99.0.3 : [17], 64 bytes, 0.464 ms (0.368 avg, 44% loss)\u001b[26X\r\n10.99.0.3 : [18], 64 bytes, 0.439 ms (0.374 avg, 42% loss)\u001b[26X\r\n10.99.0.3 : [19], 64 bytes, 0.425 ms (0.378 avg, 40% loss)\u001b[26X\r\n10.99.0.3 : [20], 64 bytes, 0.463 ms (0.385 avg, 38% loss)\u001b[26X\r\n10.99.0.3 : [21], 64 bytes, 0.493 ms (0.393 avg, 36% loss)\u001b[26X\r\n10.99.0.3 : [22], 64 bytes, 0.487 ms (0.399 avg, 34% loss)\u001b[26X\r\n10.99.0.3 : [23], 64 bytes, 0.430 ms (0.401 avg, 33% loss)\u001b[26X\r\n10.99.0.3 : [24], 64 bytes, 0.474 ms (0.405 avg, 32% loss)\u001b[26X\r\n10.99.0.3 : [25], 64 bytes, 0.513 ms (0.411 avg, 30% loss)\u001b[26X\r\n10.99.0.3 : [26], 64 bytes, 0.427 ms (0.412 avg, 29% loss)\u001b[26X\r\n10.99.0.3 : [27], 64 bytes, 0.428 ms (0.413 avg, 28% loss)\u001b[26X\r\n10.99.0.3 : [28], 64 bytes, 0.453 ms (0.415 avg, 27% loss)\u001b[26X\r\n10.99.0.3 : [29], 64 bytes, 0.410 ms (0.415 avg, 26% loss)\u001b[26X\r\n10.99.0.3 : [30], 64 bytes, 0.405 ms (0.414 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [31], 64 bytes, 0.508 ms (0.418 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [32], 64 bytes, 0.482 ms (0.421 avg, 24% loss)\u001b[26X\r\n10.99.0.3 : [33], 64 bytes, 0.312 ms (0.416 avg, 23% loss)\u001b[26X\r\n10.99.0.3 : [34], 64 bytes, 0.317 ms (0.413 avg, 22% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[36.117962, "o", "\u001b[24;86H\u001b[90m exiting in 9s... \u001b[34;1H\u001b(B\u001b[m"]
+[36.405666, "o", "\u001b[2;78H6\u001b[34;1H"]
+[36.405997, "o", "\u001b[6;43H3.5\u001b[6C9\u001b[34;1H"]
+[36.906267, "o", "\u001b[6;43H2.9% 70\u001b[6C4\u001b[34;1H"]
+[37.031823, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [17], 64 bytes, 0.464 ms (0.368 avg, 44% loss)\u001b[26X\r\n10.99.0.3 : [18], 64 bytes, 0.439 ms (0.374 avg, 42% loss)\u001b[26X\r\n10.99.0.3 : [19], 64 bytes, 0.425 ms (0.378 avg, 40% loss)\u001b[26X\r\n10.99.0.3 : [20], 64 bytes, 0.463 ms (0.385 avg, 38% loss)\u001b[26X\r\n10.99.0.3 : [21], 64 bytes, 0.493 ms (0.393 avg, 36% loss)\u001b[26X\r\n10.99.0.3 : [22], 64 bytes, 0.487 ms (0.399 avg, 34% loss)\u001b[26X\r\n10.99.0.3 : [23], 64 bytes, 0.430 ms (0.401 avg, 33% loss)\u001b[26X\r\n10.99.0.3 : [24], 64 bytes, 0.474 ms (0.405 avg, 32% loss)\u001b[26X\r\n10.99.0.3 : [25], 64 bytes, 0.513 ms (0.411 avg, 30% loss)\u001b[26X\r\n10.99.0.3 : [26], 64 bytes, 0.427 ms (0.412 avg, 29% loss)\u001b[26X\r\n10.99.0.3 : [27], 64 bytes, 0.428 ms (0.413 avg, 28% loss)\u001b[26X\r\n10.99.0.3 : [28], 64 bytes, 0.453 ms (0.415 avg, 27% loss)\u001b[26X\r\n10.99.0.3 : [29], 64 bytes, 0.410 ms (0.415 avg, 26% loss)\u001b[26X\r\n10.99.0.3 : [30], 64 bytes, 0.405 ms (0.414 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [31], 64 bytes, 0.508 ms (0.418 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [32], 64 bytes, 0.482 ms (0.421 avg, 24% loss)\u001b[26X\r\n10.99.0.3 : [33], 64 bytes, 0.312 ms (0.416 avg, 23% loss)\u001b[26X\r\n10.99.0.3 : [34], 64 bytes, 0.317 ms (0.413 avg, 22% loss)\u001b[26X\r\n10.99.0.3 : [35], 64 bytes, 0.428 ms (0.413 avg, 22% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[37.118992, "o", "\u001b[24;86H\u001b[90m exiting in 8s... \u001b[34;1H\u001b(B\u001b[m"]
+[37.406416, "o", "\u001b[2;78H7\u001b[34;1H"]
+[37.406771, "o", "\u001b[6;45H3\u001b[6C1\u001b[6C3\u001b[34;1H"]
+[37.907076, "o", "\u001b[6;43H1.7\u001b[6C2\u001b[6C4\u001b[34;1H"]
+[38.031701, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [18], 64 bytes, 0.439 ms (0.374 avg, 42% loss)\u001b[26X\r\n10.99.0.3 : [19], 64 bytes, 0.425 ms (0.378 avg, 40% loss)\u001b[26X\r\n10.99.0.3 : [20], 64 bytes, 0.463 ms (0.385 avg, 38% loss)\u001b[26X\r\n10.99.0.3 : [21], 64 bytes, 0.493 ms (0.393 avg, 36% loss)\u001b[26X\r\n10.99.0.3 : [22], 64 bytes, 0.487 ms (0.399 avg, 34% loss)\u001b[26X\r\n10.99.0.3 : [23], 64 bytes, 0.430 ms (0.401 avg, 33% loss)\u001b[26X\r\n10.99.0.3 : [24], 64 bytes, 0.474 ms (0.405 avg, 32% loss)\u001b[26X\r\n10.99.0.3 : [25], 64 bytes, 0.513 ms (0.411 avg, 30% loss)\u001b[26X\r\n10.99.0.3 : [26], 64 bytes, 0.427 ms (0.412 avg, 29% loss)\u001b[26X\r\n10.99.0.3 : [27], 64 bytes, 0.428 ms (0.413 avg, 28% loss)\u001b[26X\r\n10.99.0.3 : [28], 64 bytes, 0.453 ms (0.415 avg, 27% loss)\u001b[26X\r\n10.99.0.3 : [29], 64 bytes, 0.410 ms (0.415 avg, 26% loss)\u001b[26X\r\n10.99.0.3 : [30], 64 bytes, 0.405 ms (0.414 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [31], 64 bytes, 0.508 ms (0.418 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [32], 64 bytes, 0.482 ms (0.421 avg, 24% loss)\u001b[26X\r\n10.99.0.3 : [33], 64 bytes, 0.312 ms (0.416 avg, 23% loss)\u001b[26X\r\n10.99.0.3 : [34], 64 bytes, 0.317 ms (0.413 avg, 22% loss)\u001b[26X\r\n10.99.0.3 : [35], 64 bytes, 0.428 ms (0.413 avg, 22% loss)\u001b[26X\r\n10.99.0.3 : [36], 64 bytes, 0.356 ms (0.411 avg, 21% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[38.120229, "o", "\u001b[24;86H\u001b[90m exiting in 7s... \u001b[34;1H\u001b(B\u001b[m"]
+[38.407183, "o", "\u001b[2;78H8\u001b[34;1H"]
+[38.40764, "o", "\u001b[6;45H1\u001b[6C3\u001b[34;1H"]
+[38.907773, "o", "\u001b[6;43H0.5\u001b[6C4\u001b[6C3\u001b[34;1H"]
+[39.031748, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [19], 64 bytes, 0.425 ms (0.378 avg, 40% loss)\u001b[26X\r\n10.99.0.3 : [20], 64 bytes, 0.463 ms (0.385 avg, 38% loss)\u001b[26X\r\n10.99.0.3 : [21], 64 bytes, 0.493 ms (0.393 avg, 36% loss)\u001b[26X\r\n10.99.0.3 : [22], 64 bytes, 0.487 ms (0.399 avg, 34% loss)\u001b[26X\r\n10.99.0.3 : [23], 64 bytes, 0.430 ms (0.401 avg, 33% loss)\u001b[26X\r\n10.99.0.3 : [24], 64 bytes, 0.474 ms (0.405 avg, 32% loss)\u001b[26X\r\n10.99.0.3 : [25], 64 bytes, 0.513 ms (0.411 avg, 30% loss)\u001b[26X\r\n10.99.0.3 : [26], 64 bytes, 0.427 ms (0.412 avg, 29% loss)\u001b[26X\r\n10.99.0.3 : [27], 64 bytes, 0.428 ms (0.413 avg, 28% loss)\u001b[26X\r\n10.99.0.3 : [28], 64 bytes, 0.453 ms (0.415 avg, 27% loss)\u001b[26X\r\n10.99.0.3 : [29], 64 bytes, 0.410 ms (0.415 avg, 26% loss)\u001b[26X\r\n10.99.0.3 : [30], 64 bytes, 0.405 ms (0.414 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [31], 64 bytes, 0.508 ms (0.418 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [32], 64 bytes, 0.482 ms (0.421 avg, 24% loss)\u001b[26X\r\n10.99.0.3 : [33], 64 bytes, 0.312 ms (0.416 avg, 23% loss)\u001b[26X\r\n10.99.0.3 : [34], 64 bytes, 0.317 ms (0.413 avg, 22% loss)\u001b[26X\r\n10.99.0.3 : [35], 64 bytes, 0.428 ms (0.413 avg, 22% loss)\u001b[26X\r\n10.99.0.3 : [36], 64 bytes, 0.356 ms (0.411 avg, 21% loss)\u001b[26X\r\n10.99.0.3 : [37], 64 bytes, 0.370 ms (0.410 avg, 21% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[39.121061, "o", "\u001b[24;86H\u001b[90m exiting in 6s... \u001b[34;1H\u001b(B\u001b[m"]
+[39.407887, "o", "\u001b[2;78H9\u001b[34;1H"]
+[39.408222, "o", "\u001b[6;45H0\u001b[6C5\u001b[34;1H"]
+[39.908558, "o", "\u001b[6;42H39.5\u001b[6C6\u001b[6C4\u001b[34;1H"]
+[40.031767, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [20], 64 bytes, 0.463 ms (0.385 avg, 38% loss)\u001b[26X\r\n10.99.0.3 : [21], 64 bytes, 0.493 ms (0.393 avg, 36% loss)\u001b[26X\r\n10.99.0.3 : [22], 64 bytes, 0.487 ms (0.399 avg, 34% loss)\u001b[26X\r\n10.99.0.3 : [23], 64 bytes, 0.430 ms (0.401 avg, 33% loss)\u001b[26X\r\n10.99.0.3 : [24], 64 bytes, 0.474 ms (0.405 avg, 32% loss)\u001b[26X\r\n10.99.0.3 : [25], 64 bytes, 0.513 ms (0.411 avg, 30% loss)\u001b[26X\r\n10.99.0.3 : [26], 64 bytes, 0.427 ms (0.412 avg, 29% loss)\u001b[26X\r\n10.99.0.3 : [27], 64 bytes, 0.428 ms (0.413 avg, 28% loss)\u001b[26X\r\n10.99.0.3 : [28], 64 bytes, 0.453 ms (0.415 avg, 27% loss)\u001b[26X\r\n10.99.0.3 : [29], 64 bytes, 0.410 ms (0.415 avg, 26% loss)\u001b[26X\r\n10.99.0.3 : [30], 64 bytes, 0.405 ms (0.414 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [31], 64 bytes, 0.508 ms (0.418 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [32], 64 bytes, 0.482 ms (0.421 avg, 24% loss)\u001b[26X\r\n10.99.0.3 : [33], 64 bytes, 0.312 ms (0.416 avg, 23% loss)\u001b[26X\r\n10.99.0.3 : [34], 64 bytes, 0.317 ms (0.413 avg, 22% loss)\u001b[26X\r\n10.99.0.3 : [35], 64 bytes, 0.428 ms (0.413 avg, 22% loss)\u001b[26X\r\n10.99.0.3 : [36], 64 bytes, 0.356 ms (0.411 avg, 21% loss)\u001b[26X\r\n10.99.0.3 : [37], 64 bytes, 0.370 ms (0.410 avg, 21% loss)\u001b[26X\r\n10.99.0.3 : [38], 64 bytes, 0.385 ms (0.409 avg, 20% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[40.122392, "o", "\u001b[24;86H\u001b[90m exiting in 5s... \u001b[34;1H\u001b(B\u001b[m"]
+[40.408675, "o", "\u001b[2;77H10\u001b[34;1H"]
+[40.409004, "o", "\u001b[6;45H0\u001b[6C7\u001b[6C3\u001b[34;1H"]
+[40.909223, "o", "\u001b[6;43H8.5\u001b[6C8\u001b[6C4\u001b[34;1H"]
+[41.03155, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [21], 64 bytes, 0.493 ms (0.393 avg, 36% loss)\u001b[26X\r\n10.99.0.3 : [22], 64 bytes, 0.487 ms (0.399 avg, 34% loss)\u001b[26X\r\n10.99.0.3 : [23], 64 bytes, 0.430 ms (0.401 avg, 33% loss)\u001b[26X\r\n10.99.0.3 : [24], 64 bytes, 0.474 ms (0.405 avg, 32% loss)\u001b[26X\r\n10.99.0.3 : [25], 64 bytes, 0.513 ms (0.411 avg, 30% loss)\u001b[26X\r\n10.99.0.3 : [26], 64 bytes, 0.427 ms (0.412 avg, 29% loss)\u001b[26X\r\n10.99.0.3 : [27], 64 bytes, 0.428 ms (0.413 avg, 28% loss)\u001b[26X\r\n10.99.0.3 : [28], 64 bytes, 0.453 ms (0.415 avg, 27% loss)\u001b[26X\r\n10.99.0.3 : [29], 64 bytes, 0.410 ms (0.415 avg, 26% loss)\u001b[26X\r\n10.99.0.3 : [30], 64 bytes, 0.405 ms (0.414 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [31], 64 bytes, 0.508 ms (0.418 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [32], 64 bytes, 0.482 ms (0.421 avg, 24% loss)\u001b[26X\r\n10.99.0.3 : [33], 64 bytes, 0.312 ms (0.416 avg, 23% loss)\u001b[26X\r\n10.99.0.3 : [34], 64 bytes, 0.317 ms (0.413 avg, 22% loss)\u001b[26X\r\n10.99.0.3 : [35], 64 bytes, 0.428 ms (0.413 avg, 22% loss)\u001b[26X\r\n10.99.0.3 : [36], 64 bytes, 0.356 ms (0.411 avg, 21% loss)\u001b[26X\r\n10.99.0.3 : [37], 64 bytes, 0.370 ms (0.410 avg, 21% loss)\u001b[26X\r\n10.99.0.3 : [38], 64 bytes, 0.385 ms (0.409 avg, 20% loss)\u001b[26X\r\n10.99.0.3 : [39], 64 bytes, 0.266 ms (0.405 avg, 20% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[41.123389, "o", "\u001b[24;86H\u001b[90m exiting in 4s... \u001b[34;1H\u001b(B\u001b[m"]
+[41.409357, "o", "\u001b[2;78H1\u001b[34;1H"]
+[41.40973, "o", "\u001b[6;45H0\u001b[6C9\u001b[6C3\u001b[34;1H"]
+[41.909991, "o", "\u001b[6;43H7.5% 80\u001b[6C4\u001b[34;1H"]
+[42.031704, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [22], 64 bytes, 0.487 ms (0.399 avg, 34% loss)\u001b[26X\r\n10.99.0.3 : [23], 64 bytes, 0.430 ms (0.401 avg, 33% loss)\u001b[26X\r\n10.99.0.3 : [24], 64 bytes, 0.474 ms (0.405 avg, 32% loss)\u001b[26X\r\n10.99.0.3 : [25], 64 bytes, 0.513 ms (0.411 avg, 30% loss)\u001b[26X\r\n10.99.0.3 : [26], 64 bytes, 0.427 ms (0.412 avg, 29% loss)\u001b[26X\r\n10.99.0.3 : [27], 64 bytes, 0.428 ms (0.413 avg, 28% loss)\u001b[26X\r\n10.99.0.3 : [28], 64 bytes, 0.453 ms (0.415 avg, 27% loss)\u001b[26X\r\n10.99.0.3 : [29], 64 bytes, 0.410 ms (0.415 avg, 26% loss)\u001b[26X\r\n10.99.0.3 : [30], 64 bytes, 0.405 ms (0.414 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [31], 64 bytes, 0.508 ms (0.418 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [32], 64 bytes, 0.482 ms (0.421 avg, 24% loss)\u001b[26X\r\n10.99.0.3 : [33], 64 bytes, 0.312 ms (0.416 avg, 23% loss)\u001b[26X\r\n10.99.0.3 : [34], 64 bytes, 0.317 ms (0.413 avg, 22% loss)\u001b[26X\r\n10.99.0.3 : [35], 64 bytes, 0.428 ms (0.413 avg, 22% loss)\u001b[26X\r\n10.99.0.3 : [36], 64 bytes, 0.356 ms (0.411 avg, 21% loss)\u001b[26X\r\n10.99.0.3 : [37], 64 bytes, 0.370 ms (0.410 avg, 21% loss)\u001b[26X\r\n10.99.0.3 : [38], 64 bytes, 0.385 ms (0.409 avg, 20% loss)\u001b[26X\r\n10.99.0.3 : [39], 64 bytes, 0.266 ms (0.405 avg, 20% loss)\u001b[26X\r\n10.99.0.3 : [40], 64 bytes, 0.356 ms (0.403 avg, 19% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[42.124724, "o", "\u001b[24;86H\u001b[90m exiting in 3s... \u001b[34;1H\u001b(B\u001b[m"]
+[42.410071, "o", "\u001b[2;78H2\u001b[34;1H"]
+[42.410423, "o", "\u001b[6;45H0\u001b[6C1\u001b[6C3\u001b[34;1H"]
+[42.910668, "o", "\u001b[6;43H6.6\u001b[6C2\u001b[6C4\u001b[34;1H"]
+[43.031747, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [23], 64 bytes, 0.430 ms (0.401 avg, 33% loss)\u001b[26X\r\n10.99.0.3 : [24], 64 bytes, 0.474 ms (0.405 avg, 32% loss)\u001b[26X\r\n10.99.0.3 : [25], 64 bytes, 0.513 ms (0.411 avg, 30% loss)\u001b[26X\r\n10.99.0.3 : [26], 64 bytes, 0.427 ms (0.412 avg, 29% loss)\u001b[26X\r\n10.99.0.3 : [27], 64 bytes, 0.428 ms (0.413 avg, 28% loss)\u001b[26X\r\n10.99.0.3 : [28], 64 bytes, 0.453 ms (0.415 avg, 27% loss)\u001b[26X\r\n10.99.0.3 : [29], 64 bytes, 0.410 ms (0.415 avg, 26% loss)\u001b[26X\r\n10.99.0.3 : [30], 64 bytes, 0.405 ms (0.414 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [31], 64 bytes, 0.508 ms (0.418 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [32], 64 bytes, 0.482 ms (0.421 avg, 24% loss)\u001b[26X\r\n10.99.0.3 : [33], 64 bytes, 0.312 ms (0.416 avg, 23% loss)\u001b[26X\r\n10.99.0.3 : [34], 64 bytes, 0.317 ms (0.413 avg, 22% loss)\u001b[26X\r\n10.99.0.3 : [35], 64 bytes, 0.428 ms (0.413 avg, 22% loss)\u001b[26X\r\n10.99.0.3 : [36], 64 bytes, 0.356 ms (0.411 avg, 21% loss)\u001b[26X\r\n10.99.0.3 : [37], 64 bytes, 0.370 ms (0.410 avg, 21% loss)\u001b[26X\r\n10.99.0.3 : [38], 64 bytes, 0.385 ms (0.409 avg, 20% loss)\u001b[26X\r\n10.99.0.3 : [39], 64 bytes, 0.266 ms (0.405 avg, 20% loss)\u001b[26X\r\n10.99.0.3 : [40], 64 bytes, 0.356 ms (0.403 avg, 19% loss)\u001b[26X\r\n10.99.0.3 : [41], 64 bytes, 0.407 ms (0.403 avg, 19% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[43.126083, "o", "\u001b[24;86H\u001b[90m exiting in 2s... \u001b[34;1H\u001b(B\u001b[m"]
+[43.410721, "o", "\u001b[2;78H3\u001b[34;1H"]
+[43.411121, "o", "\u001b[6;45H1\u001b[6C3\u001b[6C3\u001b[34;1H"]
+[43.91124, "o", "\u001b[6;43H5.7\u001b[6C4\u001b[34;1H"]
+[44.03173, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [24], 64 bytes, 0.474 ms (0.405 avg, 32% loss)\u001b[26X\r\n10.99.0.3 : [25], 64 bytes, 0.513 ms (0.411 avg, 30% loss)\u001b[26X\r\n10.99.0.3 : [26], 64 bytes, 0.427 ms (0.412 avg, 29% loss)\u001b[26X\r\n10.99.0.3 : [27], 64 bytes, 0.428 ms (0.413 avg, 28% loss)\u001b[26X\r\n10.99.0.3 : [28], 64 bytes, 0.453 ms (0.415 avg, 27% loss)\u001b[26X\r\n10.99.0.3 : [29], 64 bytes, 0.410 ms (0.415 avg, 26% loss)\u001b[26X\r\n10.99.0.3 : [30], 64 bytes, 0.405 ms (0.414 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [31], 64 bytes, 0.508 ms (0.418 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [32], 64 bytes, 0.482 ms (0.421 avg, 24% loss)\u001b[26X\r\n10.99.0.3 : [33], 64 bytes, 0.312 ms (0.416 avg, 23% loss)\u001b[26X\r\n10.99.0.3 : [34], 64 bytes, 0.317 ms (0.413 avg, 22% loss)\u001b[26X\r\n10.99.0.3 : [35], 64 bytes, 0.428 ms (0.413 avg, 22% loss)\u001b[26X\r\n10.99.0.3 : [36], 64 bytes, 0.356 ms (0.411 avg, 21% loss)\u001b[26X\r\n10.99.0.3 : [37], 64 bytes, 0.370 ms (0.410 avg, 21% loss)\u001b[26X\r\n10.99.0.3 : [38], 64 bytes, 0.385 ms (0.409 avg, 20% loss)\u001b[26X\r\n10.99.0.3 : [39], 64 bytes, 0.266 ms (0.405 avg, 20% loss)\u001b[26X\r\n10.99.0.3 : [40], 64 bytes, 0.356 ms (0.403 avg, 19% loss)\u001b[26X\r\n10.99.0.3 : [41], 64 bytes, 0.407 ms (0.403 avg, 19% loss)\u001b[26X\r\n10.99.0.3 : [42], 64 bytes, 0.354 ms (0.402 avg, 18% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[44.127115, "o", "\u001b[24;86H\u001b[90m exiting in 1s... \u001b[34;1H\u001b(B\u001b[m"]
+[44.411538, "o", "\u001b[2;78H4\u001b[34;1H"]
+[44.412023, "o", "\u001b[6;45H3\u001b[6C5\u001b[6C4\u001b[34;1H"]
+[44.912691, "o", "\u001b[6;43H4.9\u001b[6C6\u001b[34;1H"]
+[45.029203, "o", "\u001b[?25l\u001b[30m\u001b[42m\r\n[demo] 0:fping* \"alice\" 02:01 18-May-26\u001b(B\u001b[m\u001b[?12l\u001b[?25h\u001b[34;1H"]
+[45.031709, "o", "\u001b[?25l\u001b[15d10.99.0.3 : [25], 64 bytes, 0.513 ms (0.411 avg, 30% loss)\u001b[26X\r\n10.99.0.3 : [26], 64 bytes, 0.427 ms (0.412 avg, 29% loss)\u001b[26X\r\n10.99.0.3 : [27], 64 bytes, 0.428 ms (0.413 avg, 28% loss)\u001b[26X\r\n10.99.0.3 : [28], 64 bytes, 0.453 ms (0.415 avg, 27% loss)\u001b[26X\r\n10.99.0.3 : [29], 64 bytes, 0.410 ms (0.415 avg, 26% loss)\u001b[26X\r\n10.99.0.3 : [30], 64 bytes, 0.405 ms (0.414 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [31], 64 bytes, 0.508 ms (0.418 avg, 25% loss)\u001b[26X\r\n10.99.0.3 : [32], 64 bytes, 0.482 ms (0.421 avg, 24% loss)\u001b[26X\r\n10.99.0.3 : [33], 64 bytes, 0.312 ms (0.416 avg, 23% loss)\u001b[26X\r\n10.99.0.3 : [34], 64 bytes, 0.317 ms (0.413 avg, 22% loss)\u001b[26X\r\n10.99.0.3 : [35], 64 bytes, 0.428 ms (0.413 avg, 22% loss)\u001b[26X\r\n10.99.0.3 : [36], 64 bytes, 0.356 ms (0.411 avg, 21% loss)\u001b[26X\r\n10.99.0.3 : [37], 64 bytes, 0.370 ms (0.410 avg, 21% loss)\u001b[26X\r\n10.99.0.3 : [38], 64 bytes, 0.385 ms (0.409 avg, 20% loss)\u001b[26X\r\n10.99.0.3 : [39], 64 bytes, 0.266 ms (0.405 avg, 20% loss)\u001b[26X\r\n10.99.0.3 : [40], 64 bytes, 0.356 ms (0.403 avg, 19% loss)\u001b[26X\r\n10.99.0.3 : [41], 64 bytes, 0.407 ms (0.403 avg, 19% loss)\u001b[26X\r\n10.99.0.3 : [42], 64 bytes, 0.354 ms (0.402 avg, 18% loss)\u001b[26X\r\n10.99.0.3 : [43], 64 bytes, 0.371 ms (0.401 avg, 18% loss)\u001b[26X\u001b[34;84H\u001b[1K\u001b[?12l\u001b[?25h\r"]
+[45.128239, "o", "\u001b[?25l\u001b[32m\u001b[1m\u001b[1;86H [15s] \u2713 rerouted through bob!\u001b(B\u001b[m\u001b[K\u001b[90m\u001b[2;86H route: alice \u2192 bob \u2192 charlie (2 hops)\u001b[39m\u001b[K\u001b[3;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u001b[31m\u2500\u2500\u2717\u2500\u2500\u2500\u001b[39m \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[5;86H \u001b[32m|\u001b[39m \u001b[32m|\u001b[39m\u001b[K\u001b[6;86H \u001b[32m\u001b[1mbob\u001b(B\u001b[m .2 \u001b[32m\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[39m\u001b[K\u001b[7;86H\u001b[K\u001b[33m\u001b[1m\n\u2500\u2500 restoring direct link \u2500\u2500\u001b(B\u001b[m\u001b[K\u001b[9;86H\u001b[K\n $ iptables -F\u001b[K\u001b[11;86H\u001b[K\u001b[90m\n [20s] waiting for direct route...............\u001b[39m\u001b[K\u001b[32m\u001b[1m\u001b[13;86H [36s] \u2713 direct link restored\u001b(B\u001b[m\u001b[K\u001b[90m\u001b[14;86H route: alice \u2192 charlie (direct, 1 hop)\u001b[39m\u001b[K\u001b[15;86H\u001b[K\n \u001b[1malice\u001b(B\u001b[m .1 \u001b[32m\u2500\u2500\u2500\u2500\u2500\u2500\u001b[39m \u001b[1mcharlie\u001b(B\u001b[m .3\u001b[K\u001b[17;86H | |\u001b[K\u001b[18;86H \u001b[1mbob\u001b(B\u001b[m .2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u001b[K\u001b[19;86H\u001b[K\u001b[36m\u001b[1m\n Zero config changes. Routes healed automatically.\u001b(B\u001b[m\u001b[K\u001b[36m\u001b[1m\u001b[21;86H https://github.com/encodeous/nylon\u001b(B\u001b[m\u001b[K\u001b[22;86H\u001b[K\u001b[90m\n exiting in 1s... \u001b[39m\u001b[K\u001b[24;86H\u001b[K\u001b[?12l\u001b[?25h\u001b[34;1H"]
+[45.134813, "o", "\u001b[1;35r\u001b(B\u001b[m\u001b[?1l\u001b>\u001b[H\u001b[2J\u001b[?12l\u001b[?25h\u001b[?1000l\u001b[?1002l\u001b[?1003l\u001b[?1006l\u001b[?1005l\u001b[?2004l\u001b[?7727l\u001b[?1004l\u001b[?1049l\u001b[23;0;0t"]
+[45.134983, "o", "[exited]\r\n"]
diff --git a/docs/assets/demo.gif b/docs/assets/demo.gif
index 1c52ab7..4cf43d9 100644
Binary files a/docs/assets/demo.gif and b/docs/assets/demo.gif differ
diff --git a/docs/index.mdx b/docs/index.mdx
index f4cbe85..9bfbb27 100644
--- a/docs/index.mdx
+++ b/docs/index.mdx
@@ -18,40 +18,16 @@ hero:
variant: minimal
---
-import { Card, CardGrid } from '@astrojs/starlight/components';
+import AsciinemaPlayer from '../../components/AsciinemaPlayer.astro';
+import demoCast from './assets/demo.cast?url';
-Nylon is a **Resilient Overlay Network (RON)** built on **WireGuard** and the **Babel** routing protocol. It provides an intelligent, self-healing mesh that ensures your servers and devices stay connected, even when *some* paths are blocked or unstable.
+Nylon is a self-healing WireGuard mesh that routes around failures. If a link goes down, nylon reroutes traffic through the next-best path in seconds. No manual intervention, no central coordination servers.
-## Why Nylon?
+[See how nylon compares to Tailscale, Nebula, and DIY setups →](/why-nylon)
-
-
- Built on the Babel routing protocol, nylon handles complex topologies, recovers from outages, and strategically routes traffic for optimal latency.
-
-
- Built on top of [wireguard-go](https://github.com/WireGuard/wireguard-go) for high-performance, state-of-the-art encryption.
-
-
- Single binary, minimal configuration, and a single UDP port. Deployment has never been simpler.
-
-
- Connect existing WireGuard clients without any extra software.
-
-
+
-:::note[Is nylon for you?]
-
-Nylon tries [to do one thing, and do it well](https://en.wikipedia.org/wiki/Unix_philosophy): mesh networking. You might be interested in nylon if:
-
-- You have many computers across different locations and want them to stay connected with minimal maintenance.
-- You don't mind writing a bit of YAML to configure your network.
-- You want a fully FOSS stack you can run on your own infrastructure.
-
-*If you are looking for a zero-config, managed experience, and plenty of addon features for non-technical users, Tailscale is likely a better fit. [See how nylon compares to Tailscale, Nebula, and DIY setups →](/why-nylon)*
-
-:::
-
-## Example
+## Here's another example
Here is a network of 5 nodes, where the numbers on the edges represent the routing metric (nylon uses latency).
diff --git a/docs/why-nylon.mdx b/docs/why-nylon.mdx
index bd5f7e3..36bf00c 100644
--- a/docs/why-nylon.mdx
+++ b/docs/why-nylon.mdx
@@ -4,46 +4,45 @@ description: How nylon compares to other mesh networking solutions, and when it'
tableOfContents: false
---
-import { Steps } from "@astrojs/starlight/components";
+Nylon is a self-healing WireGuard mesh that routes around failures. If a link goes down, nylon reroutes traffic through the next-best path in seconds. No manual intervention, no central coordination servers.
-## Use Cases
+Under the hood, nylon implements the [Babel routing protocol (RFC 8966)](https://datatracker.ietf.org/doc/html/rfc8966) on top of a [modified wireguard-go](https://github.com/encodeous/nylon/tree/main/polyamide), using measured latency as the routing metric.
-- **Distributed Mesh**: Build low-latency anycast networks for geographically distributed edge nodes that adapt to changing conditions.
-- **Home Lab Networking**: Connect your home devices, servers, and cloud resources into a single, resilient, and performant network that can adjust to network changes.
-- **Sovereign Networks**: Build a fully independent mesh that works entirely in isolated or air-gapped environments. Since nylon has no "phone-home" requirement to a central coordination server, your network stays up even if the public internet is unreachable.
-- **Optimized Routing**: Connect to the local node with the best latency when at the office, and connect to the cloud node when at home, without needing to change any configuration on your client.
+### Main Features
-## What makes nylon different?
-
-Tailscale, Nebula, and ZeroTier establish **direct peer-to-peer tunnels**. If two nodes can't reach each other directly, traffic is either relayed through a central server (Tailscale DERP) or it simply doesn't work (Nebula behind strict NAT). None of them route traffic intelligently through intermediate nodes based on measured latency.
-
-**Nylon does latency-aware multi-hop routing with no coordination server.** If the current path is slow or down, nylon automatically routes through the next-best route (if available). This is the same approach that makes the internet itself resilient! Except nylon does it within your private WireGuard mesh.
+- **Multi-hop Routing**: Traffic flows through the lowest-latency path across your mesh. Unlike Tailscale, Nebula, or ZeroTier, nodes don't need to be directly reachable from each other. Nylon forwards through intermediate hops automatically.
+- **No Coordination Server**: No SaaS dependency, no single control-plane. Nodes exchange routes directly over the same WireGuard tunnel that carries your data.
+- **Single Binary, Single Port**: One statically-linked binary, one UDP port (`57175`), one YAML config. That's it.
+- **WireGuard Client Compatibility**: Connect stock WireGuard clients (iOS, Android, Windows) to the mesh with zero extra software. Mobile clients roam between gateways seamlessly.
## Comparison
-| Feature | **nylon** | **Tailscale** | **Nebula** | **DIY WireGuard+Babel** |
-| :-------------------- | :----------------------------------------- | :-------------------------------- | :----------------------- | :------------------------------------ |
-| **Multi-hop Routing** | **Yes. latency-optimized, automatic** | No (relay only, no optimization) | No | Yes (manual setup) |
-| **Self-healing** | **Yes. reroutes in \<10s** | Relies on coordination server | No automatic failover | Yes (depends on daemon) |
-| **Coordination** | **None required (fully in-band)** | Centralized (SaaS/Headscale) | Lighthouse servers | Manual (out-of-band daemons) |
-| **WireGuard Clients** | **Stock iOS/Android/Windows clients work** | Tailscale client only | Nebula client only | Manual configuration |
-| **NAT Traversal** | Port forward or public relay node | **STUN/ICE/DERP (best-in-class)** | Public lighthouse nodes | Manual |
-| **Configuration** | Central YAML file | Web Dashboard / SSO | Certificates & CA | Multiple configs + network namespaces |
-| **Encryption** | WireGuard (link-level between hops) | WireGuard (end-to-end) | Noise-based (end-to-end) | WireGuard (link-level) |
-| **License** | Apache 2.0 | Proprietary SaaS / BSD-3 client | MIT | Various |
+| Feature | **nylon** | **Tailscale** | **Nebula** | **DIY WG+Babel** |
+| :-------------------- | :--------------------------------------------- | :--------------------------------------- | :---------------------- | :------------------------------------ |
+| **Topology** | **Partial mesh: nodes forward for each other** | Full mesh (every pair needs a tunnel) | Full mesh | Partial mesh (manual setup) |
+| **Routing** | **Latency-aware, automatic multi-hop** | No routing (relay only, no optimization) | No routing | Yes (depends on daemon) |
+| **Self-healing** | **Yes, reroutes in \<10s** | Relies on coordination server | No automatic failover | Yes (depends on daemon) |
+| **Coordination** | **None required (fully in-band)** | Centralized (SaaS/Headscale) | Lighthouse servers | Manual (out-of-band protocol) |
+| **WireGuard Clients** | **Stock iOS/Android/Windows clients work** | Tailscale client only | Nebula client only | Manual configuration |
+| **NAT Traversal** | Port forward or public relay node | **STUN/ICE/DERP (best-in-class)** | Public lighthouse nodes | Manual |
+| **Configuration** | Central YAML file | Web Dashboard / SSO | Certificates & CA | Multiple configs + network namespaces |
+| **License** | Apache 2.0 | Proprietary SaaS / BSD-3 client | MIT | Various |
+
+:::caution[Encryption Model]
+Nylon uses WireGuard's encryption **hop-by-hop**, not end-to-end. Each link between adjacent nodes is encrypted, but intermediate nodes decrypt and re-encrypt forwarded traffic. This is the same model as DIY WireGuard+Babel setups. If you need end-to-end encryption between every pair of nodes, Tailscale or Nebula may be a better fit.
+:::
-:::tip[Nylon vs. DIY]
-If you've ever tried to build a dynamic network using **WireGuard + Babel (or BGP)**, you know how powerful it can be, but also how difficult it can be to maintain.
+## When to use nylon
-[The typical setup](https://forum.mikrotik.com/t/best-approach-to-mesh-y-vpn-with-ospf/175811) involves running separate WireGuard interfaces for every peering arrangement, along with a routing daemon like Babel or BGP to manage the dynamic routing. This gives you a powerful, self-healing network that can adapt to outages and changing conditions, but it's also pretty cumbersome to set up and maintain.
+- **Distributed edge nodes**: Build low-latency anycast networks for geographically distributed services that adapt to changing conditions.
+- **Home lab networking**: Connect home devices, servers, and cloud resources into a single resilient network.
+- **Sovereign networks**: Fully independent mesh that works in isolated or air-gapped environments. No "phone-home" requirement.
+- **Optimized routing**: Automatically use the lowest-latency path without manual configuration changes.
-**Nylon is essentially that powerful DIY stack, but refined into a single, opinionated binary.** It automates the tedious parts, giving you the resilience of a professional routing setup with the ease of a modern VPN.
-:::
+## Nylon vs. DIY WireGuard+Babel
+
+If you've ever tried to build a dynamic network using WireGuard + Babel (or BGP), you know how powerful it can be, but also how painful it is to maintain.
-:::tip[Nylon vs. Tailscale/Nebula]
-Unlike Tailscale or Nebula, which focus on establishing direct P2P tunnels, **nylon** is designed as a fully dynamic mesh network. This means:
+[The typical setup](https://forum.mikrotik.com/t/best-approach-to-mesh-y-vpn-with-ospf/175811) involves running separate WireGuard interfaces for every peering arrangement, along with a routing daemon to manage dynamic routing. This gives you a powerful, self-healing network, but it's cumbersome to set up and maintain.
-1. **No reliance on central coordination**: nylon nodes discover each other and exchange routing information directly, without needing a central server for metadata and key exchange. You can still centrally configure your network using the central configuration.
-2. **Automatic & optimized multi-hop routing**: If a direct path between two nodes is blocked (e.g., due to strict NATs), or an indirect path is more optimal, nylon automatically routes traffic through intermediate nodes. This ensures connectivity even in challenging network conditions.
-3. **Native WireGuard compatibility**: By using the Passive Nodes feature, you can connect standard WireGuard clients (iOS, Android, etc.) to your nylon mesh. These clients can roam between different gateways without losing connectivity, and benefit from the dynamic routing capabilities of nylon without needing any custom software.
- :::
\ No newline at end of file
+**Nylon is that powerful DIY stack refined into a single, opinionated binary.** It automates the tedious parts, giving you the resilience of a professional routing setup with the ease of a modern VPN.