防火墙软件Netfilter之包过滤技术(转)[@more@] 如果您不知道什么是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 -----------&gt[Routing ]---&gt|FORWARD|-------------&gt [Decision] \_____/ ^ | | v ____ ___ / / |OUTPUT| |INPUT| \____/ \___/ ^ | | -----&gt 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的才匹配。 --syn 等同于--tcp-flags SYN,RST,ACK SYN (100) --source-port 或者 --sport 描述源端口,要么用数字,用么用/etc/services文件中的名字。可以用m:n来表示一组端口。 --destination-port 或者 –dport 描述目的端口 --tcp-option 检查一个包是否有相应的tcp选项,如果没有的话,包将被drop掉。 l TCP标记的一个解释 有时候只允许一个单向的TCP连接。例如,你只需要访问外部的WWW的服务器,而不允许外部访问你内部的WWW服务器。朴素的方法是阻塞所有从你的服务器发出的包,但是TCP连接需要一个双向的交流。解决的方法是只需要阻塞请求连接的包。这些包叫做SYN包。通过阻塞这些包,我们可以达到上面的目的。 标志—syn将被使用。他仅仅适用于TCP协议。例如: -p TCP -s 192.168.1.1 --syn 这条规则描述所有从192.168.1.1发起的连接。 l UDP扩展 如果-u udp 被描述,所有扩展自动装载。他提供与TCP类似的选项--source-port, --sport, --destination-port, --dport。 l ICMP扩展 如果选项-p icmp被描述,所有的扩展自动装载。他只提供一个选项: --icmp-type 看名字就知道是指类型,具体的名字参看-p icmp –help提供的帮助信息。 l 其他匹配扩展 这些选项可以用-m来启动。 Mac 这个模块可以用-m mac或者--match mac来启动。用于匹配输入包的MAC地址,因此之用于PREROUTING and INPUT chains。他只提供一个选项:--mac-source 例如:--mac-source 00:60:08:91:CC:B7 limit 可以用-m limit或者--match limit来启动。用于限制机器,如压缩log信息等等。 Owner 只用于output chain中,并且有些包没有owner(如icmp包),因而没有匹配。 --uid-owner userid 包的产生进程的有效用户id等于userid --uid-owner groupid包的产生进程的有效组id等于groupid --pid-owner processid 包的产生进程的进程的id等于processid --sid-owner sessionid 包的产生进程的session id 等于sessionid unclean 提供随机的安全检查 l 状态匹配 最有用的匹配规则是由状态扩展来提供的。因此推荐用模块ip_conntrack。描述-m state允许一个附加的—state选项。是一个逗号分开的状态列表,这些状态有: NEW 包建立了一个新的连接 ESTABLISHED 包属于一个已经存在地连接 RELATED 一个包与某个连接有关,但是不属于这个连接。 INVALID 包无法定义,通常这些包会被drop 11. 目标描述 现在我们已经知道了怎么检查包,下一步就是决定对匹配的包做什么动作。这一步叫做规则的目标。 两种基本的目标是DROP和ACCEPT。我们已经很清楚了。 但是还有的目标:扩展、用户定义的chains。 用户定义的chains iptables从ipchains继承的一个重要的特性就是用户可以自定义新的chains(除了3个内建的INPUT, FORWARD和OUTPUT)。 当一个包在用户定义的chain中进行规则匹配时,将遍历chain中的所有规则。直到找到匹配。 下面考虑两个2个chain:INPUT(内建)、test(用户定义)。 `INPUT' `test' ---------------------------- ---------------------------- | Rule1: -p ICMP -j DROP | | Rule1: -s 192.168.1.1 | |--------------------------| |--------------------------| | Rule2: -p TCP -j test | | Rule2: -d 192.168.1.1 | |--------------------------| ---------------------------- | Rule3: -p UDP -j DROP | ---------------------------- 假设一个包来自192.168.1.1,其目的地址是1.2.3.4。他首先进入INPUT chain,规则1不匹配。规则2匹配并且其目标是test,因此下一个检查的规则是test的第一个规则。规则1匹配,但是没有描述目标,因此规则2被检查。规则2不匹配,到达chain的末尾。于是返回INPUT chain,这里我们已经检查过规则2,于是检查规则3,不匹配。因此包的检查路径是: v __________________________ `INPUT' | / `test' v ------------------------|--/ -----------------------|---- | Rule1 | /| | Rule1 | | |-----------------------|/-| |----------------------|---| | Rule2 / | | Rule2 | | |--------------------------| -----------------------v---- | Rule3 /--+___________________________/ ------------------------|--- v 用户定义的chains也可以把目标设为用户定义的chains。但是不要形成环。 Iptables的扩展:新的目标 新的目标包括一个内核模块和一个可选的扩展选项(新的命令选项)。在netfilter的发行版本中有下面的几个扩展: LOG 这个模块使得内核可以记录匹配的包的日志。 REJECT 这个模块基本等同于DROP,但是有一点不同。发送方将送出一个ICMP报文:“port unreachable”。注意以下情况不发送: l 被过滤的包本身是一个ICMP差错控制或未知报文; l 第二块及以后的分片 l 最近已经送出了许多ICMP差错控制报文到那个目标 特殊的内建目标 有两个特殊的内建目标:RETURN 和QUEUE RETURN相当于到达chain的末尾。对于一个内建的chain来说,执行相应的策略。对于自定义的,返回前一条chain。 QUENE是一个特殊的目标。他将包放到用户空间等待处理。需要两个额外的部件: l 队列处理器(处理包在内核和用户空间的流通) l 用户空间的应用程序(接受包、操作包) 标准的队列处理器模块ip_queue。 下面是一个例子: # modprobe iptable_filter # modprobe ip_queue # iptables -A OUTPUT -p icmp -j QUEUE 有了这条规则,本地产生的外出ICMP包将流到ip_queue模块,然后他再将包送到用户空间的应用程序。如果没有用户空间的应用程序等待这个包,DROP。 怎么写用户空间的应用程序呢?用libipq API。他是和iptables一起发布的。程序例子在CVS中的testsuide工具里。 ip_queue的状态可以通过下面的命令查看: /proc/net/ip_queue 队列的最大长度可以用下面的命令来控制: /proc/sys/net/ipv4/ip_queue_maxlen 缺省值是1024。 12. 对整个chain的操作 l 创建一个新的chain 假设我们要创建一个名字为test的chain: # iptables -N test 是不是很简单?现在你就可以按照我上面所说的加规则了。 l 删除一个chain 同样的简单。用 –X 或者 –delete-chain选项。 # iptables -X test 注意,删除chain之前,chain必须为空,即没有规则。三个内建chain不能被删除。如果不加名字就删除所有可以删除的chain。 l 清空chain中的所有规则 用-F选项 # iptables -F FORWARD 如果没有chain的名字,将清空所有的chain的所有规则。 l 列出一个chain中的所有规则 用 –L 或者 –list选项 refcnt列是指用户定义的chain的规则数。只有refcnt = 0,chain才可以删除。 另外附加选项 –n 可以避免域名解析,只有IP地址。 -v 选项显示更多细节。 -x 选项显示具体数字,不用K、M、G等表示1000、1000000、1000000000。 l 记数复位 用 –Z 选项。 例如: # iptables -L FORWARD # iptables -Z FORWARD 在上面的两条命令之间,可能会有一些包通过。因此可以将他们合在一起,复位记数。 l 设置策略 当一个包没有找到合适的规则匹配,这时候策略将会决定包的命运。仅仅只有3个内建的chain才有策略。因为当一个包到达用户定义的chain的末尾,会返回前一个chain。 策略可以为ACCEPT或者DROP,例如: # iptables -P FORWARD DROP 13. 使用ipchains和ipfwadm 这是对于老用户熟悉了以前的,又不想学习iptables的。有两个模块ipchains.o 和ipfwadm.o。 只要插入相应的模块就可以了。 14. 混合NAT和包过滤技术 在应用包过滤技术不用考虑NAT的存在,二者结合很好。 关于NAT,将在下一篇中描述。 15. 包过滤技术的设计建议 在计算机安全领域,一种说法是阻塞所有的东西,然后当需要时才打开一些小洞小坑。就像古罗马的竞技场。Ipchains的作者强烈推荐这种方法。 不运行你不需要的服务!! 如果运行防火墙,开始时阻塞所有的包,然后再慢慢地让需要的包通过。 建议将包过滤与tcp-wrappers、代理技术、路由检验结合起来。 强烈建议跟踪连接:需要装载模块ip_conntrack.o。例如,下列命令: # iptables -N no-conns-from-ppp0 # iptables -A no-conns-from-ppp0 -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A no-conns-from-ppp0 -m state --state NEW -i ! ppp0 -j ACCEPT # iptables -A no-conns-from-ppp0 -i ppp0 -m limit -j LOG --log-prefix "Bad packet from ppp0:" # iptables -A no-conns-from-ppp0 -i ! ppp0 -m limit -j LOG --log-prefix "Bad packet not from ppp0:" # iptables -A no-conns-from-ppp0 -j DROP # iptables -A INPUT -j no-conns-from-ppp0 # iptables -A FORWARD -j no-conns-from-ppp0 细细体会之

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8225414/viewspace-940730/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8225414/viewspace-940730/

防火墙软件Netfilter之包过滤技术(转)相关推荐

  1. 防火墙系列(二)-----防火墙的主要技术之包过滤技术,状态检测技术

    防火墙系列(二)-–防火墙的主要技术 必备知识:TCP/IP基础 包过滤技术 工作对象–>数据包 防火墙要在数据包进入系统之前处理它 实现包过滤技术的防火墙模块要在操作系统协议栈的网络层的位置. ...

  2. 如何运用包过滤技术实现个人防火墙

    摘要:本文通过介绍如何运用 包过滤技术实现个人 防火墙,深入的剖析了个人防火墙中所用到的各种技术,并重点介绍了通过微软的NDIS 中间驱动 程序实现网络封装包,以及驱动程序与应用程序之间的通讯方法. ...

  3. 企业防火墙软件的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告

    本文研究全球与中国市场企业防火墙软件的发展现状及未来发展趋势,分别从生产和消费的角度分析企业防火墙软件的主要生产地区.主要消费地区以及主要的生产商.重点分析全球与中国市场的主要厂商产品特点.产品规格. ...

  4. 用包过滤技术实现个人防火墙

      随着网络的迅速发展,各种各样的网络软件也随之出现,人们的生活和学习对网络的依赖也越来越多,但问题也接踵而来,网站被攻击,病毒泛滥,个人信息被窃取,使人们面临这样一个问题:网络是否安全? 而防火墙正 ...

  5. 基于VC++包过滤技术防火墙设计与实现

    目录 摘要 I Abstract II 目录 III 1 绪论 1 1.1 研究背景 1 1.2 研究意义 2 1.3 课题内容 3 2 包过滤防火墙技术 4 2.1 包过滤防火墙技术简介 4 2.2 ...

  6. 简单了解Linux操作系统中的防火墙软件及其部署案例解析

    1.首先我们来简单的认识一下防火墙: 防火墙(Firewall),也称防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网(US5606668(A)1993-12 ...

  7. 黑客突破防火墙常用的几种技术(转)

    一.防火墙基本原理 首先,我们需要了解一些基本的防火墙实现原理.防火墙目前主要分包过滤,和状态检测的包过滤,应用层代理防火墙.但是他们的基本实现都是类似的. │ │---路由器-----网卡│防火墙│ ...

  8. 开源免费,最好用的3大系统9大防火墙软件安利给你们

    目录 什么是防火墙软件? 适用于 Windows 的3个最佳免费防火墙软件 适用于 macOS 的3个最佳免费防火墙软件 适用于 Linux 的3款最佳免费防火墙软件 安全培训资源 互联网这么发达,病 ...

  9. 服务器防火墙软件—iptables

    文章目录 服务器防火墙软件--iptables 一.iptables概述 二.iptables的表.链结构 2.1 表.链分类 2.2 数据包过滤的匹配流程 2.2.1 数据包在规则表和链直接的匹配流 ...

最新文章

  1. 五个超酷Linux命令
  2. IP地址中的网络地址和主机地址分别是什么意思?怎么计算的呢?
  3. NYOJ 269 VF
  4. html邮件和纯文本邮件区别,邮件营销必读系列五--纯文本和HTML邮件类型——哪一种邮件类型更适合你?...
  5. [转帖]备忘:CentOS-7 使用systemctl 管理的服务,文件打开数上限1024要改
  6. 有人说“如今聪明的年轻人上班,愚蠢的年轻人创业!”对此大家怎么看?
  7. ASP 中调用函数关于Call使用注意的问题
  8. Pytorch 1.1.0驾到!小升级大变动,易用性更强,支持自定义RNN
  9. 超简单的Matlab附加功能安装包的安装方法
  10. 微信小程序之上传图片功能
  11. 原子结构示意图全部_原子结构示意图规则
  12. 圆形矢量场field driven strength效果
  13. 惠普笔记本电脑重装系统后找不到引导设备
  14. widows安装wxPython
  15. 摸爬滚打DirectX11_day_11——三维天空
  16. 微信小程序:隐藏和显示功能
  17. H5音乐播放器我的2.0
  18. gl linux qt 库_Linux下Qt应用程序的发布(使用LDD命令查看所有依赖的库文件)
  19. GFD233A 3BHE022294R0103
  20. 量化投资技术六大环节

热门文章

  1. Compensating-Transaction模式
  2. 如何给App快速搭建虚拟服务器
  3. 线性稳压电源和开关电源到底有什么区别
  4. java女程序员的出路,持续更新~
  5. 详解数据仓库建设体系
  6. 忆享聚焦|全球云计算市场份额、数字虚拟人、“元宇宙”实体店……近期行业热点速览
  7. 清晰weblog日志,过滤不合法的记录
  8. Shiro权限管理实现(详解)
  9. 模型是如何训练出来的
  10. coreldraw铺花纹_CorelDRAW打造漂亮剪纸花纹教程