Raspberry PiでOpenVPNサーバを構築する

Raspberry Piを買ってからOpenVPNサーバにするまでのいきさつです。

- Raspberry Pi 3 Model B
- 有線のLANは使用せずWi-Fiのみ接続
- GUIは使用しない
- クライアントの通信をVPN経由にする
- セキュリティ対策はとりあえず後回し


## OSのインストール

Raspberry Piで使用するOSのRaspbianをダウンロードします。

Raspbianのサイト
https://www.raspberrypi.org/downloads/raspbian/

RaspbianにはWITH DESKTOP版とLITE版があります。
今回はデスクトップ不要のためLITE版を使用します。

RASPBIAN STRETCH LITEの[Downlowd ZIP]からzipをダウンロードします。
解凍するとディスクイメージのimgファイルになります。


SDカードにOSを書き込みます。

書き込みにはRufusを使いました。

Rufus
https://rufus.akeo.ie/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47389/fa0e6715-42ed-2c9d-1f3e-708714f2213b.png)


## 起動準備

sshログインできるようにします。
boot直下にsshという名前で空のファイルを作っておくとsshログインできるようになります。

Wi-Fi接続できるようにします。
boot直下にwpa_supplicant.confというファイルを作ります。
内容は以下の通りです。

```:wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
country=JP
network={
    ssid="SSID"
    psk="パスワード"
    key_mgmt=WPA-PSK
    proto=WPA WPA2
    pairwise=CCMP TKIP
    group=CCMP TKIP WEP104 WEP40
}
```

SSIDとパスワードを記入します。改行コードはLFで保存。


## 起動

Raspberry PiにSDカードを差し込んで電源を入れます。

うまくWi-Fiに接続できていればDHCPでIPアドレスが割り当てられているはずです。
割り当てられたアドレスはDHCPサーバの払い出し状況を見るなどして確認してください。

sshでログインします。
初期値は ` USER: pi ` ` PASSWORD: raspberry ` です。


## 初期設定

IPアドレスを固定します。

```
vi /etc/dhcpcd.conf
```

一番下にwlan0の設定を追加する。

```:/etc/dhcpcd.conf
interface wlan0
static ip_address=192.168.0.120/24
static routers=192.168.0.10
static domain_name_servers=192.168.0.10 8.8.8.8
```

ソフトウェアのアップデートをします。

```
sudo apt update
sudo apt upgrade
```

ラズパイの設定をします。

```
sudo raspi-config
```

ラズパイの設定メニュー(CUI)が表示されます。
ロケールとタイムゾーンを変更します。

`Localisation Options`を選択
`Change Locale`を選択
`en_GB.UTF-8 UTF-8`を外す
`ja_JP.UTF-8 UTF-8`を付ける
デフォルトロケールは`ja_JP.UTF-8`を選択

`Localisation Options`を選択
`Change Timezone`を選択
`Asia`を選択
`Tokyo`を選択

VPNサーバにするためIPフォワードを有効にします。

```
sudo vi /etc/sysctl.conf
```

以下の行のコメントを外して有効にします。

```:/etc/sysctl.conf
net.ipv4.ip_forward=1
```

再起動します。

```
sudo reboot
```


## OpenVPNのインストール

インストールします。

```
sudo apt install zip openssl openvpn
```


easy-rsaで証明書を作成します。

```
sudo su
cd /usr/share/easy-rsa
vi vars
```

以下の各行を任意の値に修正します。

```:/usr/share/easy-rsa/vars
export KEY_COUNTRY="JP"
export KEY_PROVINCE="Tokyo"
export KEY_CITY="Edogawa"
export KEY_ORG="MyOrganization"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_OU="MyOrganizationalUnit"
```

```
. ./vars
./clean-all
```

openssl.cnfをコピーして作成します。

```
cp openssl-1.0.0.cnf openssl.cnf
```

CA証明書を作成します。

```
./build-ca
```

サーバ証明書を作成します。

```
./build-key-server server
```

以下はそれぞれyで。

```
Sign the certificate? [y/n]:
1 out of 1 certificate requests certified, commit? [y/n]
```

クライアント証明書を作成します。

```
./build-key client
```

以下はそれぞれyで。

```
Sign the certificate? [y/n]:
1 out of 1 certificate requests certified, commit? [y/n]
```

クライアントが複数ある場合は同様に作成します。

```
./build-key client2
./build-key client3
```

DHパラメータを生成します。
これは結構時間がかかります。

```
./build-dh
```

TLS鍵を作成します。

```
cd keys
openvpn --genkey --secret ta.key
```

作成した鍵とサーバ証明書をコピーします。

```
cp ta.key server.crt server.key dh2048.pem ca.crt /etc/openvpn
```

サンプルからOpenVPNサーバの設定ファイルを作成します。

```
cd /etc/openvpn
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz .
gunzip server.conf.gz
```

設定ファイルを修正します。

```
vi server.conf
```

ファイル内の各行で鍵や証明書の場所を設定します。

```:/etc/openvpn/server.conf
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh2048.pem
tls-auth /etc/openvpn/ta.key
```

今回はVPNクライアントの通信をすべてVPN経由にするため、以下の行のコメントを外して有効にします。

```:/etc/openvpn/server.conf
push "redirect-gateway def1 bypass-dhcp"
```

OpenVPNをリスタートして設定を反映します。

```
systemctl restart openvpn
```

Raspberry Piの起動時にOpenVPNが自動起動するようにします。

```
systemctl enable openvpn
```

iptablesのポートを開放します。

```
vi /etc/rc.local
```

exit 0の前に2行追加

```:/etc/rc.local
iptables -A INPUT -p udp -m state --state NEW -m udp --dport 1194 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o wlan0 -j MASQUERADE
```

再起動します。

```
reboot
```


## OpenVPNクライアントの設定

OpenVPN GUI for Windowsのダウンロード
https://www.openvpn.jp/document/openvpn-gui-for-windows/

インストール後、スタートメニューから[OpenVPN]-[OpenVPN Configuration file directory]を選択し、configフォルダを開く。

client.ovpnファイルを作成し、以下の内容を編集する。
remoteのxxx.xxx.xxx.xxxはサーバのIPアドレス。
各鍵などの内容を

```:client.ovpn
client
dev tun
proto udp
key-direction 1
remote xxx.xxx.xxx.xxx 1194
resolv-retry infinite
nobind
persist-key
persist-tun
verb 3
<ca>
-----BEGIN CERTIFICATE-----
(ここはca.crtから)
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
(ここはclient.crtから)
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
(ここはclient.keyから)
-----END PRIVATE KEY-----
</key>
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
(ここはta.keyから)
-----END OpenVPN Static key V1-----
</tls-auth>
```


## 参考ページ

Raspberry Piのインストールはこちらを参考にしました。
https://jyn.jp/raspbian-setup/

OpenVPNの構築はこちらを参考にしました。
https://qiita.com/oi1man/items/abe3c5ef2113ec3e91f1