Friday, February 11, 2011

PF với FreeBSD 8.0

PF là một stateful firewall được phát triển bởi OpenBSD, tuy nhiên cũng được port sang FreeBSD. PF là một firewall đầy đủ tính năng, hỗ trợ ALTQ (Alternate Queuing), ALTQ cung cấp tính năng QoS.

1. Nạp PF kernel module, thêm dòng sau vào /etc/rc.conf:

pf_enable="YES"

Khởi động bằng tay:

#/etc/rc.d/pf start

Khi PF chạy, nó sẽ tìm đến file chứa cấu hình các luật, mặc định là /etc/pf.conf. Hãy tạo ra file pf.conf nếu nó chưa có trong /etc. Nếu file chứa các luật này nằm ở một nơi khác, thêm dòng sau vào /etc/rc.conf để PF load file này lên khi khởi động:

pf_rules="/path/to/pf.conf"

PF module có thể được load bằng tay từ command line:

#kldload pf.ko

PF hỗ trợ logging được cung cấp bởi pflog.ko và có thể được load bằng cách thêm dòng sau vào /etc/rc.conf:

pflog_enable="YES"

Khởi động pflog bằng tay:

# /etc/rc.d/pflog start

2. PF kernel options:

Khi ta cần thêm module khác cho PF, ta có thể cấu hình lại FreeBSD kernel để hỗ trợ. Cách cấu hình FreeBSD kernel như sau:

#cd /usr/src/sys/i386/conf/
#cp GENERIC YOURKERNEL
#vi YOURKERNEL

Tìm “ident GENERIC” và thay bằng “ident YOURKERNEL”. (Không có dấu ngoặc kép)

Sau đó ta thêm các option cho PF

device      pf
device      pflog
device      pfsync
options    ALTQ
options    ALTQ_CBQ
options    ALTQ_RED
options    ALTQ_RIO
options    ALTQ_HFSC
options    ALTQ_PRIQ
options    ALTQ_NOPCC

CBQ (Class Based Queuing) cho phép chia băng thông của một connection thành các lớp và đưa vào hàng đợi đối với traffic ưu tiên dựa vào “filter rules”

RED (Random Early Detection) cho phép tránh nghẽn mạng, RED sẽ đo chiều dài của “queue” và so sánh với giá trị ngưỡng max và min cho “queue”. Nếu “queue” lớn hơn max, tất cả những packet mới sẽ bị drop.

RIO (Random Early Detection In and Out)

HFSC (Hierarchical Fair Service Curve Packet Scheduler)

PRIQ (Priority Queuing) cho phép traffic ở “queue” lớn hơn qua trước.

NOPCC cho SMP hỗ trợ ALTQ

3. File pf.conf

#ext_if="tun0"
int_if="de0"
icmp_types="echoreq"
localnet=$int_if:network
table <ossec_fwtable> persist
martians = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, 0.0.0.0/8, 240.0.0.0/4, 255.255.255.255/32 }"

# options
set block-policy return
set loginterface $int_if
set skip on lo

# scrub
scrub in all

# nat/rdr
#nat on $ext_if from $int_if to any -> ($ext_if)

#filter rules
block in all
block in log quick on $int_if inet proto tcp from any to $int_if flags FUP/FUP
block in quick from <ossec_fwtable> to any
block out quick from any to <ossec_fwtable>
#block drop in log (all) quick on $ext_if from $martians to any
#block drop out log (all) quick on $ext_if from any to $martians
pass out keep state
antispoof quick for { lo $int_if }
pass in quick on $int_if inet proto tcp from any to $int_if port 22 flags S/SA keep state
pass in quick on $int_if inet proto tcp from any to $int_if port 80 flags S/SA keep state
pass in inet proto icmp all icmp-type $icmp_types keep state
#pass in quick on $int_if

No comments:

Post a Comment