OpenVPNを導入してみたくなり、Ubuntu 12.04 で導入してみました。ネットワークの分野はまだよく理解できていないため、自分で手を動かして動作させられたことに満足です。
OpenVPN とは
異なるネットワークに所属する個々のクライアントを仮想的な同一ネットワークに所属させる仕組み……のようです。VPN を経由した通信はすべて暗号化されるため、物理的に離れた機器同士を接続する際に使われるようです。色々と試行錯誤して試してみた結果、要するにインターネットからアクセス可能な公開用ルーターに相当するものに接続、ルーターにぶら下がっている機器同士で暗号化された通信を実現しているようです。
簡単に図で説明してみます。物理的には以下の様な構成になっているとします。
自宅内のネットワーク
1つ目は自宅内のネットワーク:
外部の公衆無線LANサービスなどに接続している機器が所属するネットワーク
2つめは自宅外のネットワーク。例えば外部の公衆無線LANサービスに接続した iPad とかですかね。iPhone などでもいいですね:
VPNネットワーク
VPNで接続すると仮想的なプライベートネットワークにぶら下がることになります。VPNサーバはグローバルIPを持ち、外部からアクセスできる必要があります。
このように仮想的なプライベートネットワークに各サーバがぶら下がる形になります。
OpenVPNのインストール
OpenVPN のインストール方法を説明します。サーバ側で実施する作業を解説します!
事前設定: カーネルパラメータ
/etc/sysctl.conf
を編集し、IPv4 のパケット転送を許可します:
net.ipv4.ip_forward=1
※ 「#」を外します。
編集後 sudo sysctl -p
を実行します。
事前設定: ファイアーウォールの設定
OpenVPNサーバをOpenVPNクライアントのデフォルトゲートウェイにした場合、VPNに接続したクライアントがインターネットと接続するためには、OpenVPNサーバ側でパケットをインターネット側に転送して上げる必要があります。以下のコマンドを実行してあげます:
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.0.0 -o eth0 -j MASQUERADE
パッケージのインストール
パッケージをインストールします:
sudo aptitude install openvpn libssl-dev openssl
OpenVPNサーバ側の設定
サーバ鍵の作成
ひな形になるファイルがあるので、それをコピーしてあげます:
sudo mkdir /etc/openvpn/easy-rsa/ sudo cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/ sudo chown -R $USER /etc/openvpn/easy-rsa/
認証局の設定情報を指定してあげます:
export KEY_COUNTRY=”US” export KEY_PROVINCE=”NY” export KEY_CITY=”New York City” export KEY_ORG=”Queens” export KEY_EMAIL=”me@myhost.mydomain”
サーバ用の鍵を作成します:
cd /etc/openvpn/easy-rsa/ ln -s openssl-1.0.0.cnf openssl.cnf cd /etc/openvpn/easy-rsa/ source vars ./clean-all ./build-dh ./pkitool –initca ./pkitool –server server cd keys openvpn –genkey –secret ta.key
サーバ用のキーを所定の場所にコピーします:
cp server.crt server.key ca.crt dh1024.pem ta.key /etc/openvpn/
OpenVPN サーバの設定
サンプルとなるファイルをコピーします:
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ gzip -d /etc/openvpn/server.conf.gz
vi /etc/openvpn/server.conf
で設定ファイルを編集します。
以下の行を編集して、OpenVPN内部のネットワークで使用する IP アドレスを指定します。デフォルトは「10.8.0.0/24」です:
server 192.168.2.0 255.255.255.0
OpenVPNサーバをデフォルトゲートウェイとして扱うために、以下の設定の「;」を削除してあげます:
push "redirect-gateway def1 bypass-dhcp"
セキュリティ上の理由から、OpenVPNサーバを実行するユーザー・グループを指定してあげます:
user nobody group nogroup
server.confのサンプル
server.confのサンプルはこのようになります:
# OpenVPN server config file # # Generated by Chef - local changes will be overwritten port 1194 proto tcp dev tun keepalive 10 120 comp-lzo local 0.0.0.0 # Keys and certificates. ca /etc/openvpn/keys/ca.crt key /etc/openvpn/keys/server.key # This file should be kept secret. cert /etc/openvpn/keys/server.crt dh /etc/openvpn/keys/dh1024.pem ifconfig-pool-persist /etc/openvpn/ipp.txt server 10.8.0.0 255.255.0.0 user nobody group nogroup # avoid accessing certain resources on restart persist-key persist-tun # current client connections status /etc/openvpn/openvpn-status.log # logging settings. log-append /var/log/openvpn.log verb 1 # don't spam the log with messages. mute 10 # suppress identical messages > 10 occurances. script-security 1 push "redirect-gateway def1 bypass-dhcp"
OpenVPNクライアント側の設定
クライアント用の鍵作成
以下のコマンドを実行して、クライアント用の鍵を作成します:
cd /etc/openvpn/easy-rsa/ source vars KEY_CN=someuniqueclientcn ./pkitool client
注意点としては、KEY_CNを変更してあげないとうまく鍵作成ができないことです。詳細はGreenpossum today: TXT_DB error number 2 when generating openvpn client certificatesを参照ください。
クライアントへの鍵配備
以下のファイルをクライアント側へ配備します:
- /etc/openvpn/ca.crt
- /etc/openvpn/ta.key
- /etc/openvpn/easy-rsa/keys/client.crt
- /etc/openvpn/easy-rsa/keys/client.key
またクライアント用の設定ファイルも server.conf をベースに作成する必要があります。ovpnという形式でクライアントキーなどを一つのファイルにまとめることが可能です。iPhoneでOpenVPNを使おうを参考にしてください。この設定ファイルもクライアント側に配備します。
クライアント用設定ファイルのサンプル
クライアント用の設定ファイルのサンプルです:
client dev tun proto tcp remote openvpn-server.kazu634.com 1194 resolv-retry infinite nobind persist-key persist-tun ;ca ca.crt ;cert ipad.crt ;key ipad.key comp-lzo verb 3 <ca> -----BEGIN CERTIFICATE----- MIIDuDCCAyGgAwIBAgIJANv02SnW6i6TMA0GCSqGSIb3DQEBBQUAMIGaMQswCQYD [... snip ...] Ggx0uDBQuVzhC4skB9YXt+Z2TCzXogEBtE9h/A0tR8t+ErsoXSDJ3UC7MRI= -----END CERTIFICATE----- </ca> <cert> -----BEGIN CERTIFICATE----- MIID9TCCA16gAwIBAgIBAjANBgkqhkiG9w0BAQUFADCBmjELMAkGA1UEBhMCSlAx [... snip ...] 5uE2hKer80ia -----END CERTIFICATE----- </cert> <key> -----BEGIN PRIVATE KEY----- MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMesHWRNGH9klvU/ [... snip ...] GHsGbRenaBWR0A== -----END PRIVATE KEY----- </key>
まとめ
OpenVPNクライアント側でクライアント用に生成したファイル一式を配備してあげれば、OpenVPNで接続できるようになります。