" /> OpenVPN 2.0_beta15

OpenVPN 2.0_beta15

OpenVPNを使って...

「家の外からも、sambaによるファイル共有を安全に行えたらいいな」と思ったのが、ことの発端です。OpenSSLで作成した証明書を使用して、その環境構築を行いました。

ネットワーク構成図

構成図がないと後から読み直しても理解するのに時間がかかります。絵心は全く持っていないため、ASCIIアートで表現。(小学生の時、何かの展示会で入賞した記憶はあるが...)

ネットワーク構成図(VPN環境構築前)

[ 無法PC ]
  |202.xxx.yyy.zzz
  |
--+--------+------------------
           |

        NSPIXP etc...

           |
-----------+--------+---------         ここから上が無法地帯、下が我が家(決して無法地帯では...ない)
                    |
                    |61.205.236.173
           +--------+--------+ (Linux Box)
           |      [WAN]      |
           |        |        |
           |      [NAT]      |
           |        |        |
           |   IP Routing    |
           |        |        |
           |      [LAN]      |
           +--------+--------+
                    |192.168.0.254
                    |                                    192.168.0.0/24
  ----+-------------+--------+----------------+------------------------------
      |                      |                |
      |192.168.0.250         |192.168.0.10    |192.168.0.20  ...
 [ SERVER ]                [ PC ]           [ PC ]

SERVER には、sambaを含めて、その他サーバも動作しています。

ネットワーク構成図(VPN環境構築後)

今回は、VPN用に新規のネットワークIDを払い出すことにしました。Ethernetブリッジを使用すれば、すっきりするかなとも思ったのですが、それは次の機会としました。

[ 無法PC ]
  |    202.xxx.yyy.zzz
  |VPN:192.168.100.100
--+--------+------------------
           |

        NSPIXP etc...

           |
-----------+--------+---------         ここから上が無法地帯、下が我が家(決して無法地帯では...ない)
                    |
                    |61.205.236.173
           +--------+--------+ (Linux Box)
           |      [WAN]      |
           |        |        |
           |      [NAT]      |
           |        |        |
           |   IP Routing    |
           |        |        |
           |      [LAN]      |
           +--------+--------+
                    |    192.168.0.254
                    |VPN:192.168.100.1
                    |                                    192.168.0.0/24
  ----+-------------+--------+----------------+------------------------------
      |                      |                |
      |192.168.0.250         |192.168.0.10    |192.168.0.20  ...
 [ SERVER ]                [ PC ]           [ PC ]

Linux Server(192.168.0.254)での作業

OpenVPNのrebuild&install

RPMを作成しませう。http://openvpn.sourceforge.netからTarballをダウンロードしましょう。

$ tar zxvf openvpn-2.0_beta15.tar.gz
$ cp -a openvpn-2.0_beta15/openvpn.spec ~/rpm/SPECS
$ cp -a openvpn-2.0_beta15.tar.gz ~/rpm/SOURCES
$ rpmbuild -ba --target=i686 ~/rpm/SPECS/openvpn.spec

lzo圧縮がうんぬんかんぬんでエラーとなります。SPECファイルを修正すればよいのでしょうが、致命的欠陥の場合を除いてSPECファイルは修正したくないので、lzo-1.08-3.dag.src.rpmを先んじてrebuild&install。これで問題なく、openvpnもrebuildできました。

RPMをインストールしませう。

$ cd ~/rpm/RPMS/i686
$ sudo rpm -ivh openvpn-2.0_beta15-1.i686.rpm

OpenVPNの設定

/etc/openvpnというディレクトリが作成されます。ここに設定ファイルを格納していきます。なお、設定ファイルはその拡張子が .conf であれば名称は問われません。(/etc/rc.d/init.d/openvpn 参照)
とりあえず、Linuxサーバの設定ファイルを見てみましょう。

$ sudo cat /etc/openvpn/tls-server.conf
cd              /etc/openvpn
tls-server
dev             tap0                        # トンネルデバイス
#proto          tcp-server                  # tls-serverを指定するときは、指定しないこと!

