⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 防火墙软件netfilter之包过滤技术.txt

📁 BBS的精华之处
💻 TXT
📖 第 1 页 / 共 2 页
字号:
发信人: cucme (说你说我), 信区: Hacker 
标  题: 防火墙软件Netfilter之包过滤技术 
发信站: 哈工大紫丁香 (2001年08月29日14:10:02 星期三), 站内信件 
  
  
  
    如果您不知道什么是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。 
  
我们也可以删除规则。有两种方法: 
  
第一种方法是既然我们知道他是input chain中的第一条规则,可以用下面的命令: 
  
# iptables -D INPUT 1 
  
删除规则1; 
  
第二种方法是匹配-A选项,用-D选项代替。这适用于规则非常多,不容易记住编号 
的情况,例如要删除上面的规则: 
  
# iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP 
  
  
  
10. 过滤规则的描述 
  
l 描述源和目的IP地址 
  
源地址(-s 或者—source或者—src)目的地址(-d或者—destination或者--dst)。 
一般是用名字如“localhost”或者www.linuxaid.com.cn;或者用IP地址如127.0.0.1。 
  
有时候需要描述一组地址,例如199.95.207.0/24或者199.95.207.0/255.255.255.0 
用来描述从199.95.207.0到199.95.207.255的所有地址。/后面是网络掩码或网络位 
数。/0表示任何地址。例如: 
  
# iptables -A INPUT -s 0/0 -j DROP 
  
表示DROP掉所有收到的包。 
  
l 反符号! 
  
用符号!可以表示相反的意思。例如: 
  
-s ! localhost 表示任何不是来自localhost的包。 
  
-p ! TCP 表示任何不是TCP的协议。 
  
l 描述协议 
  
-p 协议名(如TCP) 
  
l 描述接口 
  
-i选项表示in-interface;-o选项表示out-interface。分别表示包将要到达或者 
离开的屋里设备。你可以用命令ifconfig来查看网络接口。 
  
INPUT chain不需要输出接口,所以他的-o 选项的内容将会被忽略。同理, 
OUTPUT chain不需要-I 选项的内容。 
  
仅仅只有FORWARD chain同时需要输出和输入选项,即-I 和 –o 都有用。 
  
描述一个并不存在的网络接口是可以得,这特别适用于拨号上网的情况。符号+ 
表示匹配,例如:-i ppp+表示所有的PPP接口。 
  
!符号也可以用在接口中 
  
l 描述分片 
  
当一个包在传输过程中由于大于所经过的网络的最大传输单元(包的长度太大), 
将会分片,分成很多小的分片发出。在另一端再进行重组。关于分段的问题的是第 
一个分片可以很好的检查(IP + 
TCP/UDP/ICMP),但是后续的分片只有IP,没有上一层的信息。这对于过滤规则是 
不可能的。 
  
因而,让我们看看过滤规则怎么处理分片。第一个分片跟普通的包处理没有任何区 
别,但是第二个以及以后的分片将由于缺少信息而不会与规则匹配。例如: 
  
规则-p TCP --sport www将不会匹配任何分片(除了第一个分片)。同样规则 
-p TCP --sport ! www也不会匹配任何分片(除了第一个)。 
  
但是可以使用-f 选项来描述规则,以适用于第二个和以后的分片。通常是让第二个 
和以后的分片通过,因为过滤规则适用于第一个分片,如果第一个分片没有通过, 
他的分片最终将不会重组。但是要小心大量的分片会崩掉你的网络或机器。 
  
例如,下面的规则将会drop所有到192.168.1.1的分片: 
  
# iptables -A OUTPUT -f -d 192.168.1.1 -j DROP 
  
  
  
l iptables的可扩展性 
  
iptables是可以扩展的,这就是说意味着内核和iptables工具都可以扩展以提供新 
的特性。 
  
内核扩展位于内核的模块子目录,例如/lib/modules/2.3.15/net。需要你手工加 
入这些模块。 
  
Iptables程序扩展位于目录/usr/local/lib/iptables/。 
  
为了获得扩展的帮助,用选项(-p、-m、-j)来装载他并且后跟-h,例如: 
  
# iptables -p tcp --help 
  
l TCP扩展 
  
如果-p tcp被描述,TCP扩展将会自动装载。下面的选项将生效(对分片无效) 
  
--tcp-flags 
  
一系列的标志,分为两个串,第一个串表示哪些标志是要检查的;第二个串表示 
哪些标志是1(其他则为0)。 
  
例如: 
  
# iptables -A INPUT --protocol tcp --tcp-flags ALL SYN,ACK -j DENY 
  
表示ALL(SYN,ACK,FIN,RST,URG,PSH')的标志都要被检查,但是只有设置了SYN和 
ACK的才匹配。 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -