raspberry piで自宅VPN環境を構築(openvpn編)

買ってから今まで有効利用されずに家に転がっていた Raspberry pi2 を VPN サーバに仕立てあげてみました。非力な Pi2 ですが、なんとか実用できるレベルで使えています。

今ではコロナの影響もあって外でPC作業をすることはほとんどなくなりましたが、それ以前は気分転換にカフェや漫画喫茶でPC作業をすることもありました。無料のWiFiも増えてきましたし、ワイヤレスゲートを契約しているので、ある程度の場所ではWiFiに困らなくなりました。

ただ、やはりセキュリティ的にはちょっと安心できない気がするので、しばらくは無料の VPN Gate を使っていました。回線速度も結構速く、公衆無線LANの盗聴防止という意味では十分でした。VPNさえ繋いでしまえば、WPAなどの暗号化がされていないオープンなAPでも安心です。

とはいえ、VPN Gate も他人の家の回線を使っているという点では不安はあるので、自宅でもVPNサーバを立ち上げることにしました。

そんな VPN サーバを Raspberry Pi にインストールするまでを、忘れたときのために一からメモしていこうと思います。VPN関係なく Raspberry Pi をサーバに仕立てる共通的な作業も書いたので長くなってしまいました・・

VPNについて基本的な情報

構築方法の前に、調べた VPN の情報をメモがてらまとめておきます。

ネットワークには疎いので不正確な情報も含まれてるかもしれません。

VPNの種類と対応ソフト

オープンソースで VPN サーバを構築するには以下のプロトコルがあるようです。(PPTPは平文で認証するらしいので除外)

  • L2TP/IPsec
    • Windows, Android, iPhone で標準サポート。追加ソフト不要。
  • OpenVPN
    • 追加ソフトが必要。
  • SoftEther VPN
    • 追加ソフトが必要。
  • WireGuard
    • 追加ソフトが必要。この中で一番新しく、高速らしい。

上記プロトコルを実装している、Raspberry Pi 上で動作可能なオープンソースソフトは以下があります。

  • SoftEther VPN (L2TP/IPsec, OpenVPN, SoftEther VPN プロトコルをサポート)
  • OpenVPN server (OpenVPN プロトコルをサポート)
  • strongswan, xl2tp (L2TP/IPsec プロトコルをサポート)
  • WireGuard (WireGuard プロトコルをサポート)

これを見ると、SoftEther VPN で構築すれば一番良いように思えます。

Raspberry Pi に SoftEther VPN を入れる記事も検索すると大量に溢れていますし、実は私も最初に試してみました。

アプリもマニュアルも日本語で分かりやすく、概ね満足していたのですが、基本的に Windows 向けに作られている(GUIの設定アプリをWineで動かして使っていました)というのと、自分なりのカスタマイズをしようとすると一気に情報が少なくなり解決できなかったため、別のものを試すことにしました。

簡単設定 PiVPN

SoftEther VPN はWindows PCさえあれば比較的導入が楽だった(逆にLinux PCのみで立ち上げは大変)ので、他に楽にVPNを構築できるものがないか探していたところ、PiVPN という素晴らしいプロジェクトに出会いました。

初心者でも1つのコマンドを実行し、数個の質問に答えるだけで必要なパッケージをインストールして OpenVPN もしくは WireGuard サーバを立ち上げてくれるというものです。

サーバの立ち上げだけでなく、新しいクライアントの追加も1コマンドでできるなど、非常に敷居を下げてくれています。

できれば Windows PC で追加ソフト無しで接続したかったので L2TP/IPsec 用にも PiVPN のようなツールがないか調べてみたのですが見つからなかったため、PiVPN を使って OpenVPN サーバを構築することにしました。

構築するVPNサーバの仕様

今回は以下のようなVPNを構築したいと思います。

  • OpenVPN(PiVPN) による VPN サーバ
  • UDP 1194 ポートによる接続
  • TCP 1194 ポートによる接続

UDPの方がTCPよりもVPNの速度が速いらしいということもあり、デフォルトでは UDP 1194 ポートの設定が推奨されています。

ですが、UDP のポート 1194 のみでしばらく使ってみたところ、公衆無線LANでは UDP のポート1194 が塞がれていて接続できない Wifi スポットが結構あったので、TCP も開けることにしました。

今のところ、私の行動範囲では、UDP 1194 と TCP 1194 のどちらも繋がらないWiFiスポットはありませんでした。

