OpenVPN 構築

Inspire from [基本的なOpenVPNの構築手順@makisyu](https://qiita.com/makisyu/items/2ac579c0e169970b1609)

サーバー CentOS8.2
クライアント Windows 10, iphone ios 13.6

# ダウンロード
https://openvpn.net/index.php/download/community-downloads.html
これを書いた当時は2.4.9が最新だったが、適宜その時の最新版を取得。

# サーバー側の設定
ここが便利： http://www.openvpn.jp/document/how-to/
本家のHow-toを日本語化してくれている。らしいけど。
らしいけど。うまくいかなかったのであくまで参考程度。（インストール↓参照）

## インストール
RPMを作るのがオススメらしい。がうまくいかなかった。

```bash:こうやるらしい
#dnf group install "RPM Development Tools"
#dnf install openssl-devel lzo-devel pam-devel
#rpmbuild -tb openvpn-2.4.9.tar.gz
#dnf install /root/rpmbuild/RPMS/x86_64/openvpn-2.4.9-1.x86_64.rpm
```

```bash:こうなった。。。
# rpmbuild -tb openvpn-2.4.9.tar.gz
error: Failed to read spec file from openvpn-2.4.9.tar.gz
```

```bash:こうしたった
#dnf group install "RPM Development Tools"
#dnf install openssl-devel lzo-devel pam-devel
#dnf install rpm-build rpmdevtools make gcc
#dnf install openssl lzo pam
#cd /tmp
#wget https://swupdate.openvpn.org/community/releases/openvpn-2.4.9.tar.xz
#cd ./openvpn-2.4.9
#tar xf openvpn-2.4.9.tar.xz
#./configure
#make
#make install
```

```bash:ついでにこれもしたった
#dnf -y install easy-rsa
#mkdir -p /etc/openvpn/easy-rsa/
#cp -r /usr/share/easy-rsa/3.0.7/ /etc/openvpn/easy-rsa/
#cd /etc/openvpn/easy-rsa/*/
```

## 認証局の設置
もともとは`openvpn-2.4.9.tar.xz`に同梱されてたらしいけど入ってるのを見たことがない
とりあえず`dnf install easy-rsa`でインストールできるのでインストール
そしたらversion 3.0.7がはいってきた。このままやる

```bash
# cd /etc/openvpn/easy-rsa/3.0.7/
```
```bash
# ./easyrsa init-pki

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/easy-rsa/3.0.7/pki
```
```bash
# ./easyrsa build-ca
Using SSL: openssl OpenSSL 1.1.1c FIPS  28 May 2019

Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
Generating RSA private key, 2048 bit long modulus (2 primes)
..+++++
..................................................+++++
e is 65537 (0x010001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/easy-rsa/3.0.7/pki/ca.crt
```

Common Name はめんどかったのでそのままエンターした

```bash
# ./easyrsa gen-dh
Using SSL: openssl OpenSSL 1.1.1c FIPS  28 May 2019
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
...+...+...+...++*++*++*++*

DH parameters of size 2048 created at /etc/openvpn/easy-rsa/3.0.7/pki/dh.pem
```

昔は30分くらいかかった希ガスけど1分かからず終わった。マシンのスペックかな？

```bash
# openvpn --genkey --secret ./pki/ta.key
```
```bash
# ls -lvhA pki/
total 56K
-rw------- 1 root root 1.2K Aug 10 01:10 ca.crt
drwx------ 2 root root 4.0K Aug 10 01:10 certs_by_serial
-rw------- 1 root root  424 Aug 10 01:11 dh.pem
-rw------- 1 root root    0 Aug 10 01:10 index.txt
-rw------- 1 root root    0 Aug 10 01:10 index.txt.attr
drwx------ 2 root root 4.0K Aug 10 01:10 issued
-rw------- 1 root root 4.6K Aug 10 01:10 openssl-easyrsa.cnf
drwx------ 2 root root 4.0K Aug 10 01:10 private
drwx------ 5 root root 4.0K Aug 10 01:10 renewed
drwx------ 2 root root 4.0K Aug 10 01:10 reqs
drwx------ 5 root root 4.0K Aug 10 01:10 revoked
-rw------- 1 root root 4.6K Aug 10 01:10 safessl-easyrsa.cnf
-rw------- 1 root root    3 Aug 10 01:10 serial
-rw------- 1 root root  636 Aug 10 01:16 ta.key
```

## サーバ鍵と証明書の作成

```bash
./easyrsa build-server-full server nopass
```
みんなやってるので(パスワード無しで)やりました。反省してません。

```bash
cd /etc/openvpn
ln -s /etc/openvpn/easy-rsa/3.0.7/pki/
ln -s pki/ta.key
ln -s pki/ca.crt
ln -s pki/dh.pem
ln -s pki/private/server.key
ln -s pki/issued/server.crt
cp /tmp/openvpn-2.4.9/sample/sample-config-files/server.conf /etc/openvpn/server.conf.org
cp /tmp/openvpn-2.4.9/sample/sample-config-files/server.conf /etc/openvpn/server.conf
```
とりあえずこの辺やっときゃ必要なファイルが拾えるのでリンク貼った。
server.conf はオリジナルを保持しておきたいのでコピー

```ini:server.conf
ca /etc/openvpn/ca.crt # 78行目くらい
cert /etc/openvpn/server.crt # 79行目
key /etc/openvpn/server.key # 80
dh /etc/openvpn/dh.pem # 85
server 172.16.0.0 255.255.0.0 # 101
push "route 0.0.0.0 0.0.0.0" # 141 ; すべてのパケットをVPNサーバ経由とする
push "dhcp-option DNS 199.85.126.10" # 200 ; DNS サーバのアドレスをNorton DNSに向ける
push "dhcp-option DNS 199.85.127.10" # 201 ; DNS サーバのアドレスをNorton DNSに向ける
tls-auth /etc/openvpn/ta.key 0 # 244
cipher AES-256-GCM # 252 ; AES-256-CBC ではなく AES-256-GCM を採用
compress lz4-v2 # 257
user nobody # 274
group nobody # 275
status /var/log/openvpn/status.log # 287
log         /var/log/openvpn/openvpn.log #296
log-append  /var/log/openvpn/openvpn.log #297
ncp-ciphers AES-256-GCM # 最終行に追記
tls-version-min 1.2 # 最終行に追記
tls-cipher TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384:TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384 # 最終行に追記
reneg-sec 60 # 最終行に追記
```

- [Norton DNS](https://support.norton.com/sp/ja/jp/home/current/solutions/v53247054) ポリシー 1: セキュリティ
- [OpenVPNのTLSと暗号化を強くする](https://qiita.com/keiya/items/fadc549b539c542d8a40) @ keiya | Qiita
- [AES-256-GCMの方が安全なのに、なぜAES-256-CBCを使用するのですか？](https://www.it-swarm.dev/ja/encryption/aes256gcm%E3%81%AE%E6%96%B9%E3%81%8C%E5%AE%89%E5%85%A8%E3%81%AA%E3%81%AE%E3%81%AB%E3%80%81%E3%81%AA%E3%81%9Caes256cbc%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/l968341757/)
- [安全性が高いTLSへの移行で解決 - 狙われるセキュリティプロトコル：日経クロステック Active](https://active.nikkeibp.co.jp/atclact/active/17/032000256/032000005/)

変えたのは上記。うん、結構あるなぁ

```bash
openvpn /etc/openvpn/server.conf
```

設定ファイルを書いたら、まずはフォアグラウンドで動作確認。

```text:こうなった...
Mon Aug 10 02:03:30 2020 Warning: Error redirecting stdout/stderr to --log file: /var/log/openvpn/openvpn.log: No such file or directory (errno=2)
Mon Aug 10 02:03:30 2020 Warning: Error redirecting stdout/stderr to --log file: /var/log/openvpn/openvpn.log: No such file or directory (errno=2)
Options error: --status fails with '/var/log/openvpn/status.log': No such file or directory (errno=2)
Options error: Please correct these errors.
Use --help for more information.
```

こうなった。そりゃそうだ。`/var/log/openvpn`ディレクトリ作ってないんだもの

```bash
mkdir /var/log/openvpn/
openvpn /etc/openvpn/server.conf
```
何も表示されないままになればOK(?)
とりあえず^Cで終了させて。。。

```bash
# systemctl status openvpn
Unit openvpn.service could not be found.
```

[Linux の任意のスクリプトをサービス登録し OS 起動時に自動起動させる [init.d/SystemD 編]](https://qiita.com/KEINOS/items/f3e6b3064b0cbe35fd03#systemd-%E3%81%A7%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB%E4%BB%BB%E6%84%8F%E3%81%AE%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B) @ KEINOS | Qiita

↑参考にしつつサービス登録する。

```text:/etc/openvpn/openvpn.service
[Unit]
Description=OpenVPN
After=network.target

[Service]
Type=simple
User=nobody
WorkingDirectory=/etc/openvpn
ExecStart=/usr/local/sbin/openvpn /etc/openvpn/server.conf

[Install]
WantedBy=multi-user.target
```

こんな感じで作ってみたけどあってんかはわからない。

```bash
ln -s /etc/openvpn/openvpn.service /etc/systemd/system/
```

あとはリンクつなげてテスト

```bash
# systemctl status openvpn
● openvpn.service - OpenVPN
   Loaded: loaded (/etc/openvpn/openvpn.service; linked; vendor preset: disabled)
   Active: inactive (dead)
# systemctl start openvpn
# systemctl status openvpn
● openvpn.service - OpenVPN
   Loaded: loaded (/etc/openvpn/openvpn.service; linked; vendor preset: disabled)
   Active: failed (Result: exit-code) since Mon 2020-08-10 02:21:21 JST; 4s ago
  Process: 94886 ExecStart=/usr/local/sbin/openvpn /etc/openvpn/server.conf (code=exited, status=1/FAILURE)
 Main PID: 94886 (code=exited, status=1/FAILURE)

Aug 10 02:21:21 localhost systemd[1]: Started OpenVPN.
Aug 10 02:21:21 localhost systemd[1]: openvpn.service: Main process exited, code=exited, status=1/FAILURE
Aug 10 02:21:21 localhost systemd[1]: openvpn.service: Failed with result 'exit-code'.
lines 1-9/9 (END)
```

とりあえず systemD が認識したっぽいので start してみるがエラー...

```bash
vim /etc/openvpn/openvpn.service
```

```text:/etc/openvpn/openvpn.service
[Unit]
Description=OpenVPN
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/etc/openvpn
ExecStart=/usr/local/sbin/openvpn /etc/openvpn/server.conf

[Install]
WantedBy=multi-user.target
```

```bash
# systemctl start openvpn.service
Warning: The unit file, source configuration file or drop-ins of openvpn.service changed on disk. Run 'systemctl daemon-reload' to reload units.
# systemctl daemon-reload
# systemctl start openvpn.service
# systemctl status openvpn -l
● openvpn.service - OpenVPN
   Loaded: loaded (/etc/openvpn/openvpn.service; linked; vendor preset: disabled)
   Active: active (running) since Mon 2020-08-10 02:34:05 JST; 2s ago
 Main PID: 95065 (openvpn)
    Tasks: 1 (limit: 2851)
   Memory: 1.4M
   CGroup: /system.slice/openvpn.service
           mq95065 /usr/local/sbin/openvpn /etc/openvpn/server.conf

Aug 10 02:34:05 localhost systemd[1]: Started OpenVPN.
```

`User=root`にしたらサービス起動した...
permission deny とかでなかったじゃんかーーーーーー


```bash
systemctl enable openvpn.service
Created symlink /etc/systemd/system/multi-user.target.wants/openvpn.service → /etc/openvpn/openvpn.service.
```

いつも見るmesgみると落ち着く。。。

```bash
# journalctl -e -u openvpn.service
``` 

こいつでログも見れるのでとりあえず systemD へのレジスト はokってことでおｋ？

```
firewall-cmd --permanent --add-service openvpn
firewall-cmd --add-service openvpn
```

あとは、firewallD に許可リスト突っ込む

---

# クライアントの設定

## クライアント用秘密鍵生成

```bash
# cd /etc/openvpn/easy-rsa/3.0.7
```
```bash
# ./easyrsa build-client-full client01 nopass
Using SSL: openssl OpenSSL 1.1.1c FIPS  28 May 2019
Generating a RSA private key
...................................+++++
................+++++
writing new private key to '/etc/openvpn/easy-rsa/3.0.7/pki/easy-rsa-95128.16s90t/tmp.KXofP8'
-----
Using configuration from /etc/openvpn/easy-rsa/3.0.7/pki/easy-rsa-95128.16s90t/tmp.U6v8Ai
Enter pass phrase for /etc/openvpn/easy-rsa/3.0.7/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'client01'
Certificate is to be certified until Nov 12 17:49:24 2022 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

```
もう面倒になったので(パスワード無しで)やりました。反省してません。
あとは、`pki/ta.key` `pki/private/ca.crt` `pki/issued/client01.crt` `pki/private/client01.key` をSCPとかでこっそり持ってきちゃうと楽。

[![WinSCP](https://syncnavi.xsrv.jp/wp-content/uploads/2019/09/winscp.png)](https://winscp.net/eng/docs/lang:jp)

## 設定ファイル
`/tmp/openvpn-2.4.9/sample/sample-windows/sample.ovpn` (ソースコードの中)にクライアント用(windows)の設定ファイルがあるのでそれを適宜修正する。

```bash
cp /tmp/openvpn-2.4.9/sample/sample-windows/sample.ovpn /etc/openvpn/client01.ovpn
cp /tmp/openvpn-2.4.9/sample/sample-windows/sample.ovpn /etc/openvpn/client01.ovpn.org
```

```
remote example.net
port 1194
proto udp
dev tun
; ifconfig 10.3.0.1 255.255.255.0
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1
compress lz4-v2
cipher AES-256-GCM
verb 4
```
![](https://img.shields.io/badge/validation-non--check-red)

---
# p.s.
記事書いてて `ta.key` が ずっと `Turkey` にしか見えなかった・・・`Turkey`食いてぇ