ifconfig        192.168.100.1 255.255.255.0 # VPN上でのIPアドレス

local           192.168.0.254               # LAN上でのIPアドレス
port            5000                        # OpenVPNの待ち受けPort番号(デフォルトは5000)

dh              dh2048.pem                  # Diffie-Hellmanパラメータ
ca              /etc/ssl/CA/cacert.pem      # 自己署名型CA証明書(認証機関の証明書)
cert            mx-cert.pem                 # 認証機関署名済みサーバ証明書
key             mx.pem                      # サーバ証明書の秘密鍵
#key-method     2                           # サーバとクライアントでOpenVPNのバージョンが違うと設定せざるを得なくなる可能性大

persist-key
persist-tun
ping-restart    600
ping            60

comp-lzo                                    # LZO圧縮

verb            1                           # debug(0, 1, 2, 3, 9)
mute            10                          # mute
$

dh、ca、cert、keyの各パラメータに指定しているファイルの作成方法は、freeradius 0.9.3 & openssl 0.9.7dで802.1x EAP-TLS認証なるものを...(解説編)の[Diffie-Hellmanパラメータの作成]、[認証機関(CA)の設立]、[サーバ証明書の作成]の各項を参照ください。
なお、上記URIのとおりサーバ証明書の秘密鍵を作成するとそのアクセスの度(=OpenVPNの起動の度)にパスフレーズの入力が必要となります。運用をどうするのかに依るところですが、これが手間と考える場合は以下のコマンドで共通鍵で暗号化された秘密鍵を復号化しておき、それを指定すればよいです。

# openssl rsa -in mx.pem -out mx.privkey.pem

OpenVPNの設定は以上です。

IPルーティングの設定

これまでの設定でOpenVPNは起動はできますが、VPNに係わるパケットが思ったとおりに飛び交いません。そこで必要となるのが、VPNのIPルーティング設定です。

まずは、無法地帯から飛んでくるVPN接続要求のパケットをLinux Server(192.168.0.254)にディスパッチさせる、いわゆるNATです。以下に必要最低限のiptablesコマンドを記します。

# iptables -A PREROUTING -d 61.205.236.173 -p tcp -m tcp --dport 5000 -j DNAT --to-destination 192.168.0.254:5000
# iptables -A PREROUTING -d 61.205.236.173 -p udp -m udp --dport 5000 -j DNAT --to-destination 192.168.0.254:5000
#
# iptables -A INPUT -i ppp0 -j ppp-in
# iptables -A ppp-in -p tcp -m state --state NEW -m tcp --dport 5000 -j ACCEPT
# iptables -A ppp-in -p udp -m udp --dport 5000 -j ACCEPT

続いて、VPN接続が完了した後にVPNからのパケットを受け取るための設定です。

# iptables -A INPUT -i tap+ -j ACCEPT

無法PC(202.xxx.yyy.zzz)での作業

OpenVPNのInstall

http://openvpn.sourceforge.netからWindows Installerをダウンロードしましょう。そして実行するだけで、Installは完了です。

OpenVPNの設定

C:\Program Files\OpenVPN\config\vpnclient.conf として設定ファイルを作成しました。内容は以下のとおり。

tls-client

dev             tap                      # トンネルデバイス
remote          61.205.236.173           # OpenVPNサーバのIPアドレス
port            5000                     # OpenVPNサーバのPort番号
#proto          tcp-client

ifconfig 192.168.100.100 255.255.255.0   # VPN上でのIPアドレス

ca              config\\cacert.pem       # 自己署名型CA証明書(認証機関の証明書)
cert            config\\noguchi-cert.pem # 認証機関署名済みクライアント証明書
key             config\\noguchi.pem      # クライアント証明書の秘密鍵

persist-key
persist-tun
ping-restart    1800
ping            60

#key-method     2

comp-lzo                                 # LZO圧縮

route           192.168.0.0 255.255.255.0 192.168.100.1

verb            3                        # debug(1, 2, 3, 9)
mute            10                       # mute

