iptables 防火墙

linux2.4.x 内核中的防火墙工具 --iptables 的原理与配置,在 tables ipchains 的区别。
一、 概述
1.1 内核开始, linux 就已经具有包过虑功能了,在 2.0 的内核中我们采用 ipfwadm 来操作内核包过虑规则。之后在 2.2 内核中,采用了大家并不陌生的 ipchains 来控制内核包过虑规则。现在最新 linux 内核版本是 2.4.1 ,在 2.4 内核中我们不再使用 ipchains ,而是采用一个全新的内核包过虑管理工具 --iptables 这个全新的内核包过虑工具将使用户更易于理解其工作原理,更容易被使用,当然也将具有更为强大的功能。
我们说过 iptables 只是一个管理内核包过虑的工具, iptables 可以加入、插入或删除核心包过滤表格 ( ) 中的规则。实际上真正来执行这些过虑规则的是 netfilter(Linux 核心中一个通用架构 ) 及其相关模块 ( iptables 模块和 nat 模块 ), 下面我们一起来看看 netfilter 的工作原理。
二、 原理
netfilter Linux 核心中一个通用架构,它提供了一系列的 " "(tables) ,每个表由若干 " "(chains) 组成,而每条链中可以有一条或数条规则 (rule) 组成。我们可以这样来理解, netfilter 是表的容器,表是链的容器,而链又是规则的容器 ( 如图一所示 )
系统缺省的表为 "filter" ,该表中包含了 INPUT FORWARD OUTPUT 3 个链。每一条链中可以有一条或数条规则,每一条规则都是这样定义的 如果数据包头符合这样的条件,就这样处理这个数据包 。当一个数据包到达一个链时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件 : 如果满足 , 系统将根据该条规则所定义的方法处理该数据包;如果不满足则继续检查下一条规则。最后,如果该数据包不符合该链中任一条规则的话,系统就会根据该链预先定义的策略 (policy) 来处理该数据包。
数据包在 filter 表中的流程如图二所示。有数据包进入系统时,系统首先根据路由表决定将数据包发给哪一条链,则可能有三种情况:
1. 如果数据包的目的地址是本机,则系统将数据包送往 INPUT 链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉;
2. 如果数据包的目的地址不是本机,也就是说,这个包将被转发,则系统将数据包送往 FORWARD 链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉;
3. 如果数据包是由本地系统进程产生的,则系统将其送往 OUTPUT 链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉。
从以上我们可以看出, netfilter 比起以前的 ipfwadm ipchains 思路上清晰了好多,也好理解了好多,这对于原先对 ipfwadm ipchains 总是感到一头雾水的用户来说无疑是一个福音。
三、 准备工作
1. 系统需求
netfilter 要求内核版本不低于 2.3.5 ,在编译新内核时,要求选择和 netfilter 相关的项目。这些项目通常都是位于 “Networking options” 子项下。以 2.4.0 内核为例,我们应该选中的项目有:
[*] Kernel/User netlink socket
[ ] Routing messages
<*> Netlink device emulation
[*] Network packet filtering (replaces ipchains)
.......
然后,在 “IP: Netfilter Configuration ---->” 选中:
Connection tracking (required for masq/NAT)
FTP protocol support
IP tables support (required for filtering/masq/NAT)
limit match support
MAC address match support
Netfilter MARK match support
Multiple port match support
TOS match support
Connection state match support
Packet filtering
REJECT target support
Full NAT
MASQUERADE target support
REDIRECT target support
Packet mangling
TOS target support
MARK target support
LOG target support
ipchains (2.2-style) support
ipfwadm (2.0-style) support
其中最后两个项目可以不选,但是如果你比较怀念 ipchains 或者 ipfwadm ,你也可以将其选中,以便在 2.4 内核中使用 ipchians ipfwadm 。但是需要注意的是, iptables 是和 ipchians/ipfwadm 相对立的,在使用 iptables 的同时就不能同时使用 ipchains/ipfwadm 。编译成功后,这些模块文件都位于以下目录中
/lib/modules/ 2.4.0 /kernel/net/ipv4/netfilter
编译 2.4.0 的新内核时还应该注意要在 “Processor type and features” 中选择和你的 CPU 相对应的正确的 CPU 选项,否则新内核可能无法正常工作。
2. 载入模块
要使用 iptables ,还必须载入相关模块。可以使用以下命令载入相关模块:
#modprobe iptable_tables
modprobe 命令会自动载入指定模块及其相关模块。 iptables_filter 模块会在运行时自动载入。
三、 语法
1. 对链的操作
建立一个新链 (-N)
删除一个空链 (-X)
改变一个内建链的原则 (-P)
列出一个链中的规则 (-L)
清除一个链中的所有规则 (-F)
归零 (zero) 一个链中所有规则的封包字节 (byte) 记数器 (-Z)
2. 对规则的操作
加入 (append) 一个新规则到一个链 (-A) 的最后。
在链内某个位置插入 (insert) 一个新规则 (-I) ,通常是插在最前面。
在链内某个位置替换 (replace) 一条规则 (-R)
在链内某个位置删除 (delete) 一条规则 (-D)
删除 (delete) 链内第一条规则 (-D)
3. 指定源地址和目的地址
通过 --source/--src/-s 来指定源地址 ( 这里的 / 表示或者的意思,下同 ) ,通过 --destination/--dst/-s 来指定目的地址。可以使用以下四中方法来指定 ip 地址:
a. 使用完整的域名,如 “[url]www.linuxaid.com.cn[/url]”
b. 使用 ip 地址,如 “192.168. 1.1”
c. x.x.x.x/x.x.x.x 指定一个网络地址,如 “192.168.1.0/255.255. 255.0” ;
d. x.x.x.x/x 指定一个网络地址,如 “192.168.1.0/ 24” 这里的 24 表明了子网掩码的有效位数,这是 UNIX 环境中通常使用的表示方法。
缺省的子网掩码数是 32 ,也就是说指定 192.168.1.1 等效于 192.168.1.1/32
4. 指定协议
可以通过 --protocol/-p 选项来指定协议,比如 -p tcp
5. 指定网络接口将
可以使用 --in-interface/-i --out-interface/-o 来指定网络接口。需要注意的是,对于 INPUT 链来说,只可能有 -i ,也即只会有进入的包;通理,对于 OUTPUT 链来说,只可能有 -o ,也即只会有出去的包。只有 FORWARD 链既可以有 -i 的网络接口,也可以有 -o 的网络接口。我们也可以指定一个当前并不存在的网络接口,比如 ppp0 ,这时只有拨号成功后该规则才有效。
6. 指定 ip 碎片
TCP/IP 通讯过程中,每一个网络接口都有一个最大传输单元 (MTU) ,这个参数定义了可以通过的数据包的最大尺寸。如果一个数据包大于这个参数值时,系统会将其划分成更小的数个数据包 ( 称之为 ip 碎片 ) 来传输,而接收方则对这些 ip 碎片再进行重组以还原整个包。
但是再进行包过滤的时候, ip 碎片会导致这样一个问题:当系统将大数据包划分成 ip 碎片传送时,第一个碎片含有完整的包头信息,但是后续的碎片只有包头的部分信息,比如源地址,目的地址。因此假如我们有这样一条规则:
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.100 --dport 80 -j ACCEPT
并且这时的 FORWARD 的策略 (policy) DROP 时,系统只会让第一个 ip 碎片通过,而丢掉其余的 ip 碎片,因为第一个碎片含有完整的包头信息,可以满足该规则的条件,而余下的碎片因为包头信息不完整而无法满足规则定义的条件,因而无法通过。
我们可以通过 --fragment/-f 选项来指定第二个及其以后的 ip 碎片,比如以上面的例子为例,我们可以再加上这样一条规则来解决这个问题:
iptables -A FORWARD -f -s 192.168.1.0/24 -d 192.168.2.100 -j ACCEPT
但是需要注意的是,现在已经有好多进行 ip 碎片攻击的实例 ( 比如向 Win98 NT4/SP5,6 Win2K 发送大量的 ip 碎片进行 DoS 攻击 ) ,因此允许 ip 碎片通过是有安全隐患的,对于这一点我们可以采用 iptables 的匹配扩展来进行限制,但是这又会影响服务质量,我们将在下面讨论这个问题。
  
