買ってから今まで有効利用されずに家に転がっていた Raspberry pi2 を VPN サーバに仕立てあげてみました。非力な Pi2 ですが、なんとか実用できるレベルで使えています。
今ではコロナの影響もあって外でPC作業をすることはほとんどなくなりましたが、それ以前は気分転換にカフェや漫画喫茶でPC作業をすることもありました。無料のWiFiも増えてきましたし、ワイヤレスゲートを契約しているので、ある程度の場所ではWiFiに困らなくなりました。
ただ、やはりセキュリティ的にはちょっと安心できない気がするので、しばらくは無料の VPN Gate を使っていました。回線速度も結構速く、公衆無線LANの盗聴防止という意味では十分でした。VPNさえ繋いでしまえば、WPAなどの暗号化がされていないオープンなAPでも安心です。
とはいえ、VPN Gate も他人の家の回線を使っているという点では不安はあるので、自宅でもVPNサーバを立ち上げることにしました。
そんな VPN サーバを Raspberry Pi にインストールするまでを、忘れたときのために一からメモしていこうと思います。VPN関係なく Raspberry Pi をサーバに仕立てる共通的な作業も書いたので長くなってしまいました・・
Table of Contents
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アドレスの探し方は以下が参考になります。
https://tkrel.com/8759
他にも、ルータの管理画面の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 のみで待ち受けるサーバになります。イメージとしては以下のようなネットワーク構成です。
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でクライアントを分ける必要がありません。
自分一人で使う分にはこれで十分かと思いますが、仕事で使ったりする場合は、誰がいつ接続したのか特定できなくなりますのでご注意ください。
最後の「/home/pi/ovpns 以下に生成された、client1-udp.ovpn、client1-tcp.ovpn を PC やスマホに転送して OpenVPN クライアントに登録すれば VPN が使用可能です。」と書いてありますがこれは登録して2つ同時に接続すればよいと言うことでしょうか?
片方はTLS handshake faildと表示されもう片方はTCP:connect to ….とエラーを吐きます。
もう一歩というところで躓いているようで、もしよろしければそのあとのWindowesの場合はどのようにすればよいか教えて頂けないでしょうか?
メコン川の下流さん。
コメント頂きありがとうございます。
コメントに気づかず、返信が大変遅くなってしまいすみませんでした。
その後状況はいかがでしょうか。
クライアントについてはどちらか一方のみで接続すればOKです。
本文内に追記したのですが、接続するWifi環境によって繋がったり繋がらなかったりするので、繋がった方でご利用ください。
もう1つ、書き忘れていましたが、VPN接続の確認は家庭内LANの外から行う必要があります。
同じLAN内から接続しようとしていないでしょうか。
テザリングをするなど、WAN側から VPN 接続を試してみてください。
以上の内容を本文中にも追記させていただきました。
コメント頂きありがとうございました。
ルータのポートフォワード設定をするのところの設定1はUCPではなくUDPでは?
コメントありがとうございます。
ご指摘の通り UDP が正しいです。
本文を修正させていただきました。
ご指摘ありがとうございました。
このサイトを参考に、ラズパイでOpenVPNの環境を構築できました。
大変参考になり、助かりました。ありがとうございます。
ところで、VPNの接続状態を確認する目的で、syslogを確認したのですが、tcp接続の際のログは残るのですが、udpで接続したログが見当たらないようです。
なにか、思い当たるところはございませんでしょうか?
※
本当に実施したいのは、VPNの接続状態を簡単に確認することなのですが、ラズパイのOpenVPNで何かいい方法はないでしょうか?
コメント頂きありがとうございます。
私の環境ですと、/var/log/openvpn.log を見ると、UDP, TCP 接続両方ともログが残っていそうに見えます。
もしくは、journal ログの方を確認してみてはいかがでしょうか。
ブログの内容と同じ方法で環境構築していれば、以下のコマンドで TCP、UDP それぞれのログを確認することができます。
「VPNの接続状態」とおっしゃってるのが、現時点で接続しているクライアント一覧という意味であれば、以下のファイルに現時点のクライアント一覧が書かれています。
/var/log/openvpn-status.log
/var/log/openvpn-status-tcp.log
接続履歴という意味であれば、journal ログを見るのが良さそうです。
御サイトを参考にRaspberry Piを活用したOpenVPNを構築し、出先から便利に活用しています。
ありがとうございます。
2022年頃に構築したときは、ご記載の内容でtcp、udpともに問題なく利用できました。
最近、再構築したところ「TCP/UDP両方接続可能にする」の章で構築したプロトコルですと、ローカルNASにアクセス出来ない現象(Raspberry Piから外部へネットアクセスできない)が発生して不便を感じております。
PiVPNをインストールするときに設定するプロトコルですとこのよな問題はおきません。
下記サイトを試してみましたが改善しませんでした。
https://tarufu.info/openvpn-cannot-localnetwork/
OpenVPNでローカル(NAS)にアクセスできない
下記2つ手順を試してみましたが何れも「TCP/UDP両方接続可能にする」のプロトコルで外部へネットアクセスができません。
トライ1
PiVPNをインストールするときのプロトコル :tcp
「TCP/UDP両方接続可能にする」の章で構築したプロトコル:udp ✕外部へネットアクセス不可
トライ2
PiVPNをインストールするときのプロトコル :udp
「TCP/UDP両方接続可能にする」の章で構築したプロトコル:tcp ✕外部へネットアクセス不可
もし貴方で現象が再現できるようでしたら、解決策をご教示頂けますと大変助かります。
榑松 さん
コメント頂きありがとうございます。
自宅VPN便利ですよね。
もうこの記事も4年も前なので、各種ソフトウェアもバージョンが上がっていて
設定方法が変わっているのかも知れませんね。
ちょっと時間が取れたら最新の環境で構築してみましょうかね。
具体的な症状についてもう少し詳しく教えていただけますか。
> ローカルNASにアクセス出来ない現象(Raspberry Piから外部へネットアクセスできない)
これは、VPNに接続はできて、Raspberry Piにもログインできるけど、Raspberry Piの外に(ローカルLANにも、外部インターネットにも)アクセスできないという意味でしょうか。
そうだとすると「ルーティング(NAT)の設定」あたりが怪しそうですね。
バージョンアップによってこのあたりが変わってるのかも知れません
ありがとうございます。
> ローカルNASにアクセス出来ない現象(Raspberry Piから外部へネットアクセスできない)
これは、VPNに接続はできて、Raspberry Piにもログインできるけど、Raspberry Piの外に(ローカルLANにも、外部インターネットにも)アクセスできないという意味でしょうか。
→ご理解の通りです。
返信が遅くなってすみません。
症状的にはルーティングの設定に問題がありそうに思います。
最新のSWバージョンで再度自宅VPNを構築してみますので、もうしばらくお待ちください。
新しい環境を構築している中でわかったことがあります。
/etc/openvpn/ccd 以下にある、後から追加したプロトコル(TCPとします)側のユーザのファイル(本文中の例では client1-tcp)を削除するか、ファイル内のIPアドレスをTCP用のサブネット(本文中の例では10.9.0.0/24)のIPアドレスに変更してみていただけますか。
私の環境では上記修正で接続できるようになりました。
お忙しい最中にありがとうございます。
トライしてみましたが改善できませんでした。
特に急いでおりませんので後日時間を作ってやってみます。
参考までに当方がテストした環境です。
本体:Raspberry Pi Zero WH
OS:V61 32bit (2024-03-12-raspios-bullseye-armhf-lite.img)
本体ipアドレス(eth0):192.168.1.21
PiVPNポート番号:1180
tun0(デフォルト):10.56.122.0
tun-tcp0:
10.57.122.0 ×改善せず
10.56.123.0 ×改善せず
10.9.0.0 ×改善せず
VPN Client(ccd/client1-tcp )(ifconfig-push)
ファイル自体削除 ⇒ ×改善せず
10.57.122.2 ×改善せず
10.57.122.3 ×改善せず
10.56.123.2 ×改善せず
10.56.123.3 ×改善せず
10.9.0.2 ×改善せず
10.9.0.3 ×改善せず
うーん。そうですか・・
接続はできているとのことなのでIPやルーティングの問題なのだと思うんですけどね。
以下の情報をいただけませんか?
1.TCPで繋いだときに、tun-tcp0のサブネットのIPアドレスが割当てられているでしょうか
2. 後から追加した方のログ(本文中と同じなら /var/log/openvpn-status-tcp.log) に何かエラーメッセージなどは出力されていないでしょうか。
可能な範囲でログを貼っていただけるとなにかヒントになるかもしれません。
※プライバシーに関係する部分は伏せ字にするか、削除するなどしていただいて結構です
いろいろ触っているうちにRaspberry PIの挙動がおかしくなってしまったので再度キッティングからやり直しまた。
現象は改善できていませんが状況をお伝えします。
当方の理解不足も否めず、お手隙のときにでもご教示頂ければと思います。
本体:Raspberry Pi Zero WH
OS:V61 32bit (2024-03-12-raspios-bullseye-armhf-lite.img)
本体ipアドレス(eth0):192.168.1.21
PiVPNポート番号:1180
tun0(デフォルト):10.87.246.0(server 10.87.246.0 255.255.255.0)
tun0-tcp(手動設定):10.88.246.0(server 10.88.246.0 255.255.255.0)
/etc/openvpn/ccdの設定
client1-udp:ifconfig-push 10.87.246.2 255.255.255.0(デフォルト)
client1-tcp:ifconfig-push 10.88.246.3 255.255.255.0(手動設定)
>1.TCPで繋いだときに、tun-tcp0のサブネットのIPアドレスが割当てられているでしょうか
クライアントはAndroidスマホで、OpenVPNConnect-OpenVPN Appを使用して検証しています。
tcpプロトコルで接続時、接続が成立するとYOUR PRIVATE IPの項目に「10.88.246.3」が表示することから/etc/openvpn/ccdの設定は効いているように見受けられます。
ちなみにファイルclient1-tcpを削除にてから接続すると「10.88.246.2」を表示します。
>2. 後から追加した方のログ(本文中と同じなら・・・
特にマスクする部分はございませんのでそのまま全て貼らせていただきます。
/var/log/openvpn-status-tcp.log *tcp通信のログ
TITLE OpenVPN 2.5.1 arm-unknown-linux-gnueabihf [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on May 14 2021
TIME 2024-06-09 16:07:56 1717916876
HEADER CLIENT_LIST Common Name Real Address Virtual Address Virtual IPv6 Address Bytes Received Bytes Sent Connected Since Connected Since (time_t) Username Client ID Peer ID Data Channel Cipher
HEADER ROUTING_TABLE Virtual Address Common Name Real Address Last Ref Last Ref (time_t)
GLOBAL_STATS Max bcast/mcast queue length 0
END
/var/log/openvpn-status.log *udp通信のログ
TITLE OpenVPN 2.5.1 arm-unknown-linux-gnueabihf [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on May 14 2021
TIME 2024-06-09 16:22:43 1717917763
HEADER CLIENT_LIST Common Name Real Address Virtual Address Virtual IPv6 Address Bytes Received Bytes Sent Connected Since Connected Since (time_t) Username Client ID Peer ID Data Channel Cipher
HEADER ROUTING_TABLE Virtual Address Common Name Real Address Last Ref Last Ref (time_t)
GLOBAL_STATS Max bcast/mcast queue length 0
END
その他
今気づいたのですが、PiVPNインストール前のapt update/apt upgrade実行が漏れていました。
> tcpプロトコルで接続時、接続が成立するとYOUR PRIVATE IPの項目に「10.88.246.3」が表示することから/etc/openvpn/ccdの設定は効いているように見受けられます。
> ちなみにファイルclient1-tcpを削除にてから接続すると「10.88.246.2」を表示します。
なるほど。IPアドレスの取得は正しく行えているようですね。
ログの貼り付けもありがとうございました。
特にエラーが出ていないのと、上記IPアドレスの取得状況から、OpenVPN側は期待通りの動作をしているように見えます。
そうなると、後はルーティングの設定でしょうか。
Raspberry pi で以下を実行してみていただけますか
sudo iptables -t nat -L POSTROUTING
> tun0-tcp(手動設定):10.88.246.0(server 10.88.246.0 255.255.255.0)
追加したTCPのサブネットが 10.88.246.0/24 であるようですので
10.88.246.0/24 の行が以下のように表示されることをご確認ください。
$ sudo iptables -t nat -L POSTROUTING
Chain POSTROUTING (policy ACCEPT)
…
MASQUERADE all — 10.88.246.0/24 anywhere /* openvpn-nat-rule-tcp */
これが表示されるのであれば外には出れる状態のはずです。
スマホからだと状況確認が難しいのですが、PCで繋げることができるのであれば、VPNをつなげた状態で以下のあたり確認すると良さそうです。
– Raspberry Piの家庭内LANのIPアドレスに ping が通るか (Raspberry Pi内のルーティングが正常に動作していることを確認)
– 家のLANのルータの IPアドレスに ping が通るか (10.88.246.0/24から家のLANのサブネットに出ることができるか
– nslookup で www.google.com のIPアドレスが取得できるか (IPとしてはインターネットに出れるが、DNS解決ができないため繋がらないように見えるのでは?)
何度もフォローを頂きありがとうございました。
無事にUDP、TCPプロトコルどちらの接続でも外部に出られるようになりました。
原因はiptablesの設定が出来ていない(していない)ことでした。
$ sudo vi /etc/iptables/rules.v4
昔、別件でiptablesのトラブルがあり、何もしない悪い習慣が身いついていました。
2021年頃はこの設定をしない状態でも御記事通りにOpenVPNが動作していました。
これで以前のように便利に活用できるようになりました。
ファミリーレストランでは同じ系列でも店舗によって接続できるプロトコルが違うので、使い分けができるこの仕組みは大変助かります。
どうもありがとうございました。
通信できたようで良かったです!
そうなんですよ。系列店に関係なく、そのお店によって繋がる/繋がらないが変わるんですよね。
お役に立てて光栄です。