ca、cert、keyの各パラメータに指定しているファイルの作成方法は、freeradius 0.9.3 & openssl 0.9.7dで802.1x EAP-TLS認証なるものを...(解説編)の[認証機関(CA)の設立]、[クライアント証明書の作成]の各項を参照ください。

これでサーバ、クライアントともOpenVPNの設定が完了しました。

VPN接続

VPNに接続してみる

無法PC上にてコマンドプロンプトを立ち上げ、openvpnを実行します。

C:\>cd C:\Program Files\OpenVPN
C:\Program Files\OpenVPN>
C:\Program Files\OpenVPN>openvpn --config config/vpnclient.conf
Sun Nov 07 20:32:04 2004 OpenVPN 2.0_beta15 Win32-MinGW [SSL] [LZO] built on Oct
 28 2004
Enter Private Key Password:

クライアント証明書の秘密鍵に対するパスフレーズを入力します。すると...

Sun Nov 07 20:32:08 2004 LZO compression initialized
Sun Nov 07 20:32:08 2004 Control Channel MTU parms [ L:1574 D:138 EF:38 EB:0 ET:
0 EL:0 ]
Sun Nov 07 20:32:08 2004 TAP-WIN32 device [VPN 接続] opened: \\.\Gl
obal\{3D693549-6189-4B5F-8A39-5E647F7F2BE8}.tap
Sun Nov 07 20:32:08 2004 TAP-Win32 Driver Version 8.1
Sun Nov 07 20:32:08 2004 TAP-Win32 MTU=1500
Sun Nov 07 20:32:08 2004 Notified TAP-Win32 driver to set a DHCP IP/netmask of 1
92.168.100.100/255.255.255.0 on interface {3D693549-6189-4B5F-8A39-5E647F7F2BE8} [
DHCP-serv: 192.168.100.0, lease-time: 31536000]
Sun Nov 07 20:32:08 2004 Successful ARP Flush on interface [1376261] {3D693549-6
189-4B5F-8A39-5E647F7F2BE8}
Sun Nov 07 20:32:08 2004 Data Channel MTU parms [ L:1574 D:1450 EF:42 EB:19 ET:3
2 EL:0 ]
Sun Nov 07 20:32:08 2004 Local Options hash (VER=V4): '4bf8e197'
Sun Nov 07 20:32:08 2004 Expected Remote Options hash (VER=V4): '2f06f1e2'
Sun Nov 07 20:32:08 2004 UDPv4 link local (bound): [undef]:5000
Sun Nov 07 20:32:08 2004 UDPv4 link remote: 61.205.236.173:5000
Sun Nov 07 20:32:08 2004 TLS: Initial packet from 61.205.236.173:5000, sid=919af
a05 8f55dc19
Sun Nov 07 20:32:08 2004 VERIFY OK: depth=1, /C=JP/O=ORG3.NET/OU=ORG3.NET_CA/CN=
ORG3.NET_Certification_Authority
Sun Nov 07 20:32:08 2004 VERIFY OK: depth=0, /C=JP/O=ORG3.NET/OU=ORG3.NET_CA/CN=
a.mx.org3.net
Sun Nov 07 20:32:10 2004 Data Channel Encrypt: Cipher 'BF-CBC' initialized with
128 bit key
Sun Nov 07 20:32:10 2004 Data Channel Encrypt: Using 160 bit message hash 'SHA1'
 for HMAC authentication
Sun Nov 07 20:32:10 2004 Data Channel Decrypt: Cipher 'BF-CBC' initialized with
128 bit key
Sun Nov 07 20:32:10 2004 Data Channel Decrypt: Using 160 bit message hash 'SHA1'
 for HMAC authentication
Sun Nov 07 20:32:10 2004 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES2
56-SHA, 1024 bit RSA
Sun Nov 07 20:32:10 2004 [a.mx.org3.net] Peer Connection Initiated with 61.205.2
36.173:5000
Sun Nov 07 20:32:10 2004 TEST ROUTES: 1/1 succeeded len=1 ret=1 a=0 u/d=up
Sun Nov 07 20:32:10 2004 route ADD 192.168.0.0 MASK 255.255.255.0 192.168.100.1
Sun Nov 07 20:32:10 2004 Route addition via IPAPI succeeded
Sun Nov 07 20:32:10 2004 Initialization Sequence Completed

