MAP-EでL2TP/IPSecが使えないからWireGuardでAWSを経由させる
やること
自宅はIPoEでMAP-Eな環境になっている。そのため、4500/udpとかESPは通過できない。 そのため、AWS(Lightsail)を構築させることで、制限のないグローバルIPアドレスを入手し、そこからIPSecを使用する。 その構築にあたり、FreeBSDでWireGuardなVPNを構築した記録。
仕組み
特定のアドレスへの通信は、WireGuardを使用して、Lightsailへ転送し、Lightsailから接続する。
IPSecのクライアントになるPC→WireGuardの入り口→WireGuardの出口(Lightsail)→IPSecの接続先
Lightsailは3.5ドル/月で、1TBまでデータ転送できるため、用途的には十分。
方法
FreeBSDにWeireGuardをインストールして、特定アドレスはそれを経由するようにしただけ。
AWS側
LightsailでFreeBSDなインスタンスを作る。もちろん一番安い3.5ドルのプランで。
bsdconfig timezone
WireGuard
WireGuardはpkgでインストール。
pkg install wireguard
接続時の認証に使用する鍵をつくる。
# privateはAWSに設定、publicは自宅に設定 wg genkey | tee aws-private.txt | wg pubkey > aws-public.txt # privateは自宅に設定、publicはAWSに設定 wg genkey | tee local-private.txt | wg pubkey > local-public.txt
生成した鍵と、IPアドレスを書いた設定ファイルを作る。 10.01.0/2はVPNのネットワークアドレス。192.168.1.0/24は自宅のネットワークアドレス。 ポートの5555は、自分で使えるポートにする。MAP-Eは使えるポートに制限がある。
cat << 'EOF' > /usr/local/etc/wireguard/wg0.conf [Interface] Address = 10.0.1.1/32 ListenPort = 5555 PrivateKey = WKEaYCv+VOmSY/m/n82+IXNIapij8c8KqMW4e8cPKXE= [Peer] PublicKey = VSjhCn9WTEJWjSQW7tWmzKB0G/RE/z5t2AUaa58RrQU= AllowedIPs = 10.0.1.2/32, 192.168.1.0/24 'EOF'
pf
pfでNATする。
cat << 'EOF' > /etc/pf.conf ext_if=xn0 wg_if=wg0 home=172.16.0.1 home_net="192.168.1.0/24" wireguard_port=5555 set block-policy drop set skip on lo0 nat on $ext_if inet proto udp from $home_net port 500 to any -> $ext_if port 500 nat on $ext_if inet proto udp from $home_net port 4500 to any -> $ext_if port 4500 nat on $ext_if inet from $home_net to any -> $ext_if block in quick proto udp from ! $home to self port $wireguard_port pass all 'EOF'
インスタンスは使い捨てなので、rc.confには書かない。(書いてもいいけど)
kldload pf service pf onestart
パケットを転送する設定も忘れずに。
sysctl net.inet.ip.forwarding=1
起動する。
wg-quick up wg0
自宅側
AWSと同様に設定する。(インストール、ルーティングなどは面倒なので省略。) 172.17.0.1はIPSecの接続先のつもり。
WireGuardの設定はこんな感じで。
cat << 'EOF' > /usr/local/etc/wireguard/wg0.conf [Interface] Address=10.0.1.2/32 PrivateKey=+M2zyuI9IAnG6QxVMAg0nEf69rs3FeOTUsmQZVSKgFA= [Peer] Endpoint=AWSのアドレス:5555 PublicKey= U/OONLU/6LoDIo5j1hkKX2WH3gdh8KbhxlFRL/E6BUI= AllowedIPs=10.0.1.1/32, 172.17.0.1 PersistentKeepalive=25 'EOF'
起動する。
wg-quick up wg0
WireGuardの設定ファイルのAllowedIPsに書いてあるアドレス宛の場合は、wg0に流れるようになる。
まとめ
WireGuardは、接続早いし、設定は簡単。(証明書とか作らなくていいし。) AWSも3.5ドルでほぼ固定なので、外出先のWifiを使うときに、AWSまでWireGuardにして、通信の暗号化にもいいかもしれない。(スマートフォン用のアプリもあるし。)