rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

OpenVPNインストール ルーティング方式 Easy-RSA3利用、TLS認証あり版

2024 Feb. 24.
2021 May 05.
2021 Apr. 11.
2021 Mar. 28.
2021 Jan. 31.
2020 Nov. 06.
2020 Oct. 02.
2020 Sep. 22.
2020 Mar. 29.
2019 Oct. 21.
2019 Apr. 27.
2018 Oct. 08.
2018 Sep. 02.

参考元 https://qiita.com/noraworld/items/2fe6be489e1d93c748b8

留意点
・設定中に入力するパスフレーズは将来必要となるので控えておく。
・複数サーバー設置などで各サーバーのポートを変更した場合、サーバー設定ファイルとクライアント設定ファイルのポート番号を間違えないようにする。
・設定ファイル内の個別ファイル名は各サーバー、各クライアントでの個別ファイル名に変更する。

OpenVPNプログラムのインストール
(Ubuntu)
$ sudo apt update && sudo apt install openvpn git

(Manjaro Linux / Arch Linux)
openvpn、gitパッケージをインストールする


$ mkdir ~/YOUR-WORK-DIR
$ cd ~/YOUR-WORK-DIR
  CA証明書(認証局証明書)の再作成に備え、~/YOUR-WORK-DIRは恒久的なディレクトリとする。
  ~/apps/openvpn/server とした。

easy-rsaをインストールする。
$ git clone https://github.com/OpenVPN/easy-rsa.git
$ cd easy-rsa

easy-rsaのtag(バージョン)リストを出力する
$ git tag

出力されたリストから最新版を選ぶ。
ここでは v3.1.7 とする。
次のコマンドで、refs/tags/ に続いて v3.1.7 を記述し、-bオプションに適当なブランチ名を付けことで、v3.1.7ブランチから-bオプションに付けた名前で新しいブランチを作成する。

$ git checkout refs/tags/v3.1.7 -b my_v3.1.7

初期設定

$ cd ~/YOUR-WORK-DIR/easy-rsa/easyrsa3
$ ./easyrsa init-pki

CA証明書生成

OpenVPNインストール中に設定するパスフレーズはすべて同じにしておいた方が楽。
パスフレーズは将来必要となるので保存しておく。

CA名称は "ホスト名+OS名" にした。
 例:pc1ubuntu

CN(Common Name)には対象となるドメイン・ホスト+-Easy-RSA_CAを指定する。
 例:EXAMPLE.COM_pc1ubuntu-Easy-RSA_CA

$ cd ~/YOUR-WORK-DIR/easy-rsa/easyrsa3

$ ./easyrsa build-ca
No Easy-RSA 'vars' configuration file exists!

Using SSL:
* openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)

Enter New CA Key Passphrase: ここに任意のパスフレーズを入力する。
              パスフレーズは保存しておく。

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]:EXAMPLE.COM_pc1ubuntu-Easy-RSA_CA(任意の識別名)

Notice
------
CA creation complete. Your new CA certificate is at:
* ~/YOUR-WORK-DIR/easy-rsa/easyrsa3/pki/ca.crt

$ sudo cp pki/ca.crt /etc/openvpn/

サーバ証明書生成

$ cd ~/YOUR-WORK-DIR/easy-rsa/easyrsa3

$ ./easyrsa build-server-full server nopass
Notice
------
Private-Key and Public-Certificate-Request files created.
Your files are:
* req: ~/YOUR-WORK-DIR/easy-rsa/easyrsa3/pki/reqs/server.req
* key: ~/YOUR-WORK-DIR/easy-rsa/easyrsa3/pki/private/server.key

You are about to sign the following certificate:
Request subject, to be signed as a server certificate
for '825' days:

subject=
    commonName                = server

Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes ユーザーが"yes"を入力する

Using configuration from ~/YOUR-WORK-DIR/easy-rsa/easyrsa3/pki/openssl-easyrsa.cnf
Enter pass phrase for ~/YOUR-WORK-DIR/easy-rsa/easyrsa3/pki/private/ca.key: build-caで決めたパスフレーズを入力する
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'server'
Certificate is to be certified until May 23 06:40:01 2026 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Notice
------
Certificate created at:
* ~/YOUR-WORK-DIR/easy-rsa/easyrsa3/pki/issued/server.crt