7. 指定非
可以在某些选项前加上 ! 来表示非指定值,比如 “-s -! 192.168.1.1/32” 表示除了 192.168.1.1 以外的 ip 地址, “-p -! tcp” 表示除了 tcp 以外的协议。
8. TCP 匹配扩展
通过使用 --tcp-flags 选项可以根据 tcp 包的标志位进行过滤,该选项后接两个参数:第一个参数为要检查的标志位,可以是 SYN ACK FIN RST URG PSH 的组合,可以用 ALL 指定所有标志位;第二个参数是标志位值为 1 的标志。比如你要过滤掉所有 SYN 标志位为 1 tcp 包,可以使用以下规则:
iptables -A FORWARD -p tcp --tcp-flags ALL SYN -j DROP
选项 --syn 是以上的一种特殊情况,相当于 “--tcp-flags SYN,RST,ACK SYN” 的简写。
9. mac 匹配扩展
可以使用 -m 选项来扩展匹配内容。使用 --match mac/-m mac 匹配扩展可以用来检查 ip 数据包的源 mac 地址。只要在 --mac-source 后面跟上 mac 地址就可以了。比如:
iptables -A FORWARD -m mac --mac-source 00:00:BA:A5:7D:12 -j DROP
需要注意的是一个 ip 包在经过路由器转发后,其源 mac 地址已经变成了路由器的 mac 地址。
10. limit 匹配扩展
limit 扩展是一个非常有用的匹配扩展。使用 -m nat 来指定,其后可以有两个选项:
--limit avg: 指定单位时间内允许通过的数据包的个数。单位时间可以是 /second /minute /hour /day 或使用第一个字母,比如 5/second 5/s 是一样的,都是表示每秒可以通过 5 个数据包,缺省值是 3/hour
   --limit-burst number :指定触发事件的阀值 , 缺省值是 5
