« VMwareのUbuntuサーバにNHMを設定したらネットにつながらなくてハマる | トップページ | Ubuntu11.10でシステムモニタを使用する »

2011/09/27

UbuntuにOpenVPNを導入する

OpenVPNは前から興味あったのですが、特に必要ともしていなかったので、こういうのがオープンソースであるのか。すげーなー。ぐらいに思っていました。
ところが社内でVPNを構築したいという話が持ち上がり、趣味と実益を兼ねて導入調査することになったのでした。

インストールした環境は
VMware上の Ubuntu Server 8.04 です。
あくまでも社内利用の検証なのでOSを合わせる必要があり古いのです。coldsweats01

クライアントは迷いましたが、
愛機 librettoU100 に入っている Ubuntu11.04 を 嫁所有のWiMAX(ルータ) から繋げば外部からの検証ができるかなと思いました。
サーバ、クライアント、共に Ubuntu ということです。

ちなみに、サーバとクライアントのLANのプライベートネットワークが一致していると、どちらのネットワークか判らなくなるため、異なっていないといけません。
たまたま自宅のLANとWiMAXルータのLANのネットワークが異なっていたためネットワークの変更は不要でした。
(たとえば、192.168.0.0/24と192.168.1.0/24 ならOKってことです。)

ネット上では汎用的に使えるブリッジ方式の情報が多いのですが、社内で使用することが前提なので、パフォーマンスを取ってルーティング方式にすることにしました。

ブリッジ方式とルーティング方式の違いは、
ブリッジ方式はブリッジの作成や起動手順が面倒だが、そこをクリアすればLANの設定は簡単。ルーティング方式に比べて制限が少ないがブロードキャストをVPNにも通すためパフォーマンスは悪い。
ルーティング方式は、インストールや設定は割りと簡単だが、LANの設定が面倒でルーティングに関する知識が必要。ブロードキャストできず、TCP/IPしか使えない。
って所でしょうか。

どちらの方式を選ぶかはけっこう重要で、中途半端にネットの情報をうのみにすると、両方の設定が含まれてしまいうまく動かなくなりハマります。


VPNとかルーティング関連にめっぽう弱いので、今回は本を買ってきて参考にしました。
OpenVPNで構築する 超簡単VPN入門
Webでは
TipsetOpenVPN導入1@Ubuntu 9.10
とか参考にしました。

以下、手順です。


インストール
sudo aptitude install openvpn

証明書の雛形をコピー(雛形がどこにあるのか、探しました。(汗))
cd /usr/share/doc/openvpn/examples/
sudo cp -R easy-rsa/ /etc/openvpn/

証明書設定ファイル修正
cd /etc/openvpn/easy-rsa/2.0
sudo vim vars
以下の部分を修正
export KEY_COUNTRY="JP"
export KEY_PROVINCE="都道府県"
export KEY_CITY="市とか"
export KEY_ORG="組織名とか"
export KEY_EMAIL="メールアドレス"

次に証明書を作るのですが、環境変数を設定するスクリプトと併用しなくてはなりません。
sudo でコマンドを叩けないようなこういう時、Debian 的にはどうすればいいのだ?
ネットで調べてもよく判らなかったので、ルートシェルを使うことにしました。

ルートシェルを起動
sudo -s

認証証明局作成
# . ./vars
# ./clean-all
# ./build-ca

サーバ証明書作成
# ./build-key-server server←サーバ名
質問は設定ファイルを修正した内容がデフォルトになるので、デフォルトでOKのはず。
パスワードは入力しない。(入力すると再起動時に毎回パスワードが必要になるそうな。)

証明書作成後はrootシェルから抜ける
# exit

サーバの設定
サンプル設定をコピー
cd /usr/share/doc/openvpn/examples/sample-config-files/
sudo cp server.conf.gz /etc/openvpn/
cd /etc/openvpn/
なぜか圧縮されているので解凍
sudo gunzip server.conf.gz

設定ファイルを修正
sudo vim server.conf
以下のパスをサーバ証明書のある場所に修正
ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert /etc/openvpn/easy-rsa/2.0/keys/server.crt
key /etc/openvpn/easy-rsa/2.0/keys/server.key # This file should be kept secret
dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem

;user nobody ←コメントをはずす
;group nobody ←group nogroup に修正

group nobody は動作確認時にエラーが出てハマりました。
Ubuntuには nobody っていうグループが無いんですね・・・。
ちなみに、ブリッジ方式ではもう少しデフォルト設定の修正箇所が多いみたいです。
書籍に載っている設定と全く同じでいけたので、バージョン間の設定の違いってあまり無いのかもしれません。
また、設定ファイルのコメントが詳しく書かれているので、翻訳サイトで翻訳しながら設定すればだいたい設定できてしまいます。
注意点は、ルーティング方式は仮想デバイスが tun なんで、tap に関する設定が載っているWebの情報は使えないって所でしょうか。

ネットワークアダプタの転送設定
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

sysctl.confも設定しておく
sudo vim /etc/sysctl.conf
#net.ipv4.ip_forward=1 ←コメントを外す


動作確認
cd /etc/openvpn
sudo openvpn server.conf

ここでエラーが出ずに起動し、待機状態になればOK。
Ctrl+Cキーで停止します。
ちなみに再起動すると起動スクリプトが既に設定されているようで、勝手に起動していました。


次はクライアント側の設定です。
Ubuntuって、ネットワークマネージャーからVPNに接続できるので、もちろんOpenVPNも使えるんだろうと思っていたら、デフォルトでは使えませんでした。が、ネットで調べると、network-manager-openvpn をインストールすれば使えそうなことは解りました。
しかし、具体的な設定方法に関しては検索しても見つけられませんでした。
一番参考にしたのは、Yahoo! の 知恵袋 のOpenVPNの使い方をわかりやすく教えてください。って記事でした。

