CentOS7.3 OpenVPNの構築(ルーティングモード)

シェアする

OpenVPN基盤を構築してみました。
OpenVPNは、SSL(TLS)の仕組みを利用したVPN基盤です。

 今まで、L2TP/IPsecによるVPN基盤を利用していましたが、androidからL2TP/IPsecで接続しようとすると、接続が出来たり出来なかったりの事象がでていました。滅多に、androidから接続をするようなことはありませんでしたので、放置していましたが、ここ最近、立て続けに接続ができないことがあって「イラッ」となってしまったので、OpenVPN基盤を構築する事にしました。

参考URL(らしいです。。。1.3.6-8でも改善しませんでした。)
https://github.com/xelerance/xl2tpd/issues/16

OpenVPNに接続方式

OpenVPNでは、2種類の接続方式を利用する事が出来ます。
それぞれ、仮想ネットワークである、「tap(L2接続)」・「tun(L3接続)」と呼ばれています。
今回は、「tun」の俗に言うルーティングモードでの構築です。

インストール

OpenVPNはEPELリポジトリーからインストールします。
また、認証(暗号化)のための証明書を用意するため、「easy-rsa」もインストールします。

# yum --enablerepo=epel info openvpn
    :(省略)
Available Packages
Name        : openvpn
Arch        : x86_64
Version     : 2.4.3
Release     : 1.el7
Size        : 470 k
Repo        : epel/x86_64
Summary     : A full-featured SSL VPN solution
    :(省略)
# yum --enablerepo=epel info easy-rsa
    :(省略)
Available Packages
Name        : easy-rsa
Arch        : noarch
Version     : 2.2.2
Release     : 1.el7
Size        : 26 k
Repo        : epel/x86_64
Summary     : Simple shell based CA utility
    :(省略)
# yum -y --enablerepo=epel install openvpn easy-rsa
    :(省略)
Installed:
  easy-rsa.noarch 0:2.2.2-1.el7
  openvpn.x86_64 0:2.4.3-1.el7
 
Dependency Installed:
  pkcs11-helper.x86_64 0:1.11-3.el7
 
Complete!

各種証明書と秘密鍵の作成前準備

easy-rsaで各種証明書と秘密鍵の作成を行うための準備をします。

# cd /etc/openvpn
# mkdir CA   <= 認証局証明書格納ディレクトリー(Certificate Revocation List)
# mkdir CRL  <= 証明書失効リスト格納ディレクトリー(Certification Authority)
# mkdir DH   <= DHパラメータ格納ディレクトリー(Diffie-Hellman)
# mkdir TLS  <= TLS認証鍵格納ディレクトリー
# mkdir -p easy-rsa/keys   <= easy-rsaの管理ディレクトリー
# cp -rp /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa/.
# cd easy-rsa
# ls -l
total 112
-rwxr-xr-x. 1 root root   119 Nov  9  2013 build-ca
-rwxr-xr-x. 1 root root   352 Nov  9  2013 build-dh
-rwxr-xr-x. 1 root root   188 Nov  9  2013 build-inter
-rwxr-xr-x. 1 root root   163 Nov  9  2013 build-key
-rwxr-xr-x. 1 root root   157 Nov  9  2013 build-key-pass
-rwxr-xr-x. 1 root root   249 Nov  9  2013 build-key-pkcs12
-rwxr-xr-x. 1 root root   268 Nov  9  2013 build-key-server
-rwxr-xr-x. 1 root root   213 Nov  9  2013 build-req
-rwxr-xr-x. 1 root root   158 Nov  9  2013 build-req-pass
-rwxr-xr-x. 1 root root   449 Nov  9  2013 clean-all
-rwxr-xr-x. 1 root root  1471 Nov  9  2013 inherit-inter
drwxr-x---. 2 root root     6 Aug  3 13:31 keys
-rwxr-xr-x. 1 root root   302 Nov  9  2013 list-crl
-rw-r--r--. 1 root root  7791 Nov  9  2013 openssl-0.9.6.cnf
-rw-r--r--. 1 root root  8348 Nov  9  2013 openssl-0.9.8.cnf
-rw-r--r--. 1 root root  8245 Nov  9  2013 openssl-1.0.0.cnf
-rwxr-xr-x. 1 root root 12966 Nov  9  2013 pkitool
-rwxr-xr-x. 1 root root   928 Nov  9  2013 revoke-full
-rwxr-xr-x. 1 root root   178 Nov  9  2013 sign-req
-rw-r--r--. 1 root root  2077 Nov  9  2013 vars
-rwxr-xr-x. 1 root root   740 Nov  9  2013 whichopensslcnf
# cp -p vars vars.original
# vim vars
    :(省略)
