Edited at

RaspberryPi3をDDNS+OpenVPNサーバにするまでの備忘録


はじめに

本記事はRaspberryPi3を使ってDDNS+OpenVPNサーバを構築し、iPhoneからVPN接続を試みるまでを解説します。

なお、RaspberryPiの基本的な設定は終わっているものとして解説していきます。

これにより、外部から自宅NWに接続できるようになり、自宅のファイルサーバの閲覧、リモートデスクトップ等が割と簡単にできるようになります。また、海外の野良Wi-Fiから安全な通信ができるようになります。


no-ipを使ったDDNSサーバの設定

自宅のIPアドレスのアドレスが固定であればIPアドレス直打ちでVPNサーバへアクセスできるが、一般家庭でそのような環境を構築する場合、月1000円ほどコストが掛かってしまいます。

そのため、IPアドレスが変わっても固定のフレーズでアクセスできるようにするために、DDNSのサービスを使っていきます。

ここでは無料で使えて日本語の解説記事も多いno-IPを使っていきます。


no-IPの登録

まず、アカウント登録してください。

特に問題なく登録できると思います。

no-IP

ホストネームの作成までここで実行します。


IPアドレスの自動更新

ラズパイ上にnoip DUCをインストールします。


clientのダウンロード

$ wget http://www.noip.com/client/linux/noip-duc-linux.tar.gz

$ sudo tar zxvf noip-duc-linux.tar.gz
$ cd noip-2.1.9-1/


clientのインストール

$ sudo make

$ sudo make install
...
Please enter the login/email string for no-ip.com # => no-ipに登録したユーザ名を入力します
Please enter the password for user '*****' # => 同じく登録したパスワードを入力します
Please enter an update interval:[30] # => 何分毎に設定を確認するかを入力します
Do you wish to run something at successful update?[N] (y/N) n


自動起動の設定

$ sudo cp debian.noip2.sh /etc/init.d/noip2

$ sudo vi /etc/rc.lcal
# 以下の1行を追加します
/etc/init.d/noip2 start

### 設定
$ sudo /etc/init.d/noip2 stop
$ sudo /usr/local/bin/noip2 -C # 再度設定
$ sudo /etc/init.d/noip2 start # 起動

### 確認
$ sudo /usr/local/bin/noip2 -S


これで30分毎にホストネームのIPアドレスを確認し、ホストネームとIPアドレスの紐づけが間違っていれば、自動でDNS情報を変更してくれるようになりました。


PiVPNを用いたOpenVPNの設定(サーバ側の設定)

VPNには様々な種類があるようですが(L2TP/IPsec,PPTP,OpenVPNなど)、セキュリティが最も高いと言われているOpenVPNを導入していきます。

少し前まではOpenVPNを導入する場合、インストール・設定等が非常に煩雑だったようですが、現在、RaspberryPiにOpenVPNを導入する場合は、PiVPNを使うことで非常に簡単に導入できるようになっているようです。


PiVPNのインストール

$ sudo apt install zip openssl openvpn

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

あとは勝手にインストールが始まり、GUI?上で選択肢に答えていくだけでインストールが完了します。

ここでは決定はスペース、選択肢の変更はTabキーで実施します。

以下、選択肢の意訳と設定

◆Do you want to use your current network setting as a static address? (この静的IPアドレスでよい?)

Yes

◆Do you want to enable unattended upgrade of security patch to this server? (セキュリティパッチ自動で当てとこうか?)

Yes

◆Choose a protocol(press space to select).Please only choose TCP if you know why you need TCP.(プロトコルを選んでね。TCPが必要だったらTCPを選んでね。)

UDP

◆You can modify the default OpenVPN port. Enter a new value or hit 'Enter' to retain the default(OpenVPNで使うポートを入力してね)

1194

◆Choose your desired level of encryption...(暗号化のレベルを選んでね。数字が大きいほど暗号化のレベルは高くなるよ。)

2048

その後、暗号化キーが生成されます。これはかなり長いので、ご飯でも食べながら気長に待ちましょう。

僕の環境だと2時間ほどかかったと思います。

◆Will clients use a Public IP or DNS Name to connect to your server?(IPアドレスとホストネームのどちらでVPNサーバに接続する?)

DNS Entry

→ no-IPで作成したホストネームを入力

◆Select the DNS Provider for your VPN Clients.(DNSプロバイダを選択してね)

Google

◆It is strongly recommended your reboot after installation. Would you like to reboot now?(再起動する?)

Yes

これでVPNサーバが構築できました。

次にクライアントにインストールする証明書を生成します。

$ pivpn add

途中でクライアント名とパスワードの入力を求められうので、適当に入力。

成功すると、ovpnsフォルダが生成され、その中に「クライアント名.ovpn」が生成されています。

これをVPNクライアントにインストールすることで、VPN接続ができるようになります。


MSS値の最適化

ここで生成された.ovpnファイルは自動生成されているため、適切なMSS値が設定されていないことがあります。

適切なMSS値が設定されていないと、通信が著しく遅くなります。(僕の環境だと1kbps出ませんでした。)

よって、適切なMSS値を探っていきます。

下記コマンドを実行し、パケットサイズ(MTU)ができるだけ大きく、パケットロスが起こらない値を探してください。

MTUから40を引いた値がMSS値です。

$ ping -M do -s パケットサイズ(0−1500) -c 1 google.com


パケットロス(通信失敗)

$ ping -M do -s 1500 -c 1 google.com

PING google.com(nrt12s13-in-x0e.1e100.net (2404:6800:4004:81a::200e)) 1500 data bytes

--- google.com ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms



パケット到達(通信成功)

$ ping -M do -s 1400 -c 1 google.com

PING google.com(nrt12s22-in-x0e.1e100.net (2404:6800:4004:80c::200e)) 1400 data bytes
72 bytes from nrt12s22-in-x0e.1e100.net (2404:6800:4004:80c::200e): icmp_seq=1 ttl=54 (truncated)

--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 5.167/5.167/5.167/0.000 ms


上記の場合、適切なパケットサイズは1400なので、1400から40を引いた1360が適切なMSS値です。

これを.ovpnファイルに記述します。

$vi ./ovpns/クライアント名.ovpn

# 以下の1行を<ca>の前の行に追加します
mssfix 1360

ここで作成した.ovpnファイルをメール等でクライアントに送付して共有します。


ポートフォワーディング設定

ルータにてポートフォワーディングの設定をしてください。


クライアントの設定


iPhoneの場合

OpenVPN Connectを使います。


Macの場合

tunnelblickを使います。


追記


ファイアーウォールの設定について

後日追記予定