OS X のファイアウォール機能について

Written by たちゃな@巫研 < tatyana at miko dot org >

=更新履歴=
公開。(Sep 24, 2005)

もくじ

はじめに

OS X のファイアウォール機能は IPFW によって実現されています。 IPFW は FreeBSD 起源のコマンドです。 IPFW の機能は多岐に及ぶので、詳細については man ipfw を参照してください。

IPFW はステートフルなフィルタリングを課すことができます。 パケットフィルタリング型のチープなファイアウォールでは UDP ベースの IP 偽装攻撃にうまく対応できませんが、 IPFW ならば、より安全なスタイルで ファイアウォールの構築と運用をおこなうことが可能です。

また、IPFW は簡単なトラフィックシェーピングの機能も持ちます。 これは帯域幅の制限された仮想的な pipe または queue を用意し、 ルールに合致するトラフィックをそちらに流すという形で実現されます。 ホスト毎のセッション数を制限する機能については、 OS X 10.3 に搭載されている IPFW ではできませんが、 OS X 10.4 のバージョンでは limit オプションにてサポートされています。

GUI による設定

「システム環境設定」の「共有」を開き、「ファイアウォール」のタブをクリックすることで設定画面を開くことができます。

必要なサービスにチェックを入れたのち、「開始」のボタンをクリックするとファイアウォールが有効となります。

GUI により設定されるファイアウォールルールは、おおよそ以下のようなものになります。

$ sudo ipfw list
02000 allow ip from any to any via lo*
02010 deny ip from 127.0.0.0/8 to any in
02020 deny ip from any to 127.0.0.0/8 in
02030 deny ip from 224.0.0.0/3 to any in
02040 deny tcp from any to 224.0.0.0/3 in
02050 allow tcp from any to any out
02060 allow tcp from any to any established
02070 allow tcp from any to any dst-port 22 in
12190 deny tcp from any to any
65535 allow ip from any to any
$ sudo ip6fw list
02000 allow ipv6 from any to any via lo*
02010 deny ipv6 from ::1 to any in
02020 deny ipv6 from any to ::1 in
02030 deny ipv6 from ff00::/8 to any in
02040 deny tcp from any to ff00::/8 in
02050 allow tcp from any to any out
02060 allow tcp from any to any established
02070 allow tcp from any to any 22 in
12190 deny tcp from any to any
65535 allow ipv6 from any to any

ご覧のように、主として TCP のみをシャットアウトするルールとなり、UDP には制限が加えられていません。 GUI からの設定には限界がありますので、 より詳細な設定を行いたい場合には、次節の CUI による設定を行ってください。

CUI による設定

OS X の起動時に読み込まれるスタートアップスクリプトにファイアウォールの設定を記述することで、 GUI からのファイアウォール設定では扱えない、 より詳細なルールを利用できます。

CUI と GUI の設定を併用することはできませんので、 GUI によるファイアウォールの設定を既に行っている場合には、 まずそちらのファイアウォールを無効にする必要があります。

以下に挙げた例にはファイアウォールルールが含まれていますが、 理解しやすいようにとの配慮から含めているに過ぎず、 記述されているルールの正確性や適合性を主張するものではありません。 利用にあたっては、それぞれの環境に合致するよう、 ルールを書き換えて利用してください。

IPv4 のファイアウォール設定

$ sudo mkdir -p /Library/StartupItems/Firewall
[/Library/StartupItems/Firewall/StartupParameters.plist]
{
  Description = "Firewall";
  OrderPreference = "None";
  Provides = ("Firewall");
  Requires = ("Network");
  Messages =
  {
    start = "Starting firewall";
    stop = "Stopping firewall";
  };
}
[/Library/StartupItems/Firewall/Firewall]
#!/bin/sh

# Enable verbose logging
/usr/sbin/sysctl -w net.inet.ip.fw.verbose=1

# DEFINE VARIABLES
# set EXTIP/EXTIF to the external address/interface name of your system
EXTIP="xxx.xxx.xxx.xxx"
EXTIF="en0"
FWCMD="/sbin/ipfw"

# START OF FIREWALL RULES
# First flush the firewall rules
$FWCMD -q flush

# Loopback
$FWCMD add allow all from any to any via lo0
$FWCMD add deny log all from any to 127.0.0.0/8
$FWCMD add deny log all from 127.0.0.0/8 to any

# Stop Spoofing
$FWCMD add deny log all from $EXTIP to any in

# TCP Traffic and Services
$FWCMD add allow tcp from any to any established
$FWCMD add allow tcp from $EXTIP to any out xmit $EXTIF setup
$FWCMD add allow tcp from any to $EXTIP dst-port 22 in recv $EXTIF setup
$FWCMD add reset log tcp from any to $EXTIP dst-port 113 in recv $EXTIF setup

# State-based UDP Filtering
$FWCMD add check-state
$FWCMD add allow udp from $EXTIP to any out xmit $EXTIF keep-state

# ICMP Filtering (allow all)
$FWCMD add allow icmp from any to any via $EXTIF

# Deny all other traffic (deny all)
$FWCMD add 65534 deny log all from any to any
$ sudo chown root:wheel /Library/StartupItems/Firewall/Firewall
$ sudo chmod 700 /Library/StartupItems/Firewall/Firewall

IPv6 のファイアウォール設定

$ sudo mkdir -p /Library/StartupItems/Firewall6
[/Library/StartupItems/Firewall6/StartupParameters.plist]
{
  Description = "Firewall6";
  OrderPreference = "None";
  Provides = ("Firewall6");
  Requires = ("Network");
  Messages =
  {
    start = "Starting firewall(IPv6)";
    stop = "Stopping firewall(IPv6)";
  };
}
[/Library/StartupItems/Firewall6/Firewall6]
#!/bin/sh

# Enable verbose logging
/usr/sbin/sysctl -w net.inet6.ip6.fw.verbose=1

# DEFINE VARIABLES
FW6CMD="/sbin/ip6fw"

# START OF FIREWALL RULES
# First flush the firewall rules
$FW6CMD -q flush

# Loopback
$FW6CMD add allow all from any to any via lo0
$FW6CMD add deny log all from any to ::1
$FW6CMD add deny log all from ::1 to any

# Deny all other traffic (deny all)
$FW6CMD add 65534 deny log all from any to any
$ sudo chown root:wheel /Library/StartupItems/Firewall6/Firewall6
$ sudo chmod 700 /Library/StartupItems/Firewall6/Firewall6

参考リンク


ご意見・ご感想などありましたら メール もしくは web拍手 経由でお気軽に。

return