OpenVPN 

OpenVPNです。実はこのVPNという言葉、意外と知っている人は多いのです。
なぜかというと、外からパソコンを使って自分の会社のファイルを閲覧したり更新したりしなければならない仕事に就いているひとは、実はほとんどがこのVPNと言うシステムを使っています。NTTでもどこでも、意外にVPNサービスというのは成熟しており、使っている企業も多いのです。

抑えておきたいサイト

OpenVPN日本語サイト
OpenVPN本家サイト

日本語サイトは解説が非常に良くできています。
正直そっちを読んだほうが(笑)

 

OpenVPNのインストール

# aptitude install openvpn
liblzo2-2{a} libpkcs11-helper1{a} openvpn openvpn-blacklist{a}

・・・例によって普通にインストールしてください。
liblzoは通信する際に圧縮して情報の送受信を行えますので、速くなります。

# /etc/init.d/openvpn stop

・・・念のためにopenvpnを停止させてください。

 

 ちょっと下ごしらえ① 

ひと通り終えてからでも構わないのですが、実は以下のディレクトリ内に「設定ファイルのひな形」が用意されていますので、とりあえず/etc/openvpnに置いといてあげます。

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

# gunzip /etc/openvpn/server.conf.gz

# ls /etc/openvpn

server.conf

ここまでOK?ちなみに、gunzip 入ってない場合はインストールしてください。

( # aptitude install gunzip )

それでは鍵や証明書を作成して行きましょう。
初めての人は未知なる単語や用語やらが一気に畳み掛けてきますので超大変に感じると思います。
でも、やっていることはただファイルを作って所定の場所に移動しているだけなのです。

 

 証明書・各種秘密鍵の作成 

# cd /usr/share/doc/openvpn/examples/easy-rsa/2.0
以降、しばらくの間はこのディレクトリ上で作業します。勝手に出ないでくださいっ。プリッ

 ちょっと下ごしらえ② 

本格的な作業に入る前に少しだけvarsを編集します。
他の項目も、よく見れば簡単な英語で書かれていますので、適時編集してください。

# vi vars
export KEY_SIZE=2048
何ビットのRSA鍵を作成するかの設定します。

1024以上にすることは冗長設定です。
2048ビットはTLSの処理を遅くします。
公式サイトには少し遅くなる的なことが書いてありますが、実際は体感できるくらい遅くなります。

export KEY_COUNTRY="JP"
export KEY_PROVINCE="Kanagawa"
export KEY_CITY="Yokohama"
export KEY_ORG="MINAMI-SERVER"
export KEY_EMAIL="このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。"

[i]文字の書き始め。
[ESC]でコマンドモード。
[ESC][:][q][!][Enter] で保存せずviから抜ける。
[ESC][:][w][q][Enter] で保存。

もちろん内容は適時自分のものに書き換えてください。

 認証局(CA局)を作成 

# . ./vars

NOTE: when you run ./clean-all, I will be doing a rm -rf on /usr/share/doc/openvpn/examples/easy-rsa/keys


# ./clean-all


初期化です。
このコマンドを打った後にvarsを編集したりしないでください。
上記にもあるように、./clean-all をすることで、keysの中身をすべて消去(rm -rf)します。
作られたキーが霊感的に納得がいかなかったり、何度も作って体に覚え込ませたいなどやり直したいときにこれを実行します。


# ./build-ca

Generating a 2048 bit RSA private key
............................................+++
....................................+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]:
State or Province Name (full name) [Kanagawa]:
Locality Name (eg, city) [Yokohama]:
Organization Name (eg, company) [MINAMI-SERVER]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [MINAMI-SERVER CA]:
Name []:
Email Address [このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。]:

完了です。Common Name だけ注意してください。
この先、Common Name を打つ場合は、絶対に重なってはなりません。

CA局開局元年おめでとうございます。

では、何が作られたか見てみましょう。

# ls keys
ca.crt ca.key index.txt serial

ca.crt はCA証明書。
ca.key はCA局の鍵。

