openwrt routing

This commit is contained in:
Dobromir Popov
2026-02-16 14:13:35 +02:00
parent b92a02a770
commit a2c33734fb
3 changed files with 351 additions and 0 deletions

View 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