必要なもの

  • Raspberry Pi2 以降
  • microSD 8GB以上
  • ACアダプタ

私は余っていた Raspberry Pi2 を使いましたが、Pi3, Pi4 でも同じ手順です。Pi 1 は性能的に厳しいのではないかと思います。

Ether に関しては、Pi2(USB接続100Base-T) → Pi3(USB接続GbE) → Pi4(専用バス? GbE) と、新しくなるに連れて性能が大幅向上しているので、スループットを求める方は Pi4 が良いかもしれません。暗号化についてもARMv8では暗号化支援命令があるので、Pi3以降のほうがスループットが上がる可能性があります。

個人的には性能と消費電力のバランスという意味で、Pi2 は結構ちょうどよいのではないかと思ってますが、今 Pi2 を買うと性能の割に値段が高いので、新規に購入するならPi3 か Pi4 ですね。

microSDカードは、サーバ用途に使うなら多少高くても TOSHIBA, SanDisk, Transcend などの有名メーカのものが良いと思います。実際に microSD を変えただけで Raspberry Pi サーバの起動時間が倍以上変わったこともあります。

また、容量については使う予定がなくても、予算が許すならある程度大きいものが良いです。使っていない領域は寿命の平準化に使われますので、容量いっぱいまで使うのではなく、余裕をもたせたほうが microSD 全体として寿命が伸びます。サーバ用途で使うとログの書き込みなど比較的 SD への書き込みが発生します。

Raspberry Pi OSのインストール+最低限のサーバ設定

Raspberry Pi2 に OS を入れて、インターネットに公開するサーバとして最低限の設定をするまでの手順です。

すでに Raspberry Pi の環境ができている人は読み飛ばしてください。

Rasbperry Pi OS イメージを書き込み & SSH 有効化

Raspberry Pi OS を microSD に書き込みます。公式イメージが以下からダウンロードできます。

今回はサーバ用途なので Raspberry Pi OS (32-bit) Lite を選びました。サイズも小さく、デフォルトで余計なサービスやアプリが起動しないのでメモリも節約できます。

microSDにイメージを書くには Windows の場合は Downloads のページにある Raspberry Pi Imager を使うと良いようです。

Linux の場合は dd で書けますが、書き込みデバイスを間違えると PC の HDD を書き潰してしまうこともあるので、不慣れな場合は Linux 用にも Raspberry Pi Imager があるのでこれを使うと良いと思います。

 

イメージが書き終わったら、Raspberry Pi に挿す前に、SSHの有効化をしておきます。

一度 microSD カードを抜き差しして再認識させると、Windows の場合 boot というドライブが見えるはずです。

Linux の場合は 1 つ目のパーテーションが boot パーテーションです。

ここに ssh という名前でディレクトリを作っておきます。これだけで Raspberry Pi OS 起動時に自動で SSH サーバを起動してくれます。

Raspberry Pi起動 & SSHでログイン

上の手順で作成した microSD を Raspberry Pi に挿入し、電源を投入します。有線 LAN も接続しておきます。

起動するのに 1 分位かかります。起動すると DHCP で自動で IP アドレスを取得します。SDカードのアクセスLEDの点滅が落ち着いた頃、teraterm, putty などの SSH クライアントで「raspberrypi.local」に接続します。

うまく接続できたら、ユーザ名「pi」, パスワード「raspberry」でログインできます。

接続できなかった場合は、Raspberry Pi の IPアドレスを調べて IP アドレス指定で接続する必要があります。

IPアドレスの探し方は以下が参考になります。

Raspberry Pi(ラズパイ)のIPアドレスを見つける4つの方法まとめ

他にも、ルータの管理画面のDHCPによるアドレス割当情報などからも IP を調べることができます。

ユーザ名/パスワードを変更

サーバにしてインターネットに晒す以上は、デフォルトのユーザ名/パスワードは変えておきたいです。

まずはパスワードから変更します。passwdコマンドを実行します。

pi@raspberrypi:~ $ passwd
Changing password for pi.
Current password: 
New password: 
Retype new password: 
passwd: password updated successfully

raspi-config コマンドでも変更できます。

pi@raspberrypi:~ $ sudo raspi-config

1 の Change User Password を選択することでパスワードの変更ができます。

