タイトルBrowsing Mac OS X》Mac OS XでNAT処理を行う(2)カテゴリーネットワーク管理, ネットワーク, Browsing Mac OS X
作成日2001/8/28 11:12:3作成者新居雅行
Mac OS XでNATの動作を行うには、まず、/etc/hostconfigというファイルを修正する。そのファイルにある「IPFORWARDING=-NO-」を「IPFORWARDING=-YES-」に変更する。そして、再起動する。この設定により起動スクリプトにあるNetworkにおいて「sysctl -w net.inet.ip.forwarding=1」というコマンドが実行される。これはカーネルの設定を行うコマンドであり、もちろん、手でコマンド入力してもいいのだが、hostconfigで設定をして、再起動するという手軽な手段が用意されているので、それを利用しよう。ところで、/etc/hostconfigの編集だが、viやpicoといったTerminal内で使うエディタが得意な人はそちらを使うとして、どうしてもそれは大変という場合には、以下のコマンドを入力して、管理者パスワードを入力すると、TextEditで編集や保存が可能になる。

sudo open -a /Applications/TextEdit.app /etc/hostconfig

こうして再起動した後は、Terminalを起動して、以下のコマンドを入力するが、これはrootの権限で実行しないといけない。各コマンドの前にsudoを入れるか、あるいはNetInfo Managerでrootになれるようにしておくなどして、suコマンドを入力してrootになってコマンドを入力する。ipfwコマンドは普通のユーザで入力しても、エラーになるだけで設定はされない。

natd -interface en0
ipfw -f flush
ipfw add divert natd all from any to any via en0
ipfw add allow ip from any to any

ただし、一連のコマンドの中にある「en0」は状況によって変わる。これは、ネットワークポートを示す記号である。EthernetとAirMacを接続していると、Ethernetはen0、AirMacはen1となる。自分の使っているマシンでのネットワークポート名は、「ifconfig -a」というコマンドで確認できる。(以下の例は一部いい加減な数値が入っている点はご了承いただきたい)

% ifconfig -a
lo0: flags=8049 mtu 16384
inet 127.0.0.1 netmask 0xff000000
en0: flags=8863 mtu 1500
inet 99.88.77.66 netmask 0xfffffe00 broadcast 99.88.77.255
ether 00:30:65:f6:c2:e4
media: autoselect (100baseTX ) status: active
supported media: none autoselect 10baseT/UTP 10baseT/UTP 100baseTX 100baseTX
en1: flags=8863 mtu 1500
inet 192.168.1.150 netmask 0xffffff00 broadcast 192.168.1.255
ether 00:30:65:08:ec:03
media: autoselect status: active
supported media: autoselect

これだけ見て、どちらがEthernetなのかは分からなくはないのだが、システム環境設定で設定されているIPアドレスを見比べればだいたい分かるだろう。ほかに、/Applications/UtilitesにあるNetwork Utilityにある「Info」タグの情報を見ることでもかまわない。
そして、natdコマンドやipfwコマンドのポート名は、インターネットに接続されているグローバルIPアドレスが割り当てられているネットワーク端子名を指定する。たとえば、ADSLモデムが接続されていたり、あるいはPPP接続しているモデム側のポートを指定する。いずれにしても、これで、コマンドを起動させたマシンでは、NATが機能する。
natdはNATをするとしても、ipfwは何をするかだが、これは、BSDの中に組み込まれたファイアウォールの機能を利用するものである。ipfwによってそのファイアウォール機能の動作を規定する。ただ、本来はさまざまなフィルタ設定などができるのだが、前記のコマンドは、とにかく全部のパケットをdivertポートと呼ばれるポートに流すということだ。こうしたファイアウォールでのIPパケット処理機能とNATを行うデーモンを組み合わせて、全体としてNAT処理を行うのである。なお、ipfwの設定を確認するには「ipfw -a list」というコマンドを使う。

1つのネットワーク端子でNATを行うには、以下のコマンドを入れてポートに2つ目のIPアドレスを割り当てる。もちろん、IPアドレスやネットマスクは適時変更してもらいたいし、en0ではないポートだとその名前を指定する。

ifconfig en0 alias 192.168.1.150 netmask 255.255.255.0

複数のIPアドレスが設定されたかを確認するには、やはり「ifconfig -a」コマンドを使う。ネットワーク端子の設定で、inetで始まる行を確認すればよい。以下のように2行見えればそれでOKだ。各アドレスとネットマスクも確認できる。

% ifconfig -a
lo0: flags=8049 mtu 16384
inet 127.0.0.1 netmask 0xff000000
en0: flags=8863 mtu 1500
inet 99.88.77.66 netmask 0xfffffe00 broadcast 99.88.77.255
inet 192.168.1.201 netmask 0xffffff00 broadcast 192.168.1.255
ether 00:30:65:f6:c2:e4
media: autoselect (100baseTX ) status: active
supported media: none autoselect 10baseT/UTP 10baseT/UTP 100baseTX 100baseTX

あとは、natd、ipfwの3つのコマンドを入れれば良い。

ところでnatdのマニュアルを読むと、カーネルの再コンパイルなどと書いてある箇所があり、いきなりびっくりするが、そこでの要件をみたしてMac OS Xのカーネルはコンパイルされているようである。また、/etc/servicesに追加するという設定も、最初から行われている。他にも設定を加えることなどが書いてあるが、それらは行わなくても機能している。つまり、マニュアルに書かれていることはすべてを行う必要はなく、上記のことだけを行えばよいようだ。インターネットでnatdについての説明を検索すると、いろいろ見つかるのだが、比較的古いFreeBSDをベースにした話が多く、やはりそれらでも再コンパイルなどの話から入っている。参考にはもちろんなる場合もあるのだが、Mac OS Xで必要なことと不要なことを見極めないといけないだろう。もっともそれが最初から分かっていれば苦労はしないぞということになるけども…。

さて、こうしたコマンドをいちいち起動するたびに入力するなんてやってられないと思うところだろう。もちろん、起動スクリプトを作るというのが筋ではあるが、もうすぐMac OS X 10.1が出てくる。もしかしたら、チェックボックス1つでNATが実現できるようになっているかもしれないし、マルチホーミングだって同様だ。とりあえずは様子を見てから作る…ということでお許しいただきたい。
関連リンク