Netfilter/Iptables的防火墙功能介绍 1


防火墙介绍
Disclaimer: 下面描述的有些内容可能不完全正确.但希望对你理解iptables有帮助,如果你发现了错误,请通知我。

 

注意,此说明是非拷贝的(例如在GPL).如果你想做任何修改、发布、拷贝、引用,请先联系我。(哈哈,不管了)

什么是防火墙?
简单说,防火墙就是用来保护你的网络的一台主机,它对来自internet和你的内网(受保护)之间的通讯进行限制,反过来亦可。

非防火墙功能
误区 - 防火墙并不能保证你的网络绝对安全
堡垒主机(A bastion host)- In an ideal world, this would be true. However, a firewall is only as secure as the work you put into securing it.
主机安全替换(A replacement for host security) - 每一项防火墙允许的服务都是潜在的风险。
使用类型
本地 - 对于在实际的物理连接而言,没有安全可言。很明显,防火墙对此无能为力。
Local privilege escalation - The trojan horse attack. The attacker alreay has a local account on your box (inside the gates) and obtains root by some means (vulnerability or misconfiguration). A firewall cannot protect again this type of attacks.
Remote - Your host is listening on a port that the attacker is able to connect to remotely over a network and exploit a vunerability somehow. This is the only type of attack a firewall can (hopefully) protect you against. There is another important point here that most firewall howtos neglect. In order for someone to exploit your box remotely, it has to be listening on some ports (i.e. providing a way for an attacker to connect). Therefore, if your host isnt listening on any ports, you are safe from remote exploits (unless the attacker manages to attack the network stack itself).
为何需要防火墙?
提高网络安全 - 某些服务有着固有的风险,不可能作到安全性。防火墙可以帮助你提高网段或部分网络的安全性。
网络访问控制 - 防火墙可以强制性的在网络中应用安全规则。
日志记录 - 由于防火墙检测所有入站/出站的网络通讯,它可以记录网络中的活动。
防火墙的类型
代理防火墙 - 代理服务器.
包过滤防火墙 - 检测IP包 (Netfilter).
什么是 Netfilter/Iptables?
Linux 2.4内核中Netfilter是新的用来实现防火墙的. Iptables 是用来指定Netfilter规则的用户工具。

为什么Ipchains被改为Netfilter/Iptables
状态匹配 - 连接跟踪(can you trust the remote host to determine whether your firewall will accept a packet?).
自动碎片重装- Connection tracking automatically reassembles fragmented packets for examination.
改良的匹配规则 - 高级包匹配,例如速率限制、字符串匹配.
增强的日志功能 - 允许自定义日志级别和实体.
允许包撕裂(?mangle) - 允许撕裂包中的任何信息
用户队列Userspace queuing -允许userspace可以对包进行编程.
支持内置包转发 - 舍弃了IPMASQADM.
主要功能
状态包过滤(连接跟踪)
各种网络地址翻译
灵活、易扩展的急智机制
大量的增强型补丁包
Netfilter/iptables可以做什么?
建立Internet防火墙和基于状态的包过滤
用NAT和伪装(masquerading)共享上网
用NAT实现透明代理
和tc+iproute2配合使用可以实现QoS路由
用(mangling)修改IP包头的TOS字段来实现更复杂的功能
安装Iptables
下载

