Mac OS XでIPsec

'03.1.2 ('03.3.6更新)

Mac OS X 10.2では標準でIPsecに対応したのですが、入ってるだけですぐには使えません。ちょっとした設定で簡単に使えるようになります。超簡単コースと本格コースを用意しました。他機種との接続まで考える人は本格コースへどうぞ。

(自己責任で行ってください。暗号化されてるかどうかの確認も忘れずに)


OS Xのセキュア通信環境

「リモートログイン」はSSHですし、「インターネット接続」アプリケーションの「新規 VPN 接続ウインドウ」からは、クライアントとしてPPTPサーバに接続も可能です。それに引き換えIPsecには、GUIでの接続が用意されていないので、使うのは少し面倒です。(OS XのPPTPにはIPsecは使われていません)

サードパーティならGUIのツールも出ていますね。これを使うなら、あとの設定は必要ないです。
VaporSec (フリーウェア)

IPsecの超簡単設定

ここではracoon.confという設定ファイルをいっさいいじりません。そのかわりpsk.txtを直接書き換えるので、将来的にシステムが使うようになれば書き換えられてしまうかも。

ホスト A <192.168.0.2>とホスト B <192.168.0.8> のOS X同士で接続する場合で説明します。

Aに/etc/racoon/kame.confを作る

ファイルの内容は下記のように。

spdflush;
spdadd 192.168.0.8 192.168.0.2 any -P in ipsec esp/transport//require;
spdadd 192.168.0.2 192.168.0.8 any -P out ipsec esp/transport//require;

Bに/etc/racoon/kame.confを作る

上記とはIPアドレスが逆になります。

spdflush;
spdadd 192.168.0.2 192.168.0.8 any -P in ipsec esp/transport//require;
spdadd 192.168.0.8 192.168.0.2 any -P out ipsec esp/transport//require;

パスワード (事前共有鍵) を設定

/etc/racoon/psk.txtは接続時の認証を行う共有鍵 (秘密鍵) を記述したファイルです。OS Xインストール時にすでに存在してるってことは、すべてのMacで内容が同じってことで、全然秘密になってません 。なんと、すべてのMacが接続可能な状態です。なので書き換えます。下記はデフォルトのpsk.txtの内容。

# IPv4/v6 addresses
# 10.160.94.3    asecretkeygoeshere
# 172.16.1.133    asecretkeygoeshere
# 3ffe:501:410:ffff:200:86ff:fe05:80fa    asecretkeygoeshere
# 3ffe:501:410:ffff:210:4bff:fea2:8baa    asecretkeygoeshere

# USER_FQDN
macuser@localhost    somethingsecret
# FQDN
kame        hoge

/etc/racoon/racoon.confの内容によってpsk.txtの記述も変わってきますが、ここではracoon.confを書き換えなくても済むようにしてみます。下記の「***************」に適当な英数字を入れて共有鍵とします。桁数は変えてもかまいませんが、少なくなると安全度が下がります。kame hogeはコメントアウト。A、Bで同じものを記述します。

# IPv4/v6 addresses
# 10.160.94.3    asecretkeygoeshere
# 172.16.1.133    asecretkeygoeshere
# 3ffe:501:410:ffff:200:86ff:fe05:80fa    asecretkeygoeshere
# 3ffe:501:410:ffff:210:4bff:fea2:8baa    asecretkeygoeshere

# USER_FQDN
macuser@localhost    ***************
# FQDN
# kame        hoge

パーミッションの設定

psk.txtのパーミッションは600にして他に読まれないようにします。600でないとエラーになって実行されなくなるので、たとえテストでも変更が必要です。

% ls -l
total 32
-rw-r--r--  1 root  wheel   155 Jan  2 00:00 kame.conf
-rw-------  1 root  wheel   265 Jan  2 00:00 psk.txt
-rw-r--r--  1 root  wheel  3069 Jul 15 12:00 racoon.conf

setkeyとracoonを実行

A、BともにTerminalから下記を実行します。

% sudo setkey -f /etc/racoon/kame.conf
% sudo racoon

以上で<192.168.0.2>と<192.168.0.8>の間の通信はIPsecを使ったセキュアなものになり、片方が条件を満たしてなければ繋がらなくなります (再起動したら再実行が必要。自動化もできるでしょうね)。今回racoon.confはまったく書き換えてません。

IPsecの本格設定 (他機種と接続。将来性)

racoon.confは殆どインストール時のデフォルトの状態なので、きっちり設定するにはそれなりに書き換えが必要です。将来的にシステムが使うようになることも考慮して、ここではそれぞれmy_racoon.conf、my_kame.conf、my_psk.txtという別ファイルを作って設定します。

ホスト A <192.168.0.2>とホスト B <192.168.0.8> を接続する場合で、ホストAだけをOS Xとして設定することにします。

/etc/racoon/my_racoon.confを作って設定

デフォルトだとIPv6用の設定まで書いてあるし、いらないものを消すとかなりすっきりします。詳しい設定を知りたい人は「racoon.conf(5)」を読んでください。

