【VPNサーバ】OpenVPN導入その6

約1年ずっと起動していたRaspberry Piもとうとう再起動しました。
それに伴い、iPhoneからRaspberry PiのOpenVPNを介して、
自宅サーバに接続しようと思ったところ、接続できなかったので設定を見直し。

  • iptablesの設定

    iptables -t filter -A INPUT -i eth0 -p udp -m udp --dport 1194 -j ACCEPT
    iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to 192.168.XXX.XXX
    

    「–to」にはRaspberry Piの通常のIPを指定します。
    再起動すると設定が消えるため、自動設定できるようにするのが良いですが、
    まだ自動化できていません。

設定後、ufw(iptable)の再起動は不要です。
この内容は「【Raspbian】OpenVPN導入その2」の最後の方にも記載がありますが、
見逃しがちなので、再度記載しました。

【VPNサーバ】OpenVPN導入その5

ASUSのタブレットを購入したので、こちらにもOpenVPNを導入します。

  • OpenVPN設定(クライアント用の証明書と鍵作成(追加))
    RaspberryPiでタブレット用の証明書と鍵を作成します。

    cd /etc/openvpn/easy-rsa
    source ./vars
    ./build-key クライアント名(タブレット)
    

    作成した証明書や鍵のうち、
    クライアントで利用する下記ファイルをWindowsにUSB等で持ってきて、設定を行います。

    ca.crt
    クライアント名(タブレット).crt
    クライアント(タブレット).key
    ta.key(iPhone優先のため、利用していませんが、一応)
    
  • クライアント設定ファイル(タブレット用)
    クライアント設定ファイルとして「クライアント名(タブレット).ovpn」ファイルを作成します。
    設定内容は「OpenVPN導入その3」の設定値と全く一緒です。
  • はまったこと
    タブレットにOpenVPNをインストールするとデスクトップに「OpenVPN GUI」の
    ショートカットが作成されるので、ダブルクリックして実行し、接続します。
    単純に実行するとOpenVPNには接続し、IPが割り振られますが、
    OpenVPN内の他のクライアントに接続できませんでした。
    pingももちろん飛びません。

    ipv6が悪さをしているのかと色々勘ぐりましたが、
    ちゃんとクライアント側のログを見てみると下記エラーが出力されていました。

    ROUTE: route addition failed using CreateIpForwardEntry: アクセスが拒否されました。[status=5 if_index=12]
    Route addition via IPAPI failed [adaptive]
    Route addition fallback to route.exe
    env_block: add PATH=C:\Windows\System32;C:\WINDOWS;C:\WINDOWS\System32\Wbem
    ERROR: Windows route add command failed [adaptive]: returned error code 1
    

    Cドライブ内のexeファイルを実行できていないようです。
    これを解決するには「OpenVPN GUI」のショートカットを
    常に管理者権限で実行する必要があります。

    「OpenVPN GUI」のショートカットを右クリックからプロパティを開き、
    「互換性」タブの「管理者としてこのプログラムを実行する」のチェックボックスをチェックします。
    これで無事、OpenVPN内のクライアントにも接続できました。

【VPNサーバ】OpenVPN導入その4

Windowsを利用してOpenVPNの動作確認ができたので、
元々やりたかったiPhoneで外からRaspberry Piに繋げます。