Notice
------
Inline file created:
* ~/YOUR-WORK-DIR/easy-rsa/easyrsa3/pki/inline/server.inline


$ sudo cp pki/issued/server.crt /etc/openvpn/
$ sudo cp pki/private/server.key /etc/openvpn/

DH鍵生成

$ cd ~/YOUR-WORK-DIR/easy-rsa/easyrsa3
$ ./easyrsa gen-dh
$ sudo cp pki/dh.pem /etc/openvpn/

TLS鍵生成

(2021 May 04時点のコマンド)
$ openvpn --genkey secret ./pki/ta.key

(古いコマンド)
+++ ここから +++
($ openvpn --genkey --secret ./pki/ta.key)
+++ ここまで +++

$ sudo cp ./pki/ta.key /etc/openvpn/

失効クライアント証明書リスト生成

$ cd ~/YOUR-WORK-DIR/easy-rsa/easyrsa3
$ ./easyrsa gen-crl
No Easy-RSA 'vars' configuration file exists!

Using SSL:
* openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
Using configuration from ~/YOUR-WORK-DIR/easy-rsa/easyrsa3/pki/openssl-easyrsa.cnf
Enter pass phrase for ~/YOUR-WORK-DIR/easy-rsa/easyrsa3/pki/private/ca.key: build-caで決めたパスフレーズを入力する

Notice
------
An updated CRL has been created:
* ~/YOUR-WORK-DIR/easy-rsa/easyrsa3/pki/crl.pem


$ sudo cp pki/crl.pem /etc/openvpn/
$ sudo chmod o+r /etc/openvpn/crl.pem

サーバー設定ファイル記述

$ sudo touch /etc/openvpn/server.conf

/etc/openvpn/server.confを編集

port   1194    ## LAN内に複数のopenvpnサーバーを置くなら変更する
proto  udp
dev    tun

cipher AES-256-CBC
auth SHA512 

ca          ca.crt
cert        server.crt
key         server.key
dh          dh.pem
crl-verify  crl.pem 

tls-auth ta.key 0 

ifconfig-pool-persist ipp.txt

server 10.8.0.0 255.255.255.0

push "redirect-gateway def1 bypass-dhcp"
push "route 10.8.0.0 255.255.255.0"
push "dhcp-option DNS 8.8.8.8"

client-to-client
keepalive 10 120
comp-lzo

user  nobody
group nogroup

persist-key
persist-tun

status      /var/log/openvpn-status.log
log         /var/log/openvpn.log
log-append  /var/log/openvpn.log

verb 3

ファイアウォール設定

$ sudo ufw enable
$ sudo ufw allow 1194/udp    ## /etc/openvpn/server.confに記述したポート番号
$ sudo ufw reload

IPフォワーディング設定

/etc/default/ufw を編集する

  DEFAULT_FORWARD_POLICYをDROPからACCEPTに変更する
    - DEFAULT_FORWARD_POLICY="DROP"
    + DEFAULT_FORWARD_POLICY="ACCEPT"

IPフォワーディングを有効化

  /etc/ufw/sysctl.confを編集する
   net/ipv4/ip_forward=1の一行をアンコメントする
    - #net/ipv4/ip_forward=1
    + net/ipv4/ip_forward=1

   (旧書式)
   net.ipv4.ip_forward=1の一行をアンコメントする
    - # net.ipv4.ip_forward=1
    + net.ipv4.ip_forward=1


IPマスカレード有効化

"ip a"コマンドでネットワークポート名を確認する( enp0s7 とか)
/etc/ufw/before.rulesを編集する

一番下の行にCOMMITと書かれているはずなので、この下に以下を追加する。

COMMIT
(このCOMMITは元々書かれているもの。削除しない)

# START OPENVPN RULES
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/24 -o enp0s7 -j MASQUERADE
    # enp0s7 はシステムのネットワークポート名に合わせる

