红联Linux门户
Linux帮助

FreeBSD PF 防火墙及 NAT 初次架设

发布时间:2006-07-12 10:30:04来源:红联作者:wide
  这 台 FreeBSD 服务器第一个用途是作为防火墙,再来是做 IP 分享,然后架设各种服务器(如 HTTP)和一些服务(如 MLDonkey)。两张网卡,其中 vr0 对外连接 ADSL 调制解调器,设有固定 IP;vr1 则是对内连接另一台电脑。这里描述一个基本的设定。
net.inet.ip.forwarding=1
ftp-proxy stream tcp nowait root /usr/libexec/ftp-proxy ftp-proxy
# inetd 一定要记得启动
inetd_enable="YES"
# pf 防火墙的东西
pf_enable="YES"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""
# 要开下面这个才能玩 NAT
gateway_enable="YES"
引用:
# -------------------- 先定义基本宏
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

一切完成,先要用 sysctl 做单次设定(除非打算重新开机):
sysctl net.inet.ip.forwarding=1
然后启动 pf,并读入 pf 规则
文章评论

共有 0 条评论