ネットワーク構成

  • サーバ側ネットワーク(192.168.1.0)

    機器 IPアドレス
    ルータ 192.168.1.1
    VPNサーバ 192.168.1.2
    アプリケーションサーバ1 192.168.1.3
    アプリケーションサーバ2 192.168.1.4
  • サーバ/クライアント間用仮想ネットワーク(10.8.1.0)

  • クライアント側ネットワーク(192.168.0.0)
  • サーバ側ネットワークとクライアント側ネットワークは異なるゾーンである必要がある。

スタティックルーティング

  • VPNサーバ単体とだけ接続できれば良い場合は、設定の必要なし。
  • ルータ下の複数のPCに接続する場合は、ルータにスタティックルーティングを設定する必要あり。
  • クライアントからアプリケーションサーバにアクセスしているとき、アプリケーションサーバでは 10.8.1.x からアクセスされているように見える。戻りパケットを 10.8.1.x に投げるので、10.8.1.0 用のゲートウェイ設定が無いとクライアントに応答が返ってこない。
  • 10.8.1.0 宛てのパケットのゲートウェイとして VPN サーバのローカルアドレスを設定する。
    • any net 10.8.1.0 netmask 255.255.255.0 gw 192.168.1.2

ファイアウォール

  • UDP:1194 を開放し、192.168.1.2 にポート転送する。
    # firewall-cmd --permanent --add-service=openvpn
    # firewall-cmd --reload

仮想NIC

  • VPNサーバにネットワークI/Fが1つだけしか無く、グローバルIP用として使われていて、ローカルネットが存在しない場合は、VPNサーバに仮想NICを追加する。
  • /etc/sysconfig/network-scripts/ifcfg-eth0:0
    DEVICE="eth0:0"
    IPADDR=192.168.1.2
    PREFIX=24
    ONBOOT=yes
    BOOTPROTO=none

インストール

# yum install openvpn (epelリポジトリ)
# cd /etc/openvpn/
# curl -LO https://github.com/OpenVPN/easy-rsa/archive/master.zip
# unzip master.zip
# mv easy-rsa-master/easyrsa3/ .
# rm -rf easy-rsa-master/
# rm -f master.zip

サーバ設定

CA証明書・秘密鍵作成

# cd /etc/openvpn/easyrsa3/
# ./easyrsa init-pki (OpenVPNインストール後初回のみ実行する)
# ./easyrsa build-ca (PEM pass phrase, Common Name を入力)
# cp pki/ca.crt /etc/openvpn/

サーバー証明書・秘密鍵作成

# ./easyrsa build-server-full server nopass (CAのパスフレーズを入力)
# cp pki/issued/server.crt /etc/openvpn/
# cp pki/private/server.key /etc/openvpn/

Diffie Hellman パラメータ作成

# ./easyrsa gen-dh
# cp pki/dh.pem /etc/openvpn/

証明書廃止リスト作成

  • /etc/openvpn/easyrsa3/vars (vars.example をコピー)
    #set_var EASYRSA_CRL_DAYS       180
    set_var EASYRSA_CRL_DAYS        3650
# ./easyrsa build-client-full dmy nopass (CAのパスフレーズを入力)
# ./easyrsa revoke dmy (yes応答, CAのパスフレーズを入力)
# ./easyrsa gen-crl (CAのパスフレーズを入力)
# cp /etc/openvpn/easyrsa3/pki/crl.pem /etc/openvpn/
# chmod o+r /etc/openvpn/crl.pem

OpenVPN設定

# openvpn --genkey --secret /etc/openvpn/ta.key
# cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/
  • /etc/openvpn/server.conf

    port 1194
    
    proto udp
    
    dev tun
    
    ;dh dh2048.pem
    dh dh.pem
    
    server 10.8.1.0 255.255.255.0
    
    ifconfig-pool-persist /var/log/openvpn-ipp.txt
    
    push "route 192.168.1.0 255.255.255.0"
    
    ;tls-auth ta.key 0
    tls-auth ta.key 0
    
    ;cipher BF-CBC        # Blowfish (default)
    cipher AES-256-CBC
    
    ;user nobody
    ;group nobody
    user nobody
    group nobody
    
    ;status openvpn-status.log
    status /var/log/openvpn-status.log
    
    ;log-append  openvpn.log
    log-append  /var/log/openvpn.log
    
    crl-verify crl.pem
  • /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.1.0/24へのアクセスを許可する場合)
    # ※192.168.1.0/24側のファイアウォール等でVPNクライアント(10.8.0.0/24)からのアクセスを許可すること
    iptables -I FORWARD -i tun+ -d 192.168.1.0/24 -j ACCEPT
  • /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
  • /etc/logrotate.d/openvpn

    /var/log/openvpn.log {
        missingok
        notifempty
        sharedscripts
        postrotate
            systemctl restart openvpn 2>&1 > /dev/null || true
        endscript
    }
  • /etc/rc.d/init.d/openvpn (コメントを解除)

          #echo 1 > /proc/sys/net/ipv4/ip_forward
          echo 1 > /proc/sys/net/ipv4/ip_forward

サービス起動

  • CentOS 7
    # systemctl enable openvpn@server
    # systemctl start openvpn@server
  • CentOS 8
    # systemctl enable openvpn-server@server
    # systemctl start openvpn-server@server

クライアント用設定

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

# cd /etc/openvpn/easyrsa3/
# ./easyrsa build-client-full client1 (client1用のパスフレーズ, CAのパスフレーズを入力)

クライアント設定ファイル

  • ファイルをクライアントマシンに転送。

    • /etc/openvpn/ca.crt
    • /etc/openvpn/ta.key
    • /etc/openvpn/easyrsa3/pki/issued/client1.crt
    • /etc/openvpn/easyrsa3/pki/private/client1.key
    • /usr/share/doc/openvpn/sample/sample-config-files/client.conf
  • %UserProfile%/OpenVPN/config 以下に上記ファイルを配置。
    拠点が複数の場合は拠点毎にサブフォルダを作成してそこに配置する。

クライアント設定

  • client.conf を client.ovpn にリネーム。
  • %UserProfile%/OpenVPN/config/client.ovpn
    # OpenVPN サーバ名とポート
    remote vpn.takeash.net 1194
    
    ca ca.crt
    cert client1.crt
    key client1.key
    
    remote-cert-tls server
    
    ;tls-auth ta.key 1
    tls-auth ta.key 1
    
    ;cipher x
    cipher AES-256-CBC

複数拠点に同時接続

  • 同時接続する拠点分の TAP Windows Adapter が必要。
  • Adapter を追加するには、「プログラム / TAP-Windows / Utilities / Add a new TAP virtual ethernet adapter」を右クリックし「管理者として実行」を選択する。

    "C:\Program Files\TAP-Windows\bin\tapinstall.exe" install "C:\Program Files\TAP-Windows\driver\OemVista.inf" tap0901
  • How to connect multiple VPNs using OpenVPN on Windows 7 on the same time? - Server Fault

リンク