84 lines
2.4 KiB
Bash
84 lines
2.4 KiB
Bash
#!/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
|