摘要:防火墙软件Netfilter之包过滤技术
如果您不知道什么是IP地址、网络地址、网络掩码、路由或者DNS,那么,请先阅读相关的网络基础书籍。
1.什么是包过滤(Packet Filter)?
包过滤技术就是利用一些软件来查看收到包的头部,然后决定整个包的命运。要么DROP这个包(例如丢弃这个包,就像没有收到一样);要么Accept这个包;或者更复杂的动作。在Linux下,包过滤被编译到内核中。
2.为什么要用包过滤
控制:
能够允许某些类型的包通过,或者不允许某些类型的包通过。例如,包的头部含有目的地址的信息,因此,您可以设置过滤规则禁止网络内部的包到达某些外部的网络地址。举个实例,当你用netscape浏览Dilbert文档时,在它的页面上会出现来自doubleclick.net的烦人广告,让包过滤禁止任何去或者来自doubleclick.net的包就可以解决问题了。
安全:
如何在混乱的Internet和您的有序的网络之间通信?设置了防火墙来把守您的大门是十分必要的。例如,您可以允许任何包出去,但是对著名的“Ping of Death”(来自外部的攻击者)感到焦虑。又例如,您不允许外部telnet到内部的机器(尽管每个用户都有密码)。等等,都可以通过设置规则解决。
警觉:
有时候一台配置不好的内部机器向外面喷涌发包。包过滤能够及时向网络管理员报告此类异常,这样,管理员就能够做出相应的行动,以防不测。
3.Linux包过滤的发展史
l Ipfw 1994, coming from BSD, 内核2.0,工具ipfwadm
l Ipchains 1998, based on the ipfw, 内核 2.2,工具ipchains
l Netfilter 1999, based on the ipchains, 内核2.3.15~2.4, 工具iptables
(包过滤源代码直接嵌入在内核中,工具iptables作为一个模块,可以嵌入,也可以不)
4.Iptables
新一代的工具,比ipchains和ipfwadm更加强大,对IPv6的支持更好。
5.Iptables快速指南
大多数人只有一个单独的PPP连接到Internet,但是不想任何人访问他们的内部网络或者放火墙,可以如下设置:
## Insert connection-tracking modules (not needed if built into kernel).
# insmod ip_conntrack
# insmod ip_conntrack_ftp
## Create chain which blocks new connections, except if coming from inside.
# iptables -N block
# iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT
# iptables -A block -j DROP
## Jump to that chain from INPUT and FORWARD chains.
# iptables -A INPUT -j block
# iptables -A FORWARD -j block
6.包如何通过netfilter
内核在过滤表中维持了3个规则列表,这些列表叫做firewall chains。这3个chains分别叫做INPUT, OUTPUT 和FORWARD。如下图:
Incoming /--------- Outgoing
----------->[Routing ]--->|FORWARD|------------->
[Decision] \_____/ ^
| |
v ____
___ /
/ |OUTPUT|
|INPUT| \____/
\___/ ^
| |
-----> Local Process -----------
当包经过相应的chain时,这个chain将决定这个包的命运。如果chain认为DROP,就丢弃这个包;如果认为ACCEPT就继续在图中旅行。每一个chain是众多规则的检查表。规则的格式为:“如果包头部看起来象某个东西,然后对这个包做某个动作”。如果一条规则与包头部不匹配,继续检查chain中的下一条规则。一旦找到匹配的,执行相应的动作。否则,一条匹配的都没有,就检查chain的安全策略。通常是DROP。过程如下:
l 当一个包到达(如以太网接口),内核首先检查包的目的地址,这叫做“路由”
l 如果包的目的地址是本机,包将继续在上图中旅行,到达INPUT chain,如果通过了这个chain,那么任何需要这个包的进程都可以收到
l 目的地不是本机,如果内核不允许包转发,或者不知道如何转发,DROP这个包;如果内核允许转发,并且包需要经过另一块网络接口(在您的机器上至少有两个网络接口),那么包将在图中旅行到FORWARD chain,如果通过这个chain,包就可以送出了
l 本机程序发出的包必须经过OUTPUT chain,如果能够通过这个chain,那么这个包就可以送到相应的网络接口并发出
7.使用iptables
iptables有一个非常详细的帮助文件(man iptables),跟ipchains有很多类似之处。
下面列出管理chain的一些参数:
Create a new chain (-N). 产生一个新的chain
Delete an empty chain (-X). 删除一个空的chain
Change the policy for a built-in chain. (-P). 修改安全策略
List the rules in a chain (-L). 列出chain的规则
Flush the rules out of a chain (-F). 清空所有规则
Zero the packet and byte counters on all rules in a chain (-Z). 所有规则包和字节数清零
管理一个chain内部的规则:
Append a new rule to a chain (-A). 加入一个新的规则
Insert a new rule at some position in a chain (-I). 在一个chain的某个位置加入新的规则
Replace a rule at some position in a chain (-R). 在一个chain的某个位置替换规则
Delete a rule at some position in a chain (-D). 在一个chain的某个位置删除规则
Delete the first rule that matches in a chain (-D). 删除与chain匹配的第一条规则
8.计算机启动
iptables可以作为一个模块(iptable_filter.o),当你运行iptables时候自动装载,或者永久的编译到内核中。
在任何iptables命令执行之前,三个chain的缺省安全策略是“ACCEPT”。可以修改FORWARD chain的策略,把iptable_filter模块的选项中的forward=0。
9.单条规则的操作
用前面介绍的 –A(append) –D(delete) –I(insert) –R(replace)。
每一条规则首先描述包需要满足的条件,然后描述相应的动作(目标)。例如,如果你想DROP掉所有的来自地址127.0.0.1的ICMP包。因此,规则的条件为:协议ICMP、源地址127.0.0.1;规则的目标为DROP。
127.0.0.1是一个loopback接口,即使你没有真正的网络接口都可以用。你可以用ping命令来产生这样的包,用于测试。例如:
# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.2/0.2/0.2 ms
现在加上规则:
# iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP
再试试:
# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
您可以看到这样的包已经被过滤掉了。
-A选项选择chain,我们设为INPUT chain;-s 源地址,我们设为127.0.0.1;-p协议,我们设为ICMP;-j 表示jump,我们设为jump到DROP。
我们也可以删除规则