Project

General

Profile

OpenVPN

  • OpenVPNに関する簡易構築メモです。
  • インターネットを介した異なるネットワークをSSL暗号化して
    同じセグメントに属させます。(ローカルネット扱いにします)
  • そのため、ネットワークセグメントが送受信ともに同じ場合は面倒で
    IPマスカレード設定をしなければいけません。
    (自宅192.168.0.1 <=> データセンター192.168.0.10 などの場合)
  • これにより、管理者以外は使わないようなポートを閉じたまま、
    そのポートを使わないと出来ない管理などを内部から行うことが出来ます。
    (SSHでの踏み台と違い、操作端末自体が相手のネットワークに介入します)

前提条件

  • 今回はepelリポジトリを使用します。
    PHP5.2のインストール に構築メモがありますので参考に。
  • OpenSSLのインストールが必須になります。今回は省略します。

インストール

  • epelからインストールします。
    # yum --enablerepo=epel install openvpn
    

鍵生成

準備

  • 鍵生成プログラムをコピーします。
    # cd /etc/openvpn/
    # cp -Rp /usr/share/openvpn/easy-rsa/ .
    # chmod a+x easy-rsa/2.0/*
    
  • 鍵生成プログラムの設定ファイルを編集します。(一番下)
    # cd easy-rsa/2.0/
    # vi vars
    # ------------------------------------------------------
    # 変更箇所のみ記載
    export KEY_COUNTRY="JP" 
    export KEY_PROVINCE="CA" 
    export KEY_CITY="Tokyo" 
    export KEY_ORG="example.co.jp" 
    export KEY_EMAIL="postmaster@example.co.jp" 
    
  • 設定ファイルを読み込ませて、環境変数を定義します。
    実行時、追加でスクリプトの実行を要求される場合があるので
    指示に従い実行します。(察するに、サンプル鍵の削除)
    source vars
    NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/2.0/keys
    
    # ./clean-all
    

CA証明書の作成

  • CA証明書、秘密鍵の作成、配置
    (要求内容は環境変数で定義したので、デフォ値ENTERでいい)
    # ./build-ca
    writing new private key to 'ca.key'
    
    # ls keys/
    ca.crt  ca.key  index.txt  serial
    
    # cp -p keys/ca.crt /etc/openvpn/
    

サーバ証明書の作成

  • サーバ証明書、秘密鍵の作成、配置
    (先ほどと同じだが、最後に2回応答があるので注意)
    # ./build-key-server server
    
    Sign the certificate? [y/n]:y
    1 out of 1 certificate requests certified, commit? [y/n]y
    
    Write out database with 1 new entries
    
    # cp -p keys/server.key /etc/openvpn/
    # cp -p keys/server.crt /etc/openvpn/
    

DHの作成

  • 次のスクリプトを実行し、生成したファイルを配置します。
    # ./build-dh
    # cp -p keys/dh1024.pem /etc/openvpn/
    

証明書廃止リストの作成

  • 次のスクリプトを実行し、生成したファイルを配置します。
    (サーバ証明書の挙動と同様)
    # build-key dmy
    
    Sign the certificate? [y/n]:y
    1 out of 1 certificate requests certified, commit? [y/n]y
    
    Write out database with 1 new entries
    
  • 次のファイルの箇所をコメントアウトします。(一番下)
    # vi ./openssl.conf
    # ------------------------------------------------------
    # 変更箇所のみ記載
    #[ pkcs11_section ]
    #engine_id = pkcs11
    #dynamic_path = /usr/lib/engines/engine_pkcs11.so
    #MODULE_PATH = $ENV::PKCS11_MODULE_PATH
    #PIN = $ENV::PKCS11_PIN
    #init = 0
    
  • 次のコマンドを実行し、ファイルを配置します。
    # ./revoke-full dmy
    # cp -p keys/crl.pem /etc/openvpn/
    
  • TLS認証鍵を生成、配置します。
    # openvpn --genkey --secret /etc/openvpn/ta.key
    
  • 以上で鍵の設定は完了です。
     

OpenVPNの設定

  • サンプル設定ファイルのコピー、編集
    (本当はtcpにしたいんだけど、体験上iptablesのルールが面倒みたい)
    # cp -p /usr/share/doc/openvpn-2.1.4/sample-config-files/server.conf /etc/openvpn/
    # vi /etc/openvpn/server.conf
    # ------------------------------------------------------
    # 有効な設定のみ記載
    port 1194
    proto udp
    dev tun
    ca ca.crt
    cert server.crt
    key server.key  # This file should be kept secret
    dh dh1024.pem
    server 10.8.0.0 255.255.255.0
    ifconfig-pool-persist ipp.txt
    push "route 192.168.34.0 255.255.255.0" 
    keepalive 10 120
    tls-auth ta.key 0 # This file is secret
    comp-lzo
    user nobody
    group nobody
    persist-key
    persist-tun
    status openvpn-status.log
    log-append  openvpn.log
    verb 3
    management localhost 7505
    crl-verify crl.pem
    

起動スクリプトの設定

  • 次のファイルを設定する
    # vi /etc.init.d/openvpn
    # ------------------------------------------------------
    # 変更箇所のみ記載
    echo 1 > /proc/sys/net/ipv4/ip_forward
    
  • ルーティングを追加する(gw=自分のアドレスの行が追加されていること)
    # echo "any net 10.8.0.0 netmask 255.255.255.0 gw 192.168.34.n" >> /etc/sysconfig/static-routes
    # service network reload
    
    # route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    10.8.0.0        192.168.34.n   255.255.255.0   UG    0      0        0 eth0
    0.0.0.0         192.168.34.254  0.0.0.0         UG    0      0        0 eth0
    

     

ログローテーション設定

  • 設定ファイルの作成
    # vi /etc/logrotate.d/openvpn
    # ------------------------------------------------------
    /var/log/openvpn.log {
        missingok
        notifempty
        sharedscripts
        postrotate
            /etc/rc.d/init.d/openvpn restart 2>&1 > /dev/null || true
        endscript
    }
    

     

起動設定

  • 正常に起動すれば、起動設定を行う。
    # service openvpn start
    openvpn を起動中:                                          [  OK  ]
    [root@schatte openvpn]# chkconfig openvpn on
    [root@schatte openvpn]# chkconfig --list openvpn
    openvpn         0:off   1:off   2:on    3:on    4:on    5:on    6:off
    

     
  • 実際に利用するにはクライアントの構築が必要。
  • 以上。
     

補足

クライアント証明書を破棄する。

  • クライアント証明書の破棄、パスフレーズを忘れたなどでの作り直しの際
    (一端破棄しなければならない)に使用する。
  • 次のコマンドを実行する
    (環境変数読み込み時の警告は無視する)
    # cd /etc/openvpn/easy-rsa/2.0/
    # source vars
    # ./revoke-full client1
    
  • 廃止した証明書リストを更新する
    # cp -p keys/crl.pem /etc/openvpn/
    
  • これで、この鍵を用いたVPN接続が出来なくなる。
  • 同じ名前で別の鍵を再作成することが可能になる。

管理インタフェースの使い方

  • 管理インタフェースで接続中のクライアントリストを表示する。
    # telnet localhost 7505
    
    Trying 127.0.0.1...
    Connected to localhost.localdomain (127.0.0.1).
    Escape character is '^]'.
    >INFO:OpenVPN Management Interface Version 1 -- type 'help' for more info
    
    status
    
  • 管理インタフェースでクライアントを強制切断する。
    (上記の続き)
    
    kill clientname(statusで表示されるクライアント証明書の名前)
    
  • 管理インタフェースを終了する。
    (上記の続き)
    
    exit
    Connection closed by foreign host.
    

 

戻る