とりあえず、OpenVPNサーバ側でクライアント証明書を作成します。
cd /etc/openvpn/easy-rsa/2.0
ルートシェルを起動
sudo -s
クライアント証明書作成
# . ./vars
# ./build-key-pass client1←クライアント名
質問はサーバ証明書と同じくデフォルトでOKのはず。
気をつけるのはパスワードで、ネットワークマネージャーを使う場合は設定が必須です。

Ubuntu に network-manager-openvpn-gnome を入れる
Gateway にOpenVPNサーバのグローバルIPかホスト名
OpenVPNサーバから
クライアントの.crt
ca.crt
クライアントの.key
ファイルを持ってきて、ファイルの場所を設定
PrivateKey Password に、証明書作成時に設定したパスワードを入力

Advanced の General の LZO にチェック

IPv4のセッティングタブの ルート を選択し、
「そのネットワーク上のリソースのためのみこの接続を使用」 にチェック

ここまでできたら、
OpenVPNサーバのあるLANのルータのIPマスカレードを設定し、UDPポート1194(デフォルトの設定の場合)をOpenVPNサーバへ向けます。
OpenVPNサーバを起動し、クライアントからインターネット経由で接続してみます。
(私は嫁所有のWiMAXルータを借りて検証しました。)
クライアントが接続できればOKです。
ちなみに私はここでかなりハマりました。

ハマりその1
VMware のネットワークの設定をNATにしていたため、そもそも外部からサーバへアクセスできませんでした。
ブリッジに変更して対応。初歩的なミスです。

ハマり その2
OpenVPNサーバのホスト名で接続したけど、サーバ側がウンともスンとも言わずに接続に失敗します。
そんなはずは、と思い、Webサーバに繋いでも落ちる。
そういえば、LAN内からWebサーバを検証できるようにhostsを書き換えていたんだっけ・・・。coldsweats01
グローバルIPにしたらあっさりアクセスできました。アホです。

ハマり その3
知恵袋の設定は ブリッジ方式の設定だったのですが、気づかずうのみにして Advancedの設定の tap にチェックを入れてしまったのでした。
ルーティング方式ではチェックしてはいけない。
OpenVPNサーバで警告が吐かれていて気づきました。


ちなみにOpenVPNサーバをデーモンではなく直接起動するとメッセージを吐いてくれるので問題の切り分けに役立ちます。
sudo ps -C openvpn
としてみてデーモンが動いているようなら
sudo kill プロセスID で止める。
cd /etc/openvpn
sudo openvpn server.conf
で起動できます。


ここまでで、クライアントからサーバへの接続ができるのは解りました。
が、最難関(のはず)のルーティング設定が残っています。
今の状態だと、OpenVPNサーバ以外にあるNAS等を見に行った場合、戻りのパケットがルータを経由してしまいルータで破棄されて永遠に戻ってきません。
本を読むまではここのクリア方法が解らず、OpenVPNサーバはルータと同じ所に無いといけない、と思っていました。
ところが本では、iptables を使って送付元アドレスをOpenVPNサーバのアドレスに書き換えれば、正常にパケットが戻ってくると書いてありました。

まず、server.conf を修正します。
124行目付近の
;push "適当なIPとサブネットマスクが書かれている"
とコメントされている箇所があるので、参考にしてOpenVPNサーバのネットワークを記載します。
これでクライアント側にサーバ側のネットワークが判るようになり、VPN接続後はサーバ側のプライベートIPでサーバ側へアクセスできるようになります。

OpenVPNの再起動は、
sudo /etc/init.d/openvpn restart
でOKです。

で、
サーバ側のネットワークが '192.168.1.0/24'
サーバのIPが '192.168.1.100'
OpenVPNの仮想ネットワークが '10.8.0.0/24'(デフォルトの設定)
の場合、

#/bin/sh
iptables -t nat -F POSTROUTING
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s '10.8.0.0/24' -d '192.168.1.0/24' -j SNAT --to '192.168.1.100'

みたいなスクリプトファイルを作成して実行します。
正常だと何も起こったように見えないのですが、サーバ側のNASとかにアクセスできるようになっています。

一番の関門が割と簡単にクリアできて助かりました。
上記スクリプトはほぼ本に載っていたものと同じですが、微妙に間違っていた箇所を修正しているので大目に見てください。(笑)
このスクリプトを /etc/openvpn/openvpn-startup ファイルから起動させると起動時に実行してくれるそうです。(未検証)

インターネット経由で自宅LAN内が見れるのはちょっと感動しました。

|

« VMwareのUbuntuサーバにNHMを設定したらネットにつながらなくてハマる | トップページ | Ubuntu11.10でシステムモニタを使用する »

Ubuntu」カテゴリの記事

コメント

>ちなみにOpenVPNサーバをデーモンではなく直接起動するとメッセージを吐いてくれるので問題の切り分けに役立ちます。

投稿から相当時間が立っていますが、
非常役立ちました。ありがとうございました。

投稿: | 2015/10/04 23:13

お役にたてて何よりです。
ログの件は、書籍の受け売りなんですけどね。(汗)
通常ログより判りやすくて便利ですよね。

投稿: ひろちゃん | 2015/10/05 22:55

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/54336/52836343

この記事へのトラックバック一覧です: UbuntuにOpenVPNを導入する:

« VMwareのUbuntuサーバにNHMを設定したらネットにつながらなくてハマる | トップページ | Ubuntu11.10でシステムモニタを使用する »