FreeBSD(ver6.3)によるpf(Packet Filterring)

pfを利用するには、カーネルの再構築が必要。
カーネルファイル(/usr/src/sys/i386/conf/MYKERNEL など)に
options         ALTQ
options         ALTQ_CBQ        # Class Bases Queuing (CBQ)
options         ALTQ_RED        # Random Early Detection (RED)
options         ALTQ_RIO        # RED In/Out
options         ALTQ_HFSC       # Hierarchical Packet Scheduler (HFSC)
options         ALTQ_PRIQ       # Priority Queuing (PRIQ)
#options                ALTQ_NOPCC      # Required for SMP build

device          pf
device          pflog
device          pfsync          
を追加し、カーネルを再構築。
#cd /usr/src
#make buildkernel KERNCONF=MYKERNEL
#make installkernel KERNCONF=MYKERNEL
そして、/etc/rc.confに以下を加える。(/etc/default/rc.conf 参照)
pf_enable="YES"                 # Enable PF (load module if required)
pf_rules="/etc/pf.rules"         # rules definition file for pf
pf_flags=""                     # additional flags for pfctl startup
pflog_enable="YES"              # start pflogd(8)
pflog_logfile="/var/log/pflog"  # where pflogd should store the logfile
pflog_flags=""                  # additional flags for pflogd startup
/etc/pf.rulesを以下のように編集 (ここを参考にした)
ここでの方針
# No Filtering################################################
#pass in all
#pass out all
#### Macros ####
# define WAN interface
ext_if = "bge1"
ext_addr = "xxx.xxx.xxx.xxx"
# define LAN interface
int_if = "bge0"
int_addr = "192.168.x.1"

#### Tables ####
# ルータのローカルアドレスを定義
table  const {127.0.0.1, 192.168.x.1, xxx.xxx.xxx.xxx }

# プライベートアドレス群を定義
table  const { 10/8, 172.16/12, 192.168/16 }


# RFC3330からプライベートアドレスを除いた特殊用途アドレスを定義
# 一部のMulticastアドレスを使う予定がある場合は注意すること
# 14/8や24/8はケーブルテレビなど使われている可能性もあるので注意
table  const { 0/8, 14/8, 24/8, 39/8, 127/8, 128.0/16, 169.254/16, \
192.0.0/24, 192.0.2/24, 192.88.99/24, 198.18/15, 223.255.255/24, 224/4, 240/4 }

#### Translation (NAT) ####
nat on $ext_if from $int_if:network to any -> ($ext_if)

#### Filter ####
# まずはデフォルトで拒否
block in log all
block out log all

###
### WANから入ってくるパケットの処理 ###

# 外から入ってくるアドレス偽装パケットの処理
block in log quick on $ext_if from {    } to any 

# TCPの制御
## 外部からのsshを許可
pass in quick on $ext_if proto tcp from any to $ext_addr port {ssh} flags S/SA keep state
## 外部からのftp(data)を許可
pass in quick on $ext_if proto tcp from any to $ext_addr port 20 flags S/SA keep state
## 外部からのDNS(tcp)を許可(コメントアウト)
#pass in on $ext_if proto tcp from any to $ext_addr port {domain} flags S/SA keep state

## IDENTにRSTを返す
block return-rst in quick on $ext_if proto tcp from any to any port 113

## それ以外のTCPは捨てる
#block in log quick on $ext_if proto tcp all

# UDPの制御
## 外部からのDNS(udp)を許可(コメントアウト)
#pass in quick on $ext_if proto udp from any to $ext_addr port domain keep state

## それ以外は捨てる
block in log quick on $ext_if proto udp all

# ICMPの制御
## tracerouteを開ける
pass in quick on $ext_if inet proto icmp all icmp-type 3
pass in quick on $ext_if inet proto icmp all icmp-type 11

## 他のicmpは捨てる
block in log quick on $ext_if proto icmp all

###
### WANへ出ていくパケットの処理###

# 変なパケットは出さない
block out quick on $ext_if from any to {    }

# smbとnetbiosが外に漏れるのを防ぐ
block out quick on $ext_if proto {tcp udp} from any to any port 135
block out quick on $ext_if proto {tcp udp} from any to any port 137:139
block out quick on $ext_if proto {tcp udp} from any to any port 445

# SQL Slamerが気になる人はこちらも
block out quick on $ext_if proto {tcp udp} from any to any port 1433:1434

# 中からのセッション開始は許可(コメントアウト)
#pass out quick on $ext_if proto tcp all modulate state
#pass out quick on $ext_if proto udp all keep state

## 外部へのssh,wwwを許可
pass out quick on $ext_if proto tcp from any to any port {ssh http} flags S/SA keep state

## 外部へのftp(control)を許可
pass out quick on $ext_if proto tcp from any to any port 21 flags S/SA keep state

## 外部へのDNSを許可
pass out quick on $ext_if proto tcp from any to any port {domain} flags S/SA keep state
pass out quick on $ext_if proto udp from any to any port {domain} keep state

## 外部へのNTPを許可
pass out quick on $ext_if proto tcp from any to any port 123 flags S/SA keep state
pass out quick on $ext_if proto udp from any to any port 123 keep state

# ICMP関連
## 外に出ていくping
pass out quick on $ext_if inet proto icmp all icmp-type 8 code 0 keep state
## 他のicmpは外に出さない
block out log quick on $ext_if proto icmp all

####
### LAN内のパケット処理 ###
pass in quick on $int_if all
pass out quick on $int_if all

####
### loopback ###
pass in quick on lo0 all
pass out quick on lo0 all

/etc/pf.rulesを反映させるには
#pfctl -f /etc/pf.rules

ルールの確認
#pfctl -s rules


また、メールサーバとしては使わないので、sendmailは殺しておく。
/etc/rc.confで
sendmail_enable="NO"            # stop sendmail
さらに、sendmail を実行不可に
chmod 0 /sbin/mailwrapper
なお、/sbin/sendmail => /sbin/mailwrapper とリンクが張られている。