# Increase this to 2048 if you
# are paranoid.  This will slow
# down TLS negotiation performance
# as well as the one-time DH parms
# generation process.
export KEY_SIZE=2048   <= キー長
 
# In how many days should the root CA key expire?
export CA_EXPIRE=3650   <= 10年の有効期限
 
# In how many days should certificates expire?
export KEY_EXPIRE=3650   <= 10年の有効期限
 
# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="JP"   <= 国名
export KEY_PROVINCE="Hyogo"   <= 都道府県
export KEY_CITY="Takarazuka"   <= 市区町村名
export KEY_ORG="orangetakam"   <= 会社名
export KEY_EMAIL="openvpn@orangetakam.com"   <= メールアドレス(サーバー管理者)
export KEY_OU="openvpn"   <= 組織名
    :(省略)
# source vars   <= 変更した「vars」ファイルの反映
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
# ./clean-all   <= 一応実行

CA証明書と秘密鍵の作成

CA証明書と秘密鍵の作成を行ないます。

# ./build-ca   <= CA証明書と秘密鍵の作成
Generating a 2048 bit RSA private key
.....................+++
.....+++
writing new private key to 'ca.key'
-----
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.
-----
Country Name (2 letter code) [JP]: <= エンターキー押下
State or Province Name (full name) [Hyogo]: <= エンターキー押下
Locality Name (eg, city) [Takarazuka]: <= エンターキー押下
Organization Name (eg, company) [orangetakam]: <= エンターキー押下
Organizational Unit Name (eg, section) [openvpn]: <= エンターキー押下
Common Name (eg, your name or your server's hostname) [orangetakam CA]: <= エンターキー押下
Name [EasyRSA]: <= エンターキー押下
Email Address [openvpn@orangetakam.com]: <= エンターキー押下
# ls keys/.
ca.crt  ca.key  index.txt  serial
# cp -p /etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpn/CA/.   <= CA証明書のみコピー

サーバー証明書と秘密鍵の作成

サーバー証明書と秘密鍵の作成を行ないます。

# ./build-key-server server  <= 引数は名前になる(任意の文字で良い)
Generating a 2048 bit RSA private key
...........+++
..+++
writing new private key to 'server.key'
-----
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.
-----
Country Name (2 letter code) [JP]: <= エンターキー押下
State or Province Name (full name) [Hyogo]: <= エンターキー押下
Locality Name (eg, city) [Takarazuka]: <= エンターキー押下
Organization Name (eg, company) [orangetakam]: <= エンターキー押下
Organizational Unit Name (eg, section) [openvpn]: <= エンターキー押下
Common Name (eg, your name or your server's hostname) [server]: <= エンターキー押下
Name [EasyRSA]: <= エンターキー押下
Email Address [openvpn@orangetakam.com]: <= エンターキー押下
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: <= エンターキー押下
An optional company name []: <= エンターキー押下
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'JP'
stateOrProvinceName   :PRINTABLE:'Hyogo'
localityName          :PRINTABLE:'Takarazuka'
organizationName      :PRINTABLE:'orangetakam'
organizationalUnitName:PRINTABLE:'openvpn'
commonName            :PRINTABLE:'server'
name                  :PRINTABLE:'EasyRSA'
emailAddress          :IA5STRING:'openvpn@orangetakam.com'
Certificate is to be certified until Jul 30 10:33:45 2027 GMT (3650 days)
Sign the certificate? [y/n]:y
 
 
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
# cp -p /etc/openvpn/easy-rsa/keys/server.crt /etc/openvpn/server/. <= サーバー証明書をコピー
# cp -p /etc/openvpn/easy-rsa/keys/server.key /etc/openvpn/server/. <= サーバー秘密鍵をコピー

DHパラメータの作成

DH(Diffie-Hellman[ディフィー・へルマン])のパラメータを作成します。
OpenVPNでは、セキュリティーを向上されるために、DH鍵交換方式を使います。

# ./build-dh  <= DHパラメータを作成
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
.......................................................+
    :(省略)
...........++*++*
# cp -p /etc/openvpn/easy-rsa/keys/dh2048.pem /etc/openvpn/DH/. <= DHパラメーターをコピー

証明書失効リストの作成

廃止となったクライアント証明書の失効を行なうため、失効リストを用意します。
失効リストは、ダミーのクライアント証明書を作成した後、廃止をすることで、失効リストが作成されます。

・クライアント証明書作成

# ./build-key dummy  <= dummyという名称でクライアント証明書を作成
Generating a 2048 bit RSA private key
..+++
.............................................+++
writing new private key to 'dummy.key'
-----
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.
-----
Country Name (2 letter code) [JP]: <= エンターキー押下
State or Province Name (full name) [Hyogo]: <= エンターキー押下
JLocality Name (eg, city) [Takarazuka]: <= エンターキー押下
Organization Name (eg, company) [orangetakam]: <= エンターキー押下
Organizational Unit Name (eg, section) [openvpn]: <= エンターキー押下
Common Name (eg, your name or your server's hostname) [dummy]: <= エンターキー押下
Name [EasyRSA]: <= エンターキー押下
Email Address [openvpn@orangetakam.com]: <= エンターキー押下
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: <= エンターキー押下
An optional company name []: <= エンターキー押下
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'JP'
stateOrProvinceName   :PRINTABLE:'Hyogo'
localityName          :PRINTABLE:'Takarazuka'
organizationName      :PRINTABLE:'orangetakam'
organizationalUnitName:PRINTABLE:'openvpn'
commonName            :PRINTABLE:'dummy'
name                  :PRINTABLE:'EasyRSA'
emailAddress          :IA5STRING:'openvpn@orangetakam.com'
Certificate is to be certified until Jul 31 02:48:57 2027 GMT (3650 days)
Sign the certificate? [y/n]:y
 
 
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

・クライアント証明書廃止

# ./revoke-full dummy
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Revoking Certificate 03.
Data Base Updated
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
dummy.crt: C = JP, ST = Hyogo, L = Takarazuka, O = orangetakam, OU = openvpn, CN = dummy, name = EasyRSA, emailAddress = openvpn@orangetakam.com
error 23 at 0 depth lookup:certificate revoked  <= 証明書検証に失敗(要するに失効したという事)
# cp -p /etc/openvpn/easy-rsa/keys/crl.pem /etc/openvpn/CRL/.

TLS認証鍵の作成

# openvpn --genkey --secret /etc/openvpn/TLS/ta.key

OpenVPNの設定

OpenVPNの設定を行ないます。
とりあえず、動作するための設定です。

# cp -p /usr/share/doc/openvpn-2.4.3/sample/sample-config-files/server.conf \
> /etc/openvpn/.  <= サンプルをコピー
# cd /etc/openvpn
# cp -p server.conf server.conf.original
# vim server.conf
    :(省略)
# SSL/TLS root certificate (ca), certificate
# (cert), and private key (key).  Each client
# and the server must have their own cert and
# key file.  The server and all clients will
# use the same ca file.
#
# See the "easy-rsa" directory for a series
# of scripts for generating RSA certificates
# and private keys.  Remember to use
# a unique Common Name for the server
# and each of the client certificates.
#
# Any X509 key management system can be used.
# OpenVPN can also use a PKCS #12 formatted key file
# (see "pkcs12" directive in man page).
ca CA/ca.crt
cert server/server.crt
key server/server.key  # This file should be kept secret
 
# Diffie hellman parameters.
# Generate your own with:
#   openssl dhparam -out dh2048.pem 2048
dh DH/dh2048.pem
    :(省略)
server 192.168.100.0 255.255.255.0      <= VPNクライアントのアドレス範囲
    :(省略)
push "route 192.168.10.0 255.255.255.0" <= 192.168.10.0へのルーティング追加
    :(省略)
# For extra security beyond that provided
# by SSL/TLS, create an "HMAC firewall"
# to help block DoS attacks and UDP port flooding.
#
# Generate with:
#   openvpn --genkey --secret ta.key
#
# The server and each client must have
# a copy of this key.
# The second parameter should be '0'
# on the server and '1' on the clients.
tls-auth TLS/ta.key 0 # This file is secret
max-clients 2   <= 最大接続数
    :(省略)
user nobody   <= ユーザー
group nobody  <= グループ
    :(省略)
crl-verify CRL/crl.pem   <= 証明書廃止リスト

OpenVPNの起動と自動起動停止設定

OpenVPNの起動と自動起動停止の設定を行ないます。

# systemctl status openvpn@server
* openvpn@server.service - OpenVPN Robust And Highly Flexible Tunneling Application On server
   Loaded: loaded (/usr/lib/systemd/system/openvpn@.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
# systemctl start openvpn@server
# systemctl status openvpn@server
* openvpn@server.service - OpenVPN Robust And Highly Flexible Tunneling Application On server
   Loaded: loaded (/usr/lib/systemd/system/openvpn@.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2017-08-03 22:55:33 JST; 9s ago
 Main PID: 2824 (openvpn)
   Status: "Initialization Sequence Completed"
   CGroup: /system.slice/system-openvpn.slice/openvpn@server.service
           └─2824 /usr/sbin/openvpn --cd /etc/openvpn/ --config server.conf
 
Aug 03 22:55:33 openvpn openvpn[2824]: Thu Aug  3 22:55:33 2017 Could not determine IPv4/IPv6 protocol. Using AF_INET
Aug 03 22:55:33 openvpn openvpn[2824]: Thu Aug  3 22:55:33 2017 Socket Buffers: R=[212992->212992] S=[212992->212992]
Aug 03 22:55:33 openvpn openvpn[2824]: Thu Aug  3 22:55:33 2017 UDPv4 link local (bound): [AF_INET][undef]:1194
Aug 03 22:55:33 openvpn openvpn[2824]: Thu Aug  3 22:55:33 2017 UDPv4 link remote: [AF_UNSPEC]
Aug 03 22:55:33 openvpn openvpn[2824]: Thu Aug  3 22:55:33 2017 GID set to nobody
Aug 03 22:55:33 openvpn openvpn[2824]: Thu Aug  3 22:55:33 2017 UID set to nobody
Aug 03 22:55:33 openvpn openvpn[2824]: Thu Aug  3 22:55:33 2017 MULTI: multi_init called, r=256 v=256
Aug 03 22:55:33 openvpn openvpn[2824]: Thu Aug  3 22:55:33 2017 IFCONFIG POOL: base=192.168.100.4 size=62, ipv6=0
Aug 03 22:55:33 openvpn openvpn[2824]: Thu Aug  3 22:55:33 2017 IFCONFIG POOL LIST
Aug 03 22:55:33 openvpn openvpn[2824]: Thu Aug  3 22:55:33 2017 Initialization Sequence Completed
# systemctl enable openvpn@server
Created symlink from /etc/systemd/system/multi-user.target.wants/openvpn@server.service
 to /usr/lib/systemd/system/openvpn@.service.

これで、OpenVPNサーバーの構築は終わりです。
外部からの接続では、OpenVPNで設定したポート番号(デフォルト:1194/udp)ものを、フォワーディングするようにします。