OpenVPN for CentOS, Windows, Android

(2010.2.28-2024.4.6)

OpenVPN(tunモード)で安全・高速に接続する。

(環境) CentOS 7-8, AlmaLinux8, Windows 10, Android 4.x, 5.0, (CentOS 5, 6, WindowsXP, Androidはこちら)

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

Linux openvpnサーバー

インストール

yumにEPELリポジトリを追加する。openvpnをyumでインストール/更新できるようになる。

# yum install openvpn

# yum install easy-rsa

でインストール完了。

鍵の生成

証明書/鍵作成用ディレクトリをコピーする。

# mkdir /etc/openvpn/easy-rsa

# cp -r /usr/share/easy-rsa/3.0.3/* /etc/openvpn/easy-rsa/

# cd /etc/openvpn/easy-rsa/

環境変数設定,証明書/鍵作成先ディレクトリ初期化。以下の操作を途中で失敗したらここからやり直す。

# cd /etc/openvpn/easy-rsa

# ./easyrsa init-pki

CA証明書を作成し,/etc/openvpn/serverに移動。

# ./easyrsa build-ca

Generating a 2048 bit RSA private key

...

Enter PEM pass phrase: 任意のパスフレーズを入力

Verifying - Enter PEM pass phrase: もう一度入力

...

Common Name (eg: your user, host, or server name) [Easy-RSA CA]: サーバー名を入力


# mv ca.crt /etc/openvpn/server/

サーバー証明書・秘密鍵とDH(Diffie Hellman)パラメータを作成。パスワードにはCA証明書作成で入れたパスワードを入力する。

# ./easyrsa gen-dh

# mv pki/dh.pem /etc/openvpn/server/

# ./easyrsa build-server-full server nopass

# mv pki/issued/server.crt /etc/openvpn/server/

# mv pki/private/server.key /etc/openvpn/server/

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

以下のコマンドで作成する。クライアントを追加する場合はここから始めればよい。クライアントの台数分つくる。入力を促されたら全てデフォルトのまま[Enter]し,[y/n]にはyで答える。パスワードにはCA証明書作成で入れたパスワードを入力する。

# ./easyrsa build-client-full client01 nopass

# ./easyrsa build-client-full client02 nopass

# ./easyrsa build-client-full client03 nopass

# ./easyrsa build-client-full client04 nopass

...

パスワード付のクライアント証明書・秘密鍵は以下のコマンドで作成する。

# ./easyrsa build-client-full client10

その他はパスワードなしの場合と同じ。

TLS認証キーの作成

# openvpn --genkey --secret /etc/openvpn/server/ta.key

サーバーの開始

設定ファイルをコピー修正する。とりあえず修正する部分は鍵ファイルの名前だが,上のように鍵ファイルを作った場合はそれも不要。openvpnにはtapモードとtunモードがあるがデフォルトはtunモード。

# cp /usr/share/doc/openvpn-2.3.8/sample/sample-config-files/server.conf /etc/openvpn/server/


修正箇所


;DHパラメータの指定

dh dh.pem

;クライアント間通信の許可

client-to-client

;ログのレベル: 0は重大エラーのみ,3は標準,9が最大

verb 0

ファイアーウオールの1194/udpポートをあけてから,openvpnを開始,終了,再起動,サービスとして開始する。そして,ファイアウォールでtun+を信頼できるデバイスにする。これでファイアウォールのフィルタとは無関係にOpenVPN経由なら何でも使えるようになる。

# systemctl enable openvpn@server.service

# systemctl start openvpn@server.service

# firewall-cmd --add-service=openvpn --zone=public --permanent

# firewall-cmd --zone=trusted --change-interface=tun0 --permanent

# systemctl restart firewalld

openvpnクライアント

Windows openvpnクライアント

http://www.openvpn.jp/ からwindows用openvpnをダウンロードして*,全てデフォルトでインストール。

[スタート]-[openVPN]-[OpenVPN configuration file directory]でconfigフォルダを開き,その親OpenVPNに移動する。

OpenVPNフォルダの中には,sample-config,config,config-autoフォルダがある。これらは,それぞれ,設定のサンプル,OpenVPN GUIの設定,OpenVPNサービスの設定ファイルを格納するフォルダである。see

