Linux 内核2.4 版本中集成了NetFilter框架,该框架是Linux平台新的网络安全功能框架,实现了多种网络安全功能:数据包过滤、状态保持、NAT,以及抗攻击等等。我们熟知的Iptables,仅仅是NetFilter框架在用户空间的配置工具,负责从用户命令行界面接收命令,然后转化成内核认识的结构体,调用相应的内核操作函数,将规则插入到内核中去。
Iptables的使用方法请在Linux命令行界面中键入"man iptables",查看手册页的情况。
要使用Iptables,必须在编译Linux内核的时候(内核的版本必须大于2.4)选择与NetFilter相关的内核模块,否则即使安装了Iptables,也不能使用。别着急,看到NetFilter和Iptables,不要认为他们是两个东西,它们一个是内核空间的实现模块,称作NetFilter,一个是用户空间的控制命令解析器,称作Iptables。两者结合才能完成整体的工作。我们按以下的叙述顺序说明Iptables和NetFilter的使用方法,以及如何使用它们增强主机的安全性。
将分如下章节讨论
1. 内核NetFilter选项编译过程
2. Iptables工具的安装和编译
3. NetFilter框架和Iptables使用方式概述
4. 使用Iptables增强主机安全性How-To
好了,开始我们的Iptables之旅吧!注意本手册说明的过程都是在RedHat7.2 内核版本2.4.7,启动程序为LILO,Shell为bash 上进行操作的。在别的版本的内核或者操作环境请具体参考系统手册页man信息。
2.1. 内核NetFilter选项编译过程
2.1.1. 内核代码的位置
安装了Linux以后,内核部分的代码在系统目录 /usr/src/Linux-2.4/ 中。当然如果下载了新的内核代码包,例如名为linux-kernel-2.4.X.tag.gz(X表示次要版本号),可以在任何一个目录下解开该代码包,但是一般的规律是将代码包解压到/usr/src/目录下,使用的命令序列如下:
[test /root/]# pwd/root[test /root/]# mv linux-kernel-2.4.7.tag.gz /usr/src/[test /root/]# cd /usr/src/[test /usr/src/]# tar zxvf linux-kernel-2.4.7.tar.gz[test /usr/src/]# cd linux-kernel-2.4.7
好了,进入到了新的内核代码目录,我们现在开始对目录进行裁减和编译。注意:如果没有支持2.4版本的内核,可以从http://www.kernel.org 的网站上获得关于Linux内核的最新下载信息。
2.1.2. 内核代码选项介绍
进入内核源代码所在的目录以后,在该目录下使用如下命令进入内核配置界面:
make menuconfig
该命令会进入到一个ASCI的简单菜单界面,让用户对需要的内核选项进行选取,然后自动保存成一个内核配置文件。进入配置界面后如下图:
选中"Networking options",进入下一配置界面
本界面是专门配置Linux主机网络特性的配置选项
本界面的内容包含了专门配置Netfilter选项
里面罗列的选项一般都需要使用Space键选中。注意在高亮光标停留在某个选项上时,使用Space键可以将该选项加入内核中。但是一个选项和内核有三种关系:
· 模块化方式加入。(在选项前显示【M】)
· 直接编译到内核中。(在选项前显示【*】)
· 不加入内核(选项前显示为空【】)
这两种方式都没有问题,一般推荐使用直接编译到内核中。Space键可以在"模块方式"、"直接编译方式"、"忽略模块"这三种方式之间进行切换。好了,选择完你需要的选项以后,直接使用Tab键将高亮光标移动到"Exit"上,然后一路退出,到下一个界面。保存刚才对内核选项的配置,然后回车退出。
2.1.3. 内核代码的编译和安装
编译内核分为以下几步:
1. 首先使用命令make dep命令编译内核模块之间的依赖关系。
2. 然后使用命令make bzImage 命令编译压缩的内核。
3. 最后连续使用make modules 和make modules_install命令将模块化的选项编译到内核中。
4. 好了,已经编译完成了内核,现在新内核的名字叫做bzImage,路径位置在(假设源代码在/usr/src/Linux-2.4中)/usr/src/Linux-2.4/arch/i386/boot/下,名称为bzImage。
5. 现在我们要使用这个新的内核启动系统。将bzImage拷贝到/boot/目录下,然后起个新的你喜欢的名字,我们假设为bzImage.nf。
2.1.4. 系统使用新编译的内核重新启动
1. 修改/etc/lilo.conf(假设你用LILO启动系统),添加下列行:
image=/boot/bzImage.nf label=linux-nf read-only root=/dev/hda5 (换成你系统的根所在的硬件路径)
2. 编辑完成以后,在shell中敲入命令lilo,安装新的内核到启动映像中。
3. 重新启动系统(使用命令reboot,或者halt -r)
4. 在系统启动以后,你会看到LILO提出的提示符,此时按TAB键,然后会出现可以使用的启动内核,应该有linux-nf,它对应的内核就是/boot/bzImage.nf。直接敲入linux-nf,然后回车,系统就会使用bzImage.nf启动。 2.2. Iptables工具的安装和编译
Iptables是Linux Netfilter框架的用户端程序,负责接收用户的命令,并且将用户命令添加到内核中。Iptables一般是一个*.tar.gz的软件包,下载以后使用如下命令序列将其展开:
[test /root]# pwd/root[test /root]# tar zxvf iptables-2.6.tar.gz[test /root]# cd iptables-2.6[test /root]# make[test /root]# make install
好了,现在可以直接在命令行方式下使用该命令了。该命令的语法后面介绍。
2.3. NetFilter框架和Iptables使用方法概述
Linux根据数据包在内核中的不同处理,将整个IP包在内核中的生存周期划分为三个:PREROUTING、FORWARD、POSTROUTING。其他还有两个LOCAL_INPUT和LOCAL_OUTPUT(一般简写成INPUT和OUTPUT),分别对应送入本机上层协议栈的数据包和本机发送出的数据包。如果想要保护本机的安全性,那么只需关注INPUT和OUTPUT方向的数据包就可以了。其他几个不需要关心。
这五个方向对应着内核中五条不同的规则链和三个不同的规则表。
Linux中规则链被组织在三个不同的规则表中:Filter 、NAT、Mangle。其中Filter针对过滤系统,NAT针对地址转换系统,Mangle针对策略路由和特殊应用。规则链分配如下:
· Filter:INPUT、FORWARD、OUTPUT
· NAT:PREROUTING、POSTROUTING
· Mangle:PREROUTING、POSTROUTING
针对主机的安全性主要集中在Filter表中的INPUT和OUTPUT规则链,这两个关键字在添加规则的时候会使用到。
在内核编译了NetFilter系统以后,系统会自动建立这五个规则链和三个规则表。
我们在使用的时候主要要使用到的规则表是Filter表,规则链是INPUT和OUTPUT链。添加的主要规则都集中在这两个链上。用图示表示如下:
2.4. 使用Iptables增强主机的安全性How-To
1. 取消不必要的服务监听端口
使用Linux下的Setup命令,进入ASCI图形界面,限制主机提供的常用服务,例如FTP、Daytime、Echo、Telnet、WEB、syslog remote等等一系列不需要的服务。
然后使用下列命令序列重启Xinetd:
[test /root]# cd /etc/init.d[test /root]# ./xinted restart
使用netstat -na命令观察系统中是否有不期望的端口正在监听。如果自己需要什么服务,利用Setup工具打开服务,并且重启Xinetd就可以了。
如果没有不期望的端口被打开,可以进入下一步。
2. 修改INPUT和OUTPUT规则链的默认策略
使用下列命令序列:
[test /root]# iptables -P INPUT DROP[test /root]# iptables -P OUTPUT DROP
这样以来,任何未经同意的数据包都会被系统拒绝。
添加如下命令控制访问主机:
iptables -A INPUT -p PROTO -state ESTABLISHED ,RELATED -j ACCEPT
本条命令的含义是凡是属于已经建立连接的数据包,或者关联性连接的数据包都允许通过。注意将命令行中的"PROTO"换成真正的协议名称tcp、 udp、 或者 icmp
iptables -A INPUT -s A.B.C.D/32 -p PROTO -dport PORT -j ACCEPT
这条命令的含义是允许从IP地址为A.B.C.D主机来的,协议为PROTO的IP包,访问本主机的PORT端口的数据包允许通过。例如可以将PORT换成80 ,表示WEB服务,换成22,表示SSH服务等等。注意将PROTO换成tcp或者udp。
好了,只有经过上述命令添加的IP地址的主机,才能访问该主机。
为了防止IP地址冒充,我们可以将IP地址和MAC地址进行绑定,使用如下命令:
arp -s A.B.C.D aa:bb:clearcase/" target="_blank" >cc:dd:ee:ff
表示A.B.C.DIP地址对应的MAC地址是aa:bb:cc:dd:ee:ff。
上述命令完成以后,主机的安全访问就在NetFilter的控制之下了。
例如,允许10.0.0.41的主机访问该服务器的SSH服务,使用如下命令:
iptables -A INPUT -s 10.0.0.41/32 -p tcp -dport 22 -j ACCEPT
允许10.0.0.0/24网段访问news服务:
iptables -A INPUT -s 10.0.0.0/24 -p tcp -dport 532 -j ACCEPT
同时绑定内部主机的MAC地址和IP地址的对应关系。
最后可以使用下列命令观察一下是否所有需要的规则都被完全的加入了内核中:
iptables -L