wireguardでlinuxサーバとandroidスマホとでvpn接続
目標
WireGuardを使って、Androidスマホを自宅ネットワークにVPN接続します。
WireGuardとは
Linuxカーネル「Linux 5.6」からカーネルレベルでサポートされたVPN実装(とはいっても今回のlinux側カーネルは5.4)
モダンなつくりで、高速でセキュアがウリとのこと。なにがモダンかはともかく、OpenVPNより高速とのことです。
機器の構成
自宅ネットワーク側のlinuxサーバにAndroidスマホが接続する構成となります。接続している間はAndroidスマホからの通信はすべてWireGuardのVPN経由となります。
自宅ネットワーク側
alpine linux(VIRTUAL) Version 3.11.6 (Released Apr 23, 2020)
# cat /proc/version
Linux version 5.4.34-0-virt (buildozer@build-3-11-x86_64) (gcc version 9.2.0 (Alpine 9.2.0)) #1-Alpine SMP Wed, 22 Apr 2020 19:26:07 UTC
Androidスマホ側
HUAWEI P20 lite(Android 9.0 Pie)
自宅ネットワーク側の作業
基本的にはすべてrootで行います。sudo使えるならもちろんそれでも問題ありません。
また、自宅ルータにてポートマッピングの設定はもちろん必要。ISPによって違ったりなので割愛します。
communityレポジトリの有効化
必要なパッケージ(wireguard-tools)が標準設定ではレポジトリに入っていないため、レポジトリリストを修正します。/etc/apk/repositoriesを編集します。
#/media/cdrom/apks
http://dl-cdn.alpinelinux.org/alpine/v3.11/main
#http://dl-cdn.alpinelinux.org/alpine/v3.11/community
#http://dl-cdn.alpinelinux.org/alpine/edge/main
#http://dl-cdn.alpinelinux.org/alpine/edge/community
#http://dl-cdn.alpinelinux.org/alpine/edge/testing
communityレポジトリの情報が記載されている3行目の#を削除して有効化します。
#/media/cdrom/apks
http://dl-cdn.alpinelinux.org/alpine/v3.11/main
http://dl-cdn.alpinelinux.org/alpine/v3.11/community
#http://dl-cdn.alpinelinux.org/alpine/edge/main
#http://dl-cdn.alpinelinux.org/alpine/edge/community
#http://dl-cdn.alpinelinux.org/alpine/edge/testing
必要なパッケージのインストール。
apk add wireguard-tools
apk add libqrencode
- wireguard-tools:wireguardに関係するツール(wg)を提供します。
- libqrencode:ファイルの中身をQRコードにするツールで、設定ファイルをAndroidスマホ側にQRコード経由で渡すために利用します。
フォワーディングの許可
vpnセグメントからの通信を別のセグメントへ渡してあげる設定を行います。
これがないとAndroidスマホからの通信はlinuxまでしか届きません。
sysctl -w net.ipv4.ip_forward=1
ネットワークを再起動すれば有効化。今回は面倒なので再起動して有効化しました。
鍵の作成
wg genkey | tee server_private | wg pubkey > server_public
wg genkey | tee android_private | wg pubkey > android_public
自宅ネットワーク側用、Androidスマホ側の両方の秘密鍵、公開鍵を作成します。
設定ファイルの作成
ファイル(/etc/wireguard/wg0.conf)を作成して編集します。
[Interface]
PrivateKey = 【server_privateの内容をコピペ】
Address = 192.168.10.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT;iptables -A FORWARD -o %i -j ACCEPT;iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE;[Peer]
PublicKey = 【android_publicの内容をコピペ】
AllowedIPs = 192.168.10.0/24
alpine linuxが通常使っているネットワークインタフェースがeth0と想定した設定となります。ListenPortはサンプルで、他の値もOKです。
注意点
PeerのAllowedIPsは「接続を許可するネットワーク」だけの意味ではなくて、Peer側にあるネットワーク情報としても利用されます。
vpn接続の待ち受けを開始(wg up)する際に、ここに書かれているセグメントはルーティングテーブルに追加されるので注意が必要。
どこからでも許可したい。とか思って0.0.0.0/0と書くとデフォルトゲートウェイの情報がPeer側に上書きされてどこにも通信できなくなります。
Androidスマホ側 設定ファイルの作成
適当なファイル(ここではandroid_wg0.conf)を作成して編集します。EndPointはDDNSなど使えばURLを利用可能です。
[Interface]
PrivateKey = 【android_privateの内容をコピペ】
Address = 192.168.10.2/24
DNS = 【自宅ネットワークのDNSアドレス】[Peer]
PublicKey = 【server_publicの内容をコピペ】
EndPoint = 【自宅ネットワークのグローバルIPアドレス】:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepAlive = 30
Androidスマホ側 設定ファイルの作成
qrencodeはテキスト情報をQRコードに変換するツールです。
Androidスマホ側に必要な設定情報がQRコード化されてandroid.pngに保存されます。スマホ側ではこれを読み取れば必要な設定は完了です。
vpn用インタフェースの起動
wg-quick up wg0
vpn接続を受け付けるネットワークインタフェースが作成されます。これでAndroidスマホ側からの接続を受け付ける準備は完了です。
Androidスマホ側の作業
直感的に利用できるので割愛。先に作成したandroid.pngをなんとか画面に表示さ、スマホ側で読み取りを行う。
イチから手入力しても鍵情報の入力以外はそこまで大変ではないです(その場合はqrencodeの作業は不要)
スピードテスト(googleでスピードテスト)
- wireguard:(down 32Mbps / up 60Mbps)
- openVPN:(down 30Mbps / up 36Mbps)
openVPNはサーバ側にsoftetherを利用し、udpで接続しています。ダウンロードはあまり変わりませんでしたね。vpn接続の開始はwireguardの方がずいぶん早いように感じました。
感想
基本的には簡便な構成で、設定に必要な項目は少ないです。なにも知らない状態から小一時間で作業は完了しました。
ただ、日本語のドキュメントは少なく、うまくいかないときに抜け出すのに時間がかかるかもしれません。