ユーザ名の変更はちょっと面倒です。インストール直後でないとユーザ名があちこちに設定されている可能性があるので、新規ユーザ追加→piユーザ削除が安全かもしれません。

ここではインストール直後ということで既存の pi ユーザ, pi グループの名前を変更してみます。

まずは root ユーザになります。

pi@raspberrypi:~ $ sudo su -
root@raspberrypi:~#

ユーザ名を変えている途中で sudo が使えなくなる可能性があるので、root の shell に入っておきます。

続いて、ユーザ名/パスワード情報が書かれている /etc/password, shadow や、グループ情報が書かれている /etc/group, gshadow を変更します。vipw, vigr というコマンドを使います。

root@raspberrypi:~# vipw
root@raspberrypi:~# vipw -s
root@raspberrypi:~# vigr
root@raspberrypi:~# vigr -s

いずれのコマンドもエディタが起動し、ファイルを変更できる状態になります。デフォルトで vi エディタが起動しますが vi エディタに慣れていない人は nano の方が使いやすいと思います。エディタを nano に変更する場合は、上記コマンドに先立って以下のコマンドを実行してください。

root@raspberrypi:~# export EDITOR=nano

これで shell を抜ける(exitする)までは、以降の vipw, vigr コマンドで起動するエディタが nano に変わります。

vipw コマンドでは行の先頭に pi と書かれた行を新しいユーザ名に変更します。

pi:x:1000:1000:,,,:/home/pi:/bin/bash

vipw -s コマンドも同様に pi が先頭にある行を変更します。

pi:$6$d6Oawsdetgujlo123e4rty.......(ランダムに見える文字が続く)

vigr コマンドでは以下のように先頭だけでなく、末尾に pi がある行(複数あります)も変更します。

adm:x:4:pi
...
cdrom:x:24:pi
...
pi:x:1000:

vigr -s コマンドも同様です。

adm:*::pi
...
cdrom:*::pi
...
pi:!::

正しく変更が完了したら、このrootユーザの端末を閉じずに、以下のことを確認してください。

  • 新しく Teraterm などのクライアントでSSH接続し、変更後のユーザ名, パスワードでログインできるか
    → ユーザ名, パスワードの確認
  • ログイン後、sudo ls を実行してエラーが出ないか
    → sudo が使えればひとまず復旧できるので
  • ls -ld . を実行してユーザ名, グループ名が変更されているか

仮に新しいユーザでログインできなかったり、問題が起こっても、rootユーザの端末を閉じなければ復旧が可能です。慌てずに root ユーザで各種設定が間違っていないかを確認して下さい。

正しくログインでき、sudo が使えるようなら一度 Raspberry pi を再起動しておきましょう。

ホスト名を変更

ホスト名はデフォルトで raspberrypi ですが、もっと使いやすい名前にしましょう。”ホスト名.local” という名前で接続できるので、例えば vpn.local などでアクセスできると文字数も少なく便利です。また、複数台の Raspberry Pi を運用する場合はホスト名が衝突してしまうので、変更は必須となります。

ちなみに、”ホスト名.local”は名前の通り、LAN内でのみで使用可能です。インターネット側からはこの名前ではアクセスできません。

ホスト名は raspi-config コマンドで可能です。

pi@raspberrypi:~ $ sudo raspi-config

2の Network Options を選択し、N1 の Hostname を選びます。

一度変更したら再起動しましょう。

再起動後に接続する時は、「新しいホスト名.local」で接続することをお間違えなく。

固定IPアドレスの設定をする

ルータでポートフォワードするために、Raspberry PiのIPアドレスをDHCPによる動的な取得ではなく、固定IPアドレスにします。

/etc/dhcpcd.conf を root 権限で変更します。

$ sudo vi /etc/dhcpcd.conf

以下のようにコメントアウトされた形で、固定IPアドレスの設定例が書かれています。

# Example static IP configuration:
#interface eth0
#static ip_address=192.168.0.10/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
#static routers=192.168.0.1
#static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1

これを参考に、設定を追記します。コメントアウトを外す形でも、ファイルの末尾に追記でもよいです。

以下は IP アドレスを 192.168.10.100/24、ゲートウェイ、DNS が 192.168.10.1 の時の設定例です。各環境に合わせて変更してください。

interface eth0
static ip_address=192.168.10.100/24
static routers=192.168.10.1
static domain_name_servers=192.168.10.1

設定後、再起動すると設定が反映されるはずです。

