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を以下のように編集
(ここを参考にした)
ここでの方針
-
外部に開けるのは基本的にsshのみ。メール関連(smtpなど)も遮断。
-
他に開けるのは必要なもののみ : DNS, NTP, ftp(外部への接続とデータのget), 外部へのwww
# 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 とリンクが張られている。