RHEL7のOpenVPNを使ってAWSに接続
◆サービス設定◆(OpenVPN Serverインスタンス)
ここまででインスタンスが完成しましたので、続いてサービスの設定を行います。
まずは、以下のネットワーク図で赤枠の部分のOpenVPNサーバーのOpenVPNサービスの設定を行います。
このレシピではターミナルソフト「PuTTY」で接続する手順を紹介します。
- まず以下の「EC2 Management Console」の「インスタンス」をクリックします。
- メニューに表示された、今回のLinuxのインスタンスを選択すると、下の赤の長方形枠で囲った部分にIPv4パブリックIPアドレスが表示されていますので、こちらを控えておきます。
- まず「PuTTY」を起動し、以下の画面を表示します。
先ほど確認した「IPv4パブリックIP」に表示されていたIPアドレスを「PuTTY」の以下の部分に入力します。
- 次に、認証用の鍵を選択する画面を、以下の通り「認証」メニューをクリックして表示します。
- ここで、選択する秘密鍵を、EC2のインスタンスを作成した際に保管した、「Key Pair」ファイルから作成します。
秘密鍵は「PuTTY」のプログラムグループにある「PuTTYgen」というプログラムで行います。 まずは「PuTTYgen」を起動し、以下の画面を表示します。
「変換」メニューから「鍵のインポート」を選択します。
ファイルの選択画面が表示されますので、「Key Pair」ファイル(このレシピでは「OpenVPNSSHKey.pem」として保管しました(拡張子は.pem))を選択しますと、以下の通り「Key Pair」ファイルの内容が読み込まれますので、「秘密鍵の保存」をクリックします。
以下の通り、パスフレーズなしの警告が表示されますが、「はい」をクリックして、秘密鍵ファイル(拡張子は.ppk)を保管してください。
- 秘密鍵が保管できれば「PuTTY」のプログラムに戻り、「認証」メニューから、先ほど保管した秘密鍵ファイルのパスを以下の通り直接入力するか、参照ボタンで選択入力します。
- 次にキープアライブの時間以下の通り「接続」メニューの「Keepalives間の秒数」を「60」秒に設定し、接続が切れないようにします。
- 次に文字コードを「変換」メニューの「受信されるデータの文字セット変換」項目で「UTF-8(CJK)」に指定します。
- 最後に「セッション」メニューに戻って「保存されたセッション」部分に保存する名前を入力して。「保存」ボタンをクリックしてください。これで、次回から保存したセッションを選択することで、接続できるようになります。
- 以下の通り保管したセッション名を選択し「開く」ボタンをクリックすると。
以下の通り「PuTTYセキュリティ警告」メッセージが表示されますが、「はい」ボタンをクリックすると、インスタンスにSSHで接続できます。
以下のメッセージが表示されれば、接続できました。
- まず最初は「ec2-user」でログインします。
以下の通り入力します。
login as: ec2-user [ENTER]
|
以下の通り表示されればログイン完了です。
Authenticating with public key "imported-openssh-key"
Last login: Sat Jan 6 08:54:34 2018 from XXX.XXX.XXX.XXX
[ec2-user@ip-10-0-0-XXX ~]$
|
- いよいよここからOpenVPNをインストールします。
まず、以下のコマンドで、OpenVPNのインストールに必要なレポジトリ「optional」をenable=0(false)から、enable=1(true)に変更します。
[ec2-user@ip-10-0-0-XXX ~]$ sudo yum-config-manager --enable rhui-REGION-rhel-server-optional [ENTER]
|
結果は以下の通り表示されます。
Loaded plugins: amazon-id, rhui-lb
==================== repo: rhui-REGION-rhel-server-optional ====================
[rhui-REGION-rhel-server-optional]
async = True
bandwidth = 0
base_persistdir = /var/lib/yum/repos/x86_64/7Server
baseurl =
cache = 0
cachedir = /var/cache/yum/x86_64/7Server/rhui-REGION-rhel-server-optional
check_config_file_age = True
compare_providers_priority = 80
cost = 1000
deltarpm_metadata_percentage = 100
deltarpm_percentage =
enabled = 1
enablegroups = True
exclude =
failovermethod = priority
ftp_disable_epsv = False
gpgcadir = /var/lib/yum/repos/x86_64/7Server/rhui-REGION-rhel-server-optional/gpgcadir
gpgcakey =
gpgcheck = True
gpgdir = /var/lib/yum/repos/x86_64/7Server/rhui-REGION-rhel-server-optional/gpgdir
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
hdrdir = /var/cache/yum/x86_64/7Server/rhui-REGION-rhel-server-optional/headers
http_caching = all
includepkgs =
ip_resolve =
keepalive = True
keepcache = False
mddownloadpolicy = sqlite
mdpolicy = group:small
mediaid =
metadata_expire = 21600
metadata_expire_filter = read-only:present
metalink =
minrate = 0
mirrorlist = https://rhui2-cds01.REGION.aws.ce.redhat.com/pulp/mirror/content/dist/rhel/rhui/server/7/7Server/x86_64/optional/os
mirrorlist_expire = 86400
name = Red Hat Enterprise Linux Server 7 Optional (RPMs)
old_base_cache_dir =
password =
persistdir = /var/lib/yum/repos/x86_64/7Server/rhui-REGION-rhel-server-optional
pkgdir = /var/cache/yum/x86_64/7Server/rhui-REGION-rhel-server-optional/packages
proxy = False
proxy_dict =
proxy_password =
proxy_username =
repo_gpgcheck = False
retries = 10
skip_if_unavailable = False
ssl_check_cert_permissions = True
sslcacert = /etc/pki/rhui/cdn.redhat.com-chain.crt
sslclientcert = /etc/pki/rhui/product/content-rhel7.crt
sslclientkey = /etc/pki/rhui/content-rhel7.key
sslverify = True
throttle = 0
timeout = 30.0
ui_id = rhui-REGION-rhel-server-optional/7Server/x86_64
ui_repoid_vars = releasever,
basearch
username =
- 次に、OpenVPNに必要なパッケージのインストールを以下のコマンドで、実行します。
[ec2-user@ip-10-0-0-XXX ~]$ sudo yum -y install openssl-devel lzo-devel pam-devel rpm-build gcc wget [ENTER]
|
結果は以下のように表示されます。
: :
: :
Dependency Updated:
glibc.x86_64 0:2.17-196.el7_4.2
glibc-common.x86_64 0:2.17-196.el7_4.2
libgcc.x86_64 0:4.8.5-16.el7_4.1
libgomp.x86_64 0:4.8.5-16.el7_4.1
Complete!
|
- OpenVPN本体のインストールです。
OpenVPNダウンロードします。(最新バージョンを参照し以下の青色のバージョン部分を差し替えて入力してください)
[ec2-user@ip-10-0-0-XXX ~]$ sudo wget https://swupdate.openvpn.org/community/releases/openvpn-2.4.4.tar.gz[ENTER]
|
- OpenVPNのRPMパッケージ生成です。
以下のコマンドを実行します。
[ec2-user@ip-10-0-0-XXX ~]$ sudo rpmbuild -tb --clean openvpn-2.4.4.tar.gz[ENTER]
|
結果は以下の通り表示されます。(+ exit 0)が最後に出たらエラーなしです。
: :
: :
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.8LHlAI
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd openvpn-2.4.4
+ '[' /root/rpmbuild/BUILDROOT/openvpn-2.4.4-1.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/openvpn-2.4.4-1.x86_64
+ exit 0
Executing(--clean): /bin/sh -e /var/tmp/rpm-tmp.NxKOPG
+ umask 022
+ cd /root/rpmbuild/BUILD
+ rm -rf openvpn-2.4.4
+ exit 0
|
- 生成したOpenVPNのRPMパッケージをインストールします。
[ec2-user@ip-10-0-0-XXX ~]$ sudo yum -y localinstall /root/rpmbuild/RPMS/x86_64/openvpn-2.4.4-1.x86_64.rpm[ENTER]
|
結果は以下の通り表示されます。
Install 1 Package
Total size: 1.4 M
Installed size: 1.4 M
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : openvpn-2.4.4-1.x86_64 1/1
Restarting openvpn (via systemctl): [ OK ]
Verifying : openvpn-2.4.4-1.x86_64 1/1
Installed:
openvpn.x86_64 0:2.4.4-1
Complete!
|
生成したOpenVPNのRPMパッケージを削除します。
[ec2-user@ip-10-0-0-XXX ~]$ sudo rm -f /root/rpmbuild/RPMS/x86_64/openvpn-2.4.4-1.x86_64.rpm[ENTER]
|
ダウンロードしたファイルを削除します。
[ec2-user@ip-10-0-0-XXX ~]$ sudo rm -f openvpn-2.4.4.tar.gz[ENTER]
|
- 認証局を構築します。
まず以下のコマンドを実行しeasyrsa3をダウンロードします。
[ec2-user@ip-10-0-0-XXX ~]$ wget https://github.com/OpenVPN/easy-rsa/archive/master.zip[ENTER]
|
解凍します。
[ec2-user@ip-10-0-0-XXX ~]$ unzip master.zip[ENTER]
|
内容をコピーします。
[ec2-user@ip-10-0-0-XXX ~]$ sudo cp -r easy-rsa-master/easyrsa3/ /etc/openvpn/[ENTER]
|
解凍したディレクトリを削除します。
[ec2-user@ip-10-0-0-XXX ~]$ rm -rf easy-rsa-master/[ENTER]
|
ダウンロードしたファイルを削除します。
[ec2-user@ip-10-0-0-XXX ~]$ rm -f master.zip[ENTER]
|
- 認証局を設定します。
まずrootユーザになります。
[ec2-user@ip-10-0-0-XXX ~]$ sudo su -[ENTER]
[root@ip-10-0-0-XXX ~]#
|
まず以下のコマンドで認証局を初期化します。
[root@ip-10-0-0-XXX ~]# cd /etc/openvpn/easyrsa3/[ENTER]
[root@ip-10-0-0-XXX easyrsa3]# ./easyrsa init-pki[ENTER]
|
結果は以下の通り表示されます。
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/easyrsa3/pki
|
認証局を作成します
[root@ip-10-0-0-XXX easyrsa3]# ./easyrsa build-ca[ENTER]
|
結果途中でPEMパスフレーズを聞かれるので、何でも良いから4文字以上入力します。
Generating a 2048 bit RSA private key
....+++
......................................+++
writing new private key to '/etc/openvpn/easyrsa3/pki/private/ca.key.MMMqcPl5FL'
Enter PEM pass phrase:⇒何でも良いから4文字以上入力する
|
もう一度PEMパスフレーズを聞かれるので、同じものを入力します。
Verifying - Enter PEM pass phrase:⇒同じ4文字以上をもう一度入力する
|
コモンネームを聞かれますが、そのまま[ENTER]でよいです。
-----
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]:[ENTER]
|
結果以下の通り表示されます。
-----
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/easyrsa3/pki/ca.crt
-----
|
秘密鍵の作成・署名を行います。
[root@ip-10-0-0-XXX easyrsa3]# ./easyrsa build-server-full server nopass[ENTER]
|
パスフレーズを求められますので、先ほどの4文字以上のパスワードを入力します。
Generating a 2048 bit RSA private key
.................+++
................................+++
writing new private key to '/etc/openvpn/easyrsa3/pki/private/server.key.t42jadqR67'
-----
Using configuration from ./openssl-easyrsa.cnf
Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:⇒先ほどの4文字以上のパスを入力する
|
結果以下の通り表示されます。
-----
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 Jan 12 10:16:30 2028 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated
-----
|
DHパラメータ(鍵交換アルゴリズムに使う素数)を生成しますので、
以下のコマンドを入力します。
[root@ip-10-0-0-XXX easyrsa3]# ./easyrsa gen-dh[ENTER]
|
以下の通り表示され続け、5分ほど待たされますが、そのまま待ちます。
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/easyrsa3/pki/dh.pem
|
- 証明書廃止リストを作成します。
いったんダミーのクライアント証明書を作成してすぐに廃止し、証明書廃止リストを作成します。
まず、以下のコマンドでクライアント証明書を作成します。
[root@ip-10-0-0-XXX easyrsa3]# ./easyrsa build-client-full dummy nopass[ENTER]
|
パスフレーズを求められますので、先ほどの4文字以上のパスワードを入力します。
Generating a 2048 bit RSA private key
...................................+++
.........................................+++
writing new private key to '/etc/openvpn/easyrsa3/pki/private/dummy.key.Vvi6ABR93n'
-----
Using configuration from ./openssl-easyrsa.cnf
Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:⇒先ほどの4文字以上のパスを入力する
|
結果以下の通り表示されればダミーのクライアント証明書の作成は完了です。
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'dummy'
Certificate is to be certified until Jan 12 11:54:11 2028 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated
|
そしてダミーのクライアント証明書を以下のコマンドで廃止しておきます。
[root@ip-10-0-0-XXX easyrsa3]# ./easyrsa revoke dummy[ENTER]
|
廃止の確認が以下の通り表示されますので「yes」と入力します。
Please confirm you wish to revoke the certificate with the following subject:
subject=
commonName = dummy
Type the word 'yes' to continue, or any other input to abort.
Continue with revocation: yesと入力
|
パスフレーズを求められますので、先ほどの4文字以上のパスワードを入力します。
Using configuration from ./openssl-easyrsa.cnf
Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:⇒先ほどの4文字以上のパスを入力する
|
結果以下の通り表示されます。
Revoking Certificate 2DE45EDE9FFEA2D385078FD83DF17B1C.
Data Base Updated
IMPORTANT!!!
Revocation was successful. You must run gen-crl and upload a CRL to your
infrastructure in order to prevent the revoked cert from being accepted.
|
そして以下のコマンドでダミーのクライアント証明書の廃止を完了します。
[root@ip-10-0-0-XXX easyrsa3]# ./easyrsa gen-crl[ENTER]
|
パスフレーズを求められますので、先ほどの4文字以上のパスワードを入力します。
Using configuration from ./openssl-easyrsa.cnf
Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:⇒先ほどの4文字以上のパスを入力する
|
結果以下の通り表示されれば完了です。
An updated CRL has been created.
CRL file: /etc/openvpn/easyrsa3/pki/crl.pem
|
- 証明書関連のファイルを配置します。
作成した諸々のファイルをコピーします。認証局の証明書はpki/ca.crtにあり、
pki/privateに秘密鍵、pki/issuedに証明書があるのでコピーします。
ちなみに、.crtは証明書、.keyは秘密鍵ファイルです。
[root@ip-10-0-0-XXX easyrsa3]# cp ./pki/ca.crt /etc/openvpn/[ENTER]
[root@ip-10-0-0-XXX easyrsa3]# cp ./pki/issued/server.crt /etc/openvpn/[ENTER]
[root@ip-10-0-0-XXX easyrsa3]# cp ./pki/private/server.key /etc/openvpn/[ENTER]
[root@ip-10-0-0-XXX easyrsa3]# cp ./pki/dh.pem /etc/openvpn/[ENTER]
[root@ip-10-0-0-XXX easyrsa3]# cp ./pki/crl.pem /etc/openvpn/[ENTER]
[root@ip-10-0-0-XXX easyrsa3]# chmod o+r /etc/openvpn/crl.pem[ENTER]
|
- OpenVPNを設定します。
まず、以下のコマンドでTLSキーファイルを作成します。
[root@ip-10-0-0-XXX easyrsa3]# openvpn --genkey --secret /etc/openvpn/ta.key[ENTER]
|
次に、OpenVPNの設定ファイルのひな形をコピーします。
[root@ip-10-0-0-XXX easyrsa3]# cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/[ENTER]
|
OpenVPNの設定を記述していきます。
[root@ip-10-0-0-XXX easyrsa3]# vi /etc/openvpn/server.conf[ENTER]
|
#################################################
# Sample OpenVPN 2.0 config file for #
# multi-client server. #
# #
# This file is for the server side #
# of a many-clients <-> one-server #
# OpenVPN configuration. #
# #
# OpenVPN also supports #
# single-machine <-> single-machine #
# configurations (See the Examples page #
# on the web site for more info). #
# #
# This config should work on Windows #
# or Linux/BSD systems. Remember on #
# Windows to quote pathnames and use #
# double backslashes, e.g.: #
# "C:\\Program Files\\OpenVPN\\config\\foo.key" #
# #
# Comments are preceded with '#' or ';' #
#################################################
|
まず85行目のdhファイルの指定を変更します。
dh dh2048.pem
↓↓↓↓
dh dh.pem
|
次に141行目のクライアントへプッシュ設定するルーティングを指定
;push "route 192.168.10.0 255.255.255.0"
↓↓↓↓
push "route 10.0.0.0 255.255.255.0"
|
次に274、275行目のデーモンを起動するユーザとグループを指定
;user nobody
;group nobody
↓↓↓↓
user nobody
group nobody
|
次に297行目のログの保管先を指定
;log-append openvpn.log
↓↓↓↓
log-append /var/log/openvpn.log
|
最後に最終行に以下を追記します。
crl-verify crl.pem
|
以上でOpenVPNの設定の記述は完了ですので、保存します。
- ログローテーション設定を行います。
ログファイルを/var/log/openvpn.logに指定しましたので、このファイルを定期的にローテーションし肥大化を回避する設定ファイルを以下の通り作成し、保存します。
[root@ip-10-0-0-XXX easyrsa3]# vi /etc/logrotate.d/openvpn[ENTER]
|
以下の通り記述し保存します。
/var/log/openvpn.log {
missingok
notifempty
sharedscripts
postrotate
systemctl restart openvpn 2>&1 > /dev/null || true
endscript
}
|
- Firewall設定を行います。
EC2のAmazon マシンイメージはデフォルトでローカルFirewall(iptables)のポリシーはINPUT、FORWARD、OUTPUTいずれも許可「ACCEPT」となります。
また、ポートへのアクセス制限は「セキュリティグループ」で実施していますので特にFirewall設定は不要です。
確認してみましょう。
[root@ip-10-0-0-XXX easyrsa3]# iptables -nL[ENTER]
|
以下の通り結果が表示されます。
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
|
ちなみにポリシーが拒否「DENY」の場合は、以下のコマンドでVPN通信ができるようにしましょう。
iptables -I OUTPUT -o tun+ -j ACCEPT
iptables -I FORWARD -o tun+ -j ACCEPT
iptables -I INPUT -i tun+ -j ACCEPT
|
- 続いてOpenVPNの起動と起動設定を行います。
まず、以下の通りOpenVPNの起動&停止スクリプトをviで編集します。
[root@ip-10-0-0-XXX easyrsa3]# vi /etc/rc.d/init.d/openvpn[ENTER]
|
119行目のコメントを外し、保存します
#echo 1 > /proc/sys/net/ipv4/ip_forward
↓↓↓↓
echo 1 > /proc/sys/net/ipv4/ip_forward
|
編集できれば保存し、以下のコマンドで変更をsystemdに反映させます。
[root@ip-10-0-0-XXX easyrsa3]# systemctl daemon-reload[ENTER]
|
以下のコマンドでOpenVPNを起動します。
[root@ip-10-0-0-XXX easyrsa3]# systemctl start openvpn.service[ENTER]
|
ここで変更をsystemdに反映していないと、以下の通りワーニングが出ますので、注意してください。
Warning: openvpn.service changed on disk. Run 'systemctl daemon-reload' to reload units.
|
また、以下のコマンドでLinux起動時(インスタンス起動時)に自動的にOpenVPNが起動するようにします。
[root@ip-10-0-0-XXX easyrsa3]# systemctl enable openvpn.service[ENTER]
|
お疲れ様でした。以上でOpenVPNサーバーのOpenVPNサービスの設定は完了です。
|