Skip to content

Instantly share code, notes, and snippets.

@salaros
Last active June 25, 2024 06:51
Show Gist options
  • Save salaros/d4bec5d50582a3a692db39bdf11bd51a to your computer and use it in GitHub Desktop.
Save salaros/d4bec5d50582a3a692db39bdf11bd51a to your computer and use it in GitHub Desktop.
Create a new Wireguard peer
#!/usr/bin/env bash
if [ -z "${1}" ]; then
echo "Please provide the private key of the client."
exit 1;
fi
if [ -z "${2}" ]; then
echo "Please provide a valid device name, e.g. 'ivan@dell-insp-5500'."
exit 1;
fi
WIREGUARD_CLIENT_PRIVATE_KEY="$1"
WIREGUARD_CLIENT_PUBLIC_KEY=$(echo $WIREGUARD_CLIENT_PRIVATE_KEY | wg pubkey)
WIREGUARD_CLIENT_DEVICE="$2"
WIREGUARD_CLIENT_ALLOWEDIPS="${WIREGUARD_CLIENT_ALLOWEDIPS:-${3:-0.0.0.0/0}}"
if [ -z "${WIREGUARD_CLIENT_ALLOWEDIPS}" ]; then
echo "Please provide a valid list of allowed IPs e.g. '0.0.0.0/0'."
exit 1;
fi
WIREGUARD_CLIENT_DNS="${WIREGUARD_CLIENT_DNS:-${4:-1.1.1.1, 8.8.8.8}}"
if [ -z "${WIREGUARD_CLIENT_DNS}" ]; then
echo "Please provide a valid list of DNS severs e.g. '1.1.1.1, 8.8.8.8'."
exit 1;
fi
WIREGUARD_SERVER_HOSTNAME="${WIREGUARD_SERVER_HOSTNAME:-$5}"
if [ -z "${WIREGUARD_SERVER_HOSTNAME}" ]; then
WIREGUARD_SERVER_HOSTNAME=$(curl icanhazip.com)
fi
WIREGUARD_SERVER_INTERFACE="$6"
if [ -z "${WIREGUARD_SERVER_INTERFACE}" ]; then
WIREGUARD_SERVER_INTERFACE="wg0"
fi
WIREGUARD_SERVER_IP=$(sed -n -e 's/^Address = //p' /etc/wireguard/wg0.conf | sort -rn | head -n 1)
WIREGUARD_SERVER_ID=$(sed -n -e 's/^AllowedIPs = //p' /etc/wireguard/wg0.conf | sort -rn | head -n 1)
WIREGUARD_SERVER_PORT=$(sed -n -e 's/^ListenPort = //p' /etc/wireguard/wg0.conf)
WIREGUARD_SERVER_PRIVATE_KEY=$(sed -n -e 's/^PrivateKey = //p' /etc/wireguard/wg0.conf)
WIREGUARD_SERVER_PUBLIC_KEY=$(echo $WIREGUARD_SERVER_PRIVATE_KEY | wg pubkey)
WIREGUARD_SERVER_PRESHARED_KEY=$(wg genpsk)
if [ -z "${WIREGUARD_SERVER_PUBLIC_KEY}" ]; then
echo "Couldn't read your server's private and public key."
exit 1;
fi
nextip(){
IP=$1
IP_HEX=$(printf '%.2X%.2X%.2X%.2X\n' `echo $IP | sed -e 's/\./ /g'`)
NEXT_IP_HEX=$(printf %.8X `echo $(( 0x$IP_HEX + 1 ))`)
NEXT_IP=$(printf '%d.%d.%d.%d\n' `echo $NEXT_IP_HEX | sed -r 's/(..)/0x\1 /g'`)
echo "$NEXT_IP"
}
WIREGUARD_CLIENT_LAST_IP=$(sed -n -e 's/^AllowedIPs = //p' /etc/wireguard/wg0.conf | sort -rn | head -n 1)
if [ -z "${WIREGUARD_CLIENT_LAST_IP}" ]; then
WIREGUARD_CLIENT_LAST_IP=$WIREGUARD_SERVER_IP
fi
WIREGUARD_CLIENT_NEXT_IP=$(nextip $WIREGUARD_CLIENT_LAST_IP)
WIREGUARD_CLIENT_PUBLIC_KEY=$(echo $WIREGUARD_CLIENT_PRIVATE_KEY | wg pubkey)
WIREGUARD_CLIENT_PRESHARED_KEY="/etc/wireguard/clients/$WIREGUARD_CLIENT_DEVICE-$WIREGUARD_CLIENT_NEXT_IP.psk"
mkdir -p /etc/wireguard/clients/
echo $WIREGUARD_SERVER_PRESHARED_KEY > $WIREGUARD_CLIENT_PRESHARED_KEY
wg set wg0 peer $WIREGUARD_CLIENT_PUBLIC_KEY preshared-key $WIREGUARD_CLIENT_PRESHARED_KEY allowed-ips $WIREGUARD_CLIENT_NEXT_IP/32
wg-quick down wg0
wg-quick up wg0
WIREGUARD_WIREGUARD_CLIENT_CONF="/etc/wireguard/clients/$WIREGUARD_CLIENT_DEVICE-$WIREGUARD_CLIENT_NEXT_IP.conf"
mkdir -p /etc/wireguard/clients/
clear
tee $WIREGUARD_WIREGUARD_CLIENT_CONF << END
[Interface]
PrivateKey = $WIREGUARD_CLIENT_PRIVATE_KEY
Address = $WIREGUARD_CLIENT_NEXT_IP/24
DNS = $WIREGUARD_CLIENT_DNS
[Peer]
PublicKey = $WIREGUARD_SERVER_PUBLIC_KEY
PresharedKey = $WIREGUARD_SERVER_PRESHARED_KEY
AllowedIPs = $WIREGUARD_CLIENT_ALLOWEDIPS
Endpoint = $WIREGUARD_SERVER_HOSTNAME:$WIREGUARD_SERVER_PORT
PersistentKeepalive = 25
END
qrencode -t ansiutf8 < $WIREGUARD_WIREGUARD_CLIENT_CONF
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment