152 lines
5.0 KiB
Bash
152 lines
5.0 KiB
Bash
#!/bin/bash
|
|
echo "---Ensuring UID: ${UID} matches user---"
|
|
usermod -u ${UID} ${USER}
|
|
echo "---Ensuring GID: ${GID} matches user---"
|
|
groupmod -g ${GID} ${USER} > /dev/null 2>&1 ||:
|
|
usermod -g ${GID} ${USER}
|
|
echo "---Setting umask to ${UMASK}---"
|
|
umask ${UMASK}
|
|
|
|
echo "---Checking for optional scripts---"
|
|
cp -f /opt/custom/user.sh /opt/scripts/start-user.sh > /dev/null 2>&1 ||:
|
|
cp -f /opt/scripts/user.sh /opt/scripts/start-user.sh > /dev/null 2>&1 ||:
|
|
|
|
if [ -f /opt/scripts/start-user.sh ]; then
|
|
echo "---Found optional script, executing---"
|
|
chmod -f +x /opt/scripts/start-user.sh ||:
|
|
/opt/scripts/start-user.sh || echo "---Optional Script has thrown an Error---"
|
|
else
|
|
echo "---No optional script found, continuing---"
|
|
fi
|
|
|
|
if [ ! -f /etc/sudoers.d/${USER} ]; then
|
|
echo "---Creating sudoers file for user: ${USER}---"
|
|
echo "${USER} ALL=(ALL) NOPASSWD: /usr/bin/wg-quick up *
|
|
${USER} ALL=(ALL) NOPASSWD: /usr/bin/wg-quick down *
|
|
${USER} ALL=(ALL) NOPASSWD: /usr/bin/wg show wg*" > /etc/sudoers.d/${USER}
|
|
else
|
|
echo "---Found sudoers file for user: ${USER}---"
|
|
fi
|
|
|
|
if [ "${SETUP_IPTABLES}" == "true" ]; then
|
|
echo "---Setting up iptables---"
|
|
iptables -t nat -A PREROUTING -i wg${WG_CONFIG_ID} -p ${NAT_PROTOCOL} --dport ${NAT_TUNNEL_PORT} -j DNAT --to-destination ${NAT_DESTINATION}
|
|
iptables -A FORWARD -i wg${WG_CONFIG_ID} -o eth0 -p ${NAT_PROTOCOL} --dport ${NAT_DESTINATION#*:} -d ${NAT_DESTINATION%%:*} -j ACCEPT
|
|
iptables -A FORWARD -i eth0 -o wg${WG_CONFIG_ID} -p ${NAT_PROTOCOL} --sport ${NAT_DESTINATION#*:} -s ${NAT_DESTINATION%%:*} -j ACCEPT
|
|
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
|
|
iptables -A FORWARD -i wg${WG_CONFIG_ID} -j DROP
|
|
elif [ "${SETUP_IPTABLES}" == "custom" ]; then
|
|
if [ ! -f ${DATA_DIR}/wg${WG_CONFIG_ID}/iptables ]; then
|
|
echo "---No custom iptables found, make sure that the file iptables exists---"
|
|
else
|
|
echo "---Applying custom iptables---"
|
|
while IFS= read -r line; do
|
|
if [ -z "$line" ]; then
|
|
continue
|
|
fi
|
|
echo "Applying: $line"
|
|
eval "$line"
|
|
done < "${DATA_DIR}/wg${WG_CONFIG_ID}/iptables"
|
|
fi
|
|
fi
|
|
|
|
create_servercfg() {
|
|
if [ ! -d ${DATA_DIR}/wg${WG_CONFIG_ID}/server ]; then
|
|
mkdir -p ${DATA_DIR}/wg${WG_CONFIG_ID}/server
|
|
fi
|
|
cat <<EOF > ${DATA_DIR}/wg${WG_CONFIG_ID}/server/wg${WG_CONFIG_ID}.conf
|
|
[Interface]
|
|
Address = ${WG_NET_IP}/${WG_NET_SUBNET}
|
|
PrivateKey = ${1}
|
|
ListenPort = ${SERVER_LISTEN_PORT}
|
|
|
|
EOF
|
|
}
|
|
|
|
create_peer() {
|
|
ADDRESS_NO=${1}
|
|
cat <<EOF >> ${DATA_DIR}/wg${WG_CONFIG_ID}/server/wg${WG_CONFIG_ID}.conf
|
|
[Peer] # Client ${1}
|
|
PublicKey = ${2}
|
|
$(if [ ! -z "${3}" ]; then echo "PresharedKey = ${3}"; fi)
|
|
AllowedIPs = ${WG_NET_IP%.*}.$(( ${WG_NET_IP##*.} + ADDRESS_NO ))/32
|
|
|
|
EOF
|
|
}
|
|
|
|
create_config() {
|
|
if [ ! -d ${DATA_DIR}/wg${WG_CONFIG_ID}/client ]; then
|
|
mkdir -p ${DATA_DIR}/wg${WG_CONFIG_ID}/client
|
|
fi
|
|
ADDRESS_NO=${1}
|
|
cat <<EOF > ${DATA_DIR}/wg${WG_CONFIG_ID}/client/peer${1}.conf
|
|
[Interface]
|
|
Address = ${WG_NET_IP%.*}.$(( ${WG_NET_IP##*.} + ADDRESS_NO ))/32
|
|
PrivateKey = ${2}
|
|
|
|
[Peer]
|
|
PublicKey = ${3}
|
|
$(if [ ! -z "${4}" ]; then echo "PresharedKey = ${4}"; fi)
|
|
Endpoint = ${SERVER_IP}:${SERVER_LISTEN_PORT}
|
|
AllowedIPs = ${WG_NET_IP}/32
|
|
|
|
EOF
|
|
if [ "${GENERATE_QR}" == "true" ]; then
|
|
qrencode -t png -o ${DATA_DIR}/wg${WG_CONFIG_ID}/client/peer${1}.png -r ${DATA_DIR}/wg${WG_CONFIG_ID}/client/peer${1}.conf
|
|
fi
|
|
}
|
|
|
|
if [ ! -f ${DATA_DIR}/wg${WG_CONFIG_ID}/server/wg${WG_CONFIG_ID}.conf ]; then
|
|
echo "---Generating wg${WG_CONFIG_ID}.conf---"
|
|
PRIV_KEY=$(wg genkey)
|
|
create_servercfg "${PRIV_KEY}"
|
|
unset PRIV_KEY PUB_KEY
|
|
else
|
|
echo "---Configuration wg${WG_CONFIG_ID}.conf found!---"
|
|
fi
|
|
|
|
for ((i=1; i<=PEERS; i++))
|
|
do
|
|
if ! grep -q "^\[Peer\] # Client ${i}" ${DATA_DIR}/wg${WG_CONFIG_ID}/server/wg${WG_CONFIG_ID}.conf ; then
|
|
echo "---Generating configuration for Peer ${i}---"
|
|
PRIV_KEY=$(wg genkey)
|
|
PUBLIC_KEY=$(echo ${PRIV_KEY} | wg pubkey)
|
|
if [ "${GENERATE_PSK}" == "true" ]; then
|
|
WG_PSK=$(wg genpsk)
|
|
fi
|
|
create_peer "${i}" "${PUBLIC_KEY}" "${WG_PSK}"
|
|
SRV_PRIV_KEY=$(grep -A 5 "\[Interface\]" ${DATA_DIR}/wg${WG_CONFIG_ID}/server/wg${WG_CONFIG_ID}.conf | awk '/PrivateKey = /{print $NF; exit}')
|
|
SRV_PUBLIC_KEY=$(echo $SRV_PRIV_KEY | wg pubkey)
|
|
create_config "${i}" "${PRIV_KEY}" "${SRV_PUBLIC_KEY}" "${WG_PSK}"
|
|
unset SRV_PRIV_KEY SRV_PUBLIC_KEY PRIV_KEY PUBLIC_KEY WG_PSK
|
|
else
|
|
echo "---Client ${i} already existing---"
|
|
fi
|
|
done
|
|
|
|
cp ${DATA_DIR}/wg${WG_CONFIG_ID}/server/wg${WG_CONFIG_ID}.conf /etc/wireguard/wg${WG_CONFIG_ID}.conf
|
|
|
|
echo "---Taking ownership of data...---"
|
|
chown -R root:${GID} /opt/scripts
|
|
chown root:root /etc/wireguard/wg${WG_CONFIG_ID}.conf
|
|
chmod 440 /etc/sudoers.d/${USER}
|
|
chmod -R 750 /opt/scripts
|
|
chown ${UID}:${GID} ${DATA_DIR}
|
|
chown -R ${UID}:${GID} ${DATA_DIR}/wg${WG_CONFIG_ID}
|
|
|
|
echo "---Starting...---"
|
|
term_handler() {
|
|
echo "---Stopping WireGuard tunnel wg${WG_CONFIG_ID}---"
|
|
wg-quick down wg${WG_CONFIG_ID} > /dev/null 2>&1
|
|
kill $(pidof sleep)
|
|
exit 143;
|
|
}
|
|
|
|
trap 'kill ${!}; term_handler' SIGTERM
|
|
su ${USER} -c "/opt/scripts/start-server.sh" &
|
|
killpid="$!"
|
|
while true
|
|
do
|
|
wait $killpid
|
|
exit 0;
|
|
done |