由于公司的需要控制上网行为,于是前段时间研究了下软路由防火墙。开始经朋友介绍觉得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
#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"
#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_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
# 以下语句用来实现透明共享上网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
# 先阻止所有进入网关/从网关出去的数据
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
# 端口服务并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
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
#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
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
当我们按照自己的需求重新配置了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
为了安全,管理员一般将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
续