Pritunl VPN環境の構築

### コロナの影響でリモート接続が必要となり構築した際のメモ。  
既存のセグメントに透過的にアクセス可能とするのではなく、新しい仮想のVPNセグメントを生成して、そのセグメントに必要なクライアントを参加させる形となる。

## Pritunlサーバ構築

### AWS（準備）

*   EC2のOS：　Amazon Linux 2
*   EC2インスタンスタイプ：　t3.micro
*   ストレージ：　8GB
*   ElasticIP付与：　必須（以降、111.111.111.111）
*   ドメイン設定：　任意
*   インバウンドポート設定

    *   TCP　SSH、HTTP、HTTPS　保守作業する場所（自宅／会社）のIPのみ許可
    *   UDP　18055　VPNクライアント用（*後ほどPritunlのWeb設定画面で表示される番号）

### AWS（EC2サーバ構築）

*   SSHにて、ec2-userでログイン
*   [ここ](https://docs.pritunl.com/docs/installation#section-aws-install)を参考にPritunlをインストール(以下)

        sudo tee /etc/yum.repos.d/mongodb-org-4.2.repo << EOF
        [mongodb-org-4.2]
        name=MongoDB Repository
        baseurl=https://repo.mongodb.org/yum/amazon/2/mongodb-org/4.2/x86_64/
        gpgcheck=1
        enabled=1
        gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc
        EOF
*  
        sudo tee /etc/yum.repos.d/pritunl.repo << EOF
        [pritunl]
        name=Pritunl Repository
        baseurl=https://repo.pritunl.com/stable/yum/amazonlinux/2/
        gpgcheck=1
        enabled=1
        EOF

* 
        sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
        gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 7568D9BB55FF9E5287D586017AE645C0CF8E292A
        gpg --armor --export 7568D9BB55FF9E5287D586017AE645C0CF8E292A > key.tmp; sudo rpm --import key.tmp; rm -f key.tmp
        sudo yum -y install pritunl mongodb-org
        sudo systemctl start mongod pritunl
        sudo systemctl enable mongod pritunl

*   セットアップキーを作成

        sudo pritunl setup-key
        0602d77d26fe4b22a8330a8c13c00000　のようなキーが表示される

*   デフォルトパスワードを作成

        sudo pritunl default-password
        Administrator default password:
        username: "pritunl"
        password: "xxxxxxxxxxxxxx"

### Pritunl コントロール画面（初期設定）

*   ブラウザで、Pritunlセットアップ画面を開き、セットアップキーを入力する。  
[https://111.111.111.111/setup](https://111.111.111.111/setup)
*   先程生成した、ユーザ、初期パスワードを入力しログインする。
*   Settingsダイアログが表示されるのでNew Password、Lets Encrypt Domain(ドメイン取得時のみ)などを設定する。
*   オーガナイゼーション作成
    *   上部メニューの　Users　をクリック
    *   Add Organization　ボタンをクリック  
※最低この単位で、VPNのネットワークセグメントを分けることも可能
*   ユーザ作成
    *   Add User　ボタンをクリック
    *   対象ユーザを全員分作成
    *   Linuxのファイルサーバをクライアントにする場合、Pinやメールは設定しない
<table>
<thead>
<tr>
<th>アカウント（半角）</th>
<th>メール</th>
<th>PIN（整数6文字以上）</th>
</tr>
</thead>
<tbody>
<tr>
<td>user1</td>
<td>user1@hoge.jp</td>
<td>123456</td>
</tr>
<tr>
<td>user2</td>
<td>user1@hoge.jp</td>
<td>123456</td>
</tr>
<tr>
<td>user3</td>
<td>user3@hoge.jp</td>
<td>123456</td>
</tr>
<tr>
<td>linuxFileServer</td>
<td>なし</td>
<td>なし</td>
</tr>
</tbody>
</table>
*   サーバ作成  
    *   Add Server　ボタンをクリック  
Name：　vpnの名称  
UDP：　18055 （自動で設定される）  
セグメント：　192.168.217.0/24 （自動で設定される）  
※VPNセグメントを複数構築したい場合（ネットワークを分離したい場合）は複数作成する。
*   オーガナイゼーションをサーバに紐付ける
    *   Attach Organization　ボタンをクリック
    *   オーガナイゼーションとサーバを入力
*   サーバの起動
    *   左側の　Start Server 緑ボタンをクリック
    *   右側の　Status　が　Online　となればOK
*   ユーザ一覧の右側アイコンをクリックして、各ユーザのプロファイルをダウンロード  
*   ダウンロードしたプロファイルと、先程設定したPinを、各ユーザに配布する。

このファイルとPinがあれば誰でも接続できてしまう為、配布は可能な限り安全な方法で行うこと。またPinは口頭で伝えるなどする。

## Windowsクライアントアプリの導入

*   ここ [https://client.pritunl.com/](https://client.pritunl.com/#install)より Pritunl.exe をダウンロードし、インストール
*   クライアント起動
*   設定ファイルをImport（予め、Pritunlのユーザ一覧画面の右側のダウンロードボタンで、各ユーザの.tarファイルをダンロードしておく）
*   右上のハンバーガーメニューより「Connect」
*   Pinをいれれば接続完了
*   Autostart　ON　にしておけば、Windows起動とともに自動で接続される

リモートデスクトップを使用する場合は、接続元、接続先の２台にクライアントアプリをインストールし、どちらもVPNセグメントに参加させます。また、既存のファイルサーバにアクセスしたい場合は、ファイルサーバにクライアントをインストールします（次章を参照）

## LinuxサーバにOpenVPNクライアントを導入

共有ファイルサーバ（Sambaサーバ）等、Linuxマシンをセグメントに参加させたい場合に必要となる。  
※[ここ](https://www.atmarkit.co.jp/ait/articles/1603/22/news010_2.html)の記事のclient側についてのみ参考にさせていただきました。

*   openvpnクライアントをインストール

        yum install epel-release
        yum install --enablerepo=epel openvpn

*   client.confの修正

        cat /usr/share/doc/openvpn/sample/sample-config-files/client.conf > /etc/openvpn/client.conf
        vi /etc/openvpn/client.conf

* 下記項目を変更します。  

        remote 111.111.111.111 18055  
        ca /etc/openvpn/ca  
        cert /etc/openvpn/cert  
        key /etc/openvpn/key  
        tls-auth /etc/openvpn/ta 1

*   上記の４つの証明書(ca,cert,key,ta)に対応したファイルを作成  
Pritunlのユーザ一覧画面からダウンロードしたプロファイル（tarファイル）をLhaForge等のアーカイバで展開し、展開された .ovpnファイルを、サクラエディタ等のテキストエディタで開いて切り出し、ファイル化します。

        <ca>～この部分をコピーして単独のファイル ca にする～</ca>
        <tls-auth>～この部分をコピーして単独のファイル ta にする～</tls-auth>
        <cert>～この部分をコピーして単独のファイル certに する～</cert>
        <key>～この部分をコピーして単独のファイル key にする～</key>

※Linuxであれば　`tar -xf user1.tar`　のようにアーカイブを展開し、展開後のovpnファイルを　`vi user1.ovpn`　等としてファイル内のタグで囲まれたテキスト部分を切り出してファイル化します。少々面倒なのですが、もっと良い方法を知っている方がいれば教えてほしいです・・・

*   VPNクライアント接続テスト

        openvpn /etc/openvpn/client.conf

接続ログが画面にずらずらと表示される。エラーなどがなければOK。
※以下のようなPinエラーになる場合は、当該ユーザ作成時にPinを設定しているかもしれませんので、その場合は再度ユーザ設定よりPinの設定を削除します。

    Mon Mar 30 02:03:30 2020 AUTH: Received control message:
    AUTH_FAILED,CRV1:R:f52cbb8978cc402da249d2e00000003:bmls:Enter Pin
    Mon Mar 30 02:03:30 2020 SIGTERM[soft,auth-failure] received, process exiting

*   VPNクライアント自動起動

        vi /opt/openvpn-client.sh

        #!/bin/bash  
        openvpn /etc/openvpn/client.conf

* 

        chmod 755 /opt/openvpn-client.sh



        vi /etc/systemd/system/openvpn-client.service

        [Unit]  
        Description = OpenVPN-Client daemon  
        [Service]  
        ExecStart = /opt/openvpn-client.sh  
        Restart = always  
        Type = simple  
        [Install]  
        WantedBy=multi-user.target

*   起動

        systemctl start openvpn-client
        ps aux | grep openvpn

下記のようなプロセスがあれば問題ない  

        root 862 0.0 0.1 23284 3420 ? Ss 3月31 0:00 /bin/bash /opt/openvpn-client.sh  
        root 867 0.0 0.4 56504 7976 ? S 3月31 0:05 openvpn /etc/openvpn/client.conf

*   自動起動

        systemctl enable openvpn-client

*   サーバを再起動後しばらくして、Pritunl ユーザ一覧画面で、当該サーバが接続状態となっていればOK