#!/bin/sh
|
|
|
|
. /usr/share/libubox/jshn.sh
|
|
. /usr/share/wginstaller/wg.sh
|
|
|
|
wg_key_exists () {
|
|
local key=$1
|
|
|
|
wg show | grep -q "$key"
|
|
}
|
|
|
|
wg_timeout () {
|
|
local int=$1
|
|
|
|
handshake=$(wg show "$int" latest-handshakes | awk '{print $2}')
|
|
timeout=$(uci get wgserver.@server[0].timeout_handshake)
|
|
|
|
if [ "$handshake" -ge "$timeout" ]; then
|
|
echo "1"
|
|
else
|
|
echo "0"
|
|
fi
|
|
}
|
|
|
|
wg_check_interface () {
|
|
local int=$1
|
|
if [ "$(wg_timeout "$int")" -eq "1" ]; then
|
|
ip link del dev "$int"
|
|
fi
|
|
}
|
|
|
|
wg_check_interfaces () {
|
|
wg_interfaces=$(wg show interfaces)
|
|
for interface in $wg_interfaces; do
|
|
wg_check_interface "$interface"
|
|
done
|
|
}
|
|
|
|
wg_get_usage () {
|
|
num_interfaces=$(wg show interfaces | wc -w)
|
|
json_init
|
|
json_add_int "num_interfaces" "$num_interfaces"
|
|
json_dump
|
|
}
|
|
|
|
wg_register () {
|
|
local uplink_bw=$1
|
|
local mtu=$2
|
|
local public_key=$3
|
|
|
|
if wg_key_exists $public_key; then
|
|
logger -t "wginstaller" "Rejecting request since the public key is already used!" "$public_key"
|
|
json_init
|
|
json_add_int "response_code" 1
|
|
json_dump
|
|
return 1
|
|
fi
|
|
|
|
base_prefix_ipv6=$(uci get wgserver.@server[0].base_prefix_ipv6)
|
|
port_start=$(uci get wgserver.@server[0].port_start)
|
|
port_end=$(uci get wgserver.@server[0].port_end)
|
|
|
|
port=$(next_port "$port_start" "$port_end")
|
|
ifname="wg_$port"
|
|
|
|
offset=$((port - port_start))
|
|
gw_ipv6=$(owipcalc "$base_prefix_ipv6" add "$offset" next 128) # gateway ip
|
|
gw_ipv6_assign="${gw_ipv6}/128"
|
|
|
|
gw_key=$(uci get wgserver.@server[0].wg_key)
|
|
gw_pub=$(uci get wgserver.@server[0].wg_pub)
|
|
|
|
if [ "$(uci get wgserver.@server[0].wg_tmp_key)" -eq 1 ]; then
|
|
[ -d "/tmp/run/wgserver" ] || mkdir -p /tmp/run/wgserver
|
|
gw_key="/tmp/run/wgserver/${ifname}.key"
|
|
gw_pub="/tmp/run/wgserver/${ifname}.pub"
|
|
wg genkey | tee "$gw_key" | wg pubkey > "$gw_pub"
|
|
else
|
|
[ -d "$(dirname $gw_key)" ] || mkdir -p "$(dirname $gw_key)"
|
|
[ -f "$gw_key" ] || wg genkey | tee "$gw_key" | wg pubkey > "$gw_pub"
|
|
fi
|
|
wg_server_pubkey=$(cat "$gw_pub")
|
|
|
|
# create wg tunnel
|
|
ip link add dev "$ifname" type wireguard
|
|
wg set "$ifname" listen-port "$port" private-key "$gw_key" peer "$public_key" allowed-ips 0.0.0.0/0,::0/0
|
|
ip -6 addr add "$gw_ipv6_assign" dev "$ifname"
|
|
ip -6 addr add fe80::1/64 dev "$ifname"
|
|
|
|
base_prefix_ipv4=$(uci get wgserver.@server[0].base_prefix_ipv4)
|
|
if [ $? -eq 0 ]; then
|
|
gw_ipv4=$(owipcalc "$base_prefix_ipv4" add "$offset" next 32) # gateway ip
|
|
gw_ipv4_assign="${gw_ipv4}/32"
|
|
ip addr add "$gw_ipv4_assign" broadcast 255.255.255.255 dev "$ifname"
|
|
fi
|
|
|
|
ip link set up dev "$ifname"
|
|
ip link set mtu "$mtu" dev "$ifname"
|
|
|
|
# craft return address
|
|
json_init
|
|
json_add_int "response_code" 0
|
|
json_add_string "gw_pubkey" "$wg_server_pubkey"
|
|
if test -n "${gw_ipv4_assign-}"; then
|
|
json_add_string "gw_ipv4" "$gw_ipv4_assign"
|
|
fi
|
|
json_add_string "gw_ipv6" "$gw_ipv6_assign"
|
|
json_add_int "gw_port" "$port"
|
|
|
|
json_dump
|
|
}
|