当前位置: 主页 > 服务器技术 > 安全防护 > 通过IP Filter实现FreeBSD防火墙

通过IP Filter实现FreeBSD防火墙

时间:2010-4-13来源:互联网 点击:
一,计算机的初步工作:
在一个系统上建立放火墙的第一步是禁止所有我们不需要的服务。这可以让来自本地或远程的攻击最小化。编辑/etc/rc.conf以确定inetd,portmap,sendmail的守护进程都已经禁止了。

inetd_enable="NO"
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
check_quotas="NO"

为了最佳的预防效果,还可以把/etc/inetd.conf中的所有服务都注释掉。如果你需要远程登陆,用ssh并在/etc/rc.conf中加入sshd_enable="YES"
一旦你禁止了所有不必要的服务,你可以去unixcircle.com(http://www.unixcircle.com/memberonly/portscan.php3), 从外部对你的机器进行端口扫描测试。请注意,如果你的机器处在一个NAT/firewall的保护下,那么端口扫描的会是这台NAT/firewall。如果你还能有一台机器,可以运行namp从内网扫描你的机器。手动从下列站点获取FreeBSD最近的补丁并运行他们:
ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/

或者通过CVSup同步(http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/synching.html)稳定发行版,并通过源代码对系统打补丁。

如果想获得更多的有关安全的信息,请阅读SANS(http://www.sans.org/top20/)

二,安装网络接口:
假设这台机器上有2块3com 509B的网卡,并且在FreeBSD中名字分别为:ep0,ep1。第一块网卡使用不可路由的保护地址(rfc1918)。第二块网卡被使用静态ip或通过DHCP获得动态ip。

不可路由受保护ip:

10.0.0.1 - 10.255.255.254 netmask 255.0.0.0
172.16.0.1 - 172.31.255.254 netmask 255.240.0.0
192.168.0.1 - 192.168.255.254 netmask 255.255.255.0

假定你选择了192.168.0这个网段,启动第一块网卡需在/etc/rc.conf中加入:

ifconfig_ep0="inet 192.168.1.1 netmask 255.255.255.0"

如果第二块网卡是静态ip,启动它同样需要在/etc/rc.conf中加入:

ifconfig_ep1="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"

这里的xxx表示ISP提供给你的ip和掩码。

一定要为每块网卡指定正确的ip和掩码。一旦你为内网选择了一个网段,内网机器就要保持在这一个网段内。第一块网卡的地址就是FreeBSD网关的默认ip地址。

三,定制内核:

为了编译新内核你需要内核代码(part of kernel developer distribution)。如果你还没做好这些,运行/stand/sysinstall以确定以安装了内核代码。

# cd /sys/i386/conf
# cp GENERIC firewall

我经常以机器名来命名内核文件,当然你可以用任何其他名字。编辑内核配置文件:

# vi firewall

在选项段中加入:

options IPFILTER # IPFilter support
options IPFILTER_LOG # IPFilter logging support
options IPFILTER_DEFAULT_BLOCK # Block all packets by default
options RANDOM_IP_ID # RANDOM_IP_ID causes the ID field in IP packets to be # randomized
# instead of incremented by 1 with each packet # generated.

删除所有与你机器硬件无关项的"options"。有一种方法可以让你知道要保留什么,参考dmesg的输出,并删除所有输出中没有的项。对于所有内核中可用的项可以查阅相同文件夹内的内核文件LINT。保存内核设置文件,并且编译安装:

# cd /usr/src
# make buildkernel KERNCONF=firewall
( kernel building output... )
...
# make installkernel KERNCONF=firewall
# reboot

系统会保留原来的内核文件于/kernel.old以防新内核文件出错甚至系统不能引导。如果真的出错,你可以键入:‘kernel.old‘ 在boot:命令后,声明使用旧的内核文件。

四,开启Packet forwarding,DHCP,Firewall和NAT:

开启Packet forwarding,在/etc/sysctl.conf中加入:

net.inet.ip.forwarding=1

强化系统的方法:

在/etc/sysctl.conf中加入:

为了校验向某个接口的一个流入包的源地址:

net.inet.ip.check_interface=1

丢弃向non-listening tcp/udp 端口的SYN包,这样可以形成一个黑洞,用来防止恶意的端口扫描:

net.inet.tcp.blackhole=2
net.inet.udp.blackhole=1

提升性能的方法:

为了得到系统上的高性能的数据传输,参考:http://www.psc.edu/networking/perf_tune.html
为ip forwarding在/etc/sysctl.conf中加入下列附加项:

# 1. Path MTU discovery: enabled by default
# 2. TCP Extension (RFC1323): enabled by default
# 3. Increase TCP Window size for increase in network performance
net.inet.tcp.recvspace=65535
net.inet.tcp.sendspace=65535
# 4. SACK (RFC2018): FreeBSD doesn‘t have a SACK implementation

DHCP客户端:

如果你想通过DHCP服务器获得你的外网ip地址,在/etc/rc.conf中加入:

ifconfig_ep1="DHCP"

并编辑/etc/dhclient.conf,这样dhcp client才能询问dhcp server,得到一些对连接有用的信息,这是我的/etc/dhclient.conf:

send host-name "crxxxxxx-a"; # Put your client IP here
request subnet-mask, broadcast-address, routers, domain-name-servers;

包过滤规则:

假如你还不知道如何阻塞包,你需要打开一个出口和一个入口来打开网络传输。编辑/etc/ipf.rules并加入:

pass in all
pass out all

这有一个例子:/etc/ipf.rules (http://www.muine.org/~hoang/ipf.txt)

NAT规则:

对于一个工作在NAT后面的NAT和FTP客户端,在/etc/ipnat.rules中加入:

# Use ipfilter ftp proxy for ftp client transfers mode: active
map ep1 192.168.1.0/24 -> 0.0.0.0/32 proxy port ftp ftp/tcp

# Map all tcp and udp connections from 192.168.1.0/24 to external IP address,
# changing the source port number to something between 40,000 and 60,000 inclusive
map ep1 192.168.1.0/24 -> 0.0.0.0/32 portmap tcp/udp 40000:60000

# For all other IP packets, map to the external IP address
map ep1 192.168.1.0/24 -> 0.0.0.0/32

确保每一个‘proxy‘行前都有一个‘portmap‘行,以使所有的匹配成功。
这有一个例子/etc/ipnat.rules:http://www.muine.org/~hoang/ipnat.txt

现在,在/etc/rc.conf中加上NAT/firewall特征:

ipfilter_enable="YES" #Stateful firewall
ipfilter_flags="" #IPFilter is enabled in the kernel and not module
ipnat_enable="YES" #Network Address Translation
ipmon_enable="YES" #Firewall logging
ipmon_flags="-Dsn"

-D: 使ipmon作为守护进程运行。
-n: ip地址和端口可以被映射, 如果可以,可用主机名和服务名。
-s: 读入的包信息会被发到syslogd中,而不是存到文件里。

一些你可以找到的其他的有趣的方法:

1,透明代理(transparent proxying):

如果有一个邮件服务器192.168.1.2在内网中,用"rdr"来声明一个透明代理,在用"rdr"以前的NAT中,对于流入邮件系统的包需要使用"pass in"语句:

/etc/ipnat.rules:

# Redirect incoming smtp traffic to mail server behind NAT
rdr ep1 0.0.0.0/0 port 25 -> 192.168.1.2 port 25

/etc/ipf.rules:

# Allow the translated packets with fragment and SYN flag to flow in. Keep state the connection.
pass in quick on ep1 proto tcp from any to any port = 25 flags S keep state keep frags

2,启动负载均衡(Load balancing)

为一个在NAT后的6台web服务器(192.168.1.1-192.168.1.6)提供负载均衡,使用"round-robin"声明, IPFilter会使用round robin模式加载。IPFilter会一直工作即使其中之一的web服务器当掉。l4check作为IPFilter的一部分会处理这种情况。

rdr ep1 0.0.0.0/0 port 80 -> 192.168.1.1,192.168.1.2 port 80 tcp round-robin
rdr ep1 0.0.0.0/0 port 80 -> 192.168.1.3,192.168.1.4 port 80 tcp round-robin
rdr ep1 0.0.0.0/0 port 80 -> 192.168.1.5,192.168.1.6 port 80 tcp round-robin

3,将过滤规则记录到专门的记录主机(dedicated log server)上:

一个很好的备份记录信息并依赖这个NAT/firewall是否牢固的方法是使用专用记录主机,这是如何建立的相关信息:
a,在NAT/Firewall上,将记录信息发送到一台叫"loghost"的机器上
编辑/etc/syslog.conf并取消下列行的注释:

# uncomment this to enable logging to a remote loghost named loghost
*.* @loghost

重启syslogd:

# kill -1 `cat /var/run/syslog.pid`

b,在专用的FreeBSD记录主机上杀掉当前运行的没有记录远程机器信息的syslogd

# kill -9 `cat /var/run/syslog.pid`

用-a参数调用它来记录远程NAT/firewall机器上的日志

# syslogd -a 192.168.1.1

检查记录主机上给远程NAT/firewall记录的/var/log文件。警告:因为记录主机与firewall之间的传输没有进行加密,因此可能存在受内网攻击的可能。应该使用IPsec加密传输通道。

站长资讯网
.
分页: [1] [2]
TAG: ip filter freebsd 防火墙
推荐内容最近更新人气排行
关于我们 | 友情链接 | 网址推荐 | 常用资讯 | 网站地图 | RSS | 留言