summaryrefslogtreecommitdiffstatshomepage
path: root/src/tools/wg-quick.bash
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2017-07-26 03:09:48 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2017-07-26 03:38:09 +0200
commitf3f5f66af1c52b7a1dbce8bb1207c4e0f33ebfd1 (patch)
tree66cecedba4258788aaba54ade458ae090ed62bac /src/tools/wg-quick.bash
parentwg-quick: do not use grep (diff)
downloadwireguard-monolithic-historical-f3f5f66af1c52b7a1dbce8bb1207c4e0f33ebfd1.tar.xz
wireguard-monolithic-historical-f3f5f66af1c52b7a1dbce8bb1207c4e0f33ebfd1.zip
wg-quick: add explicit support for common DNS usage
Diffstat (limited to '')
-rwxr-xr-xsrc/tools/wg-quick.bash16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/tools/wg-quick.bash b/src/tools/wg-quick.bash
index d7e7d68..e5ae48f 100755
--- a/src/tools/wg-quick.bash
+++ b/src/tools/wg-quick.bash
@@ -14,6 +14,7 @@ WG_CONFIG=""
INTERFACE=""
ADDRESSES=( )
MTU=""
+DNS=( )
PRE_UP=""
POST_UP=""
PRE_DOWN=""
@@ -41,6 +42,7 @@ parse_options() {
case "$key" in
Address) ADDRESSES+=( ${value//,/ } ); continue ;;
MTU) MTU="$value"; continue ;;
+ DNS) DNS+=( ${value//,/ } ); continue ;;
PreUp) PRE_UP="$value"; continue ;;
PreDown) PRE_DOWN="$value"; continue ;;
PostUp) POST_UP="$value"; continue ;;
@@ -128,6 +130,14 @@ set_mtu() {
cmd ip link set mtu $(( mtu - 80 )) dev "$INTERFACE"
}
+set_dns() {
+ [[ ${#DNS[@]} -eq 0 ]] || printf 'nameserver %s\n' "${DNS[@]}" | cmd resolvconf -a "tun.$INTERFACE" -m 0 -x
+}
+
+unset_dns() {
+ [[ ${#DNS[@]} -eq 0 ]] || cmd resolvconf -d "tun.$INTERFACE"
+}
+
add_route() {
if [[ $1 == 0.0.0.0/0 || $1 =~ ^[0:]+/0$ ]]; then
add_default "$1"
@@ -168,6 +178,9 @@ save_config() {
for address in ${BASH_REMATCH[1]}; do
new_config+="Address = $address"$'\n'
done
+ while read -r address; do
+ [[ $address =~ ^nameserver\ ([a-zA-Z0-9_=+:%.-]+)$ ]] && new_config+="DNS = ${BASH_REMATCH[1]}"$'\n'
+ done < <(resolvconf -l "tun.$INTERFACE" 2>/dev/null)
[[ -n $MTU && $(ip link show dev "$INTERFACE") =~ mtu\ ([0-9]+) ]] && new_config+="MTU = ${BASH_REMATCH[1]}"$'\n'
[[ $SAVE_CONFIG -eq 0 ]] || new_config+=$'SaveConfig = true\n'
[[ -z $PRE_UP ]] || new_config+="PreUp = $PRE_UP"$'\n'
@@ -203,6 +216,7 @@ cmd_usage() {
- Address: may be specified one or more times and contains one or more
IP addresses (with an optional CIDR mask) to be set for the interface.
+ - DNS: an optional DNS server to use while the device is up.
- MTU: an optional MTU for the interface; if unspecified, auto-calculated.
- PreUp, PostUp, PreDown, PostDown: script snippets which will be executed
by bash(1) at the corresponding phases of the link, most commonly used
@@ -226,6 +240,7 @@ cmd_up() {
done
set_mtu
up_if
+ set_dns
for i in $(while read -r _ i; do for i in $i; do [[ $i =~ ^[0-9a-z:.]+/[0-9]+$ ]] && echo "$i"; done; done < <(wg show "$INTERFACE" allowed-ips) | sort -nr -k 2 -t /); do
[[ $(ip route get "$i" 2>/dev/null) == *dev\ $INTERFACE\ * ]] || add_route "$i"
done
@@ -237,6 +252,7 @@ cmd_down() {
[[ -n $(ip link show dev "$INTERFACE" type wireguard 2>/dev/null) ]] || die "\`$INTERFACE' is not a WireGuard interface"
execute_hook "$PRE_DOWN"
[[ $SAVE_CONFIG -eq 0 ]] || save_config
+ unset_dns
del_if
execute_hook "$POST_DOWN"
}