IPアドレスが変わっても、”ホスト名.local” で接続できると思います。便利ですね。

Dynamic DNSサービスに登録する

多くの一般家庭用のインターネット回線はDHCPのように動的にIPアドレスが割り当てられます。インターネットから Raspberry Pi に接続するために毎回 IP アドレスで指定するのは困難なので、Dynamic DNSサービスを利用します。

最初は最大手(と勝手に思ってる) no-ip を試してみたのですが、1ヶ月毎に手動でアカウントの更新が必要(IPの更新ではなくアカウントの更新)なので面倒でやめました。

その後 dynu に乗り換えて今のところは不満なく使えています。

Dynamic DNSのIPアドレスを定期的に更新する

ここは DDNS サービスによって方法が異なりますので、dynu での設定例を示します。

dynu では HTTP/HTTPS の通信で IP アドレスが更新できるので、wget や curl で特定の URL にアクセスするだけで IP アドレスの更新ができます。

dynu の IP アドレスの更新方法は IP Update Protocol のページにあります。基本的には以下のようなURLにアクセスするだけでOKです。

https://api.dynu.com/nic/update?username=ユーザ名&password=パスワードのハッシュ

パスワードのハッシュは、パスワードを MD5 もしくは SHA256 でハッシュしたものです。

例えば “password” というパスワードだった場合は、以下のコマンドで表示できます。

$ echo -n "password" | md5sum

-n を忘れずに付けましょう。-n が無いと改行コードも込みでハッシュ値が計算されてしまいます。

パスワードのハッシュを計算したら、curl で更新できるか確認してみましょう

$ curl -4 'https://api.dynu.com/nic/update?username=ユーザ名&password=ハッシュ化したパスワード'

good xx.xx.xx.xx(IPアドレス) や nochg などと表示されれば成功です。

ちなみに -4 は IPv4 で接続するというオプションで、IPv4 のアドレスを DDNS に登録したい時は IPv4 で接続する必要があるようです。

確認がうまく行ったら、以下のようなスクリプトを用意します。私は /home/pi/bin/update-ddns.sh というファイル名で作成しました。

#!/bin/sh

USER="ユーザ名"
PASSWD="ハッシュ化したパスワード"

URL="https://api.dynu.com/nic/update?username=$USER&password=$PASSWD"

curl -4 -s "$URL" | logger -t update-ddns

update-ddns.sh に実行権限を付与します。

$ chmod +x ~/bin/update-ddns.sh

これを定期的に実行するため、cron に登録します。crontab -e を実行するとエディタが起動するので、以下の行を追加します。

$ crontab -e
0 1 * * * /home/pi/bin/update-ddns.sh

これで毎日 1:00 に IP アドレスが更新されます。

定期的に実行されているかは /var/log/syslog から ddns で検索すれば確認できます。

$ grep ddns /var/log/syslog
/var/log/syslog:Sep 11 01:00:01 hostname CRON[20264]: (xxxx) CMD (/home/pi/bin/update-ddns.sh)
/var/log/syslog:Sep 11 01:00:04 hostname update-ddns: nochg

VPNサーバ用の設定

ここまでは、Raspberry Pi で自宅サーバを立ち上げるための一般的な設定でしたが、ここからはいよいよVPNサーバ用の設定です。

今回は以下のようなVPNを構築したいと思います。

  • OpenVPN(PiVPN)によるVPN
  • UDP 1194 ポートによる接続
  • TCP 1194 ポートによる接続

UDPの方がTCPよりもVPNの速度が速いらしいということもあり、デフォルトでは UDP 1194 ポートの設定が推奨されています。

ですが、公衆無線LANでは UDP 1194 が塞がれていて接続できない Wifi スポットが結構あったので、TCP も開けることにしました。

私の行動範囲では、UDP 1194 と TCP 1194 のどちらも繋がらないところはありませんでした。

ルータのポートフォワード設定をする

ブロードバンドルータにポート転送の設定をします。ポート転送の設定方法はルータのメーカによって違うのでマニュアルで調べてください。

以下のような設定をすればOKです。

  • 設定1
    • プロトコル: UDP
    • ポート番号: 1194
    • 転送先IP: Raspberry Piのアドレス
  • 設定2
    • プロトコル: TCP
    • ポート番号: 1194
    • 転送先IP: Raspberry Piのアドレス

今回は、TCP, UDP の両方で接続可能にするので、このような設定をします。

