my dotfiles for arch
1#!/bin/bash
2# Comprehensive CGNAT and IPv6 connectivity checker for Linux
3
4# ----------- Public IPs -----------
5PUBLIC_IPV4=$(curl -4 -s https://ifconfig.me)
6PUBLIC_IPV6=$(curl -6 -s https://ifconfig.me)
7
8# ----------- Local Interface Info -----------
9WAN_IF=$(ip route show default | awk '/default/ {print $5}')
10LOCAL_IPV4=$(ip -4 addr show "$WAN_IF" | awk '/inet / {print $2}' | cut -d/ -f1)
11LOCAL_IPV6=$(ip -6 addr show "$WAN_IF" | awk '/inet6 / && !/fe80/ {print $2}' | cut -d/ -f1)
12
13echo "===== CGNAT / IPv6 Check ====="
14echo "Network interface: $WAN_IF"
15echo
16
17echo "Local IPv4: $LOCAL_IPV4"
18echo "Public IPv4: $PUBLIC_IPV4"
19echo
20echo "Local IPv6: $LOCAL_IPV6"
21echo "Public IPv6: $PUBLIC_IPV6"
22echo
23echo "--------------------------------"
24
25# ----------- IPv4 Analysis -----------
26if [[ -z "$PUBLIC_IPV4" ]]; then
27 echo "🌐 No public IPv4 address detected (possibly IPv6-only connection)."
28elif [[ "$LOCAL_IPV4" =~ ^10\. || "$LOCAL_IPV4" =~ ^192\.168\. || "$LOCAL_IPV4" =~ ^172\.(1[6-9]|2[0-9]|3[0-1])\. || "$LOCAL_IPV4" =~ ^100\.(6[4-9]|[7-9][0-9]|1[0-1][0-9]|12[0-7])\. ]]; then
29 if [ "$PUBLIC_IPV4" != "$LOCAL_IPV4" ]; then
30 echo "⚠️ Your local IPv4 ($LOCAL_IPV4) is private, and your public IPv4 differs."
31 echo "➡️ You are likely behind CGNAT or another NAT layer."
32 else
33 echo "✅ Local and public IPv4 match — you have a public IPv4 address."
34 fi
35else
36 echo "✅ Local IPv4 appears to be public ($LOCAL_IPV4). No CGNAT detected."
37fi
38
39echo "--------------------------------"
40
41# ----------- IPv6 Analysis -----------
42if [[ -n "$PUBLIC_IPV6" ]]; then
43 echo "✅ Public IPv6 is active — your device has global IPv6 connectivity."
44else
45 echo "❌ No global IPv6 address detected."
46fi
47
48echo "--------------------------------"
49echo "Done."