証明書という言葉が使われていますが、これはSSLで慣習的に使われる言い回しのようで、認識としては『公開鍵』としても差し支えないようです。
誰にでも公開され、暗号化するときに鍵をかけるために使用できるものです。

バッチリですか?これからまだまだ先は長いですよ?

 VPNサーバー本体の証明書と鍵の作成 

それっていま作ったんじゃないの?と思った人。
四の五の言わずルーチンワークに従ってください。
いままで作っていたものは、あくまで認証(CA)局の証明書と鍵です。
局とか言ってしまうと、あちこちにサーバーがあるイメージが起きてしまいますが、証明書とかCA局とかすべて一つのサーバー内での話です。(もちろん分けても出来ます。ここではあくまで自宅サーバーなどの単一PCでどうするか?で扱います。企業などはおとなしくYAMAHAルーターを使って下さい。)
次はVPNサーバー本体のものを作ります。
SSLの世界は複雑なのです。

# ./build-key-server MINAMI-SERVER-OVPN

Generating a 2048 bit RSA private key
...............+++
..................................................................+++
writing new private key to 'MINAMI-SERVER-OVPN.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]:
State or Province Name (full name) [Kanagawa]:
Locality Name (eg, city) [Yokohama]:
Organization Name (eg, company) [MINAMI-SERVER]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [MINAMI-SERVER-OVPN]:
Name []:
Email Address [このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/share/doc/openvpn/examples/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'JP'
stateOrProvinceName :PRINTABLE:'Kanagawa'
localityName :PRINTABLE:'Yokohama'
organizationName :PRINTABLE:'MINAMI-SERVER'
commonName :PRINTABLE:'MINAMI-SERVER-OVPN'
emailAddress :IA5STRING:このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。'
Certificate is to be certified until Feb 20 14:56:59 2022 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

またまた中身を拝見してみましょう。

# ls keys

01.pem  MINAMI-SERVER-OVPN.csr ca.crt index.txt
 MINAMI-SERVER-OVPN.crt  MINAMI-SERVER-OVPN.key ca.key index.txt.attr serial

なんだか、色々増えましたね。

MINAMI-SERVER-OVPN.crt 証明書
MINAMI-SERVER-OVPN.csr CA局への証明要求書
MINAMI-SERVER-OVPN.key 鍵

上の csr が初めはみんな分かりづらいのです。
csr はさっき作ったCA認証局にたどり着くと、CA局がハンコを押した証明書を作成して返してくれます。
その名の通り、証明を要求しているわけです。
これで正しく自分の求めている場所にアクセスしてるんだなぁ。と確証が取れるわけです。
でも、ここまで話しを広げておいてなんですが、実はこのcsrファイルはVPN接続では通常使用されません。
あしからず。
削除してしまっても何ら差し支えありません。

 ユーザー鍵と証明書の作成 

・・・今後、ユーザーを増やすときにはこれを繰り返します。

# ./build-key-pass horikita

Generating a 2048 bit RSA private key
....+++
..........................+++
writing new private key to 'horikita.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]:
State or Province Name (full name) [Kanagawa]:
Locality Name (eg, city) [Yokohama]:
Organization Name (eg, company) [MINAMI-SERVER]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [horikita]:
Name []:
Email Address [このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/share/doc/openvpn/examples/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'JP'
stateOrProvinceName :PRINTABLE:'Kanagawa'
localityName :PRINTABLE:'Yokohama'
organizationName :PRINTABLE:'MINAMI-SERVER'
commonName :PRINTABLE:'horikita'
emailAddress :IA5STRING:このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。'
Certificate is to be certified until Feb 20 15:03:05 2022 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

これでユーザー horikita の鍵と証明書が作成出来ました。

 DeffieHellmanパラメータの作成 

# ./build-dh

Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
..........................................................+.....................................+...................

中略
そのままコピペしたらひどいことになった(笑)

+....................+.......................................................................+..............++*++*

2048ビットで指定した場合、かなり時間がかかったのではないでしょうか?
この間は20分以上かかったかな?去年作ったときは6~7分だったかな?
とりあえずコレで、 dh2048.pem というファイルができあがり、作成しなければならないものはすべて完了です。
これは、サーバーがユーザーと鍵を交換する際に、暗号化するための元になるパラメータ(媒介数)です。(だそうです。)
パラメータとは、イメージ的には酵素です。
自分自身は性格を変えずに、周りに影響を与えまくるアレです。
まあ、いろいろ考えずに、これがSSL/TLSには必要なのだと覚えた方が良さそうです。

 /etc/openvpn へファイルの移動 

さて、そうしましたら、これらkeysディレクトリに作成されたファイルで必要なものを /etc/openvpn ディレクトリに移動してしまいましょう。
その前に、一度中身を見てみようではありませんか?

赤字・・・/etc/openvpn へ。
青字・・・ユーザーのパソコンへ。
紫字・・・両方に必要。

# cd keys

# ls
01.pem MINAMI-SERVER-OVPN.csr horikita.csr ca.key index.txt.attr serial
02.pem MINAMI-SERVER-OVPN.key horikita.key dh2048.pem
MINAMI-SERVER-OVPN.crt horikita.crt ca.crt index.txt

ワケ分らなくなってきましたねー。
必要なものをとっとと移動(ca.crtだけはコピー)しましょう。
コピーや移動は人によってやり方や手癖が違うと思いますので、自由勝手にやってください。
ca.crtだけは、クライアント側でも必要なので、このまま作業をするときは移動よりはコピーにしておけばここに残ります。

# mv MINAMI-SERVER-OVPN.crt MINAMI-SERVER-OVPN.key dh2048.pem /etc/openvpn/

# cp ca.crt /etc/openvpn/

色々なファイルがごった返していますが、サーバー側で使うのは上記の4ファイルだけです。
/etc/openvpn に移動(mv)・コピー(cp)してください。
どのファイルも大切なのですが、特に *.key ファイルは重要です。
無くしたり人に上げたり年貢として納めたりしないでください。

 使うパソコンにどうにかして移動 

# ls
01.pem 02.pem MINAMI-SERVER-OVPN.csr horikita.crt horikita.csr horikita.key ca.crt ca.key index.txt index.txt.attr serial

# mv horikita.crt horikita.key ca.crt /クライアントの/PCへ/どうにかして/移動

次は、上記の3つのファイルを頑張ってアクセスする対象のパソコンに移してください。
方法はUSBでもフロッピーでもsambaでもなんでも良いです。

 server.conf の編集 

# cd /etc/openvpn
# vi server.conf

port 1194
proto udp
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/MINAMI-SERVER-OVPN.crt
key /etc/openvpn/MINAMI-SERVER-OVPN.key
dh /etc/openvpn/dh2048.pem
server 10.8.0.0 255.255.255.0
push "route 192.168.1.1 255.255.255.0"
・・・自分のルーターのゲートウェイとサブネットを記述してください。
comp-lzo
user nobody
・・・セキュリティ向上のためLINUX系サーバーはこの行を設定してください。
group nogroup
・・・セキュリティ向上のためLINUX系サーバーはこの行を設定してください。

以上を確認・編集をしてください。
その他の細かい編集は各自気の済むまでおこなってください。

 ta.keyについて 

もっと安全にできるらしいです。
仕組みはよく知らないのですが、これを設定すると毎回署名があるか確認をするようになるらしいです。
作り方自体はものすごく簡単で、

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

これだけで共有鍵の作成完了です。
作成されたta.keyはサーバー、ユーザー共に持っていなくてはなりません。
さらに、server.conf client.ovpn をそれぞれ以下のように編集します。

server.confには
tls-auth ta.key 0

.opvnファイルには
tls-auth ta.key 1

を追加すればOKです。
これをすることで、様々な攻撃や不具合・成りすまし等からの耐性を持つことができるそうです。
自分はやってないのですが、たった2~3分の手間で、メリットは大きいと思います。

 サーバー自体の設定 

# vi /etc/sysctl.conf

net.ipv4.ip_forward=1
・・・ip fowardを許可してください。

いままで言うの忘れてましたが、今回の設定はブリッジ(tap)接続ではなく、ルーター(tun)接続です。
サーバーをルーターにして上げなければなりません。

 OpenVPNドキドキの起動 

# /etc/init.d/openvpn start
Starting virtual private network daemon: server.

となっていれば、成功です。faild!などのエラーが出た場合はとにかく試行錯誤してください。
どこかの記述が必ず間違っています。

 

 ルーターの設定 

ルーターの設定です。
さて、ここまでやっておいて何なのですが、このルーターの設定でつまずく人が非常に多いらしいです。
場合によってはルーターにその機能がないため、そもそも外に公開できないかも?なんて記事もよく見かけます。
でも、最近のルーターであればほぼ、っていうか、絶対できるはずですのであきらめずに頑張ってください。

『外部に公開するポート』はUDP1194ポートを使用します。(変えることも出来ます。)
これは、OpenVPNを設定したときに、TCPを使うかUDPを使うか決めたと思いますので、それに従ってください。
TCPorUDPに関しては色々文献があり、いわゆるTCPoverTCPを非効率だと考える人が多く、実際にもの凄く非効率的です。
まあ、遅いインターネットでの話ですが。
TCPはパケットの整合性を逐一検査。
UDPはパケット垂れ流し。
と言うのがありまして、UDPは転送されたパケットの整合性を保証していません。
一見UDPの方が悪いように感じますが、要するに、たかだかファイルのやり取りをするのにTCPはいちいちチェックが激しすぎるから遅い回線だとトロいし、不安定になる要素がものすごく多いよ。
て言うようなことらしいです。

さて、ポートの開放が済みますといよいよあなたのサーバーは外に公開されています。
誰でも玄関までは来ることができてしまうということです!どきどき。
まあ、VPNなんてのはそもそもローカルではなくてお外を通すためのものですから、内側で自己満足をしていても何の意味もないです。
勇気を出してくださいっ!

また、もう一つ『LAN側の静的ルーティング』が必ず必要になります。
これが出来ないルーターがあるらしいです。
でも、言葉を換えて存在するかも知れません。
具体的には、IPルーティングテーブルの静的登録が可能な設定を探すのですが、たとえば、10.8.0.0/24宛に来たパケットを192.168.1.100などのサーバーのアドレス(ゲートウェイ)に相互に飛ばせるような設定です。

 

 仮想ネットワークカードの設定 

OpenVPN GUI をインストールすると、自動的に Tap-WIN32 という仮想ネットワークカードがインストールされます。
実はサーバー側にもOpenVPNをインストールしたときに、どさくさにまぎれて導入されています。
早い話が、サーバー側・クライアント側両者にこの仮想ネットワークカードを入れて、それ同士で暗号通信させ合いましょう!というチョコザイな画期的な寸法なのです。
と、そこでそのTapに割り当てられるアドレスが、10.8.0.0/24系統ということになります。
と言うことは、一つのパソコン内に192.系統と10.系統が混在するわけです。
192.系統のルーターには192.系統のアドレス処理しか行いませんので、別のネットワーク空間である10.系統が来た時だけ特別ルールを適用してあげねばなりません。
そのため、上の項目で行った"静的ルーティング設定"が必ず必要になるわけです。
ここで意外と「仮想」という文字に惑わされる人が多いのですが、ただ単にソフトで作られたネットワークカードと思ってください。実体はありません。
しかし、デバイスマネージャーを覗くとちゃんとカードとして認識されているはずです。

接続に成功するとサーバーの設定によってはインターネットができなくなったりします。
この原因はDNSが探せないためです。
なので、あせらずTap-WIN32のDNSサーバーを192.168.1.1(ルーターのDNSアドレス)のように設定してあげれば問題解決となります。

 

 sambaの設定 

さんばの設定です。
環境によってまちまちですが、ポイントをメモしておきます。

・smb.confのallowhostsを正しく設定
(例)
allowhosts 127.0.0.1 10.8.0.0/255.255.255.0 192.168.0.0/24

のように設定します。サブネットは別にCIDRでも構いません。

まあ、こんな感じです。

コメントを追加(どなたでも投稿できます)
  • コメントはありません