私の家のソフトバンク光のルータの場合は以下のような設定になります。※IPアドレスは実設定から変更しています

上の2つは softether を試した時の名残です。OpenVPN の場合は赤枠の設定のみでOKです。

PiVPNをインストール

いよいよ PiVPN を使って Raspberry pi に OpenVPN をインストールします。

インストールと言っても非常に簡単。以下のコマンドを実行するだけです。

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

いくつかの質問に答えるだけで、必要な deb パッケージをインストールして設定ファイルを作って OpenVPN サーバを起動してくれます。

基本的にはデフォルトの選択肢を設定していけばよいのですが、簡単に設定項目を記載しておきます。

最初にIPアドレスを聞かれます。これまでの設定でIPアドレスを固定設定にしているので、No (固定IP) を指定します。

続いて、生成する設定ファイルを置くユーザ名を選択します。ユーザを追加していなければ 1 つしかないので、pi ユーザから変更したユーザ名を指定しておきます。

VPNサーバの種類を指定します。OpenVPN を選択します。

OpenVPN の設定をカスタマイズするかを聞かれます。デフォルト設定で良いので、No を選択します。TCP の設定は後で追加しますのでここでは UDP のままでセットアップします。

UDPのポート番号を設定します。デフォルトの 1194 のまま変更せずに OK します。

VPN接続時に使用するDNSサーバを設定します。ここは自由ですのでどれを選んでも良いです。

私は Custom を選択して 1.1.1.1 のサーバを設定しました。

最後にこの VPN サーバに接続する際に IP アドレスで指定するのか、DNSで名前解決するのかを設定します。

Dynamic DNSサービスに登録しているので、 DNS Entry を選択し、ホスト名を入力します。

以上で設定は完了です。PiVPN が鍵を生成したり、設定ファイルを作ったりして、OpenVPNサーバを立ち上げてくれます。

上記手順で設定をすると、UDP port 1194 のみで待ち受けるサーバになります。イメージとしては以下のようなネットワーク構成です。

UDPだけで良ければ次の手順は飛ばしてください。

TCP/UDP両方接続可能にする

続いて、TCPでも接続可能にします。以下のようなネットワーク構成です。

 

openvpnでは、待受のポートごとにサブネットを作る必要があるらしく、UDP 1194ポート用とは別に TCP 用のサブネットを作ります。

openvpnの設定

openvpnデーモンは、1プロセスあたり 1 ポートのみを待ち受けるように作られているようで、新たなポートを開くには別プロセスとしてデーモンを起動する必要があります。

openvpnの設定ファイルは /etc/openvpn/server.conf に書かれています。これをコピーして server-tcp.conf ファイルを作ります。/etc/openvpn/ 以下に .conf というファイルがあれば、その分のプロセスを起動してくれるようになっています。

$ sudo cp /etc/openvpn/server.conf /etc/openvpn/server-tcp.conf

そして、server-tcp.conf を以下のように変更します。

;dev tun
dev tun-tcp
  :
;proto udp
proto tcp
  :
;server 10.8.0.0 255.255.255.0
server 10.9.0.0 255.255.255.0
  :
;status /var/log/openvpn-status.log 20
status /var/log/openvpn-status-tcp.log 20

新しいサブネットは 10.9.0.0 にしました。

設定を変更したのでデーモンを再起動します。

$ sudo service openvpn restart

エラーがでず、openvpn プロセスが 2 つ起動していればOKです。

$ ps aux | grep openvpn
openvpn 18785 0.0 0.6 8828 6140 ? Ss Sep06 2:05 /usr/sbin/openvpn --daemon ovpn-server-tcp --status /run/openvpn/server-tcp.status 10 --cd /etc/openvpn --config /etc/openvpn/server-tcp.conf --writepid /run/openvpn/server-tcp.pid
openvpn 18788 0.0 0.6 8704 6044 ? Ss Sep06 0:49 /usr/sbin/openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 --cd /etc/openvpn --config /etc/openvpn/server.conf --writepid /run/openvpn/server.pid

ルーティング(NAT)の設定

新たにサブネットを作ったのでルーティングの設定を追加します。これを実施しないと、10.9.0.0/24のサブネットからインターネットに出ることができません。

/etc/iptables/rules.v4 を編集します。PiVPN をインストールすると 10.8.0.0 用の設定が書かれているはずですので、その下に10.9.0.0 用の設定(赤字の行)を追加します。