※必要最低限の情報のみをスクリーン表示させたい場合は、verbを0にしてください。

VPN接続の確認

きちんと接続されているかを確認しましょう。まずは、無法PC上からの確認です。もう1つコマンドプロンプトを起動して、pingコマンドを実行してみましょう。

C:\>ping 192.168.100.1

Pinging 192.168.100.1 with 32 bytes of data:

Reply from 192.168.100.1: bytes=32 time=585ms TTL=64
Reply from 192.168.100.1: bytes=32 time=597ms TTL=64
Reply from 192.168.100.1: bytes=32 time=479ms TTL=64
Reply from 192.168.100.1: bytes=32 time=487ms TTL=64

Ping statistics for 192.168.100.1:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 479ms, Maximum = 597ms, Average = 537ms

C:\>

パケットが飛ぶことが確認できました。続いては、LAN側のPCに対してpingコマンドを実行してみましょう。

C:\>ping 192.168.0.20

Pinging 192.168.0.20 with 32 bytes of data:

Reply from 192.168.0.20: bytes=32 time=633ms TTL=249
Reply from 192.168.0.20: bytes=32 time=529ms TTL=249
Reply from 192.168.0.20: bytes=32 time=471ms TTL=249
Reply from 192.168.0.20: bytes=32 time=600ms TTL=249

Ping statistics for 192.168.0.20:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 471ms, Maximum = 633ms, Average = 558ms

C:\>

こちらも大丈夫のようです。きちんとroutingされているかを確認するため、tracertコマンドで確認してみます。

C:\>tracert 192.168.0.20

Tracing route to 192.168.0.20 over a maximum of 30 hops

  1   730 ms   769 ms   629 ms  192.168.100.1
  2   635 ms   489 ms   583 ms  192.168.0.20

Trace complete.

C:\>

こちらも問題ありません。

さて次は、我が家(192.168.0.254)から無法PCにpingを実行してみます。

$ ping 192.168.100.100
PING 192.168.100.100 (192.168.100.100) 56(84) bytes of data.
64 バイト応答 送信元 192.168.100.100: icmp_seq=0 ttl=128 時間=1163 ミリ秒
64 バイト応答 送信元 192.168.100.100: icmp_seq=1 ttl=128 時間=484 ミリ秒
64 バイト応答 送信元 192.168.100.100: icmp_seq=2 ttl=128 時間=577 ミリ秒
64 バイト応答 送信元 192.168.100.100: icmp_seq=3 ttl=128 時間=478 ミリ秒
64 バイト応答 送信元 192.168.100.100: icmp_seq=4 ttl=128 時間=451 ミリ秒
64 バイト応答 送信元 192.168.100.100: icmp_seq=5 ttl=128 時間=426 ミリ秒

--- 192.168.100.100 ping 統計 ---
送信パケット数 7, 受信パケット数 6, パケット損失 14%, 時間 6063ミリ秒
rtt 最小/平均/最大/mdev = 426.246/597.001/1163.490/257.634ミリ秒, pipe 3
$

こちらも問題ありません、めでたしめでたし。

VPN接続の終了

VPN接続をクローズするときは、[F4]を押下します。

Sun Nov 07 20:32:39 2004 TCP/UDP: Closing socket
Sun Nov 07 20:32:39 2004 route DELETE 192.168.0.0
Sun Nov 07 20:32:39 2004 Route deletion via IPAPI succeeded
Sun Nov 07 20:32:39 2004 Closing TUN/TAP interface
Sun Nov 07 20:32:39 2004 SIGTERM[hard,] received, process exiting

C:\Program Files\OpenVPN>

ところでsambaは?

最終目的であったsambaを使用してのファイル共有もきちんとできていることを確認しました。特に設定はいじってません。が、遅すぎる...