blob: 51d166b669c7d94dd3d3b7327775404e2de825b2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
#!/bin/sh
set -e
# 中間証明書チェーンを個別ファイルに分割(strongSwan は複数証明書 PEM の最初しか読まないため)
# iOS の IKEv2 実装は trust store を参照しないため、完全なチェーンを送る必要がある
# YE1 + Root YE + ISRG Root X2(cross-signed by Root X1) の 3 枚を送る
n=0
file=""
while IFS= read -r line; do
case "$line" in
"-----BEGIN CERTIFICATE-----")
n=$((n+1))
if [ "$n" -gt 3 ]; then break; fi
file="/etc/swanctl/x509ca/chain-${n}.crt"
printf '%s\n' "$line" > "$file"
;;
*)
[ -n "$file" ] && printf '%s\n' "$line" >> "$file"
;;
esac
done < /tmp/server-chain.crt
echo "Loaded ${n} intermediate CA certs from chain"
# IP フォワーディング有効化(network_mode: host では書き込み不可の場合があるのでエラー無視)
sysctl -w net.ipv4.ip_forward=1 2>/dev/null || true
sysctl -w net.ipv6.conf.all.forwarding=1 2>/dev/null || true
if [ "$(cat /proc/sys/net/ipv4/ip_forward)" != "1" ]; then
echo "ERROR: IP forwarding が無効。ホスト側で sysctl -w net.ipv4.ip_forward=1 を実行してください"
exit 1
fi
# 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 を直接フォアグラウンドで起動(ログが Docker に流れる)
/usr/lib/strongswan/charon &
CHARON_PID=$!
# vici ソケット待ち
for i in $(seq 1 10); do
swanctl --list-conns > /dev/null 2>&1 && break
sleep 1
done
swanctl --load-conns
swanctl --load-creds --noprompt
swanctl --load-pools
echo "VPN ready. Domain: ${VPN_DOMAIN}"
wait $CHARON_PID
|