由于公司的需要控制上网行为,于是前段时间研究了下软路由防火墙。开始经朋友介绍觉得Pfsesen+panabit的整合版不错,在虚拟机下测试OK,但到实机安装时,发现主板网卡还有我的Dlink530网卡只识别到一张,搞了好久都不行。只好放弃这个整合版。于是自己整合了freebsd+pf+squid+panabit实现透明代理加流控上网行为管理,已经稳定运行两个礼拜,相对于分公司50来台电脑没什么问题。抽空整理下搭建日志。

一.安装前准备
1 4 张网卡,我用的是 3 DLINK 1 张板载网卡。
2 、主机一台。一般 PC 机。交叉线一条。跳线若干。
3 、下载 panabit 软件。我用的是最新版, Panabit 标准版 v12.04 (核心代号 东汉 ”  R2 )下载地址 http://www.panabit.com/forum/p_w_upload.php?aid=4898
官网有安装教程。 http://www.panabit.com/free2/panabit_setup.html

二.安装

1 安装安装freebsd系统,这个网上有更好的教程,就不多说了,我装的是freebsd 8.3
2. 下面说下网卡的连接与ip地址、路由配置。
1 )我的 pc 4 张网卡分别为识别为 re0 vr0 vr1 vr2
我用 re0 wan 口, vr0 panabit 的管理口。 Vr1 vr2 Panabit 网桥模式。
接线: re0 连接外网, vr2 连接内网,用交叉线连接 vr0 vr1. 如下图
 

2 )配置 ip 地址:
先配置 wan 口即 re0 网卡的 IP 地址,我先配置一个内网 IP 用于 ssh 连接安装 panabit ,等安装完所有服务调试完成后就将其改为外网 ip 地址。(在此要注意)
#ee /etc/rc.conf
gateway_enable="YES"
sshd_enable="YES"
ifconfig_re0="inet 192.168.10.200 netmask 255.255.255.0"
hostname="panabit.test.com"
defaultrouter="192.168.10.254"
还有要配置好 dns ,如下
#ee /etc/resolv.conf
nameserver      202.181.224.2
nameserver      8.8.8.8
3 、打开freebsd远程root 的SSH连接(默认root是不开启登陆的),并安装panabit
1)#ee /ect/ssh/sshd_config
在最后添加如下内容:
PermitRootLogin yes
PermitEmptyPasswords no
PasswordAuthentication yes
重启 ssh 服务,如下
/etc/rc.d/sshd restart
现在可以用 root 远程连接上 freebsd 安装 panabit 了。
2) 安装 panabit 可以参考官网教程: http://www.panabit.com/free2/panabit_setup.html
1 )安装过程中选择vr0为panabit的管理口。Vr1与vr2为网桥模式
我这里 Vr0 ip 地设置为: 192.168.5.1
子网掩码为 255.255.255.0
网关:为空 (这里网关设置与 panabit 管理网页里的网关选项的设置都要注意,不然路由会有问题,后面会讨论关于 freebsd 双网卡路由的问题)
2) 登陆 https://192.168.10.200 配置 panabit 的网桥模式。如下设置。
 

3 )安装完panabit后设置开机自动启动。
新建一个 rc.local 文件,添加如下内容:
#ee /etc/rc.local
/usr/panabit/bin/ipectrl start
 
4. 关于freebsd双网卡路由的问题。
以上安装完成后你会发觉, vr0 内网卡 192.168.5.1 这个网卡跨网段路由是有问题的。
因为默认网关 defaultrouter="192.168.10.254" 只可以设置一个,要实现双网卡路由,我们可以添加静态路由,如 route add -net 192.168.0.0/16 192.168.5.254 我们可以编辑 rc.conf 文件让其开机自动添加,如下:
#ee /etc/rc.conf
gateway_enable="YES"
sshd_enable="YES"
ifconfig_re0="inet 192.168.10.200 netmask 255.255.255.0"
hostname="panabit.test.com"
defaultrouter="192.168.10.254"
ifconfig_vr0="inet 192.168.5.1 netmask 255.255.255.0"
hostname="panabit.test.com"
#static route
static_routes="static1"
route_static1="-net 192.168.0.0/16 192.168.5.254"
这样双网卡路由问题就解决了。
 