$ sudo vi /etc/iptables/rules.v4
<<<<省略>>>>>
*nat
:PREROUTING ACCEPT [8079:828227]
:INPUT ACCEPT [3275:468738]
:POSTROUTING ACCEPT [2212:331398]
:OUTPUT ACCEPT [2212:331398]
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -m comment --comment openvpn-nat-rule -j MASQUERADE
-A POSTROUTING -s 10.9.0.0/24 -o eth0 -m comment --comment openvpn-nat-rule-tcp -j MASQUERADE
COMMIT

変更したら以下のコマンドで設定を反映させます。再起動でもOKです。

$ sudo service netfilter-persistent restart

正しく設定できているかは以下のコマンドで確認できます。10.9.0.0 の行があればOKです。

$ sudo iptables -t nat -L POSTROUTING
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination 
MASQUERADE all -- 10.8.0.0/24 anywhere /* openvpn-nat-rule */
MASQUERADE all -- 10.9.0.0/24 anywhere /* openvpn-nat-rule-tcp */

クライアントを作る

pivpn add コマンドで OpenVPN のクライアントを作成します。1 コマンドでクライアント毎に適切に鍵を生成してくれたり、接続用の .ovpn ファイルを作ってくれるので非常に楽です。

TCPとUDP用で 2 つのクライアントを作成します。クライアント毎に IP アドレスを分けることで使用するサブネットをTCP用とUDP用で分けます。

例として client1-udp という名前でクライアントを作る場合は以下です。クライアント名とパスワードを入力するだけです。

$ pivpn -a
Enter a Name for the Client: client1-udp
How many days should the certificate last? 1080  ※変更せずEnter
Enter the password for the client: ※パスワード入力
Enter the password again to verify: ※再度パスワード入力
spawn ./easyrsa build-client-full test

Note: using Easy-RSA configuration from: /etc/openvpn/easy-rsa/vars
Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019
Generating an EC private key
writing new private key to '/etc/openvpn/easy-rsa/pki/easy-rsa-20372.4gvldq/tmp.pw1IIx'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
Using configuration from /etc/openvpn/easy-rsa/pki/easy-rsa-20372.4gvldq/tmp.j7XCMc
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'client1-udp'
Certificate is to be certified until Aug 22 10:22:30 2023 GMT (1080 days)

Write out database with 1 new entries
Data Base Updated

Client's cert found: client1-udp.crt
Client's Private Key found: client1-udp.key
CA public Key found: ca.crt
tls Private Key found: ta.key


========================================================
Done! test.ovpn successfully created! 
test.ovpn was copied to:
/home/pi/ovpns
for easy transfer. Please use this profile only on one
device and create additional profiles for other devices.
========================================================

同様に client1-tcp を追加します。

設定値や鍵情報が書かれた .ovpn ファイルは、上記メッセージの最後にあるようにホームディレクトリの ovpns ディレクトリに格納されます。上記手順では client1-udp と client1-tcp を追加したので、ovpns ディレクトリには以下の 2 ファイルが作られます。

  • client1-udp.ovpn
  • client1-tcp.ovpn

pivpn add コマンドで生成するとインストール時に指定した設定(このページ用の手順だと UDP 用)で .ovpn ファイルが生成されるので、client1-tcp.ovpn ファイルの方だけ TCP 用に変更します。

client1-tcp.ovpn ファイルの proto の行を tcp に変更します。

proto tcp

最後に、client1-tcp.ovpn の IP アドレスを 10.9.0.0 のサブネットに変更します。

$ sudo vi /etc/openvpn/ccd/client1-tcp
ifconfig-push 10.9.0.2 255.255.255.0

以上で設定は完了です。

/home/pi/ovpns 以下に生成された、client1-udp.ovpn、client1-tcp.ovpn を PC やスマホに転送して OpenVPN クライアントに登録すれば VPN が使用可能です。

お疲れ様でした。

===2021/10/17追記===

client1-udp.ovpn, client1-tcp.ovpn は状況により使い分けてください。
公衆無線LANの種類やカフェのFree Wifiによって TCP でしか繋がらないケースや UDPでしか繋がらないケースがあるようです。
UDPの方がTCPよりも若干高速との話もありますが、私が使ってみた体感としてはどちらもあまり変わりませんでした。
UDP/TCP両方試してみて繋がった方でご使用ください。

