Initial version
This commit is contained in:
parent
c26011d670
commit
0cdcae2c17
8 changed files with 243 additions and 0 deletions
0
.gitignore
vendored
Normal file
0
.gitignore
vendored
Normal file
39
setup/balancer.sh
Normal file
39
setup/balancer.sh
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Author: Martijn de Boer
|
||||||
|
|
||||||
|
if [[ $EUID -ne 0 ]]; then
|
||||||
|
echo "You must be a root user" 2>&1
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -f /etc/debian_version ]]; then
|
||||||
|
echo "This script only works on Debian"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
apt update && apt upgrade -y && apt install -y \
|
||||||
|
caddy \
|
||||||
|
wireguard \
|
||||||
|
jq \
|
||||||
|
openssh-server \
|
||||||
|
ufw
|
||||||
|
|
||||||
|
ufw default deny incoming
|
||||||
|
ufw default allow outgoing
|
||||||
|
ufw allow http
|
||||||
|
ufw allow https
|
||||||
|
ufw enable
|
||||||
|
|
||||||
|
mkdir -p /root/tunnel-manager /etc/tunnel-manager/domains.d
|
||||||
|
|
||||||
|
read -p "Reboot the system now? " -n 1 -r REPLY_REBOOT
|
||||||
|
case "$REPLY_REBOOT" in
|
||||||
|
y|Y ) echo "yes";;
|
||||||
|
n|N ) echo "no";;
|
||||||
|
* ) echo "invalid";;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [[ $REPLY_REBOOT =~ ^[Yy]$ ]]
|
||||||
|
then
|
||||||
|
reboot
|
||||||
|
fi
|
46
setup/controlplane.sh
Normal file
46
setup/controlplane.sh
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Author: Martijn de Boer
|
||||||
|
|
||||||
|
if [[ $EUID -ne 0 ]]; then
|
||||||
|
echo "You must be a root user" 2>&1
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -f /etc/debian_version ]]; then
|
||||||
|
echo "This script only works on Debian"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
apt update && apt upgrade -y && apt install -y \
|
||||||
|
caddy \
|
||||||
|
wireguard \
|
||||||
|
jq \
|
||||||
|
openssh-server \
|
||||||
|
ufw
|
||||||
|
|
||||||
|
ufw default deny incoming
|
||||||
|
ufw default allow outgoing
|
||||||
|
ufw allow http
|
||||||
|
ufw allow https
|
||||||
|
ufw allow 51820/udp
|
||||||
|
ufw enable
|
||||||
|
|
||||||
|
mkdir -p /root/tunnel-manager /etc/tunnel-manager/domains.d
|
||||||
|
|
||||||
|
cd ../tunnel-manager
|
||||||
|
cp add-domain.sh update-tunnels.sh generate-wireguard.sh /root/tunnel-manager/
|
||||||
|
chmod +x /root/tunnel-manager/*.sh
|
||||||
|
|
||||||
|
echo '{"domains":{}}' > /etc/tunnel-manager/domains.json
|
||||||
|
|
||||||
|
read -p "Reboot the system now? " -n 1 -r REPLY_REBOOT
|
||||||
|
case "$REPLY_REBOOT" in
|
||||||
|
y|Y ) echo "yes";;
|
||||||
|
n|N ) echo "no";;
|
||||||
|
* ) echo "invalid";;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [[ $REPLY_REBOOT =~ ^[Yy]$ ]]
|
||||||
|
then
|
||||||
|
reboot
|
||||||
|
fi
|
40
tunnel-manager/Caddyfile
Normal file
40
tunnel-manager/Caddyfile
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
{
|
||||||
|
email abuse@habalancer.tld
|
||||||
|
|
||||||
|
log {
|
||||||
|
output file /var/log/caddy/access.log
|
||||||
|
format json
|
||||||
|
}
|
||||||
|
|
||||||
|
servers {
|
||||||
|
timeouts {
|
||||||
|
read_body 10s
|
||||||
|
read_header 5s
|
||||||
|
write 10s
|
||||||
|
idle 2m
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
import /etc/tunnel-manager/domains.d/*.conf
|
||||||
|
|
||||||
|
(proxy_settings) {
|
||||||
|
header {
|
||||||
|
Cache-Control "public, max-age=3600, stale-while-revalidate=86400"
|
||||||
|
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
|
||||||
|
X-Content-Type-Options "nosniff"
|
||||||
|
Referrer-Policy "strict-origin-when-cross-origin"
|
||||||
|
}
|
||||||
|
|
||||||
|
@cached_routes {
|
||||||
|
path /static/* /assets/* /images/* /css/* /js/*
|
||||||
|
}
|
||||||
|
|
||||||
|
handle @cached_routes {
|
||||||
|
cache {
|
||||||
|
ttl 1h
|
||||||
|
stale 24h
|
||||||
|
storage file /tmp/caddy-cache
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
55
tunnel-manager/add-domain.sh
Normal file
55
tunnel-manager/add-domain.sh
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Author: Martijn de Boer
|
||||||
|
|
||||||
|
if [[ $EUID -ne 0 ]]; then
|
||||||
|
echo "You must be a root user" 2>&1
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -f /etc/debian_version ]]; then
|
||||||
|
echo "This script only works on Debian"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
DOMAINS_CONFIG="/etc/tunnel-manager/domains.json"
|
||||||
|
|
||||||
|
add_domain() {
|
||||||
|
local domain="$1"
|
||||||
|
local target_ips=("${@:2}")
|
||||||
|
|
||||||
|
[[ -z "$domain" ]] && { echo "Error: Domain required"; exit 1; }
|
||||||
|
[[ ${#target_ips[@]} -eq 0 ]] && { echo "Error: At least one target IP required"; exit 1; }
|
||||||
|
|
||||||
|
jq --arg domain "$domain" \
|
||||||
|
--arg ipv4 "${target_ips[0]}" \
|
||||||
|
--arg ipv6 "${target_ips[1]:-}" \
|
||||||
|
'.domains[$domain] = {
|
||||||
|
"ipv4": $ipv4,
|
||||||
|
"ipv6": $ipv6,
|
||||||
|
"added_at": now
|
||||||
|
}' "$DOMAINS_CONFIG" > tmp.json && mv tmp.json "$DOMAINS_CONFIG"
|
||||||
|
|
||||||
|
/root/tunnel-manager/update-tunnels.sh
|
||||||
|
}
|
||||||
|
|
||||||
|
list_domains() {
|
||||||
|
jq '.' "$DOMAINS_CONFIG"
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_domain() {
|
||||||
|
local domain="$1"
|
||||||
|
jq "del(.domains[\"$domain\"])" "$DOMAINS_CONFIG" > tmp.json && mv tmp.json "$DOMAINS_CONFIG"
|
||||||
|
/root/tunnel-manager/update-tunnels.sh
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
add) add_domain "${@:2}" ;;
|
||||||
|
list) list_domains ;;
|
||||||
|
remove) remove_domain "$2" ;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 {add|list|remove} [domain] [ipv4] [ipv6]"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
1
tunnel-manager/domains.d/.gitignore
vendored
Normal file
1
tunnel-manager/domains.d/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
*.conf
|
33
tunnel-manager/generate-wireguard.sh
Normal file
33
tunnel-manager/generate-wireguard.sh
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Author: Martijn de Boer
|
||||||
|
|
||||||
|
if [[ $EUID -ne 0 ]]; then
|
||||||
|
echo "You must be a root user" 2>&1
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -f /etc/debian_version ]]; then
|
||||||
|
echo "This script only works on Debian"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
generate_wireguard_config() {
|
||||||
|
local server_index="$1"
|
||||||
|
local private_key=$(wg genkey)
|
||||||
|
local public_key=$(echo "$private_key" | wg pubkey)
|
||||||
|
|
||||||
|
cat > "/etc/wireguard/wg0-$server_index.conf" <<EOL
|
||||||
|
[Interface]
|
||||||
|
PrivateKey = $private_key
|
||||||
|
Address = 10.0.0.$((server_index + 1))/24
|
||||||
|
ListenPort = 51820
|
||||||
|
|
||||||
|
[Peer]
|
||||||
|
PublicKey = $(cat /etc/wireguard/public_key)
|
||||||
|
AllowedIPs = 10.0.0.1/32
|
||||||
|
Endpoint = controlplane.habalancer.tld:51820
|
||||||
|
|
||||||
|
EOL
|
||||||
|
}
|
29
tunnel-manager/update-tunnels.sh
Normal file
29
tunnel-manager/update-tunnels.sh
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Author: Martijn de Boer
|
||||||
|
|
||||||
|
if [[ $EUID -ne 0 ]]; then
|
||||||
|
echo "You must be a root user" 2>&1
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -f /etc/debian_version ]]; then
|
||||||
|
echo "This script only works on Debian"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
TUNNEL_SERVERS=("10.0.0.2" "10.0.0.3" "10.0.0.4")
|
||||||
|
SSH_KEY="/root/.ssh/tunnel_key"
|
||||||
|
|
||||||
|
update_tunnel_configs() {
|
||||||
|
local server="$1"
|
||||||
|
|
||||||
|
scp -i "$SSH_KEY" /etc/tunnel-manager/Caddyfile root@"$server":/etc/caddy/Caddyfile
|
||||||
|
|
||||||
|
ssh -i "$SSH_KEY" root@"$server" "systemctl reload caddy"
|
||||||
|
}
|
||||||
|
|
||||||
|
for server in "${TUNNEL_SERVERS[@]}"; do
|
||||||
|
update_tunnel_configs "$server"
|
||||||
|
done
|
Loading…
Add table
Reference in a new issue