Iptables v1.2.2 (http://netfilter.samba.org/iptables-1.2.2.tar.bz2) md5sum 7d065a5d1e7003a061bece79a88d903
Linux kernel v2.4.5 (http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.5.tar.bz2)
安装提示

注意,在编译、安装iptables之前,不需要编译内核。并且某些内核选项不可用,除非用"make patch-o-matic".

在/usr/src/linux目录中, make oldconfig (在没有.config文件时,make menuconfig)。
在iptables包的解报目录中, make && make install
打补丁,make patch-o-matic,推荐只打你需要的补丁。
返回 /usr/src/linux目录, make menuconfig ,选择新的、可用的选项
完成正常的内核编译过程(make dep; make clean; make bzImage)

编译 - Iptales编译一般比较简单

make && make install 将在缺省路径/usr/local中做一个最小安装.
make pending-patches 将给标准内核打上一些著名的漏洞补丁.
make patch-o-matic 将给标准内核打上一些增强功能的补丁.
make experimental && make install-experimental 将创建 iptables-save和 iptables-restore 二进制代码.
如果你想修改安装路径,可以带参数BINDIR=/usr/sbin LIBDIR=/usr/lib MANDIR=/usr/man 进行编译。 (e.g. make BINDIR=/usr/sbin LIBDIR=/usr/lib MANDIR=/usr/man install)
补丁包 - 每个补丁都有新的功能,但几乎每个都有漏洞,因此最好不要全部都安装。

注意: 下面列出的是v1.2.1a版本的,不是最新版本. 你可以用 make patch-o-matic命令列出补丁列表来.

CONFIG_IP_NF_TARGET_BALANCE 选项, 类似DNAT:把负载均分到一段地址上。(`--to-dest 1.2.3.4-1.2.3.7)
CONFIG_IP_NF_TARGET_NETLINK, 替代ipchains中的 -o 选项,通过增加一个NETLINK目标,把丢弃的包发往用户空间
CONFIG_IP_NF_TARGET_SAME ,类似SNAT,利用一段地址(`--to-source 1.2.3.4-1.2.3.7),对客户端的每个连接给相同的地址.
CONFIG_IP_NF_TARGET_TTL ,允许用户修改IP包中的TTL值。
CONFIG_IP_NF_MATCH_AH_ESP, 支持两个扩展匹配(`ah and `esp),允许在IPSec包中的AH或者ESP包头中匹配一段SPI范围
CONFIG_IP_NF_DROPTABLE . 将要被丢弃的包将通过这个表,来允许做日志记录,(此补丁有漏洞)
CONFIG_IP_NF_EGG: 连接跟踪。Connection tracking for eggdrop bot networks.
CONFIG_IP_NF_TARGET_FTOS ,允许你任意设置TOS值。从0x0-0xff
ftp-multi.patch 允许ftp连接跟踪和地址翻译到最多8个端口。在ip_conntrack_ftp和ip_nat_ftp模块中用 `ports=选项. 不然,将使用缺省21端口。另外,它还支持FXP(direct FTP 2 FTP transport).使用模块载入参数`fxp=1`可以来支持FXP
ftp-pasv-fix.patch :可以在使用ip_conntrack_ftp.o模块的情况下,在FTP服务器上实现状态类型防火墙功能
CONFIG_IP_NF_MATCH_IPLIMIT 允许限制每个客户端(每个IP)并发TCP连接的最大个数
例如:
#每个客户端最多允许2个telnet连接
iptables -p tcp -dport 23 -m iplimit --iplimit-above 2 -j REJECT
# you can also match the other way around:
iptables -p tcp -dport 23 -m iplimit ! --iplimit-above 2 -j ACCEPT
# 每个C类地址允许的http连接的并发最大个数为16
iptables -p tcp -dport 80 -m iplimit --iplimit-above 16 --iplimit-mask 24 -j REJECT
#允许每个IP地址可同时发起4个HTTP连接
iptables -A INPUT -p tcp --syn --dport http -m iplimit --iplimit-above 4 -j REJECT
#允许整个A类地址中每个地址的HTTP访问为4
iptables -A INPUT -p tcp --syn --dport http -m iplimit --iplimit-mask 8 --iplimit-above 4 -j REJECT


CONFIG_IP_NF_IRC: IRC支持模块,允许 DCC和NAT、连接跟踪一起工作。此补丁依赖丢弃表(dropped-table)和段偏移(seqoffset).
masquerade+fwmark.patch :一种复杂的路由设置,依靠防火墙的标记来路由,和 MASQUERADE NAT target组合来用
nat+conntrack-hashsize.patch 设置连接跟踪代码和NAT代码中的模块参数(hashsize=xxx) hash表的大小,NAT的缺省值为内存的
1/16384(对于大多数机器来说,比先前的缺省值64好多了).
CONFIG_IP_NF_POOL, 提供了一种从IP地址段中的一个位的位映射,它依赖于源或目的地址是否在地址池中设置了位。它也提供了一个目标池
CONFIG_IP_NF_MATCH_PSD, 支持端口扫描检测(PSD:PortScanDetection). 可以检测TCP和UDP端口扫描. 它源自Solar Designer磗 scanlogd.
支持的选项:
--psd-weight-threshold <threshold>
从同一主机发往不同目的端口的TCP/UDP包的总的优先级,被用来作为端口扫描次序
--psd-delay-threshold <delay>
由同一主机发往不同目的端口的包的延迟 (in hundredths of second) ,用来作为可能的端口扫描子次序
--psd-lo-ports-weight <weight>
特权目的端口的优先级,即目标端口(<=1024)的优先级
--psd-hi-ports-weight <weight>
非特权目的端口的优先级(>1024).
举例:iptables -A INPUT -m psd -j DROP
CONFIG_IP_NF_MATCH_RPC,支持两个模块ip_conntrack_rpc_udp和ip_conntrack_rpc_tcp(用来分别跟踪UDP和TCP的端口映射请求),在iptabIe 中添加record_rpc(用来匹配是否包的源地址已经发过端口映射请求,或者是一个新的发往端口映射的GET请求,以允许RPC过滤)
seqoffset.patch - 新的NAT中的 API 函数. 此API函数隐藏了所有的协议翻译(例如:ftp/irc)中的包重设大小和计算序列号的细节问题
要求:至少内核 2.4.2以上!
dropped-table-patch from netfilter patch-o-matic
CONFIG_IP_NF_NAT_SNMP_BASIC 基本的SNMP地址翻译支持. 如同RFC 2962中描述的,是 SNMP-ALG中的“基本”条目;它通过修改SNMP有效载荷中的IP地址来匹配IP层的地址翻译映射.
CONFIG_IP_NF_MATCH_STRING :允许在整个包里匹配字符串.
iptables -A INPUT -m string --string cmd.exe -j QUEUE

tcp-window-tracking.patch :通过Guido van Rooij的论文"IP过滤器中的实时状态TCP包过滤“( Real Stateful TCP Packet Filtering in IP Filter),实现了TCP连接跟踪.它包含新的支持已建立的连接控制的TCP连接跟踪. 并添加了窗口缩放支持(Window scaling).
CONFIG_IP_NF_MATCH_TTL option:允许用户根据包的TTL值来匹配包.
CONFIG_IP_NF_TARGET_ULOG:支持更多高级的包日志记录机制,目录libiptulog/ 下包含有收到的ULOG消息库.
更多信息:http://www.gnumonks.org/projects/ulogd
CONFIG_IP6_NF_TARGET_LOG :在ip6tables中添加LOG target.
CONFIG_IP6_NF_TARGET_REJECT:在ip6tables中添加拒绝目标( REJECT target). 请注意此处的 icmp-types与icmpv6 types不同(更多消息请看:ip6tables -j REJECT -h)
ipv6-ports.patch:ipv6 有IPv6的自己的端口匹配形式.
注意: 以上高亮显示的补丁并不表示你应该编译进你的内核中。仅表示我发现的有趣的功能。你可以把你感兴趣的补丁从目录patch-o-matic 中拷贝到usr/src/linux,并且运行 patch -R -p1 < name_of_the_patch.

下面是一篇转载的关于用IPTables实现字符串模式匹配 的文章


自1995年ipfwadm开始进入1.2.1的核心,Linux的防火墙实现有很长的时间了。Ipfwadm实现了标准的tcp/ip包过滤功能,比如过滤源地址与目的地址以及端口过滤。早在1999年第一个稳定的2.2.0核心中防火墙的实现被ipchains替代了,ipchains的新功能包括支持规则链,碎片包控制,较好的网络地址翻译功能(NAT)以及其他一些有用的改进。我们需要明白Linux防火墙包括核心级代码(通常是可加载核心模块或者核心源程序的补丁)和用户级代码(一个配置的工具,比如/usr/bin/ipchains,这是用来插入包规则到核心空间的)因此无论如何,只要新的linux防火墙代码被引入,核心和用户空间的有关代码都要改写。
2001年2.4的核心完成了,iptables出现了。它引入了很多重要的改进,比如基于状态的防火墙,基于任何TCP标记和MAC地址的包过滤,更灵活的配置和记录功能,强大而且简单的NAT功能和透明代理功能,通过速度限制实现DoS的阻止(更详细的资料请参看A Comparison of iptables Automation Tools一文)。
然而,最重要变化是引入了模块化的架构方式。比如,ipchains和ipfwadm兼容模式是通过一个核心模块的设置实现的,该模块能够在运行的核心中插入,以便提供相应的通讯功能。在附加的变化中,用户自定义编码功能已经成为了可能,比如过滤一定范围的端口,根据TTL值和包的到达时间进行判断,对自定义的协议进行状态监视,对随机的数据包进行监视等,这些目前都还不是iptable的一部分,但是在未来将被实现。很多很有趣的新模块已经完成了。编写一个可加载的核心模块来创建核心级代码,通过用户级代码实现控制过滤器的行为。参见Rusty Russells Linux iptables HOWTO
本文主要关注字符串模式匹配的功能,(显然,是通过模块实现的),该功能可以限制和研究数据包的有效载荷。这是iptable技术的一个非常有意义的突破,它超越了传统的包过滤防火墙的标准TCP/IP标志监视功能。传统的防火墙可以分为包过滤和应用代理两种类型,应用代理防火墙可以分别出应用层的协议比如telnet,HTTP或者SMTP,能够监视这些协议的有效载荷和检查命令,但是应用代理防火墙带来了巨大的性能缺陷:当通过网络协议栈处理上层即应用层的数据包。同时我们需要为每一个要监控的协议编写新的代理程序。包过滤防火墙通常只监视源地址和目的地址,源端口和目的端口,TCP/IP标志等,而完全忽略了高层协议的有效载荷。由于上述原因,包过滤防火墙通常比应用代理防火墙的速度快。应用代理提供了更加有力度的安全控制而包过滤可以用于更高的带宽线路满足更高的吞吐量。
基于以上的情况,iptables的新增功能提供了跨越两种防火墙类型的优势,避免了各自的缺陷,这个功能同时非常清晰的证明了新的模块化的架构较之老的ipchains的优势,它能够使得iptables工作在网络层(OSI模型的第三层)不必工作在高层协议,但是却可以监视高层协议的有效载荷,而不必分析应用层的通信结构。
在2001年5月以前,还没有提出字符串模式匹配模块以前。有一个尝试添加内容监控的能力给iptables防火墙的工程:Hogwash。该工程结合了Snort IDS规则模式匹配引擎,以便于iptable能够响应带有攻击信号的数据包。
现在我们提供了一个Step-By-Step的指导,以便于在RedHat Linux上实现模式匹配的包监视功能。标准的RH7.2提供了iptables 1.2.3的版本以及1.2.4的可用RPM升级包。然而,模式匹配功能没有被包含在标准的发行版中,因为开发人员将它标记为试验。
如果你使用的是RH7.1-7.2,你就已经使用了2.4的核心。你至少需要2.4.4的核心以便能够使用iptables 1.2.4的功能。通常推荐你从发行商那里下载最新的可用的核心。目前,有一个例外:iptables-1.2.4的字符串模式匹配补丁不能在2.4.9的核心下工作。你应该安装核心的源码RPM包(通常被放在/usr/src/linux-2.4.x的源码树内)或者从别处下载的核心源程序(比如www.kernel.org或者它的一个镜像)。
在本文中,将采用最新的2.4.16核心作为例子。测试也能运行在使用2.4.7核心的RedHat 7.2上,但是2.4.7的核心并不推荐使用,因为2.4.7的核心有一些小的安全问题,比如SYN-cookie保护和iptables的保存/恢复功能。
接下来需要从http://netfilter.samba.org/iptables-1.2.4.tar.bz2下载iptables。当对压缩文件进行解压缩之后,需要对iptables进行配置,合并相关的核心源程序树。可以使用半自动化的程序来完成这个目的。首先,可能需要运行程序以便包含已经考虑过的稳定的iptables补丁,但是这个补丁没有被包含在kernel的发行版内。从iptables的解压目录(在本例中iptables在/home/anton/iptables-1.2.4,核心源程序在/usr/src/linux-2.4.16)运行:
make pending-patches KERNEL_DIR=/usr/src/linux-2.4.16
这将开始运行交互式的补丁应用程序,虽然你可以安全应用所有的补丁,但是没有一个补丁是iptables的字符串匹配所必需的。对任何你认为需要的补丁都回答y(yes)。如果你希望能够安全的使用iptables,则选择none。
现在我们将准备应用试验部分的补丁,比如字符串模式匹配的支持。运行:
make patch-o-matic KERNEL_DIR=/usr/src/linux-2.4.16
在这个交互式的过程中,回答y(yes)以便应用string.patch。程序将遍历所有的可用的补丁,包括那些稳定的。
Testing... string.patch NOT APPLIED ( 2 missing files)
The string patch:

Author: Emmanuel Roger <[email protected]>
Status: Working, not with kernel 2.4.9

This patch adds CONFIG_IP_NF_MATCH_STRING which allows you to
match a string in a whole packet.

THIS PATCH DOES NOT WORK WITH KERNEL 2.4.9 !

Do you want to apply this patch [N/y/t/f/q/?] y
其余的补丁也许也让你非常感兴趣,不过它们与本文并不相关。如果你选择安装任何别的补丁,请注意开发者给出的警告信息,其中包括了补丁的功能(比如dropped表的补丁)确定你没有安装MAC过滤的补丁,因为最近发现这个补丁包含一个漏洞。
现在我们开始编译用户空间程序和相关的Libraries:
make KERNEL_DIR=/usr/src/linux-2.4.16
然后我们安装它们(iptables在/usr/local/user/sbin,libraries在/usr/local/lib/iptables)在root身份下执行以下内容:
make install KERNEL_DIR=/usr/src/linux-2.4.16
紧接着我们配置和编译核心:
Now we are ready to compile the user-space code and the libraries:
make KERNEL_DIR=/usr/src/linux-2.4.16
and then install them (iptables program goes in /usr/local/user/sbin and libraries go into /usr/local/lib/iptables). As root:
cd /usr/src/linux-2.4.16
可以使用任何的核心配置方法。有关详细的配置核心的方法,可以查阅Internet资源,Internet上有大量的这方面的文档,比如kernel HOWTO等。以下简要介绍一下:
make xconfig
在GUI界面下,选择Netfilter配置选项,然后在Strings match support前选择m(模块支持),如下图:

然后执行通常的操作:
make dep;make bzImage;make modules;make modules_install
现在按照你喜欢的方式安装核心,并重新启动。重新启动系统以后,测试一下iptables是否支持模式匹配功能,在root身份下执行:
/usr/local/sbin/iptables –m string –help
该命令将显示如下标准的iptables帮助信息:
STRING match v1.2.4 options:
--string [!] string Match a string in a packet
该功能允许你对匹配数据包的内容,我们可以通过netcat或者telnet来测试这一功能,从而确定我们确实可以获得数据包的内容。
运行:
iptables -A INPUT -m string --string "test" -j LOG --log-level
info --log-prefix "TEST"
然后启动一个netcat的服务器:
nc -l -p 3456
然后连接该netcat服务器:
telnet localhost 3456
然后输入:
test
whatevertestdoes
这样将引起iptables产生一个简单的记录,我们在记录文件中将会看到如下的信息(当然你需要设置了记录信息的级别为info)
Nov 27 23:16:53 pua kernel:
TEST IN=lo OUT=MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00

SRC=127.0.0.1 DST=127.0.0.1 LEN=2154 TOS=0x00 PREC=0x00 TTL=64
ID=42880 DF PROTO=TCP SPT=3128 DPT=33018 WINDOW=32767 RES=0x00 ACK PSH URGP=0

Nov 27 23:16:53 pua kernel:
TEST IN=lo OUT=MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00

SRC=127.0.0.1 DST=127.0.0.1LEN=1830 TOS=0x00 PREC=0x00 TTL=64
ID=17451 DF PROTO=TCP SPT=8000 DPT=33017 WINDOW=32767 RES=0x00 ACK PSH URGP=0
在tcp/ip数据包中只要出现test字符串,以上的信息就会产生。这有什么好处呢?太多了。正如Filtering packets based on string matching这篇文章所建议的那样,该文章可以在linuxguru.net的sysctl内找到。它能够用来阻止那些讨厌的IIS蠕虫造成得Unix web服务器记录文件记录大量的对cmd.exe的请求,这些蠕虫将不再干扰你,但是如果你的/var分区(通常是记录文件存放的分区)不够大,那么这一功能将有一定的帮助。只要静静地丢弃蠕虫对80端口的请求或者使用记录限制功能,对这些信息进行记录,丢弃这些包的操作如下:
iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe"
每小时只记录一条这样的信息:
iptables -I INPUT -j LOG -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe" -m limit
--limit 1/hour
Bill Steams(Mason firewall building script的作者)提供了一个极好的建议----转换网络IDS Snort的规则成为iptables字符串模式匹配的规则。Snort的攻击信号数据库中包含了大约1200种信号and appears to be the biggest publicly available attack database suitable for instant deployment。在iptables上使用现成的信号是合理的一种方式。http://www.strearns.org/snort2iptables 是Bill Stearm提供的试验性的软件。在这里你可以找到shell脚本以便将标准的Snort规则转换为iptables的规则。下面是一个将snort关于Linux下针对mountd的攻击和bind的攻击转化为iptables的规则的例子:
Snort 规则:
1. alert udp $EXTERNAL_NET any -> $HOME_NET 518
(msg:"EXPLOIT ntalkd x86 linux overflow";
content:"|0103 0000 000 0 0001 0002 02e8|";
reference:bugtraq,210; classtype:attempted-admin; sid:313; rev:2;)

2. alert tcp $EXTERNAL_NET any -> $HOME_NET 53
(msg:"EXPLOIT named tsig infoleak";
content: "|AB CD 09 80 00 00 00 01 00 00 00 00 00 00 01 00 01 20 20 20 20 02 61|";
reference:cve,CAN-2000-0010; reference:bugtraq,2302; reference:arachnids,482;
classtype:attempted-admin; sid:303; rev:3;)

3. alert udp $EXTERNAL_NET any -> $HOME_NET 635
(msg:"EXPLOIT x86 linux mountd overflow";
content:"|5eb0 0289 06fe c889 4604 b006 8946|";
reference:cve,CVE-1999-0002; classtype:attempted-admin; sid:315; rev:1;)
转化的iptables规则:
1. iptables -A SnortRules -p udp -s $EXTERNAL_NET -d $HOME_NET --dport 518 -m
string --string " è" -j LOG --log-prefix "SID313 " # "EXPLOIT ntalkd x86
linux overflow" bugtraq,210 classtype:
attempted-admin sid:313
2. iptables -A SnortRules -p tcp -s $EXTERNAL_NET -d $HOME_NET --dport 53 -m
string --string "«Í .a" -j LOG --log-prefix "
SID303 " # "EXPLOIT named tsig infoleak" cve,CAN-2000-0010 bugtraq,2302
arachnids,482 classtype:attempted-admin sid:303
3. iptables -A SnortRules -p udp -s $EXTERNAL_NET -d $HOME_NET --dport 635 -m
string --string "^° ‰ þȉF ° ‰F" -j LOG --log-prefix " cve-CVE-1999-0002
" # "EXPLOIT x86 linux mountd overflow" classtype:attempted-admin sid:315
显而易见,上面的转化使用了针对漏洞所使用的缓冲区溢出字符串作为捕获攻击的方式,有些规则不便于转化主要是因为在桢的控制方面snort比iptables要强大一点。
总之,iptables的字符串模式匹配功能能够被用来保护那些开放了易受攻击的而一般的包过滤又无法保护的网络服务(如WWW服务,mail服务,DNS服务,FTP服务等)的组织的网络(如果将它布置在组织的网关上)和单个的主机(使iptables成为主机的一部分),另外,iptables的字符串模式匹配功能还能够帮助实现强制安全策略,即通过关键字来阻止访问非法的内容。 
 

你可能感兴趣的:(Netfilter/Iptables的防火墙功能介绍 1)