OpenVPNクライアントを追加するため、まずはサーバー側で証明書、鍵を作成します。

  • OpenVPN設定(クライアント用の証明書と鍵作成(追加))
    1度Windows用に証明書と鍵作成を行っているため、手順が短くて済みます。

    cd /etc/openvpn/easy-rsa
    source ./vars
    ./build-key クライアント名(追加)
    

    varsファイルを読み込むと「you run ./clean-all」が表示されますが、
    これは以前に1度実行しているため、実行不要です。
    実行すると「/etc/openvpn/easy-rsa/keys」内が初期化され、
    再度、認証局から作り直しとなります。(やりました)

    iPhoneでOpenVPNを利用する場合もWindowsと同様で、
    「OpenVPN導入その1」で作成した証明書や鍵のうち、
    クライアントで利用するものをWindowsにUSB等で持ってきて、設定を行います。

  • クライアント設定ファイル(iPhone用)
    iPhone用のクライアント設定ファイルとして「クライアント名(追加).ovpn」ファイルを作成します。

    下記内容を追加
    # tunデバイス、udpプロトコル、OpenVPNサーバの1194番ポートをクライアントとして利用
    dev tun
    proto udp
    remote z-area.net 1194
    client
    
    # 名前解決試みのリトライ数(無限)
    resolv-retry infinite
    
    # ローカルポートをバインドしない
    nobind
    
    # 再接続時に鍵読み込み、tunデバイスオープン
    persist-key
    persist-tun
    
    # OpenVPNのログ設定
    verb 3
    
    # LZO圧縮を利用
    comp-lzo
    
    # 認証局証明書、クライアント(追加)証明書、クライアント(追加)秘密鍵の内容貼り付け
    <ca>
    -----BEGIN CERTIFICATE-----
    ca.crtの内容を貼り付け
    -----END CERTIFICATE-----
    </ca>
    <cert>
    -----BEGIN CERTIFICATE-----
    クライアント名(追加).crtの内容を貼り付け
    -----END CERTIFICATE-----
    </cert>
    <key>
    -----BEGIN PRIVATE KEY-----
    クライアント名(追加).keyの内容を貼り付け
    -----END PRIVATE KEY-----
    </key>
    
  • iPhoneへ証明書と鍵の移動
    Apple StoreからVPNクライアントのアプリとして「OpenVPN」をダウンロードします。
    次にiTunesからダウンロードした「OpenVPN」を選択して、
    「クライアント名(追加).ovpn」を移動します。

    次にiPhoneの操作に戻ると、「+」マークが出ているので、
    設定ファイルを読み込み、OpenVPNに接続します。
    「Connected」になれば成功です。
    左上に「4G VPN」と表示されるはずです。

    はまりやすい注意点は自宅で作業をしている場合、
    ルーターのWifiには接続しないように4G回線や別回線でやること。

  • iPhoneから自宅のLinuxへ接続
    OpenVPNアプリで「4G VPN」接続状態になったら
    SSH接続アプリで自宅のLinuxに接続確認を行います。

    私は「vSSH Lite」を利用しました。
    有名なのは「Prompt」ですが、無印は公開中止になり、
    「Prompt2」のみになってしまったようなので、「vSSH Lite」を利用してみました。

    接続するLinuxはSSHで接続する際、秘密鍵が必要になるので、
    iTunesから「vSSH Lite」を選択して秘密鍵を移動します。

    2つのLinuxに外から接続確認してみました。
    【Raspberry Pi】
    IPは10.8.0.1でOpenVPNサーバーの仮想IPを指定してみました。

    【VMWare上のCentOS】
    IPは192.168.XXX.XXXで自宅LAN内のIPを指定してみました。

    どちらも無事接続成功です。

【VPNサーバ】OpenVPN導入その3

OpenVPNクライアントをWindowsにインストールしてみました。

利用したファイルは「openvpn-install-2.3.4-I605-x86_64.exe」で、
インストール時に右クリックし「管理者として実行」で、画面に従いインストールしました。

「OpenVPN導入その1」で作成した証明書や鍵のうち、
クライアントで利用するものをWindowsにUSB等で持ってきて、
「OpenVPNインストールフォルダ/OpenVPN/config」に配置します。

  • クライアント設定ファイル
    OpenVPNクライアント側の設定を行います。

    先ほど配置したconfigフォルダに「クライアント名.ovpn」を作成します。

    下記内容を追加
    # tunデバイス、udpプロトコル、OpenVPNサーバの1194番ポートをクライアントとして利用
    dev tun
    proto udp
    remote z-area.net 1194
    client
    
    # 認証局証明書、クライアント証明書、クライアント秘密鍵のパス設定
    ca ca.crt
    cert クライアント名.crt
    key クライアント名.key
    
    # 名前解決試みのリトライ数(無限)
    resolv-retry infinite
    
    # ローカルポートをバインドしない
    nobind
    
    # 再接続時に鍵読み込み、tunデバイスオープン
    persist-key
    persist-tun
    
    # OpenVPNのログ設定
    verb 3
    
    # LZO圧縮を利用
    comp-lzo
    
    # 共有鍵の利用
    #tls-auth ta.key 1
    

