Linux活用レシピ > AWS活用 > OpenVPNでAWSに接続

RHEL7のOpenVPNを使ってAWSに接続


サービス設定(OpenVPN Serverインスタンス)

    ここまででインスタンスが完成しましたので、続いてサービスの設定を行います。

    まずは、以下のネットワーク図で赤枠の部分のOpenVPNサーバーのOpenVPNサービスの設定を行います。

    このレシピではターミナルソフト「PuTTY」で接続する手順を紹介します。

  1. まず以下の「EC2 Management Console」の「インスタンス」をクリックします。

  2. メニューに表示された、今回のLinuxのインスタンスを選択すると、下の赤の長方形枠で囲った部分にIPv4パブリックIPアドレスが表示されていますので、こちらを控えておきます。

    ※「IPv4パブリックIP」にパブリックIPアドレスが表示されていない場合は、インスタンス作成時に「自動割り当てパブリックIP」オプションを「有効」にしていない可能性がありますので確認してください。

  3. まず「PuTTY」を起動し、以下の画面を表示します。

    先ほど確認した「IPv4パブリックIP」に表示されていたIPアドレスを「PuTTY」の以下の部分に入力します。

  4. 次に、認証用の鍵を選択する画面を、以下の通り「認証」メニューをクリックして表示します。

  5. ここで、選択する秘密鍵を、EC2のインスタンスを作成した際に保管した、「Key Pair」ファイルから作成します。

    秘密鍵は「PuTTY」のプログラムグループにある「PuTTYgen」というプログラムで行います。
    まずは「PuTTYgen」を起動し、以下の画面を表示します。

    「変換」メニューから「鍵のインポート」を選択します。

    ファイルの選択画面が表示されますので、「Key Pair」ファイル(このレシピでは「OpenVPNSSHKey.pem」として保管しました(拡張子は.pem))を選択しますと、以下の通り「Key Pair」ファイルの内容が読み込まれますので、「秘密鍵の保存」をクリックします。

    以下の通り、パスフレーズなしの警告が表示されますが、「はい」をクリックして、秘密鍵ファイル(拡張子は.ppk)を保管してください。

  6. 秘密鍵が保管できれば「PuTTY」のプログラムに戻り、「認証」メニューから、先ほど保管した秘密鍵ファイルのパスを以下の通り直接入力するか、参照ボタンで選択入力します。

  7. 次にキープアライブの時間以下の通り「接続」メニューの「Keepalives間の秒数」を「60」秒に設定し、接続が切れないようにします。

  8. 次に文字コードを「変換」メニューの「受信されるデータの文字セット変換」項目で「UTF-8(CJK)」に指定します。

  9. 最後に「セッション」メニューに戻って「保存されたセッション」部分に保存する名前を入力して。「保存」ボタンをクリックしてください。これで、次回から保存したセッションを選択することで、接続できるようになります。

  10. 以下の通り保管したセッション名を選択し「開く」ボタンをクリックすると。

    以下の通り「PuTTYセキュリティ警告」メッセージが表示されますが、「はい」ボタンをクリックすると、インスタンスにSSHで接続できます。

    以下のメッセージが表示されれば、接続できました。
    login as:
    
    ※ここで接続できない場合は「VPCのデフォルトゲートウェイ設定」ができていない可能性がありますので確認してください。

  11. まず最初は「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 ~]$
    
    ※「XXX」にはIPアドレスの数値が表示されます。

  12. いよいよここから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]
    ※このレシピで利用する「Red Hat Enterprise Linux7.4」において、OpenVPNをyumコマンドでインストールするには、「optional」レポジトリを上記の通り有効にする必要があります。
    結果は以下の通り表示されます。
    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 =
    

  13. 次に、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!
    
    

  14. OpenVPN本体のインストールです。
    OpenVPNダウンロードします。(最新バージョンを参照し以下の青色のバージョン部分を差し替えて入力してください)
    [ec2-user@ip-10-0-0-XXX ~]$ sudo wget https://swupdate.openvpn.org/community/releases/openvpn-2.4.4.tar.gz[ENTER]


  15. 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
    


  16. 生成した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]


  17. 認証局を構築します。
    まず以下のコマンドを実行し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]


  18. 認証局を設定します。
    まず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

  19. 証明書廃止リストを作成します。
    いったんダミーのクライアント証明書を作成してすぐに廃止し、証明書廃止リストを作成します。
    まず、以下のコマンドでクライアント証明書を作成します。
    [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


  20. 証明書関連のファイルを配置します。
    作成した諸々のファイルをコピーします。認証局の証明書は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]


  21. 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"
    
    ※クライアントへプッシュ設定するルーティングのネットワークアドレスは、VPNサーバーや今回VPN接続後に利用するWWWサーバーが接続されている、VPC内に設けた「パブリックサブネット」を指定します。
    このレシピでは
    「10.0.0.0/24」に指定しましたので、上記記述になります。
    次に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の設定の記述は完了ですので、保存します。

  22. ログローテーション設定を行います。
    ログファイルを/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
    }
    



  23. 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
    


  24. 続いて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サービスの設定は完了です。