#!/usr/bin/env bash # Policy routing: send traffic to specified domains via Starlink interface. # Run on Linux host (e.g. Linux Mint) that has both main connection and WiFi to Starlink. # Usage: sudo ./policy-route-starlink.sh [setup|remove] # Configure STARLINK_IF, STARLINK_GW, DOMAINS below or via env. set -e # Starlink WiFi interface (e.g. wlan0) STARLINK_IF="${STARLINK_IF:-wlan0}" # Starlink gateway IP (get from: ip route show dev "$STARLINK_IF" | head -1) STARLINK_GW="${STARLINK_GW:-}" # Domains to route via Starlink (space-separated) DOMAINS="${DOMAINS:-polymarket.com www.polymarket.com}" # Routing table id for Starlink TABLE_ID=200 action="${1:-setup}" resolve_domains() { local list="" for d in $DOMAINS; do local ips ips=$(getent ahosts "$d" 2>/dev/null | awk '$1 !~ /^:/ {print $1}' | sort -u) || true for ip in $ips; do [[ -n "$ip" ]] && list="$list $ip" done done echo "$list" } get_starlink_gw() { if [[ -n "$STARLINK_GW" ]]; then echo "$STARLINK_GW" return fi ip route show dev "$STARLINK_IF" 2>/dev/null | awk '/default via/ {print $3; exit}' } do_setup() { if ! ip link show "$STARLINK_IF" &>/dev/null; then echo "Interface $STARLINK_IF not found. Set STARLINK_IF (e.g. wlan0)." exit 1 fi local gw gw=$(get_starlink_gw) if [[ -z "$gw" ]]; then echo "Could not determine Starlink gateway. Set STARLINK_GW or ensure $STARLINK_IF has a route." exit 1 fi # Ensure table 200 has default via Starlink (idempotent) ip route replace default via "$gw" dev "$STARLINK_IF" table "$TABLE_ID" 2>/dev/null || true local ips ips=$(resolve_domains) if [[ -z "$ips" ]]; then echo "No IPs resolved for domains: $DOMAINS. Check DNS/connectivity." exit 1 fi for ip in $ips; do ip rule add to "$ip" table "$TABLE_ID" 2>/dev/null || true done echo "Routing via Starlink ($STARLINK_IF): $ips" } do_remove() { local ips ips=$(resolve_domains) for ip in $ips; do ip rule del to "$ip" table "$TABLE_ID" 2>/dev/null || true done ip route flush table "$TABLE_ID" 2>/dev/null || true echo "Removed policy rules for table $TABLE_ID." } case "$action" in setup) do_setup ;; remove) do_remove ;; *) echo "Usage: $0 [setup|remove]" echo "Env: STARLINK_IF ($STARLINK_IF), STARLINK_GW, DOMAINS" exit 1 ;; esac