「OpenVPN GUI」を起動し、接続が成功すれば
サーバーの設定、クライアントの設定とも完了です。
接続完了後、コマンドプロンプトから「ipconfig /all」を打つと
「ローカルエリア接続2」という接続情報が増えており、
「10.8.0.X」とIPが振られていることが確認できます。

【VPNサーバ】OpenVPN導入その2

鍵の作成が終わったので、次に設定ファイルを作成、修正していきます。

  • パケット転送設定
    下記2ファイルを修正します。

    vi /etc/sysctl.conf
    
    下記コメントアウトを外す。
    #net.ipv4.ip_forward=1
    ↓
    net.ipv4.ip_forward=1
    

    viじゃなぜか編集できなかったので、リダイレクトで設定変更。

    echo 1 > /proc/sys/net/ipv4/ip_forward
    
  • サーバー設定ファイル

    vi /etc/openvpn/server.conf
    
    下記内容を追加
    # tunデバイス、udpプロトコル、1194番ポートを利用
    dev tun
    proto udp
    port 1194
    
    # 認証局証明書、サーバー証明書、サーバー秘密鍵、鍵交換用のパス設定
    ca /etc/openvpn/ca.crt
    cert /etc/openvpn/サーバー名.crt
    key /etc/openvpn/サーバー名.key
    dh /etc/openvpn/dh1024.pem
    
    # OpenVPNの実行権限(OpenVPNインストール時に作成されるユーザとグループ)
    user nobody
    group nogroup
    
    # OpenVPNの仮想ネットワークと仮想サブネットマスク
    server 10.8.0.0 255.255.255.0
    
    # 起動時に鍵読み込み、tunデバイスオープン
    persist-key
    persist-tun
    
    # OpenVPNのログ設定
    status /var/log/openvpn-status.log
    log-append /var/log/openvpn
    verb 3
    
    # OpenVPNクライアント間の接続許可
    client-to-client
    
    # OpenVPNクライアント側の全てのトラフィックをOpenVPNサーバー経由(デフォルトゲートウェイ:10.8.0.2)
    # 「route -n」で確認可能
    push "redirect-gateway def1"
    
    # DHCP設定(DHCP利用しないため、詳細不明)
    push "dhcp-option DNS 8.8.8.8"
    push "dhcp-option DNS 8.8.4.4"
    
    # LZO圧縮を利用
    comp-lzo
    
    # OpenVPNクライアントのIP固定設定を利用
    client-config-dir ccd
    
    # 共有鍵の利用
    #tls-auth ta.key 0
    

    下記サイトを参考にしました。
    英語サイトですが、コマンドは一緒なので雰囲気で。
    http://raspberrypihelp.net/tutorials/1-openvpn-server-tutorial

  • サーバー設定ファイル(注意点1)
    pushを「”」で括っていますが、色々な参考サイトを見ていると、
    「”」(全角のダブルクォーテーション)になっているサイトがありますが、
    正しくは「”」(半角のダブルクォーテーション)です。

    クライアントはWindowsとiPhoneでそれぞれ試したところ、
    WindowsはどちらでもOpenVPNに接続成功しますが、
    iPhoneでは「”」(半角のダブルクォーテーション)でないとエラーになりました。

    全く同事象でエラーとなっていた人がいました。
    https://forums.openvpn.net/topic12789.html

  • サーバー設定ファイル(注意点2)
    「tls-auth ta.key 0」はコメントアウトしています。
    前回も記載していますが、有効になっているとiPhoneからの接続が出来なかったためです。
  • クライアントの仮想IP固定設定
    VPNクライアントの仮想IPは固定が推奨らしいので、設定を行います。

    mkdir /etc/openvpn/ccd
    vi /etc/openvpn/ccd/クライアント名
    
    下記内容を追加
    ifconfig-push 10.8.0.X 10.8.0.X+1
    

    Xは決まった数値がありますが、他のサイトを参考にしてください。

  • OpenVPN起動

    /etc/init.d/openvpn start
    

    エラーが発生する場合、下記のログを確認します。

    view /var/log/openvpn
    

    私のRaspberry Piでは下記の内容が出力されていました。

    Note: Cannot open TUN/TAP dev /dev/net/tun: No such device (errno=19)
    

    下記サイトを確認するとrebootが有効とのことで、
    再起動後にコマンドを実行してみたところ、無事起動しました。

    http://blog.paulregan.co.uk/2013/02/raspberry-pi-openvpn.html

  • ファイアウォール設定
    ファイルウォールの設定を行います。
    私のRaspberry Piはiptablesのラッパー的な役割をするufwを導入しているため、
    iptablesだけではなく、ufwの設定も行います。

    • iptablesの設定

      iptables -t filter -A INPUT -i eth0 -p udp -m udp --dport 1194 -j ACCEPT
      iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to 192.168.XXX.XXX
      

      「–to」にはRaspberry Piの通常のIPを指定します。
      再起動すると設定が消えるため、自動設定できるようにするのが良いです。
      (ここでは記載省略)

    • ufwの設定

      ufw allow 1194
      vi /etc/ufw/before.rules
      
      下記内容を「# End required lines」と「# allow all on loopback」の間に追加
      # OpenVPN Configuration
      -A ufw-before-input -i tun+ -j ACCEPT
      -A ufw-before-output -i tun+ -j ACCEPT
      -A ufw-before-forward -s 10.8.0.0/24 -j ACCEPT
      -A ufw-before-forward -d 10.8.0.0/24 -j ACCEPT
      
      ufw disable
      ufw enable
      

