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ドルのプランで。

タイムゾーンUTCだったので、JSTにしておく。

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にして、通信の暗号化にもいいかもしれない。(スマートフォン用のアプリもあるし。)