path include "/etc/racoon" ;
path pre_shared_key "/etc/racoon/my_psk.txt" ;

padding
{
    maximum_length 20;    # maximum padding length.
    randomize off;        # enable randomize length.
    strict_check off;     # enable strict check.
    exclusive_tail off;   # extract last one octet.
}

timer
{
    # These value can be changed per remote node.
    counter 5;        # maximum trying count to send.
    interval 20 sec;  # maximum interval to resend.
    persend 1;        # the number of packets per a send.

    # timer for waiting to complete each phase.
    phase1 30 sec;
    phase2 15 sec;
}

remote 192.168.0.8
{
    exchange_mode aggressive,main;
    doi ipsec_doi;
    situation identity_only;

    my_identifier address "192.168.0.2";

    nonce_size 16;
    lifetime time 1 min;    # sec,min,hour
    initial_contact on;
    support_mip6 on;
    proposal_check obey;    # obey, strict or claim

    proposal {
        encryption_algorithm 3des;
        hash_algorithm sha1;
        authentication_method pre_shared_key ;
        dh_group 2 ;
    }
}

sainfo anonymous
{
    pfs_group 1;
    lifetime time 30 sec;
    encryption_algorithm 3des ;
    authentication_algorithm hmac_sha1;
    compression_algorithm deflate ;
}

/etc/racoon/my_psk.txtを作り事前共有鍵を設定

IPアドレスでの指定とします。*に適当な半角英数字を入れて鍵にします。

192.168.0.8    ***************

/etc/racoon/my_kame.confを作る

ファイルの内容は下記のように。

spdflush;
spdadd 192.168.0.8 192.168.0.2 any -P in ipsec esp/transport//require;
spdadd 192.168.0.2 192.168.0.8 any -P out ipsec esp/transport//require;

パーミッションの設定

my_psk.txtのパーミッションは600にして他に読まれないようにします。600でないとエラーになります。

% ls -l
total 32
-rw-r--r--  1 root  wheel   155 Jan  2 00:00 my_kame.conf
-rw-------  1 root  wheel   265 Jan  2 00:00 my_psk.txt
-rw-r--r--  1 root  wheel  3069 Jul 15 12:00 my_racoon.conf

setkeyとracoonを実行

Terminalから下記を実行します。

% sudo setkey -f /etc/racoon/my_kame.conf
% sudo racoon -f /etc/racoon/my_racoon.conf

さあ、次は相手側の設定です。相手もOS Xなら設定上のIPアドレスが入れ替わるだけです。

BSD系はOS Xと同じKAME (とracoon)、LinuxならFreeS/WAN、Windowsは2000以降標準搭載ですね。PGPnet (商用でなければフリー) はWindows95から対応で、Mac Classic版もあります。参考文献の「Linux以外のIPSecスタックとの相互接続[前編]」と、そこからのリンクに他機種での設定の詳しい解説があります。

動作確認

tcpdumpで確認すると以下のようになります。IPsec実行前と比べれば一目瞭然。psk.txtを書き換えなくても同じ内容になりますから、こういうログだから安心、とは限りませんね。(下記はWeb共有してブラウザでアクセスしたところ)

% sudo tcpdump host 192.168.0.2 and 192.168.0.8
tcpdump: listening on en0
20:22:54.853466 192.168.0.8.isakmp > 192.168.0.2.isakmp: isakmp: phase 1 I agg: [|sa]
20:22:55.311886 192.168.0.2.isakmp > 192.168.0.8.isakmp: isakmp: phase 1 R agg: [|sa]
20:22:56.964593 192.168.0.8.isakmp > 192.168.0.2.isakmp: isakmp: phase 1 I agg:
    (hash: len=20)
20:22:56.966263 192.168.0.8.isakmp > 192.168.0.2.isakmp: isakmp: phase 2/others I inf[E]: [encrypted hash]
20:22:56.967255 192.168.0.2.isakmp > 192.168.0.8.isakmp: isakmp: phase 2/others R inf[E]: [encrypted hash]
20:22:57.025765 192.168.0.8.isakmp > 192.168.0.2.isakmp: isakmp: phase 2/others I oakley-quick[E]: [encrypted hash]
20:22:57.106219 192.168.0.2.isakmp > 192.168.0.8.isakmp: isakmp: phase 2/others R oakley-quick[E]: [encrypted hash]
20:22:57.196785 192.168.0.8.isakmp > 192.168.0.2.isakmp: isakmp: phase 2/others I oakley-quick[E]: [encrypted hash]
20:23:01.289519 192.168.0.8 > 192.168.0.2: ESP(spi=0x0aeeb486,seq=0x2) (DF)
20:23:01.290353 192.168.0.2 > 192.168.0.8: ESP(spi=0x0365c949,seq=0x1) (DF)
20:23:01.290946 192.168.0.8 > 192.168.0.2: ESP(spi=0x0aeeb486,seq=0x3) (DF)

AirMacだと下記のようにしないとだめかも。

% sudo tcpdump -i en1 host 192.168.0.2 and 192.168.0.8

止めるときはcontrol+C

使用上の注意

参考文献