【VPNサーバ】OpenVPN導入その1

外から自宅サーバをいじってみたくなったので、OpenVPNを導入します。
Raspberry Piで動いてるサービスをNUCに移行したら
Raspberry PiはOpenVPNサーバ専用かもしれません。

  • OpenVPN導入
    まずはパッケージを最新化します。
    しばらくやってなかったので、結構長かったです。

    aptitude update
    aptitude upgrade
    

    OpenVPNをインストールします。
    相変わらずインストールはコマンドで一瞬。

    aptitude install openvpn openssl
    

    opensslは以前にApache2にSSLを導入した際に
    最初から入ってたような気がしたのですが、入れちゃいました。

  • OpenVPN設定(準備)
    Apache2のSSLではサーバー側で公開鍵、秘密鍵を利用していましたが、
    OepnVPNを利用するにはサーバー側、クライアント側の両方で公開鍵、秘密鍵を利用します。

    Apache2の時と同様に鍵の正当性を証明するために、OpenVPN用のオレオレ認証局を作成します。
    OpenVPNをインストールするとOpenSSLを簡単に利用できるツール「easy-rsa」が
    同時にインストールされるのでそれを利用します。
    OpenVPNのディレクトリにツール「easy-rsa」をコピーしておきます。

    現在では「easy-rsa」は3.0まで公開されていて、
    それを利用すると以降に記述した2.0の手順よりさらに短く簡単に設定できるようです。
    今回は2.0の手順になります。

    cd /etc/openvpn
    cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 ./easy-rsa
    

    認証局作成、サーバー用の証明書と鍵作成、クライアント用の証明書と鍵作成で
    参照する変数用のファイル作成もしておきます。
    作成しておくと入力の手間が省けます。

    vi /etc/openvpn/easy-rsa/vars
    
    下記内容を変更
    export EASY_RSA="`pwd`"
    ↓
    export EASY_RSA="/etc/openvpn/easy-rsa"
    
    export KEY_COUNTRY="US"
    ↓
    export KEY_COUNTRY="JP"
    
    export KEY_PROVINCE="CA"
    ↓
    export KEY_PROVINCE="TOKYO"
    
    export KEY_CITY="SanFrancisco"
    ↓
    export KEY_CITY="Akihabara"
    
    export KEY_ORG="Fort-Funston"
    ↓
    export KEY_ORG="OreOreCA"
    
    export KEY_EMAIL="me@myhost.mydomain"
    ↓
    export KEY_EMAIL=""
    
    export KEY_CN=changemeからexport PKCS11_PIN=1234はコメントアウト
    
  • OpenVPN設定(認証局作成)
    認証局を作成する際に「openssl.cnf」を参照するため、
    サンプルファイルの「openssl-1.0.0.cnf」を「openssl.cnf」としてコピーしておきます。

    cd /etc/openvpn/easy-rsa
    cp -pi openssl-1.0.0.cnf openssl.cnf
    

    さらに先ほど事前作成しておいたvarファイルを環境変数として有効化しておきます。

    source ./vars
    
    NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
    

    初期化してから実行しろということなので、初期化後にオレオレ認証局を作成します。

    ./clean-all
    ./build-ca オレオレ認証局名(適当)
    
    Generating a 1024 bit RSA private key
    ...............++++++
    ....++++++
    writing new private key to 'ca.key'
    -----
    略
    

    括弧内にvarsファイルで予め設定しておいた設定内容が表示されるので、
    問題なければそのままEnter押下して作業を進めます。

  • OpenVPN設定(DHパラメータ作成)
    DHパラメータはサーバーとクライアントで鍵を交換するために利用するそうです。

    ./build-dh
    
  • OpenVPN設定(サーバー用の証明書と鍵作成)

    ./build-key-server サーバー名
    

    途中でチャレンジパスワード、会社名付属、署名にサインされるか聞かれますが、
    チャレンジパスワード、会社名付属はブランクでEnter、署名はyで入力します。
    最後のコミットもyで入力します。

  • OpenVPN設定(クライアント用の証明書と鍵作成)

    ./build-key クライアント名
    

    実行するファイル名がサーバーと似ていますが微妙に違うので注意。

  • OpenVPN設定(共有鍵作成)
    セキュリティ強化の一環として、共有鍵をさらに作成可能です。
    この鍵はツール「easy-rsa」ではなく、openvpnコマンドを利用して作成します。

    openvpn --genkey --secret /etc/openvpn/easy-rsa/keys/ta.key
    

    私の環境では、iphoneから利用する場合、ta.keyがあると
    OpenVPNに接続できなかったので、利用しませんでした。