また、書き忘れていましたが、接続確認について注意点があります。
Raspberry Pi が存在しているLAN(家庭内のWiFiなど)から VPN 接続をしようとしても接続できません。
スマホでテザリングするなどして、家庭内LANの外から VPN 接続して動作確認してください。

おまけ: クライアントを共用する場合

上記の方法では、クライアント毎にIPアドレスが固定である関係で、PCとスマホを同時にVPNに接続する場合は、それぞれクラアントを作成する必要があります。例えば、PC-udp, PC-tcp, phone-udp, phone-tcp など・・・

同時に接続しなければ同じクライアントでも良いのですが、台数が増えるとクライアントを作るのも面倒になってきます。

そこで、セキュリティ的にはあまり良くないやり方かもしれませんが、クライアントを複数人や複数台で共用する方法を書いておきます。

共用する方法は簡単。/etc/openvpn/ccd/ 以下にある、共用したいクライアントのファイルを削除するだけです。

この設定ファイルでIPアドレスを固定しているのですが、ファイルがない場合は、DHCPのように接続順に自動でIPアドレスが割り振られます。しかも、TCPで接続した時はTCPのサブネットのIPアドレスが割り当てられるため、UDP/TCPでクライアントを分ける必要がありません。

自分一人で使う分にはこれで十分かと思いますが、仕事で使ったりする場合は、誰がいつ接続したのか特定できなくなりますのでご注意ください。

raspberry piで自宅VPN環境を構築(openvpn編)” への6件のフィードバック

  1. 最後の「/home/pi/ovpns 以下に生成された、client1-udp.ovpn、client1-tcp.ovpn を PC やスマホに転送して OpenVPN クライアントに登録すれば VPN が使用可能です。」と書いてありますがこれは登録して2つ同時に接続すればよいと言うことでしょうか?

    片方はTLS handshake faildと表示されもう片方はTCP:connect to ….とエラーを吐きます。

    もう一歩というところで躓いているようで、もしよろしければそのあとのWindowesの場合はどのようにすればよいか教えて頂けないでしょうか?

    1. メコン川の下流さん。
      コメント頂きありがとうございます。
      コメントに気づかず、返信が大変遅くなってしまいすみませんでした。
      その後状況はいかがでしょうか。

      クライアントについてはどちらか一方のみで接続すればOKです。
      本文内に追記したのですが、接続するWifi環境によって繋がったり繋がらなかったりするので、繋がった方でご利用ください。

      もう1つ、書き忘れていましたが、VPN接続の確認は家庭内LANの外から行う必要があります。
      同じLAN内から接続しようとしていないでしょうか。
      テザリングをするなど、WAN側から VPN 接続を試してみてください。

      以上の内容を本文中にも追記させていただきました。
      コメント頂きありがとうございました。

  2. ルータのポートフォワード設定をするのところの設定1はUCPではなくUDPでは?

    1. コメントありがとうございます。
      ご指摘の通り UDP が正しいです。
      本文を修正させていただきました。
      ご指摘ありがとうございました。

  3. このサイトを参考に、ラズパイでOpenVPNの環境を構築できました。
    大変参考になり、助かりました。ありがとうございます。

    ところで、VPNの接続状態を確認する目的で、syslogを確認したのですが、tcp接続の際のログは残るのですが、udpで接続したログが見当たらないようです。
    なにか、思い当たるところはございませんでしょうか?


    本当に実施したいのは、VPNの接続状態を簡単に確認することなのですが、ラズパイのOpenVPNで何かいい方法はないでしょうか?

    1. コメント頂きありがとうございます。
      私の環境ですと、/var/log/openvpn.log を見ると、UDP, TCP 接続両方ともログが残っていそうに見えます。

      もしくは、journal ログの方を確認してみてはいかがでしょうか。
      ブログの内容と同じ方法で環境構築していれば、以下のコマンドで TCP、UDP それぞれのログを確認することができます。

      journalctl -u openvpn@server.service    # UDP接続のログ
      journalctl -u openvpn@server-tcp.service    # TCP接続のログ
      

      「VPNの接続状態」とおっしゃってるのが、現時点で接続しているクライアント一覧という意味であれば、以下のファイルに現時点のクライアント一覧が書かれています。

      /var/log/openvpn-status.log
      /var/log/openvpn-status-tcp.log

      接続履歴という意味であれば、journal ログを見るのが良さそうです。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です