FreeBSD PF 防火墙及 NAT 初次架设

freebsd 6 pf防火墙/NAT配置:
1.内核编译配置 /usr/src/sys/i385/conf - MYKERNEL
options ALTQ
options ALTQ_CBQ # 基于分类的排列 (CBQ)
options ALTQ_RED # 随机先期检测 (RED)
options ALTQ_RIO # 对进入和发出的包进行 RED
options ALTQ_HFSC # 带等级的包调度器 (HFSC)
options ALTQ_PRIQ # 按优先级的排列 (PRIQ)
options ALTQ_NOPCC # 在联编 SMP 内核时必须使用,禁止读时钟首先是核心设定。

device pf
device pflog
device pfsync

重新编译

2.修改 /etc/sysctl.conf 加入
  net.inet.ip.forwarding=1

3./etc/inetd.conf 要开启 ftp-proxy 的功能(直接把最后一行批注「#」取消掉就好):
  ftp-proxy stream tcp nowait root /usr/libexec/ftp-proxy ftp-proxy
  
4.再来改 /etc/rc.conf:

inetd_enable="YES"
  pf_enable="YES"
  pf_rules="/etc/pf.conf"
  pf_flags=""
  pflog_enable="YES"
  pflog_logfile="/var/log/pflog"
  pflog_flags=""
  # 要开下面这个才能玩 NAT
  gateway_enable="YES"

 

5.最后,就是实际写 pf 的防火墙规则了;
ext_if = "vr0" # 连往 ADSL 的界面
int_if = "vr1" # 连往内部网络的接口
# 定义内部网络区段,这些是绝不应该出现在连外接口 $ext_if 的
priv_nets = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }"
# -------------------- 再定义要开放的服务
# 这边是我们要开放给因特网的服务。我们有架 Apache,所以要开 HTTP
# 至于 113 则是 IDENT,一些服务如 IRC、台湾部份 BBS 会用到
tcp_services = "{ http, https, 113 }"
# MLDonkey 需要开的连接?
# 6881-6889 是 BT 用的,33333 是我设定的 ed2k 连接埠,UDP 就是 33333+4
# 至于 44444 则是我设定的 Kad 连接埠,这个在 TCP 和 UDP 都是一样的
# 其它 MLDonkey 连接埠参考:
mldonkey_tcp_ports = "{ 6881, 6882, 6883, 6884, 6885, 6886, 6887, 6888, 6889, 33333, 44444 }"
mldonkey_udp_ports = "{ 33337, 44444 }"
# 下面这些是只打算开放给内部使用的服务
# 4001、4080 均是 MLDonkey 的控制接口
priv_tcp_services = "{ ssh, 4001, 4080, http }"
# 允许的 ICMP 类型(主要为 ping、tracert 等工具)
icmp_types = "echoreq"
# -------------------- 设定选?
# 好国民要用这个设定,狠心人就别用 return 改成 drop 吧
set block-policy return
# 只记录 $ext_if 的东西
set loginterface $ext_if
# -------------------- Normalization 动作
# 基本动作,把所有封包弄整齐
scrub in all
# -------------------- 地址转译 (NAT) 部份
# 做 NAT
nat on $ext_if from $int_if:network to any -> ($ext_if)
# 这个重新导向是给 ftp-proxy 用的
rdr on $int_if proto tcp from any to any port ftp -> 127.0.0.1 port 8021
# -------------------- 封来过滤规则
# 开始过滤封包,一开始先全挡
block all
# loopback 上的东西基本上都要允许
pass quick on lo0 all
# 把对外接口上绝对不应该出现的 IP 挡掉,避免伪造 IP 来源
block drop in quick on $ext_if from $priv_nets to any
block drop out quick on $ext_if from any to $priv_nets
# 开启要提供给外面的人用的服务
pass in on $ext_if inet proto tcp from any to ($ext_if) port $tcp_services flags S/SA keep state
# 开启 MLDonkey 要用的连接?
pass in on $ext_if inet proto tcp from any to ($ext_if) port $mldonkey_tcp_ports flags S/SA keep state
pass in on $ext_if inet proto udp from any to ($ext_if) port $mldonkey_udp_ports keep state
# 开启供内部网络用的服务
pass in on $int_if inet proto tcp from any to ($int_if) port $priv_tcp_services flags S/SA keep state
# 让 ICMP 数据通过
pass in inet proto icmp all icmp-type $icmp_types keep state
# 很松的规则,假定内部网络使用者都是好人。这个以后再锁紧
pass in on $int_if from $int_if:network to any keep state
pass out on $int_if from any to $int_if:network keep state
# 让对外接口的数据出得去
pass out on $ext_if proto tcp all modulate state flags S/SA
pass out on $ext_if proto { udp, icmp } all keep state

5.reboot

6.pfctl -e 启动pf
  pfctl -d 关闭pf
  pfctl -f /etc/pf.conf
  inetd_enable="YES"
  pf_enable="YES"
  pf_rules="/etc/pf.conf"
  pf_flags=""
  pflog_enable="YES"
  pflog_logfile="/var/log/pflog"
  pflog_flags=""
  # 要开下面这个才能玩 NAT
  gateway_enable="YES"

 

你可能感兴趣的:(security,freebsd)