OpenVPNサービスを使うかGUIを使うかに応じて,config-autoまたはconfigフォルダに,サーバーで作ったCA証明書,クライアント証明書,鍵,TLS認証キーをコピーする。

(例)

ca ca.crt

cert client01.crt

key client01.key

そして,sample-configフォルダから,client.ovpnファイルをconfig-autoまたはconfigフォルダにコピーして,エディタでファイルを開き,鍵ファイルの名前と,サーバー名を修正する。

;remote my-server-1 1194 ← ;を削除して,my-server-1をサーバー名かサーバーのIPアドレスにする。

サービスとして起動

サービスとして起動と同時に接続するには:[スタート]を右クリックして[コンピュータの管理][サービスとアプリケーション]-[サービス]でOpenVPN Serviceを探し,ダブルクリックして[スタートアップの種類]を[自動]にする。config-autoに入れた接続先に自動的に常時接続されるようになる。この場合,クライアント鍵にパスワードが付いていると接続されないのでパスワードは設定しない。また,OpenVPN GUI自動起動しないように,タスクバーの通知領域でOpenVPN GUIアイコンを右クリックして設定しておく。

OpenVPN GUI

パスワード付のクライアント鍵はconfigフォルダに入れて,OpenVPN GUIで利用する。OpenVPN GUIを起動するとパスワードを聞かれるので,パスワードを入力しなければOpenVPNに接続されない。複数の人が利用するPCで,自分が利用するときだけOpenVPNに接続したいときこの方法で接続するとよい。

Android openvpnクライアント

Google PlayからOpenVPN Connectをインストール。SDカードなどにサーバーで作ったCA証明書,クライアント証明書,鍵,TLS認証キーとovpnファイル(前節参照)をコピーする。

(例)

ca ca.crt

cert client02.crt

key client02.key

ovpn client02.ovpn

[メニュー]-[import]-[Import Profile from SD card]でovpnファイルを読み込み,Connectする。Disconnectしないでアプリを抜ける。

Sambaファイルサーバーは,ESファイルエクスプローラー(無料)で利用できる。設定は,ESファイルエクスプローラーを起動して左上をクリックし,[ビューを変更]-[LAN] 新規でVPNアドレス(10.8.0.1など)を入力する。

VNCはRealVNCのVNC Viewer - Remote DesktopPocketCloud(無料)がよい。

Linux openvpnクライアント

OpenVPNをインストールして,サーバーで作ったCA証明書,クライアント証明書,鍵,TLS認証キー(前節参照)を/etc/openvpn/にコピーする。

(例)

ca ca.crt

cert client03.crt

key client03.key

設定ファイルをコピー修正する。修正する部分はopenvpnサーバー名と鍵ファイルの名前。

# cp /usr/share/doc/openvpn-2.3.8/sample/sample-config-files/client.conf /etc/openvpn/

ファイアウォールでtunを信頼できるデバイスにして(openvpnポートはクライアントからアクセスしにいくのであける必要はない),openvpnを再起動,サービス開始する。

(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行の行頭の;をとれば,クライアント同士で通信ができるようになる。もちろん,クライアントのフォルダを共有にしておけば,クライアント同士でファイルのやりとりができるし,Remote Desktop接続も安全快適に使える。

推奨されてはいないが,duplicate-cn行の行頭の;をとれば,複数台のクライアントで同じ証明書を使うことができる。

Windowsファイアウオールの設定

Windowsクライアントに接続するには,接続したいクライアントで,次のようにしてファイアウオールを開けておく必要がある: [スタート]-[Windowセキュリティ]-[ファイアーウォールとネットワーク保護]-[詳細設定]で[プロパティ]をクリック。[ドメインプロファイル]タブで[保護されているネットワーク接続]の[カスタマイズ]をクリックして,OpenVPNのインストールに伴ってできたOpenVPN Data Channel Offloadのチェックをはずす。プライベートプロファイル,パブリックプロファイルについても同じようにチェックをはずす。

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

# vi /etc/openvpn/server/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で同じ名前のクライアント証明書・鍵を作っても大丈夫(古い証明書は廃止され,同じ名前の新しい証明書が有効になる)。 

参考