作業完了すると「/etc/openvpn/easy-rsa/keys」に下記ファイルが作成されています。
他にも作業ファイルが作成されていますが、記載していません。

ファイル名概要権限備考
ca.crtオレオレ認証局の証明書644サーバー、クライアントで利用
ca.keyオレオレ認証局の秘密鍵--
サーバー名.crtサーバーの証明書644サーバーで利用
サーバー名.csrサーバーの公開鍵--
サーバー.keyサーバーの秘密鍵600サーバーで利用
クライアント名.crtクライアントの証明書-クライアントで利用
クライアント名.csrクライアントの公開鍵--
クライアント.keyクライアントの秘密鍵-クライアントで利用
dh1024.pem鍵交換用644サーバーで利用
ta.key共有鍵--

サーバーで利用する4ファイルはディレクトリ移動しておきます。
実行権限も表の通りではない場合は修正しておきます。

cd /etc/openvpn
cp -pi /etc/openvpn/easy-rsa/keys/ca.crt .
cp -pi /etc/openvpn/easy-rsa/keys/サーバー名.crt .
cp -pi /etc/openvpn/easy-rsa/keys/サーバー.key .
cp -pi /etc/openvpn/easy-rsa/keys/dh1024.pem .

クライアントで利用する3ファイルはUSBメモリ等でクライアントに移動しておきます。
keysディレクトリ内のファイルは削除しても問題ないようですが、
クライアントを追加したい場合、ca.crtやca.keyを参照したりするので、一旦削除しないでおきます。