ラズパイでVPN(wireguard)

  • SoftEtherを使っていたが、もう古いみたいなので、設定が簡単なwireguardを使用することにした
  • Android12以降ではPPTP接続が使えなくなったため(私はiphoneを持ってないので確認できません)
  • 目的としては達成できそうだ
  • サーバ側で作成したキー情報ファイルをクライアント側の専用アプリ(PC用、android用など)に読み込ませて使用するタイプの仕組み

最終的にできたこと

  • スマホからインターネット経由でVPN接続ができた
  • スマホからラズパイにVNC接続できた(ラズパイ自身にも接続できることが確認できた)
  • スマホから自宅PCにVNC接続できた

wireguardについて思ったこと

  • セット・アップが簡単(SoftEtherに比べて)
  • 一つだけポート「51820」を使用するのでわかりやすい
  • クライアント側にも専用アプリを使用するが、設定はサーバ側で自動的に作成されたものを使うだけなのでわかりやすい(接続先とポート、鍵情報などが含まれる)

システム構成

  • 外部のPCからルータにwireguardで接続する
  • ルータはwireguardの通信をラズパイに転送する
  • ラズパイのwireguardは外部PCからの接続を処理して認証やIPアドレスの割り振りを行いトンネルを張る
  • トンネルが張れると、PCは自宅のPCなどにアクセスすることができるようになる

前準備

  • ラズパイに自宅ネットワークの固定IPを設定している(192.168.20.100をふった)
  • ダイナミックDNSを準備してある

手順概要

  • wireguardのインストール、定義ファイル作成
  • androidから接続

インストール

SSHで接続してして操作

ちなみにwindows10以降のpowershellでもssh接続が可能
ssh ユーザ名@ラズパイのIP
”Are you sure you want to continue connecting (yes/no/[fingerprint])? ”って出た場合は”yes”
”ユーザ名@ラズパイのIP’s password:”とでたらパスワードを入力して接続する

$curl -L https://install.pivpn.io | bash

固定IPを使うので「No」

「pi」を選択

「wireguard」を選択

ポートはデフォルトの「51820」のままでいい

「Google」を選択

「DNS Entry」を選択

ダイナミックDNSで取得したドメインを入れる

再起動しておく

再起動後にSSH接続する

設定ファイルを作成するために定義を作成する

$sudo pivpn add

「myhome」という名前で定義ファイルを作成した
ファイルは「/home/pi/configs」に作成される
※追加するとサーバ用の設定ファイルに設定が追加され、それとセットになるconfが作成される
※wireguardではdhcpのような仕組みはない(たぶん)そのため、設定ファイルにはipが固定されている

ファイルを確認してみる

このファイルには、接続先やポート、暗号化されたキー情報が格納されている

定義ファイルは用途ごとに作れば大丈夫です
たとえばこのような感じです
・外部から接続するPC用
・外部から接続するスマホ用
・家族が接続する用
など

ファイルの詳細

$sudo cat /home/user/configs/pc.conf

    [Interface]                                                   ←端末側に割り当てる情報
    PrivateKey = jdsfpioo34kjmopp/SWLpfm,pedbuci4u/iehjfidje=     
    Address = 10.143.57.4/24,fd11:5ee:bad:c0de::a8f:3904/64       ←端末に割り当てるIPアドレス
    DNS = 8.8.8.8, 8.8.4.4
    
    [Peer]                                                        ←ラズパイ側の設定
    PublicKey = /34nofjdshjoiosdiofpioo34kjmopp/SWLpfm,pedb=
    PresharedKey = Bsdl4jod@@3kp@fke@fk4@pfkjsd;l4p4kpkvp4pcvj=
    Endpoint = xxx.xxx.jp:51820                                   ←自宅のルータへの接続ドメイン名とポート
    AllowedIPs = 0.0.0.0/0, ::0/0                                 ←端末側でどこ宛てのパケットをwireguardに流すかのルート設定

AllowedIPsについて

デフォルトでは「AllowedIPs = 0.0.0.0/0, ::0/0 」このようになっているが、これだと端末側からのすべてのパケットが自宅のwireguard側に流れてしまう
自宅宛てとwireguardサーバ宛てのパケットだけをwireguard側に流すのであれば、「AllowedIPs = 10.143.57.0/24, 192.168.20.0/24」というようにしておけばよい。それ以外のパケット(例えば端末でインターネットを使う場合)はwireguardを経由しないので効率は良くなる

ポート転送(ルータ)

TCPno51820をラズパイに転送設定している

androidから接続

ラズパイでQRコードを表示してスマホのwireguardアプリでQRコードを読み込ませる

実際にはconfファイルをメールで送ってインポートさせたほうが早い

ラズパイでQR表示

$sudo pivpn -qr

※PCでのラズパイへのSSH接続で実行してもQRコードが正しく表示されなかったので、ラズパイにVNCで接続して、ターミナル上で実行してQRコードを表示する

スマホ(android)にて設定取り込み

playストアからアプリを入れる

青い+ボタンで設定を追加

QRを選択

QRを認識すると保存する設定の名前をを入力することになる
「myhome」とした

設定が保存された
スイッチをクリックすると接続できる

画面の上の方に鍵マークが表示される
これはVPN接続中の意味を表す
※自宅の中でスマホ接続を試す場合は自宅ネットワークのwifi接続をOFFにしてから試さないと外部からの接続を試したことにならないので注意すること!!

この画面はVPN接続後に、スマホのVNCアプリでラズパイ(192.168.20.100)に接続して画面が出るか確認した画面です

VPNを切断する場合はスイッチをOFFにする