5 、安装pf+squid实现透明代理,加速上网。
下面安装 squid,要实现透明代理与防护墙功能需要先安装PF防火墙软件,freebsd下的包过滤工具有ipfw、 pf、ipfilter等我用的是 PF。
1)  安装pf,
现在我装的Freebsd 版本内核已经是支持pf的了,freebsd开启pf功能有两种方法有二个方式,一个是编译进入核心,另外是以动态模块方式加载。
编译内核,这样pf的所有功能都可以用到如QoS、pflog ,我没有在pf做带宽限制,所以我用的是第二种方法。
1. 编译内核:
#cd /usr/src/sys/i386/conf
#cp GENERIC LOULAN
编辑 LOULAN加入以下内容
device pf
device pflog
device pfsync
options ALTQ
options ALTQ_CBQ
options ALTQ_RED
options ALTQ_RIO
options ALTQ_HFSC
options ALTQ_CDNR
options ALTQ_PRIQ
options ALTQ_NOPCC
options ALTQ_DEBUG
config LOULAN
make depend&& make && make install && reboot
 
2. 以动态模块加载
#vi /etc/rc.conf
加入下面四行
#启用 PF
pf_enable="YES"
#PF 防火墙规则的设定文件
pf_rules="/etc/pf.conf"
#启用 inetd 服务
inetd_enable="YES"
#启动 pflogd
pflog_enable="YES"
#pflogd 储存记录档案的地方
pflog_logfile="/var/log/pflog"
sysctl -w net.inet.ip.forwarding=1
 
下面编辑pf的配置文件
关于pf的详细使用可以参考相关资料.
#vi /etc/inetd.conf
# 网卡、IP地址等定义、方便后文调用
ext_if="re0"  # 外网网卡
int_if="vr0"  # 内网网卡
loop="lo0"  # 回路设备
ext_addr="202.5.76.8" #这个是配置好后 re0外网wan口的公网IP地址
tcp_services={80,443,22} #定义允许外部访问本机的端口
internal_net="192.168.0.0/16"  # 内网IP范围
# 以下语句用来实现透明共享上网NAT
# 所有内部请求都通过外部网卡出去
nat on $ext_if from $int_if:network to any -> $ext_if
#实现squid透明代理,将客户端80端口定向到3128端口.
rdr on $int_if inet proto tcp from $internal_net to any 80 -> 192.168.5.1 port 3128
# 企业级安全网关的做法
# 先阻止所有进入网关/从网关出去的数据
block all
# 再逐个开放需要的权限
# 允许回路网络进出网关
pass in quick on lo0 all keep state
pass out quick on lo0 all keep state
# 允许网络内部机器ping任何资源
# 不允许互联网机器ping服务器外部网卡
block in on $ext_if inet proto icmp all icmp-type 8 code 0
pass out on $ext_if inet proto icmp all icmp-type 8 code 0 keep state
pass in quick on $ext_if inet proto icmp all icmp-type 8 code 0
# 允许外部访问前边定义的"tcp_services"
# 端口服务并keep state
pass in on $ext_if inet proto tcp from any to ($ext_if) port $tcp_services flags S/SA keep state
# pf对外发布内网WEB服务器,将对8080端口的访问转发到内部机器192.168.5.10的8080端口 #并允许外部访问内网WEB服务
rdr on $ext_if proto tcp from any to $ext_addr port 8080 ->192.168.5.10 port 8080
pass in on $ext_if inet proto tcp from any to 192.168.5.10 port 8080 flags S/SA keep state
#开放内部网络对外联机
#pass in on $inf_if proto rcp from any to any queue std_in
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 $ext_if proto tcp from any to any queue std_out
pass out on $ext_if proto tcp all modulate state flags S/SA
pass out on $ext_if proto { udp, icmp } all keep state

 
启动 PF,并读取 pf 规则
pfctl -e;pfctl -f /etc/pf.conf
 
