VPN(IPSec/IKEv2)サーバを立ち上げて外出先から闇ネットに接続する
IPSec/IKEv2サーバを立ち上げると、外出先でMacBookやiPadやiPhoneなどから闇ネットに接続できるようになる 後述の課題もあり、まだすべての闇の眷属におすすめできるような状態ではない 動作確認済みのOS
サーバ: Ubuntu 20.04
クライアント: iOS 14.7, iPadOS 14.7, macOS 11.5
VPNサーバをGSNetに接続する
当たり前だが、IPSec/IKEv2サーバにするホストがまずなんらかの方法で闇ネットに接続されていることが前提となる VPSをIKEv2サーバにする場合
Ubuntu 20.04 LTS が動作している場合は何もしなくてOK
Debian 11 も未確認だがたぶんOK
Debian 10 (2021/08 時点でのRaspberry Pi OSも含む)の場合は Debian 11 へのアップグレードが必要
ただし Raspberry Pi OS は apt dist-upgrade をサポートしていないので、Raspberry Pi OSで実行する場合はサポート外の操作になる
strongSwan のセットアップ
strongSwanをインストールする
code:sh
sudo apt update
sudo apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins libstrongswan-extra-plugins
ルート証明書を作成する
code:sh
mkdir -p ~/pki/{cacerts,certs,private}
chmod 700 ~/pki
sudo ipsec pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem
sudo ipsec pki --self --ca --lifetime 3650 --in ~/pki/private/ca-key.pem \
--type rsa --dn "CN=VPN root CA" --outform pem > ~/pki/cacerts/ca-cert.pem
サーバ証明書の作成
code:sh
pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem
pki --pub --in ~/pki/private/server-key.pem --type rsa \
| pki --issue --lifetime 1825 \
--cacert ~/pki/cacerts/ca-cert.pem \
--cakey ~/pki/private/ca-key.pem \
--dn "CN=<サーバのインターネット側IPアドレス>" --san <サーバのインターネット側IPアドレス> \
--flag serverAuth --flag ikeIntermediate --outform pem \
~/pki/certs/server-cert.pem
sudo cp -r ~/pki/* /etc/ipsec.d/
/etc/ipsec.conf を以下の内容で作成する
code:/etc/ipsec.conf
config setup
charondebug="ike 1, knl 1, cfg 0"
uniqueids=no
conn ikev2-vpn
auto=add
compress=no
type=tunnel
keyexchange=ikev2
fragmentation=yes
forceencaps=yes
dpdaction=clear
dpddelay=300s
rekey=no
left=%any
leftid=<サーバのインターネット側IPアドレス>
leftcert=server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
right=%any
rightid=%any
rightauth=eap-mschapv2
rightsourceip=192.168.83.0/24
rightdns=8.8.8.8,8.8.4.4
rightsendcert=never
eap_identity=%identity
ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
/etc/ipsec.secrets にユーザごとの認証情報を作成する
code:/etc/ipsec.secrets
# This file holds shared secrets or RSA private keys for authentication.
# RSA private key for this host, authenticating it to any other host
# which knows the public part.
: RSA "server-key.pem"
ipad : EAP "password1234567890"
iphone : EAP "password2345678901"
iptables の設定
code:sh
iptables -t nat -A POSTROUTING -d 10.0.0.0/8 -o br0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o <インターネット側のインターフェース> -j MASQUERADE
10.0.0.0/8 へのアクセスは br0 (GSNet) に転送する
それ以外はインターネット側のインターフェースに転送する
さくらVPSの場合は ens3 とか
VPNクライアントの設定
iOSの場合
ルート証明書( ca-certs.pem )をてきとうなサーバに置いてSafariで開く
もしくは、iOS純正メールからpemファイルを開くことで追加できる
環境設定->ネットワークから、VPN(IKEv2)を作成
サーバーアドレス、リモートIDをサーバーのグローバルIPに
認証設定をユーザー名にして /etc/ipsec.screts に書いたユーザー名/パスワードを設定
macOSの場合
ルート証明書( ca-certs.pem )をダウンロードしてダブルクリック
キーチェーンアクセスから証明書を信頼する
https://gyazo.com/8234eab77368a32064985d58c98dd067
https://gyazo.com/9693a5641bd3b38b831a7d20ea8ac5b9
つながらない場合は
とりあえずログを見てみよう
journalctl -f
/etc/ipsec.screts にEAPキーを追加しても接続ができないとき、サーバを再起動するとつながるようになった
追加したEAPキーを認識させる手順がなんかあるけどすっ飛ばしているのかも?
課題
GSNet(gsnet)からWAN側( ens3 )に流れるパケットを DROP できない
ip addr を見ても、strongswan の作ったインターフェースが見当たらないため
GSNet(gsnet)からWAN側(ens3)に流れるパケットを DROP しようとすると、GSNet に接続できなくなる
code:sh
iptables -t filter -A FORWARD -i br0 -o ens3 -j DROP
↑これを消すと GSNet に接続出来る
Debian 10 Buster(Debian 10 BusterベースのArmbian含む)だとlibcharon-extauth-pluginsが存在しないので、rightauth=eap-mschapv2 が使えない Debian 11 がリリースされたのでこの節はもう見るな!
testingのstrongswanを入れようとすると、libcまでアップデートしようとしてくるのでシステムが壊れる可能性がありやめた4
AppleデバイスはEAP-TLSも使えるようなので、rightauth=eap-mschapv2を諦めて、rightauth=eap-tlsを試してもいいかもしれない
Debian 11 がリリースされたのでもう気にしなくてもいいかも?
GSNet以外宛のパケットもIKEv2サーバを経由してしまう
オリジンがさくらVPSなどのIPアドレスになると問題が起こることも
例: ヨドバシ・ドット・コムがさくらVPSのIPアドレスをbotと見做してアクセスを拒絶する
VPSの帯域はそれほど広いわけではない
さくらVPSだと100Mbps
トラフィックがもったいない
EC2みたいに従量課金だと、闇ネットのトラフィックだけだと数百円で済むところ、インターネットのトラフィックも合わせるとすごい金額をとられるかも
EC2でVPNやってる酔狂なやつはおらんと思うが・・・
macOSやiOSでどのような設定をすれば特定の宛先だけVPNに流せるのか要調査
参考
See Also: