From d60c710d12d8afa7ac29d7875d146e4882bce7c2 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Tue, 24 Jan 2017 05:28:03 +0100 Subject: tools: wg-quick: support v6 dual stack --- src/tools/wg-quick.bash | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/tools/wg-quick.bash b/src/tools/wg-quick.bash index b6fcef8..1eb71b2 100755 --- a/src/tools/wg-quick.bash +++ b/src/tools/wg-quick.bash @@ -79,8 +79,10 @@ add_if() { del_if() { if [[ $(ip route show table all) =~ .*\ dev\ $INTERFACE\ table\ ([0-9]+)\ .* ]]; then - cmd ip rule delete table "${BASH_REMATCH[1]}" - [[ $(ip rule show table main) == *"from all lookup main suppress_prefixlength 0"* ]] && cmd ip rule delete table main suppress_prefixlength 0 + while [[ -n $(ip rule show table ${BASH_REMATCH[1]}) ]]; do + cmd ip rule delete table "${BASH_REMATCH[1]}" + [[ $(ip rule show table main) == *"from all lookup main suppress_prefixlength 0"* ]] && cmd ip rule delete table main suppress_prefixlength 0 + done fi cmd ip link delete dev "$INTERFACE" } @@ -101,13 +103,22 @@ add_route() { fi } +DEFAULT_TABLE= +PREVIOUS_ENDPOINT= add_default() { - [[ $(join <(wg show "$INTERFACE" allowed-ips) <(wg show "$INTERFACE" endpoints)) =~ .*\ ${1//./\\.}\ \[?([0-9.:a-f]+)\]?:[0-9]+$ ]] && local endpoint="${BASH_REMATCH[1]}" + [[ $(join <(wg show "$INTERFACE" allowed-ips) <(wg show "$INTERFACE" endpoints)) =~ ([A-Za-z0-9/+=]{44})\ ([0-9a-f/.:]+ )*${1//./\\.}\ ([0-9a-f/.:]+ )*\[?([0-9.:a-f]+)\]?:[0-9]+ ]] && local endpoint="${BASH_REMATCH[4]}" [[ -n $endpoint ]] || return 0 - local table=51820 - while [[ -n $(ip route show table $table) ]]; do ((table++)); done - cmd ip route add "$1" dev "$INTERFACE" table $table - cmd ip rule add not to "$endpoint" table $table + local first=0 + if [[ -z $DEFAULT_TABLE ]]; then + first=1 + DEFAULT_TABLE=51820 + while [[ -n $(ip route show table $DEFAULT_TABLE) ]]; do ((DEFAULT_TABLE++)); done + fi + cmd ip route add "$1" dev "$INTERFACE" table $DEFAULT_TABLE + [[ $PREVIOUS_ENDPOINT == "$endpoint" ]] && return 0 + PREVIOUS_ENDPOINT="$endpoint" + cmd ip rule add not to "$endpoint" table $DEFAULT_TABLE + [[ $first -eq 1 ]] || return 0 cmd ip rule add table main suppress_prefixlength 0 } -- cgit v1.2.3-59-g8ed1b