" />
[HOME]
        「家の外からも、sambaによるファイル共有を安全に行えたらいいな」と思ったのが、ことの発端です。OpenSSLで作成した証明書を使用して、その環境構築を行いました。
      
構成図がないと後から読み直しても理解するのに時間がかかります。絵心は全く持っていないため、ASCIIアートで表現。(小学生の時、何かの展示会で入賞した記憶はあるが...)
[ 無法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用に新規のネットワーク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 ]
      
        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
        /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の設定は以上です。
これまでの設定で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
        http://openvpn.sourceforge.netからWindows Installerをダウンロードしましょう。そして実行するだけで、Installは完了です。
      
        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の設定が完了しました。
無法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にしてください。
きちんと接続されているかを確認しましょう。まずは、無法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接続をクローズするときは、[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を使用してのファイル共有もきちんとできていることを確認しました。特に設定はいじってません。が、遅すぎる...