diff options
| author | yyamashita <yyamashita@hetzner.yyamashita.com> | 2026-06-30 22:29:07 +0900 |
|---|---|---|
| committer | yyamashita <yyamashita@hetzner.yyamashita.com> | 2026-06-30 22:29:07 +0900 |
| commit | 58f7917662ff92a3712289acccff8310c8f1baff (patch) | |
| tree | cf7290a3eaf0e08c170199ac831f562949785014 /vpn/entrypoint.sh | |
| parent | 1ad98cc2f9f8a5950aec998a6daacec381cbe2c4 (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.sh | 54 |
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 |