COMMIT
# END OPENVPN RULES

ufw再読み込み

$ sudo ufw reload

Logローテーション設定

参照元 https://gtrt7.com/blog/linux/ubuntu-openvpn

OpenVPNログローテーション設定ファイル /etc/logrotate.d/openvpn を作成する。

/var/log/openvpn-status.log {
weekly
rotate 7
delaycompress
compress
missingok
notifempty
}
/var/log/openvpn.log {
weekly
rotate 7
delaycompress
compress  missingok
notifempty
sharedscripts
postrotate
systemctl restart openvpn@server 2>&1 > /dev/null || true
endscript
}

OpenVPN起動

$ sudo systemctl start openvpn@server.service
//  systemctl start openvpn.service では起動できない

起動確認

$ systemctl status openvpn@server.service

  Active: active (running) の表示を確認する

OpenVPN自動起動設定

$ sudo systemctl disable openvpn
$ sudo systemctl disable openvpn.service
$ sudo systemctl enable openvpn@server.service
起動設定確認
$ systemctl is-enabled openvpn openvpn.service openvpn@server.service openvpn@server

OpenVPNを使ってLAN外からのアクセスを受け付けるアプリのポートを10.8.0.0/24に対して開放する
$ sudo ufw enable
$ sudo ufw allow proto tcp from 10.8.0.0/24 to any port PORTNUM
$ sudo ufw allow proto udp from 10.8.0.0/24 to any port PORTNUM
$ sudo ufw reload


EPGStationの例

$ sudo ufw enable
$ sudo ufw allow proto tcp from 10.8.0.0/24 to any port 8888
$ sudo ufw allow proto udp from 10.8.0.0/24 to any port 8888
$ sudo ufw reload

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

$ cd ~/YOUR-WORK-DIR/easy-rsa/easyrsa3 


次のクライアント秘密鍵生成時のパスワード有無は、パスワード有りにしても、クライアント側ソフトに、一度設定すれば以後は入力不要の機能があるはずなので、どちらでもかまわない。

(接続時パスワード無し)

$ ./easyrsa build-client-full CLIENTHOGE nopass
Notice
------
Private-Key and Public-Certificate-Request files created.
Your files are:
* req: /home/ryuichi/work/openvpn/server/easy-rsa/easyrsa3/pki/reqs/galaxy_a22.req
* key: /home/ryuichi/work/openvpn/server/easy-rsa/easyrsa3/pki/private/galaxy_a22.key

You are about to sign the following certificate:
Request subject, to be signed as a client certificate
for '825' days:

subject=
    commonName                = CLIENTHOGE

Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes ユーザーが"yes"を入力する

Using configuration from /home/ryuichi/work/openvpn/server/easy-rsa/easyrsa3/pki/openssl-easyrsa.cnf
Enter pass phrase for /home/ryuichi/work/openvpn/server/easy-rsa/easyrsa3/pki/private/ca.key: build-caで決めたパスフレーズを入力する


(接続時パスワード有り)

::: ここから :::::
 $ ./easyrsa build-client-full CLIENTHOGE
::: ここまで :::::



(CLIENTHOGEは "サーバー名+サーバーOS+クライアント端末名" とした)


次の作業を行う

$ mkdir ~/YOUR-WORK-DIR/CLIENT-FILE-DIR
      ~/apps/openvpn/client とした

$ sudo cp /etc/openvpn/ca.crt ~/YOUR-WORK-DIR/CLIENT-FILE-DIR/
$ cd ~/YOUR-WORK-DIR/easy-rsa/easyrsa3
$ cp pki/issued/CLIENTHOGE.crt ~/YOUR-WORK-DIR/CLIENT-FILE-DIR/
$ cp pki/private/CLIENTHOGE.key ~/YOUR-WORK-DIR/CLIENT-FILE-DIR/
$ sudo chown USER:USER ~/YOUR-WORK-DIR/CLIENT-FILE-DIR/ca.crt
$ chown USER:USER ~/YOUR-WORK-DIR/CLIENT-FILE-DIR/CLIENTHOGE.crt
$ chown USER:USER ~/YOUR-WORK-DIR/CLIENT-FILE-DIR/CLIENTHOGE.key

  USER: VPNサーバに現在ログインしているユーザのユーザ名