下面在网上摘录了一些pf 使用的相关命令.
pf 控制指令
当我们按照自己的需求重新配置了pf之后,难道就必须重新启动服务器才能让新规则生效?答案是否定的。我们可以通过pf控制命令来重新加载新的应用规则,或者帮助管理员随时了解pf的运作情况。
1. 打开或者关闭 pf
pf提供了pfctl指令来控制pf的运作。
pfctl -e  ;启动pf
pfctl -d  ;关闭pf
不过这里还需要说明的是,pfctl -e只是启用了pf,但是并没有加载任何规则。
2. 重新加载 pf 配置
当我们修改了pf的配置文件pf.conf之后,可以通过以下命令,使用新的配置而无须重新启动pf服务。
pfctl -f /etc/pf.conf
如果我们仅仅只是想确认加载配置文件中的nat规则:
pfctl -nf /etc/pf.conf
甚至我们还可以只重新加载配置文件中的nat规则:
pfctl -Nf /etc/pf.conf
或者防火墙过滤规则:
pfctl -Rf /etc/pf.conf
3. 查看服务器运作情况
为了让管理员更好地了解pf工作情况,pfctl还提供了以下几个十分有用的服务器壮态查看参数。
查看nat规则:pfctl -sn
查看过滤规则:pfctl -sr |more
另外,我们还可以通过以下指令查看服务器的工作壮态(如图4)
查看pf工作状态:pfctl -ss
查看pf过滤状态:pfctl -si
查看所有统计数据:pfctl –sa
4. 内网网站的发布
为了安全,管理员一般将Web服务器放到内网中。Internet上的计算机要访问pf后面的Web服务器,就需要我们在pf中进行相应设置。
假设内网Web服务器IP地址为192.168.0.10的工作端口为80。我们可以把pf服务器上的80端口影射到内网的Web服务器的80端口上去。
# 对pf服务器外网IP的80端口的访问转发到内部机器192.168.0.10的80端口
rdr on $ext_if proto tcp from any to $ext_addr port 80 ->192.168.0.10 port 80
5. 禁止访问高危端口
作为企业网关,肯定是会受到无聊人的扫描以及***的,另外,冲击波等蠕虫病毒也可以通过网关***。如何防范这些***或者扫描成为pf管理员必须考虑的安全问题。
我们可以定义一些高危端口,然后对这些端口的访问进行特别的限制。
# 定义高危端口
Danger_Port="{445 135 139 593 5554 9995 9996}"
# 禁止内部网络和外部网络的机器访问服务器的135、139等高危端口
block quick on $int_if inet proto tcp from any to any port $Danger_Port
block quick on $ext_if inet proto tcp from any to any port $Danger_Port
 
2). 安装squid代理
FreeBSD中安装 Squid, 方便的软件安装方法----ports安装
用ports 安装前,先用portsnap升级下ports的目录树
(1)     要使用portsnap,首先要设置一下它的配置文件,位于/etc/portsnap.conf 中,如下所示:
#ee /etc/portsnap.conf
SERVERNAME = portsnap.freebsd.org
将其修改如下:
SERVERNAME = portsnap.hshh.org
 
可以根据实际速度来判断是否需要更新port的升级源.
(2)     首次使用freebsd的portsnap时必须执行下面两步.
Portsnap fetch
Portsnap extract
这两步也可以合成为:
Portsnap fetch extract
 
(3)     以后更新时我们可以使用portsnap更新ports,并执行如下两个步骤:
这两步也可以合成为:
Portsnap fetch update
 
更新后安装 squid.
#cd /usr/ports/www/squid

# make install clean