FreeBSD + WireGuardでAndroidとのVPNトンネルを作る

2 min read

こんにちは、無能です。
前回の記事で速度結果だけ載せましたがトンネルを作る手順です。
他に日本語記事で見つからなかったので記録しておきます。

WireGuard

スマホ側(クライアント)

PC側でWireGuardの鍵生成の必要があります。

wg genkey | tee private.key
wg genpsk | tee psk.key

秘密鍵さえ作れば、公開鍵はスマホ版のWireGuard側で表示されるのでここで作らなくてもOKです。 別に一緒にwg genkey | tee private.key | wg pubkey > pub.keyで作ってもOKです。
一旦この鍵をスマホに渡してWireGuardのスマホアプリの

秘密鍵 =  private.keyの内容  
事前共有鍵 = psk.keyの内容  
アドレス = やりとりしたいIP, 今回は`10.1.0.4/32`とします
エンドポイント = WireGuardサーバーのグローバルIP:51820
Allowed IPs = 0.0.0.0/0 , ::/0 # 全てをVPN介する

を入力し、このときに生成された公開鍵をサーバー側に送るかペーストできる用にしておきます。

PC側(サーバー側)

まずはWireGuardを入れている前提として、末尾の方にPeerを追加します。

[Peer]
PublicKey = スマホ側でprivate.keyを入力したあとに表示されている公開鍵又は、pub.keyの内容
PreSharedKey = psk.keyの内容
AllowedIPs = 10.1.0.4/32
PersistentKeepalive = 25

これで一旦wg quick up wg0しておきます。VPNをスマホ側でOnにして転送ができていればOKです。しかしこのままではWireGuardのトンネル内でしか行き来できていないのでNATでルールを作る必要があります。

FreeBSD

まずはIPv4とIPv6に対してのポートフォワードを有効化します。

vi /etc/sysctl.conf

これで以下を追記

net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1

これで再起動します。
そしてpfでルールを作ります。

vi /etc/pf.conf

そして以下を追記

wireguard_clients=10.1.0.4
wanint="vtnet0"
wg_ports="{51820}"

nat on $wanint inet from $wireguard_clients to any -> $wanint
pass in on $wanint proto udp from any to $wanint port $wg_ports
pass out quick

その後有効化

pfctl -nf /etc/pf.conf

エラーでなければ

pfctl -f /etc/pf.conf

これで適応させます。 サーバー側のIPアドレスになっているか、シンプルで便利なたかしさんのところでIPアドレスがWireGuardサーバー側のIPになっているか見てみましょう。 bibi.moe/ip
これで終了です。

これが行えれば、ローカル環境で立ち上げてるサービスを家のサーバーもVPN繋げた状態でWireGuardネットワークにプロキシしてる場合スマホのブラウザから家のネットワークにアクセスすることができる為、とても便利です。 それではまた。よろしくおねがいします。