接続するクライアントに鍵ファイルをダウンロード
$ scp ~/YOUR-WORK-DIR/CLIENT-FILE-DIR/ca.crt CLIENT/
$ scp ~/YOUR-WORK-DIR/CLIENT-FILE-DIR/CLIENTHOGE.crt CLIENT/
$ scp ~/YOUR-WORK-DIR/CLIENT-FILE-DIR/CLIENTHOGE.key CLIENT/
$ scp ~/YOUR-WORK-DIR/easy-rsa/easyrsa3/pki/ta.key CLIENT/
クライアントに置くVPNCLIENT.ovpn を作る(ファイル名は任意だが、拡張子は .ovpn )
client
dev    tun
proto  udp
remote YOUR.GLOBAL.ADDRESS.HERE PORTNUM    ## サーバーグローバルドメイン名、ポート番号
resolv-retry  infinite
nobind
tls-auth ta.key 1
persist-key
persist-tun
cipher AES-256-CBC

auth SHA512

ca    ca.crt
cert  CLIENTHOGE.crt    ## 適切なファイル名に変更する
key   CLIENTHOGE.key    ## 適切なファイル名に変更する
comp-lzo
verb 3

# persist-key, persist-tun, comp-lzo, verb はサーバ側と同じにする。サーバ側に設定してあればこちらにも入力し、設定していない場合は外す。

VPNCLIENT.ovpn をクライアントにコピー
$ scp VPNCLIENT.ovpn CLIENT/
android端末にOpenVPN for Androidをインストールする

OpenVPN for Androidを開き、「プロファイルの追加」アイコンをタップして、 .ovpnファイルをインポートし、他の4ファイルを読み込む。
ポートを番号をサーバーに合わせる。

OpenVPN for Android 設定

(上記までの設定を行うと、下記設定を確認しなくても正常に動いた)

種別: 証明書
CA証明書 ca.crt
クライアント証明書  CLIENTHOGE.crt
クライアント証明書のキー CLIENTHOGE.key
ポート番号 1194 ## サーバーポートに合わせる
プロコトル UDP

TLS認証を使用する :  on
暗号化方式: AES-256-CBC

OpenVPNサーバー、LAN内ホスト、 LAN外OpenVPNクライアントのIPアドレス、通信関係

IPアドレス

OpenVPNサーバー:(OpenVPN導入前からの)LAN内アドレス(例 192.168.1.1)
LAN内ホスト:LAN内アドレス(例 192.168.1.2)
LAN外OpenVPNクライアント:/etc/openvpn/server.confのserverに設定されたネットワークのアドレス(例 10.8.0.6)

LAN内ホストとLAN外OpenVPNクライアントとの通信
  • LAN内ホストからLAN外OpenVPNクライアントへのping
$ ping -c 1 10.8.0.6
PING 10.8.0.6 (10.8.0.6) 56(84) バイトのデータ
64 バイト応答 送信元 10.8.0.6: icmp_seq=1 ttl=64 時間=87.2ミリ秒

  • LAN外OpenVPNクライアントからLAN内ホストへのping

Androidpingアプリをインストールし、192.168.1.2にping(ICMP)を飛ばせた。

警告・エラーメッセージ対応

WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
This is nothing to worry about.
https://support.hidemyass.com/hc/en-us/articles/202720436-Auth-nocache-Warning-in-OpenVPN-connection-log

WARNING: cipher local='cipher BF-CBC' remote='cipher AES-256-CBC'
クライアントの暗号化方式を AES-256-CBS に指定する。

WARNING: No server certificate verification method has been enabled.
クライアント設定で「TLSサーバー証明書を要求する」をオンにする。

VPN経由でアクセスするLAN内の各種サーバーの設定
http://rokkonet.blogspot.com/2018/05/openvpn.html