openwrt routing
This commit is contained in:
83
linux/openwrt/policy-route-starlink.sh
Normal file
83
linux/openwrt/policy-route-starlink.sh
Normal file
@@ -0,0 +1,83 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user