環境
・サーバ
Intel NUC
UbuntuDesktop 24.04LTS
・クライアント
iPhone15 Pro
VPNの構築
今回はpivpnを使ってVPNサーバを立ち上げたあと、スマホをVPNサーバに接続する設定を行う。
IPアドレスの固定
まずVPNサーバーのIPアドレスを固定する。
あとからpivpn内からやる方法もあるが、今回はあらかじめ設定からIPアドレスを設定した。
UbuntuServerなどGUIが使えない環境で作業する場合、IPアドレスの設定が結構めんどいためこの項はスキップしてもOK。その場合あとから行うpivpnの設定でIPアドレスを固定するか否かと、固定したいIPアドレスを聞かれることになる。
SSHの設定
このあとSSHを使って設定を行いたかったので、Openssh‐serverを導入した。
sudo apt install openssh-server
以降の作業はWindowsからSSHを使って実施
きちんとネットワークが確立されていれば、WindowsPowerShellから、
ssh ubuntuのユーザ名@サーバのIPアドレス
でアクセスできる。
ルーターのポートフォワーディング設定
ルータでポートフォワーディングの設定を行った。
VPNのデフォルトののポートは443番だが、セキュリティの観点から別のポートとした。
外部の特定のポートあての通信が先ほど設定したUbuntuのIPアドレスの特定のポートに転送されるように設定する。
DDNS Nowでサービスの登録
プロバイダの固定IPサービスを申し込んでいない場合、ルータのグローバルIPアドレスが定期的に変わってしまう。グローバルIPアドレスと特定のドメインを紐づけるDDNSサービスに登録を行う。DDNS Nowは完全無料のサービスでおすすめ。
ここで取得したドメインとパスワードは後で使う。
DDNS Now
pivpnをインストールしてWireguardの設定
本来RaspberryPI向けのVPN設定アプリだが、IntelのNUCでも問題なく動作した。
これを使うことで本来CUIでかなり面倒な設定がGUI風の画面で簡単に済んでしまう。
curlを導入したあと、pivpnをインストールする。
sudo apt install curl
curl -L https://install.pivpn.io | bash
続けていくとGUI風の画面が出てくるのでしたがって進めていく。私の行った設定は以下の通り。
- IPv6のルーティングはYesを選択
- VPNはWireguardを選択
- ポートはルータでポートフォワーディングを行ったポートに設定
- DNSプロバイダーは今回は完全にローカルで完結するために
PiVPN-is-local-DNS
を選択。Googleなどでもいいかも。 - DNSの選択でDNS Entryを選択し、DDNS Nowで取得したドメインを入力
- セキュリティアップデートはYesを選択
全設定終了後に再起動を勧められるので再起動する。
設定は/etc/pivpn/wireguard/setupVars.conf
中に記載されており、それらをエディタで編集することであとからでも設定を変更できる。
以下のコマンドで設定情報が確認できる。特にpivpnHOSTの欄がIPアドレスではなく取得したドメインになっているか確認する。
cat /etc/pivpn/wireguard/setupVars.conf
設定ファイルを編集した場合は、以下のコマンドでビルドする
pivpn -d
VPNクライアントの設定
あらかじめスマホにWireguardのスマホアプリをダウンロードしておく。
iPhone
Android
pivpnを使用するとクライアントの設定が以下の2つのコマンドで完結する。すごく簡単。
まずクライアントを作成する。クライアントの名前を決めるように言われるので、自分が分かるように名前をつけてEnterを押せばクライアントが作成される。
pivpn add
以下のコマンドでクライアントのリストが表示されるため、リスト中のクライアントの番号を入力する。設定用QRコードが表示されるため、それをWiregurardのスマホアプリで読み込む。すると自動でVPN設定が追加される。
pivpn -qr
ここまででVPN設定自体は完了なので、きちんと接続ができるか確認する。
クライアント側の端末のWifiを切ってLTE接続にし、VPNをオンにしてローカルのネットワークにアクセスできればきちんと接続できていることが確認できる。
DDNS Nowの自動更新設定
グローバルIPアドレスが変更されたときにドメインに紐づけたIPアドレスを自動で更新するように設定する。
DDNS Nowには複数の方法があるが、今回のサーバはubuntuなので、cronを使った方法を使う。参考
以下のコマンドでcronの設定ファイルを開く
crontab -e
エディタは好きなものを選ぶ。
開いたファイルの末尾に以下の設定を加える。
0-59 * * * * wget -O DDNSNow_update.log "https://f5.si/update.php?domain=ユーザ名&password=パスワードもしくはAPIトークン"
この設定により、一分毎にグローバルIPアドレスを確認し、IPアドレスの変更があればドメインとの紐づけを更新できる。
以下のコマンドできちんと更新が行えているか確認できる
service cron status
参考文献
・ラズパイとPiVPNで、手軽にVPNサーバーを手に入れる
・ネットワークに外出先からアクセス! ラズパイ(Raspberry Pi)とWireguardで作るVPNサーバ
・ubuntuでcronを動かす方法