MacOSX 10.5 LeopardのファイアウォールでRailsアプリが許可されない時

10.5 Leopardになって、ファイアウォールの仕組みが大きく変更された。これまでの10.4 Tigerまでのポートを指定する方式から、アプリケーションを指定する方式(Mac OS X 10.5 Leopard: アプリケーション・ファイアウォールについて)になったのだ。この変更で最初戸惑ってしまったことがある。
「それでは、ファイアウォールを有効にしつつ、Railsアプリケーションを許可するためにはどのように指定すべきなのか?」
まず最初にやってみたのが、アクティビティモニタで確認しながらRailsアプリを起動すると、Rubyプロセスとして表示されるので、「/usr/bin/ruby」を「+」ボタンで追加して、それからサーバーを起動してみた。この設定をしておいたのがOSX 10.5インストール直後。その後、ファイアウォールの動作確認をせず、現在のOSX 10.5.2までアップデートしてきた。そして最近、Time Capsuleでポートマッピングの設定をした時に、初めて動作確認をしてみること...動かない...。
もしかしたら、Railswebサービスの本体は「/usr/bin/ruby」ではないのかもしれない...。もしかしたら、script/serverで起動するサーバープログラムを指定するべきか?または、その他諸々関連するすべてのプログラムを指定するべきなのではないか?等々、様々な疑念がよぎった...。

ところが、最終的には最初に予想した通り、「/usr/bin/ruby*1の「受信接続を許可」しておけば、Railsアプリへの接続が可能であった。以下の手順を実行した。

ファイアウォールのレベル

以下の現象は、ファイアウォールで「特定のサービスおよびアプリケーションにアクセスを設定」を選択した状況で発生している。

リストから取り除いてリセット

  • アプリケーションリストから「ruby」をすべて削除。
  • MacBook再起動。
  • ターミナルから「script/server」を実行。
  • 「アプリケーション"ruby"へのネットワーク受信接続を許可しますか?」と訊かれるので、「許可」ボタンを押す。*2

  • アプリケーションリストに「ruby」が追加される。「受信接続を許可」の状態。これで、外部からRailsアプリへの接続が可能になった。
  • 「受信接続を許可」を「受信接続をブロック」に変更すると、Railsアプリへの接続が拒否される。

自分の勝手な憶測だが、おそらく、OSX 10.5リリース直後のファイアウォールには不具合があったのかもしれない。その後、OSX 10.5.2では不具合が解消されたが、リリース直後の不具合のある状態が保存されて、正常に設定変更が出来ない状態であったのかもしれない...。

紛らわしい挙動

  • アプリケーションリストから「−」ボタンで「ruby」を削除しても、削除した時点の「受信接続を許可」または「受信接続をブロック」の状態が、MacBookを再起動するまでは維持された。(ログアウトして再ログインでは維持されていた。)
  • アプリケーションリストから削除した後、受信接続をコントロールしたい場合は、「+」ボタンで該当するアプリケーションを追加して、設定変更すればOK。
  • MacBookを再起動すれば、リストに無いアプリケーションへの接続は、最初にアプリケーションを起動した時に確認を求めてくる。(ファイアウォールで「特定のサービスおよびアプリケーションにアクセスを設定」を選択の場合)

ポート指定との関係

理解できない挙動

  • ファイル名は同じで、存在するディレクトリが違うアプリケーションを複数リスト指定した場合(例: バージョン違いの異なるディレクトリのrubyなど)...
    • そのうちの一つの「受信接続」が変更されると、すべてのrubyの「受信接続」に影響する。つまり、アプリケーションのファイル名しかチェックしていないのかもしれない。
    • 登録する時は存在するディレクトリ別に追加されるのに、その後の設定変更は、最後に選択した「受信接続」の指定が、同一ファイル名のアプリケーションすべてで優先される、という不可解な状態。
    • ところが、MacBookを再起動すると、ディレクトリの異なるアプリケーションに対して「受信接続」が個別に設定される。(これが本来あるべき動作だと思う。)
  • アプリケーションリストの設定を変更した時に、変更対象のアプリケーションも再起動しないと「受信接続」の指定が反映されない場合があった。

試行錯誤の結果...

*1:「/usr/bin/ruby」はエイリアスであり、これを選択すると、リストには実態である「/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby」が登録された。

*2:「script/server」実行前に「+」ボタンで「/usr/bin/ruby」を追加しても同じ結果になると思う。