#!/usr/bin/env bash
echo "========================================"
echo " GitHub Copilot / VPN network diagnostic"
echo "========================================"
echo
echo "=== 1. External IPv4 ==="
IPV4=$(curl -4 -s --max-time 10 https://ifconfig.me)
if [ -n "$IPV4" ]; then
echo "IPv4: $IPV4"
else
echo "IPv4: FAILED"
fi
echo
echo "=== 2. External IPv6 ==="
IPV6=$(curl -6 -s --max-time 10 https://ifconfig.me)
if [ -n "$IPV6" ]; then
echo "IPv6: $IPV6"
echo "WARNING: IPv6 is available. Check that it also goes through VPN."
else
echo "IPv6: unavailable / blocked"
fi
echo
echo "=== 3. IP geolocation ==="
curl -4 -s --max-time 10 https://ipinfo.io/json
echo
echo
echo "=== 4. DNS resolution ==="
HOSTS=(
"github.com"
"api.github.com"
"api.githubcopilot.com"
"copilot-proxy.githubusercontent.com"
)
for HOST in "${HOSTS[@]}"; do
echo "--- $HOST ---"
if command -v dig >/dev/null 2>&1; then
dig +short A "$HOST"
echo "IPv6:"
dig +short AAAA "$HOST"
else
getent ahosts "$HOST" 2>/dev/null | head
fi
echo
done
echo "=== 5. Copilot endpoints ==="
check_url() {
URL="$1"
echo "--- $URL ---"
RESULT=$(curl \
-sS \
-o /dev/null \
--max-time 15 \
-w "HTTP=%{http_code} remote_ip=%{remote_ip} local_ip=%{local_ip} time=%{time_total}s\n" \
"$URL" 2>&1)
echo "$RESULT"
echo
}
check_url "https://copilot-proxy.githubusercontent.com/_ping"
check_url "https://api.githubcopilot.com/_ping"
check_url "https://api.github.com"
echo "=== 6. Force IPv4 ==="
for URL in \
"https://copilot-proxy.githubusercontent.com/_ping" \
"https://api.githubcopilot.com/_ping"
do
echo "--- $URL ---"
curl -4 \
-sS \
-o /dev/null \
--max-time 15 \
-w "HTTP=%{http_code} remote_ip=%{remote_ip} local_ip=%{local_ip}\n" \
"$URL" 2>&1
echo
done
echo "=== 7. Force IPv6 ==="
for URL in \
"https://copilot-proxy.githubusercontent.com/_ping" \
"https://api.githubcopilot.com/_ping"
do
echo "--- $URL ---"
curl -6 \
-sS \
-o /dev/null \
--max-time 10 \
-w "HTTP=%{http_code} remote_ip=%{remote_ip} local_ip=%{local_ip}\n" \
"$URL" 2>&1
echo
done
echo "=== 8. Routing table ==="
if command -v ip >/dev/null 2>&1; then
echo "--- IPv4 default route ---"
ip route
echo
echo "--- IPv6 default route ---"
ip -6 route
elif command -v route >/dev/null 2>&1; then
route -n
fi
echo
echo "========================================"
echo " Diagnostic finished"
echo "========================================"