看起来好像有点复杂,就让我们来看一个例子:
假设又如下的规则:
iptables -A INPUT -p icmp -m limit --limit 6/m --limit-burst 5 -j ACCEPT
iptables -P INPUT DROP
然后从另一部主机上 ping 这部主机,就会发生如下的现象:
首先我们可以看到前四个包的回应都很正常,然后从第五个包开始,我们每 10 秒可以收到一个正常的回应。这是因为我们设定了单位时间 ( 在这里是每分钟 ) 内允许通过的数据包的个数是每分钟 6 个,也即每 10 秒钟一个;其次我们又设定了事件触发阀值为 5 ,所以我们的前四个包都是正常的,只是从第五个包开始,限制规则开始生效,故只能每 10 秒收到一个正常回应。
假设我们停止 ping 30 秒后又开始 ping ,这时的现象是:
前两个包是正常的,从第三个包开始丢包,这是因为在这里我的允许一个包通过的周期是 10 秒,如果在一个周期内系统没有收到符合条件的包,系统的触发值就会恢复 1 ,所以假如我们 30 秒内没有符合条件的包通过,系统的触发值就会恢复到 3 ,假如 5 个周期内都没有符合条件的包通过,系统都触发值就会完全恢复。不知道你明白了没有,欢迎你来信讨论。
11. LOG 目标扩展
netfilter 缺省的目标 ( 也就是一旦满足规则所定义以后系统对数据包的处理方法 ) 有:
ACEEPT :接收并转发数据包
DORP :丢掉数据包
目标扩展模块提供了扩展的目标。 LOG 目标提供了记录数据包的功能。该目标扩展有以下几个参数:
--log-level :指定记录信息的级别,级别有 debug info notice warning err crit alert emerg 分别对应 7 0 的数字。其含义请参看 syslog.conf man 手册。
--log-prefix :后接一个最长为 30 个字符的字符串,该字符串将出现在每一条日志的前面。
12. REJECT 目标扩展
该目标扩展完全和 DORP 标准目标一样,除了向发送方返回一个 “port unreachable” icmp 信息外。
还有其他一些扩展是常用的,如果你想了解可以参考 Packet-Filtering-HOWTO 。当然,最直接获得帮助的办法是查看 iptables 的在线帮助,比如想得到关于 mac 匹配扩展的帮助可以执行 “iptables -m mac -help” 命令,想得到 LOG 目标扩展的帮助可以执行 “iptables -j LOG -help” 命令。

你可能感兴趣的:(linux,防火墙,职场,iptables,休闲)