| #!/bin/bash | |
| short_route() { | |
| ip route | sed -n "s/$1 \\(.* dev [^ ]\\+\\).*/\\1/p" | head -n 1 | |
| } | |
| resolve_ip() { | |
| local filter='/^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$/{p;q;}' | |
| [[ $(sed -n "$filter" <<<"$1") == "$1" ]] && echo "$1" || | |
| host -t a "$1" | cut -d ' ' -f 4 | sed -n "$filter" | |
| } | |
| set_route() { | |
| local default_route="$(short_route default)" | |
| [[ -n $default_route ]] || { echo "[-] Could not determine default route"; return; } | |
| echo "[+] Adding route for $1 to be $default_route" | |
| ip route del "$1/32" 2>/dev/null | |
| ip route add "$1/32" $default_route | |
| } | |
| check_loop() { | |
| local ip="$(resolve_ip "$1")" | |
| [[ -n $ip ]] || { echo "[-] Could not determine IP of '$1'" && return 1; } | |
| echo "[+] Making sure $ip goes over the default (non-0/1,128/1) route" | |
| set_route "$ip" | |
| while read; do | |
| [[ $(short_route "$ip") != "$(short_route default)" ]] && set_route "$ip" | |
| done < <(exec ip monitor route) | |
| } | |
| [[ $# -ne 1 ]] && { echo "Usage: $0 IP|HOST" >&2; exit 1; } | |
| [[ $UID -ne 0 ]] && exec sudo "$(readlink -f "$0")" "$@" | |
| check_loop "$1" | |
| exit $? |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment