【VPNサーバ】OpenVPN設定後のファイル構成

  • 設定完了後のフォルダ構成

    # 共通ファイル配置場所
    cd /etc/openvpn
    ls -l
    -rw------- 1 root root  1168  9月  3 15:59 2016 ca.crt:CA証明書(サーバとクライアントの両方で利用)
    -rw----r-- 1 root root   682  9月  3 16:31 2016 crl.pem:証明書廃止リスト
    -rw------- 1 root root   424  9月  3 16:26 2016 dh.pem:DHパラメータ
    drwxr-xr-x 4 root root  4096  9月  3 15:52 2016 easyrsa3:SSL/TLSプロトコルを利用した暗号化ツール
    -rwxr-xr-x 1 root root   530  9月  3 17:07 2016 openvpn-shutdown:OpenVPN停止時実行スクリプト
    -rwxr-xr-x 1 root root   670  9月  3 17:03 2016 openvpn-startup:OpenVPN起動時実行スクリプト
    -rw-r--r-- 1 root root 10593  9月  3 19:29 2016 server.conf:OpenVPN設定ファイル
    -rw------- 1 root root  4448  9月  3 16:03 2016 server.crt;サーバ証明書
    -rw------- 1 root root  1704  9月  3 16:03 2016 server.key:サーバ秘密鍵
    -rw------- 1 root root   636  9月  3 16:35 2016 ta.key:SSL/TLS認証鍵
    
    # 証明書配置場所
    cd /etc/openvpn/easyrsa3/pki/issued
    ls -l
    -rw------- 1 root root 4423  9月  3 16:27 2016 dmy.crt:クライアント(ダミー用)証明書(廃止済)
    -rw------- 1 root root 4432  9月  3 22:56 2016 クライアント名.crt:クライアント(iphoneやタブレット用)証明書
    -rw------- 1 root root 4448  9月  3 16:03 2016 server.crt:サーバ証明書(共通ファイル配置場所にコピーしたもの)
    
    # 秘密鍵配置場所
    cd /etc/openvpn/easyrsa3/pki/private
    ls -l
    -rw------- 1 root root 1834  9月  3 15:58 2016 ca.key:CA秘密鍵
    -rw------- 1 root root 1708  9月  3 16:27 2016 dmy.key:クライアント(ダミー用)秘密鍵(廃止済)
    -rw------- 1 root root 1704  9月  3 22:56 2016 クライアント名.key:クライアント(iphoneやタブレット用)秘密鍵
    -rw------- 1 root root 1704  9月  3 16:02 2016 server.key:サーバ秘密鍵
    

【VPNサーバ】OpenVPNファイルウォール設定

  • OpenVPNファイアウォール設定

    # OpenVPNファイアウォール設定
    iptables -I INPUT 16 -p udp --dport 1194 -j ACCEPT
    service iptables save
    
    # 設定内容の確認
    # フィルタリングの確認(-t filter省略)
    iptables -L --line-numbers -n -v
    # アドレス変換の確認(-t nat)
    iptables -L -t nat --line-numbers -n -v
    

    この設定ではiPhone5sからVPNサーバに接続できても
    各サーバにPingが飛ばせませんでした。
    どこか設定をミスしているのかも。
    以下の設定を追加してみても変化なし。

    iptables -t nat -I POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to 192.168.11.30
    service iptables save
    

    「/var/log/message」を確認するとiPhone5sからLZOのエラーが出ていたので、
    そこを改善すれば直るのかは確認中です。

【VPNサーバ】OpenVPN設定(クライアント用)

  • OpenVPN設定(クライアント側パスワード有)
    iPhone以外でパスワード有りでログインする場合、こっちを選択。

    # クライアント用の証明書作成
    cd /etc/openvpn/easyrsa3/
    ./easyrsa build-client-full クライアント名
    
    下記内容を入力
    Enter PEM pass phrase:クライアント用パスワードを入力
    Verifying - Enter PEM pass phrase:クライアント用パスワードを入力
    Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:CA秘密鍵のパスワードを入力
    
  • OpenVPN設定(クライアント側パスワード無)
    iPhoneやパスワード無しでログインする場合、こっちを選択。

    # クライアント用の証明書作成
    cd /etc/openvpn/easyrsa3/
    ./easyrsa build-client-full クライアント名 nopass
    
    下記内容を入力
    Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:CA秘密鍵のパスワードを入力
    
  • iPhone用のOpenVPN設定
    WindowsのOpenVPNクライアントをインストールし、
    インストール後、「インストールディレクトリ/OpenVPN/sample-config/client.ovpn」を編集する。
    iPhone用は設定値のみとし、#のコメントも削除する。

    下記内容を確認/追加/変更
    # TLSクライアントを指定
    tls-client
    
    # VPNインターフェースとしてtunデバイスを指定
    dev tun
    
    # プロトコルとしてudp
    proto udp
    
    # サーバ名とポートを指定
    remote z-area.net 1194
    
    # 名前解決試みのリトライ数(無限)
    resolv-retry infinite
    
    # ローカルポートをバインドしない
    nobind
    
    # 再接続時に鍵読み込み、tunデバイスオープン
    persist-key
    persist-tun
    
    # Man-in-the-Middle攻撃対策
    remote-cert-tls server
    
    # LZO圧縮を利用
    comp-lzo
    
    # OpenVPNのログ設定
    verb 3
    
    # 鍵の設定と思われるがいまいち不明
    # しかしこの記述がないと接続できなかった
    key-direction 1
    
  • iPhone用の秘密鍵の変換
    「X509」というエラーが出いてた場合、
    iPhoneのOpenVPNクライアントアプリのTLS/SSLがPolarSSLを利用している場合があり、
    OpenSSLと秘密鍵のフォーマットが異なり、接続できないことがある。
    そこで以下のコマンドで秘密鍵を変換する。

    openssl rsa -in /etc/openvpn/easyrsa3/pki/private/クライアント名.key -out /etc/openvpn/easyrsa3/pki/private/クライアント名.key.polarssl
    

【VPNサーバ】OpenVPN設定

  • OpenVPN設定

    # OpenVPN設定ファイルをOpenVPN設定ファイル格納ディレクトリへコピー
    cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/
    # OpenVPN設定ファイルを編集
    vi /etc/openvpn/server.conf
    
    下記内容を確認/追加/変更
    # VPNインターフェースとしてtunデバイスを指定
    dev tun
    
    # プロトコルとしてudp、ポートは1194を指定
    proto udp
    port 1194
    
    # 認証局証明書、サーバー証明書、サーバー秘密鍵のファイルパスを指定
    # 配置場所を変更している場合、変更する
    ca ca.crt
    cert server.crt
    key server.key
    
    # DHパラメータファイルのパスを指定
    # 配置場所を変更している場合、変更する
    dh dh.pem
    
    # VPNクライアント割当てアドレス範囲として10.8.0.0/24を指定(デフォルト)
    server 10.8.0.0 255.255.255.0
    
    # LAN(例:192.168.1.0/24)へのルートをVPNサーバー経由にする
    ;push "route 192.168.10.0 255.255.255.0"
    ;push "route 192.168.20.0 255.255.255.0"
    push "route 192.168.11.0 255.255.255.0"
    
    # TLS認証有効化(行頭の;を削除し、コメント解除)
    tls-auth ta.key 0 # This file is secret
    
    # OpenVPN実行権限を下げる(行頭の;を削除し、コメント解除)
    user nobody
    group nobody
    
    # 起動時に鍵読み込み、tunデバイスオープン
    persist-key
    persist-tun
    
    # ログの設定
    status /var/log/openvpn-status.log
    log-append  /var/log/openvpn.log
    verb 3
    
    # LZO圧縮を利用
    comp-lzo
    
    # OpenVPNクライアントのIP固定設定を利用しない
    # 利用する場合、行頭の;を削除
    ;client-config-dir ccd
    
    # 管理インタフェースの有効化(最終行に追加)
    # 証明書廃止リストの有効化(最終行に追加)
    management localhost 7505
    crl-verify crl.pem
    
    # OpenVPN経由でSambaへのアクセスがエラーになる場合、最終行に追加
    fragment 1280
    mssfix 1280
    link-mtu 1400
    
  • OpenVPN起動時実行スクリプト作成

    # OpenVPN起動時実行スクリプト作成
    vi /etc/openvpn/openvpn-startup
    
    #!/bin/bash
    
    # VPN用のiptablesルール削除スクリプト実行(初期化)
    /etc/openvpn/openvpn-shutdown
    
    # VPNサーバーからの送信を許可
    iptables -I OUTPUT -o tun+ -j ACCEPT
    iptables -I FORWARD -o tun+ -j ACCEPT
    
    # VPNクライアントからVPNサーバーへのアクセスを許可
    iptables -I INPUT -i tun+ -j ACCEPT
    
    # VPNクライアントからLANへのアクセスを許可
    # VPNクライアントから192.168.11.0/24へのアクセスを許可する場合、
    # 192.168.11.0/24側のファイアウォール等でVPNクライアント(10.8.0.0/24)からのアクセスを許可すること
    iptables -I FORWARD -i tun+ -d 192.168.11.0/24 -j ACCEPT
    
    # OpenVPN起動時実行スクリプトへ実行権限付加
    chmod +x /etc/openvpn/openvpn-startup
    
  • OpenVPN停止時実行スクリプト新規作成

    # OpenVPN停止時実行スクリプト新規作成
    vi /etc/openvpn/openvpn-shutdown
    
    #!/bin/bash
    
    # VPNインタフェース(tun+)用iptablesルール削除関数
    delete() {
        rule_number=`iptables -L $target --line-numbers -n -v|grep tun.|awk '{print $1}'|sort -r`
        for num in $rule_number
        do
            iptables -D $target $num
        done
    }
    
    # VPNインタフェース(tun+)用iptables受信ルール削除
    target='INPUT'
    delete
    
    # VPNインタフェース(tun+)用iptables転送ルール削除
    target='FORWARD'
    delete
    
    # VPNインタフェース(tun+)用iptables送信ルール削除
    target='OUTPUT'
    delete
    
    # OpenVPN停止時実行スクリプトへ実行権限付加
    chmod +x /etc/openvpn/openvpn-shutdown
    
  • OpenVPNログローテーション設定

    # OpenVPNログローテーション設定ファイル新規作成
    vi /etc/logrotate.d/openvpn
    
    /var/log/openvpn.log {
        missingok
        notifempty
        sharedscripts
        postrotate
            systemctl restart openvpn 2>&1 > /dev/null || true
        endscript
    }
    
  • OpenVPN起動スクリプト変更

    # OpenVPN起動スクリプト変更
    vi /etc/rc.d/init.d/openvpn
    
    下記内容を変更
    # 行頭の#を削除し、コメント解除
    # パケット転送を有効化する
    echo 1 > /proc/sys/net/ipv4/ip_forward
    

【VPNサーバ】OpenVPN導入

RaspberryPiがとうとう壊れしまったので、
NUCにOpenVPNを導入します。
導入はrootユーザで実施します。

  • OpenVPN導入

    cd /usr/local/src
    # OpenVPNインストールに必要なパッケージをインストール
    yum -y install openssl-devel lzo-devel pam-devel
    # 最新の OpenVPN をダウンロードしてビルド
    # 最新版は公式サイトで確認
    wget http://swupdate.openvpn.org/community/releases/openvpn-2.3.10.tar.gz
    rpmbuild -tb --clean openvpn-2.3.10.tar.gz
    yum -y localinstall ~/rpmbuild/RPMS/x86_64/openvpn-2.3.10-1.x86_64.rpm
    rm -f ~/rpmbuild/RPMS/x86_64/openvpn-*
    rm -f openvpn-2.3.10.tar.gz
    
    # easyrsa をダウンロードして解凍
    # OpenVPNをインストールするとOpenSSLを簡単に利用できるツール「easy-rsa」が
    # 「/usr/share/doc/openvpn/examples/easy-rsa/2.0」にインストールされるが、
    # 最新版の3.0をダウンロードします。
    wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
    unzip master.zip
    cp -r easy-rsa-master/easyrsa3/ /etc/openvpn/
    rm -rf easy-rsa-master/
    rm -f master.zip
    
  • 証明書初期化(OpenVPN導入後の1回のみ)

    cd /etc/openvpn/easyrsa3/
    ./easyrsa init-pki
    
  • CA証明書と秘密鍵作成

    ./easyrsa build-ca
    
    下記内容を入力
    Enter PEM pass phrase:任意のパスワードを入力
    Verifying - Enter PEM pass phrase:任意のパスワードを再入力
    Common Name (eg: your user, host, or server name) [Easy-RSA CA]:z-area.net
    
    # CA証明書をOpenVPN設定ファイル格納ディレクトリへコピー
    cp pki/ca.crt /etc/openvpn/
    # CA秘密鍵は以降のサーバ証明書・秘密鍵作成時、クライアント証明書・秘密鍵作成時のみ使用するため、コピー不要
    
  • サーバ証明書と秘密鍵作成

    ./easyrsa build-server-full server nopass
    
    下記内容を入力
    Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:CA秘密鍵のパスワードを入力
    
    # サーバ証明書をOpenVPN設定ファイル格納ディレクトリへコピー
    cp pki/issued/server.crt /etc/openvpn/
    # サーバ秘密鍵をOpenVPN設定ファイル格納ディレクトリへコピー
    cp pki/private/server.key /etc/openvpn/
    
  • DH(Diffie Hellman)パラメータ作成

    # DHパラメータ作成
    ./easyrsa gen-dh
    # DHパラメータをOpenVPN設定ファイル格納ディレクトリへコピー
    cp pki/dh.pem /etc/openvpn/
    
  • 証明書廃止リスト作成
    証明書廃止リストは、実際にクライアント証明書を
    作成してから廃止を行わないと作成できないので、
    ダミーのクライアント証明書を一旦、作成と廃止することにより、
    証明書廃止リストを作成する

    # ダミーのクライアント証明書作成
    ./easyrsa build-client-full dmy nopass
    
    下記内容を入力
    Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:CA秘密鍵のパスワードを入力
    
    # ダミーのクライアント証明書廃止
    ./easyrsa revoke dmy
    
    下記内容を入力
    Continue with revocation:yes
    Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:CA秘密鍵のパスワードを入力
    
    # 証明書廃止リストを作成
    ./easyrsa gen-crl
    
    下記内容を入力
    Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:CA秘密鍵のパスワードを入力
    
    # 証明書廃止リストをOpenVPN設定ファイル格納ディレクトリへコピー
    cp pki/crl.pem /etc/openvpn/
    # 証明書廃止リストへ参照権限付加
    chmod o+r /etc/openvpn/crl.pem
    
  • TLS認証鍵作成

    # TLS認証鍵作成
    openvpn --genkey --secret /etc/openvpn/ta.key