summaryrefslogtreecommitdiff
path: root/vpn/entrypoint.sh
diff options
context:
space:
mode:
authoryyamashita <yyamashita@hetzner.yyamashita.com>2026-06-30 22:29:07 +0900
committeryyamashita <yyamashita@hetzner.yyamashita.com>2026-06-30 22:29:07 +0900
commit58f7917662ff92a3712289acccff8310c8f1baff (patch)
treecf7290a3eaf0e08c170199ac831f562949785014 /vpn/entrypoint.sh
parent1ad98cc2f9f8a5950aec998a6daacec381cbe2c4 (diff)
Add strongSwan IKEv2 VPN service
- vpn/: Dockerfile, docker-compose.yml, swanctl.conf.tpl, entrypoint.sh - install.sh: Caddy 証明書流用 + コンテナ起動 - renew-cert.sh: 証明書更新 + swanctl ホットリロード - caddy/Caddyfile: vpn.yyamashita.com 追加(Let's Encrypt 証明書取得用) - post-receive: vpn/deploy.sh を追加 - setup-route53.py: WEB_SUBDOMAINS に vpn を追加 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'vpn/entrypoint.sh')
-rw-r--r--vpn/entrypoint.sh54
1 files changed, 54 insertions, 0 deletions
diff --git a/vpn/entrypoint.sh b/vpn/entrypoint.sh
new file mode 100644
index 0000000..4efe500
--- /dev/null
+++ b/vpn/entrypoint.sh
@@ -0,0 +1,54 @@
+#!/bin/sh
+set -e
+
+# IP フォワーディング有効化
+sysctl -w net.ipv4.ip_forward=1
+sysctl -w net.ipv6.conf.all.forwarding=1
+
+# VPN クライアントのトラフィックを MASQUERADE
+IFACE=$(ip route show default | awk '/default/ {print $5}' | head -1)
+iptables -t nat -C POSTROUTING -s 10.10.0.0/24 -o "${IFACE}" -j MASQUERADE 2>/dev/null || \
+ iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o "${IFACE}" -j MASQUERADE
+iptables -C FORWARD -s 10.10.0.0/24 -j ACCEPT 2>/dev/null || \
+ iptables -A FORWARD -s 10.10.0.0/24 -j ACCEPT
+iptables -C FORWARD -d 10.10.0.0/24 -j ACCEPT 2>/dev/null || \
+ iptables -A FORWARD -d 10.10.0.0/24 -j ACCEPT
+
+# users.conf から EAP シークレットセクションを生成
+VPN_SECRETS=""
+while IFS=' ' read -r user pass || [ -n "$user" ]; do
+ [ -z "$user" ] && continue
+ case "$user" in \#*) continue ;; esac
+ VPN_SECRETS="${VPN_SECRETS}
+ eap-${user} {
+ id = ${user}
+ secret = \"${pass}\"
+ }"
+done < /etc/strongswan/users.conf
+
+export VPN_SECRETS
+export VPN_DOMAIN="${VPN_DOMAIN:-vpn.yyamashita.com}"
+
+# テンプレートから swanctl.conf を生成
+envsubst < /etc/swanctl/swanctl.conf.tpl > /etc/swanctl/swanctl.conf
+
+# charon (IKE デーモン) 起動
+ipsec start
+
+# 初期化待ち
+sleep 2
+
+# 設定ロード
+swanctl --load-conns
+swanctl --load-creds --noprompt
+swanctl --load-pools
+
+echo "VPN ready. Domain: ${VPN_DOMAIN}"
+
+# シグナルハンドラ
+trap 'ipsec stop; exit 0' TERM INT
+
+# charon が生きている間ループ
+while ipsec status > /dev/null 2>&1; do
+ sleep 10
+done