2019-02-14 21:03:36 +01:00
#!/bin/bash
set -e
2021-03-07 04:22:10 +01:00
default_route_ip = $( ip route | grep default | awk '{print $3}' )
if [ [ -z " $default_route_ip " ] ] ; then
echo "No default route configured" >& 2
exit 1
fi
2019-05-13 07:21:16 +02:00
configs = ` find /etc/wireguard -type f -printf "%f\n" `
2020-09-13 03:07:06 +02:00
if [ [ -z " $configs " ] ] ; then
2019-05-13 07:21:16 +02:00
echo "No configuration files found in /etc/wireguard" >& 2
2019-02-14 21:03:36 +01:00
exit 1
fi
2019-05-13 07:21:16 +02:00
config = ` echo $configs | head -n 1`
interface = " ${ config %.* } "
2019-02-14 21:03:36 +01:00
2020-09-12 23:26:51 +02:00
if [ [ " $( cat /proc/sys/net/ipv4/conf/all/src_valid_mark) " != "1" ] ] ; then
echo "sysctl net.ipv4.conf.all.src_valid_mark=1 is not set" >& 2
exit 1
fi
2021-06-08 21:43:43 +02:00
# The net.ipv4.conf.all.src_valid_mark sysctl is set when running the Docker container, so don't have WireGuard also set it
sed -i "s:sysctl -q net.ipv4.conf.all.src_valid_mark=1:echo Skipping setting net.ipv4.conf.all.src_valid_mark:" /usr/bin/wg-quick
2019-02-14 21:03:36 +01:00
wg-quick up $interface
2021-06-08 21:33:01 +02:00
# IPv4 kill switch: traffic must be either (1) to the WireGuard interface, (2) marked as a WireGuard packet, (3) to a local address, or (4) to the Docker network
2019-05-13 07:21:16 +02:00
docker_network = " $( ip -o addr show dev eth0 | awk '$3 == "inet" {print $4}' ) "
docker_network_rule = $( [ ! -z " $docker_network " ] && echo " ! -d $docker_network " || echo "" )
iptables -I OUTPUT ! -o $interface -m mark ! --mark $( wg show $interface fwmark) -m addrtype ! --dst-type LOCAL $docker_network_rule -j REJECT
2021-06-08 21:33:01 +02:00
# IPv6 kill switch: traffic must be either (1) to the WireGuard interface, (2) marked as a WireGuard packet, (3) to a local address, or (4) to the Docker network
2019-05-13 07:21:16 +02:00
docker6_network = " $( ip -o addr show dev eth0 | awk '$3 == "inet6" {print $4}' ) "
2021-06-08 21:33:01 +02:00
if [ [ " $docker6_network " ] ] ; then
2020-09-13 03:07:06 +02:00
docker6_network_rule = $( [ ! -z " $docker6_network " ] && echo " ! -d $docker6_network " || echo "" )
ip6tables -I OUTPUT ! -o $interface -m mark ! --mark $( wg show $interface fwmark) -m addrtype ! --dst-type LOCAL $docker6_network_rule -j REJECT
2021-06-08 21:33:01 +02:00
else
echo "Skipping IPv6 kill switch setup since IPv6 interface was not found" >& 2
2020-09-13 03:07:06 +02:00
fi
2019-05-13 07:21:16 +02:00
2022-04-17 04:21:01 +02:00
# Support LOCAL_NETWORK environment variable, which was replaced by LOCAL_SUBNETS
if [ [ -z " $LOCAL_SUBNETS " && " $LOCAL_NETWORK " ] ] ; then
LOCAL_SUBNETS = $LOCAL_NETWORK
2021-03-09 04:17:08 +01:00
fi
2022-04-17 04:21:01 +02:00
# Support LOCAL_SUBNET environment variable, which was replaced by LOCAL_SUBNETS (plural)
if [ [ -z " $LOCAL_SUBNETS " && " $LOCAL_SUBNET " ] ] ; then
LOCAL_SUBNETS = $LOCAL_SUBNET
2021-03-07 04:22:10 +01:00
fi
2022-04-17 04:21:01 +02:00
for local_subnet in ${ LOCAL_SUBNETS //,/ $IFS }
do
echo " Allowing traffic to local subnet ${ local_subnet } " >& 2
ip route add $local_subnet via $default_route_ip
iptables -I OUTPUT -d $local_subnet -j ACCEPT
done
2019-02-14 21:03:36 +01:00
shutdown ( ) {
wg-quick down $interface
exit 0
}
trap shutdown SIGTERM SIGINT SIGQUIT
sleep infinity &
wait $!