Leopard はアプリケーションファイアーウォールだけで十分ですが、 第5のBSDですから /sbin/ipfw もちゃんとある :)

暇だし、補完的に ipfw をちょっと使ってみることにした。 へんなホストに対してポートを遮断してみます。 FreeBSD の場合は、ipfw のルールセットにすべてのことを書きますが、 Leopard の場合は、後ろにアプリケーションファイアーウォールが控えているので、 ipfw がすべてのことをしなくて済みますから、ルールセットは簡単です。

あらすじ:
cd /etc
mkdir firewall
chmod 700 firewall
cd firewall
vi fwrules
chmod 700 fwrules

/etc/firewall/fwrules の例:

#!/bin/sh
# fwrules for MacOSX Leopard
fwcmd="/sbin/ipfw"
cidr="???.???.???.0/??" # 受け入れるホスト
service="me dst-port ??"
$fwcmd -f flush
$fwcmd add allow tcp from ${cidr} to ${service} in recv any setup keep-state
$fwcmd add deny log ip from any to ${service}

このルールセットは sh スクリプトです。 名前を fwrules としておきます。 これを管理者権限で実行すればよいわけです。

MacOSX スタート時にこのスクリプトを実行したければ

/etc/hostoconfig と /Library/StartupItems/ をいじります。

あらすじ:
vi /etc/hostconfig
cd /Library/StartupItems/
mkdir ipfw
cd ipfw
vi StartupParameters.plist
vi ipfw
chmod 700 ipfw
/etc/hostconfig の例:
IPFW=-YES- #この行を追加
/Library/StartupItems/ipfw/ipfw の例:
#!/bin/sh
# for Mac OS X 10.2 later

[ -f /sbin/ipfw ] || exit 0

. /etc/rc.common
# . の後ろにスペースあるからね

StartService ()
{
    if [ "${IPFW:=-NO-}" = "-YES-" ]; then
        ConsoleMessage "Starting ipfw"
        sh /etc/firewall/fwrules
    fi
}

StopService ()
{
    ConsoleMessage "Stopping ipfw"
}

RestartService ()
{
    StopService
    StartService
}

ConsoleMessage "try to $1 ipfw..."

RunService "$1"
/Library/StartupItems/ipfw/StartupParameters.plist の例:
{
  Description = "ipfw";
  Provides = ("ipfw");
  Requires = ("Disks", "Network");
  OrderPreference = "None";
  Messages =
  {
    start = "Starting ipfw";
    stop  = "Stopping ipfw";
  };
}

ipfw にスタートもストップもありませんが、 書式的にこう書いておけば大丈夫。 StopService は実際に何もしません。 何もする必要がないので。

log は /var/log/appfirewall.log に書かれるみたい。 /var/log/ipfw.log には何も出ません。 syslogd の設定をいじるのは別の話題ということで。

Mac OS X 10.5 Leopard: アプリケーション・ファイアウォールについて
http://support.apple.com/kb/HT1810

topic: macosx
first posted: 2009-06-20 20:10:20
last modified: 2010-10-17 03:11:00