はじめに
本記事は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をインストールします。
$ 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/
$ 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 chmod +x /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を使うことで非常に簡単に導入できるようになっているようです。
$ 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を使います。
#追記
ファイアーウォールの設定について
2019/9/22追記
何回かやっているとVPNはつながるものの、パケットの通信ができないことが多々発生したため、調査すると、ファイアウォールが閉じていることが判明した。
そのため、ufwを導入し以下を実行した。
$ sudo apt-get install ufw # ufwのインストール
$ sudo ufw allow 22 # ポートの開放
$ sudo ufw default deny # 許可されたポート以外を閉じる
$ sudo ufw enable #ufwの有効化
$ sudo ufw allow 1194/udp #UDP1194番を開放
こうするとうまくいった。