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](https://www.noip.com/)
ホストネームの作成までここで実行します。

##IPアドレスの自動更新
ラズパイ上にnoip DUCをインストールします。

```Bash: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/
```


```Bash: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
```

```Bash:自動起動の設定
$ 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を使うことで非常に簡単に導入できるようになっているようです。

```Bash: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***

その後、暗号化キーが生成されます。これはかなり長いので、ご飯でも食べながら気長に待ちましょう。
僕の環境だと２時間ほどかかったと思います。

◆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値が設定されていないと、通信が著しく遅くなります。（僕の環境だと1kbｐｓ出ませんでした。）
よって、適切なMSS値を探っていきます。
下記コマンドを実行し、パケットサイズ(MTU)ができるだけ大きく、パケットロスが起こらない値を探してください。
MTUから40を引いた値がMSS値です。

```Bash
$ ping -M do -s パケットサイズ（０−１５００） -c 1 google.com
```

```Bash:パケットロス（通信失敗）
$ 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
```
```Bash:パケット到達（通信成功）
$ 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](https://itunes.apple.com/jp/app/openvpn-connect/id590379981?mt=8)を使います。
##Macの場合
[tunnelblick](https://tunnelblick.net/)を使います。

#追記
## ファイアーウォールの設定について
2019/9/22追記
何回かやっているとVPNはつながるものの、パケットの通信ができないことが多々発生したため、調査すると、ファイアウォールが閉じていることが判明した。
そのため、ufwを導入し以下を実行した。

```Bash
$ sudo apt-get install ufw  # ufwのインストール
$ sudo ufw allow 22  # ポートの開放
$ sudo ufw default deny  # 許可されたポート以外を閉じる
$ sudo ufw enable #ufwの有効化
$ sudo ufw allow 1194/udp #UDP1194番を開放
```


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