Help us understand the problem. What is going on with this article?

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 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を使うことで非常に簡単に導入できるようになっているようです。

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番を開放

こうするとうまくいった。

tororu
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away