kilin> how to> openvpn

OpenVPN for Linux/Windows/Android

(2010.2.28-2015.8.31)

openvpn(tunモード)で安全・高速に接続する。
(環境) CentOS 5, 6, 7, WindowsXP, Windows 7(32, 64), 10(32, 64), Android 4.x, 5.0

Linux openvpnサーバー

(以下プロンプトが#ならroot,$なら普通のユーザー)

インストール:

yumにEPELリポジトリを追加する。これで,openvpnをyumでインストール/更新できるようになる。
# yum install openvpn
# yum install easy-rsa
でインストール完了。

鍵の生成:

証明書/鍵作成用ディレクトリをコピーして,ファイルを実行可能にする。
# cp -r /usr/share/doc/openvpn-2.0.9/easy-rsa/2.0/ /etc/openvpn/easy-rsa
# cd /etc/openvpn/easy-rsa/
# chmod +x *
証明書/鍵作成用環境変数設定ファイル編集。
# vi vars

export KEY_COUNTRY="JP"
export KEY_PROVINCE="Kanagawa"
export KEY_CITY="Sagamihara"
export KEY_ORG="Kitasato University"
export KEY_EMAIL="xxx@kitasato-u.ac.jp"
環境変数設定,証明書/鍵作成先ディレクトリ初期化。以下の操作を途中で失敗したらここからやり直す。
# source vars
# ./clean-all
CA証明書を作成し,/etc/openvpnにコピー。
# ./build-ca
Generating a 1024 bit RSA private key
Country Name (2 letter code) [JP]:
State or Province Name (full name) [Kanagawa]:
Locality Name (eg, city) [Sagamihara]:
Organization Name (eg, company) [Kitasato University]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [Kitasato University CA]:
Email Address [xxx@kitasato-u.ac.jp]:

# cp keys/ca.crt /etc/openvpn/
サーバー証明書・秘密鍵とDH(Diffie Hellman)パラメータを作成し ,/etc/openvpnにコピー。
# ./build-key-server server
Generating a 1024 bit RSA private key
Country Name (2 letter code) [JP]:
State or Province Name (full name) [Kanagawa]:
Locality Name (eg, city) [Sagamihara]:
Organization Name (eg, company) [Kitasato University]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [server]:
Email Address [xxx@kitasato-u.ac.jp]:
A challenge password []:
An optional company name []:
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Data Base Updated

# ./build-dh
# cp keys/server.crt /etc/openvpn/
# cp keys/server.key /etc/openvpn/
# cp keys/dh1024.pem /etc/openvpn/

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

サーバーの場合と同じように,以下のコマンドで作成する。クライアントを追加する場合はここから始めればよい。クライアントの台数分つくる。入力を促されたら,サーバーの場合と同じように全てデフォルトのまま[Enter]し,[y/n]にはyで答える。
# ./vars
# ./build-key client1
# ./build-key client2
# ./build-key client3
...
パスワード付のクライアント証明書・秘密鍵は以下のコマンドで作成する。
# ./vars
# ./build-key-pass client10
Enter PEM pass phrase:でパスワードを入力する。その他はパスワードなしの場合と同じ。

サーバーの開始

設定ファイルをコピー修正する。とりあえず修正する部分は鍵ファイルの名前だが,上のように鍵ファイルを作った場合はそれも不要。openvpnにはtapモードとtunモードがあるがデフォルトはtunモード。
# cp /usr/share/doc/openvpn-2.3.8/sample/sample-config-files/server.conf /etc/openvpn/
ファイアーウオールの1194/udpポートをあけてから,openvpnを開始,終了,再起動,サービスとして開始する。そして,ファイアウォールでtun+を信頼できるデバイスにする。これでファイアウォールのフィルタとは無関係にOpenVPN経由なら何でも使えるようになる。

(CentOS5の場合)

# iptables -I INPUT -i tun+ -j ACCEPT
# iptables -I FORWARD -o tun+ -j ACCEPT
# iptables -I OUTPUT -o tun+ -j ACCEPT
# service iptables save
# service openvpn restart
# chkconfig openvpn on

(CentOS6の場合)
iptablesコマンドを使わずに,デスクトップの[管理]-[ファイアウォール]の[信頼したインターフェイス]でtun+にチェックを入れる。そして,サービスを起動。

# service openvpn restart
# chkconfig openvpn on

(CentOS7の場合)

# systemctl enable openvpn@server
# systemctl start openvpn@server
# firewall-cmd --add-service=openvpn --zone=public --permanent
# firewall-cmd --zone=trusted --change-interface=tun0 --permanent
# systemctl restart firewalld

Windows openvpnクライアント

http://www.openvpn.jp/ からwindows用openvpnをダウンロードして*,全てデフォルトでインストール。
[スタート]-[全てのプログラム]-[openVPN]-[OpenVPN Sample Configuration Files]でsample-configフォルダを開き,[スタート]-[全てのプログラム]-[openVPN]-[OpenVPN configuration file directory]でconfigフォルダを開く。
configフォルダにサーバーで作ったCA証明書,クライアント証明書,鍵をコピーする。
(例)
ca ca.crt
cert client1.crt
key client1.key
sample-configフォルダから,client.ovpnファイルをconfigフォルダにコピーして,エディタでファイルを開き,鍵ファイルの名前と,サーバー名を修正する。
;remote my-server-1 1194 ← ;を削除して,my-server-1をサーバー名かサーバーのIPアドレスにする。
[スタート]-[全てのプログラム]-[openVPN]-[OpenVPN GUI]でopenvpnを開始し(注1),タスクバーの通知領域のアイコンを右クリックして,[client1]に[接続]する。(注1)Windows 7では,右クリックして[管理者として実行]する。
Windowsファイアウオールの設定
WindowsXP: [コントロールパネル]の[Windowsファイアウォール]の[詳細設定]で,openvpnのインストールに伴ってできたローカルエリア接続を,ファイアウォールからはずす(チェックをはずす)。他の接続は,ファイアウォールの設定をしておく。
Windows7-10: [コントロールパネル]の[Windowsファイアウォール]の[詳細設定]で,[Windowsファイアウォールのプロパティ]をクリック。[ドメインプロファイル]タブで[保護されているネットワーク接続]の[カスタマイズ]をクリックして,openvpnのインストールに伴ってできたローカルエリア接続を,ファイアウォールからはずす(チェックをはずす)。プライベートプロファイル,パブリックプロファイルについても同じように設定する。
OpenVPNを起動と同時に接続するには。タスクバー通知領域のOpenVPNを終了し,[コントロールパネル]-[管理ツール]-[サービス]でOpenVPN Serviceを探し,ダブルクリックして[スタートアップの種類]を[自動]にする。OpenVPN configuration file directoryに入れた接続先に自動的に常時接続されるようになる。この場合,クライアント鍵にパスワードが付いていると接続されない。
パスワード付のクライアント鍵は,OpenVPN GUIで利用する。OpenVPN GUIを起動するとパスワードを聞かれるので,パスワードを入力しなければOpenVPNに接続されない。複数の人間が利用するPCで,自分が利用するときだけOpenVPNに接続したいときこの方法で接続するとよい。
Windows 10 (32ビット)での接続断について: Windows10 (32ビット)で,OpenVPNサービスを開始すると,数時間後に,サービスは動いているにもかかわらず,VPNに接続できなくなる。原因不明。対処療法で,タスクスケジューラーで1時間に一度サービスを再起動すると,この問題に対処できるようである。タスクスケジューラーで起動するのは,以下のvbsファイルとbatファイル。vbsを挟むのは,コマンドプロンプトが表示されるのが煩わしいからである。
OpenVPNrestart.vbs CreateObject("WScript.Shell").Run "C:\OpenVPNrestart.bat",0
OpenVPNrestart.bat net stop "OpenVPN Service"
net start "OpenVPN Service" 
*64ビット版もあり。I00XとI60Xがあるが,後者のほうが性能が良いらしいが,Windows7ではスリープからの復帰時にVPNが繋がらない(I604)ので,スリープを使う場合は前者をインストールすること(I604はNDIS6ベースのTAPドライバ、I004はNDIS5ベースのTAPドライバを組み込んでいます。NDIS6では処理効率などが向上していると言われていますが、特に安定性を重視する環境では、実績面からはNDIS5ベースのほうが安全かもしれません。2014.10.21 ツイッターより)。Windows10では,逆にI00Xではスリープからの復帰時に繋がらないがI60Xでは正常動作する。Windows10では文句なくI60Xを使うべき

Android openvpnクライアント

Google PlayからOpenVPN Connectをインストール。SDカードなどにサーバーで作ったCA証明書,クライアント証明書,鍵とovpnファイル(前節参照)をコピーする。
(例)
ca ca.crt
cert client2.crt
key client2.key
ovpn client2.ovpn
[メニュー]-[import]-[Import Profile from SD card]でovpnファイルを読み込み,Connectする。Disconnectしないでアプリを抜ける。
Sambaファイルサーバーは,ESファイルエクスプローラー(無料)で利用できる。設定は,ESファイルエクスプローラーを起動して左上をクリックし,[ビューを変更]-[LAN] 新規でVPNアドレス(10.8.0.1など)を入力する。
VNCはPocketCloud(無料)がよい。

Linux openvpnクライアント

OpenVPNをインストールして,サーバーで作ったCA証明書,クライアント証明書,鍵(前節参照)を/etc/openvpn/にコピーする。
(例)
ca ca.crt
cert client2.crt
key client2.key
設定ファイルをコピー修正する。修正する部分はopenvpnサーバー名と鍵ファイルの名前。
# cp /usr/share/doc/openvpn-2.3.8/sample/sample-config-files/client.conf /etc/openvpn/
ファイアウォールでtunを信頼できるデバイスにして(openvpnポートはクライアントからアクセスしにいくのであける必要はない),openvpnを再起動,サービス開始する。

(CentOS5の場合)

# iptables -I INPUT -i tun+ -j ACCEPT
# iptables -I FORWARD -o tun+ -j ACCEPT
# iptables -I OUTPUT -o tun+ -j ACCEPT
# service iptables save
# service openvpn restart
# chkconfig openvpn on

(CentOS6の場合)
iptablesコマンドを使わずに,デスクトップの[管理]-[ファイアウォール]の[信頼したインターフェイス]でtun+にチェックを入れる。そして,サービスを起動。

# service openvpn restart
# chkconfig openvpn on

(CentOS7の場合)

# systemctl enable openvpn@client
# systemctl start openvpn@client
# firewall-cmd --zone=trusted --change-interface=tun0 --permanent
# systemctl restart firewalld

サーバーで稼動しているsambaファイルサーバーを使う

サーバーの設定ファイルで,10.8.0.0/255.255.255.0がopenvpnに割当られるようになっている(変更可)。10.8.0.1がサーバー,クライアントにはその他のIPアドレスが割り振られる。
以下のようにsambaを稼働しておけば,Windowsエクスプローラ(マイドキュメントなど)のアドレス欄に\\10.8.0.1と入れることで,ユーザのホームディレクトリに接続できる。なお,ファイヤーウオールでsambaのポートは閉じておく。

sambaのインストール

# yum install samba

sambaパスワードの設定

ユーザのsamba用のパスワードを設定する。user1はLinuxの既存ユーザ。
# pdbedit -a user1
new password:
retype new password:

sambaの設定

# vi /etc/samba/smb.conf

[global]

#ファイル作成時のパーミッション
   create mask = 0644
   force create mode = 0
   security mask = 0644
   force security mode = 0
#ディレクトリ作成時のパーミッション
   directory mask = 0755
   force directory mode = 0
   directory security mask = 0755
   force directory security mode = 0

# 
   unix extensions = no
   wide links = yes

sambaの起動と自動起動設定

# service smb restart
# chkconfig smb on

クライアント同士で通信する

サーバーの設定ファイル(/etc/openvpn/server.conf)で,client-to-client行の行頭の;をとれば,クライアント同士で通信ができるようになる。もちろん,クライアントのフォルダを共有にしておけば,クライアント同士でファイルのやりとりができるし,vncを稼動(接続先は10.8.0.0/255.255.255.0に限定しておく)すれば,vncも安全快適に使える。
推奨されてはいないが,duplicate-cn行の行頭の;をとれば,複数台のクライアントで同じ証明書を使うことができる。
クライアントに接続されたWindows 7のフォルダをvpnを通して別のWindows/Androidから使えるようにするには,ワークグループ名を同じにし,共有したいドライブを右クリックして,[共有][詳細な共有...]の[詳細な共有]ボタンをクリックし,[このフォルダを共有する]をチェック。[アクセス許可]をクリックして,クライアントと共通のユーザをフルアクセスできるように[追加]して,[everyone]の[読み取り許可]ははずす。そして[適用]。VPNのファイヤウオールははずしてあるので,ファイアやーウオールをいじる必要はない。

クライアントに固定IPアドレスを割り当てる

1.サーバーの設定ファイル(/etc/openvpn/server.conf)で,client-config-dir ccd行の行頭の;をとる。
2./etc/openvpnにccdというディレクトリを作る。
# mkdir /etc/openvpn/ccd
3.ccdにクライアント名(クライアントcrtファイルに書いてある)のファイルを作り,以下のように記述する。
# vi /etc/openvpn/ccd/client1

ifconfig-push 10.8.0.5 10.8.0.6
この例では,クライアント10.8.0.5が割り振られる。一般に,aを4n+1,bを4n+2,(n=1,2,3,...)として
ifconfig-push 10.8.0.a 10.8.0.b
と書くと,アドレス10.8.0.aが割り振られる。

Windowsでサーバー,Linuxでクライアント

ここまでのやり方と,同じようにして,できる(はず)。

WebDAVをパスワード無しで使う

このHowtoのWebDAVで紹介したSSLでBASIC認証をかけたWebDAVを,OpenVPNからはパスワード無しで使うには,WebDAVの設定ファイルに以下を追加して,
# cd /etc/httpd/conf.d
# vi webdav.conf
Alias /vpnwebdav "/home/www/html/webdav"
<Location /vpnwebdav>
    DAV On
    Order deny,allow
    Deny from all
    Allow from 10.8.0
</Location>
とする。つまり,WebDAVでは,同じフォルダに2つの設定をすることができる。設定を有効にするためにhttpdを再起動する。
# /etc/init.d/httpd restart

これをWindowsXPから使うには,

[マイネットワーク]-[ネットワークプレースを追加する]で[次へ]をクリックし,[ネットワークプレースの追加ウイザード]で[別のネットワークの場所を選択...]を選び[次へ]をクリック。[インターネットまたはネットワークのアドレス(A)]に
https://10.8.0.1/vpnwebdav
と入力して[次へ]。(OpenVPNサーバのアドレスを10.8.0.1とした)。[マイネットワーク]に[ホスト名 上の webdav]ができ,WebDAVへのファイルのアップロード,ダウンロードがパスワード無しでできる。

クライアントの削除

特定のVPNクライアントからのVPN接続を廃止したい場合は,そのクライアントが使用しているクライアント証明書を廃止すればよい。以下はclient1の証明書を廃止する方法。(OpenVPN日本語情報サイト,ドキュメントより)
# /etc/init.d/openvpn stop
# cd /etc/openvpn/easy-rsa/
# source ./vars
# source ./revoke-full client1
# /etc/init.d/openvpn start
client1がrevokeされた旨のメッセージが出て(error 23 at 0 depth lookup:certificate revokedと出ればOK。「最後の”error 23″が気になるかもしれませんが、このメッセージは問題ありません。これは、失効させた証明書の検証に失敗したということを示しているからです。」),keysサブディレクトリ内にcrl.pemというCRL(証明書失効リスト)ファイルが生成される。
このcrl.pemファイルを/etc/openvpn/にコピーし,/etc/openvpn/server.confファイルの末尾に
crl-verify crl.pem
と書く。./build-keyで同じ名前のクライアント証明書・鍵を作っても大丈夫(古い証明書は廃止され,同じ名前の新しい証明書が有効になる)。

参考

OpenVPN日本語情報サイト(http://www.openvpn.jp/) 2009.12現在
VPNサーバー構築(OpenVPN) (http://fedorasrv.com/openvpn.shtml), (http://centossrv.com/openvpn.shtml) 2008.8現在
Windows7でOpenVPNを使う (http://hrk.ateria.co.jp/2009/08/windows7%E3%81%A7openvpn%E3%82%92%E4%BD%BF%E3%81%86/)2010.2現在
Windows7 + OpenVPN + Samba 設定メモ(http://blog.goo.ne.jp/firstletter/e/4dd7080aee15eccdb7a4f40e5240c706)2011.8現在