Linux iptables 防火墙


1、防火墙(Firewall)
 
1.1防火墙定义
所谓防火墙指的是一个由软件和硬件设备组合而成、在内部网和外部网之间、专用网与公共网之间的界面上构造的保护屏障.是一种获取安全性方法的形象说法,它是一种计算机硬件和软件的结合,使Internet与Intranet之间建立起一个安全网关(Security Gateway),从而保护内部网免受非法用户的侵入,防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成,防火墙就是一个位于计算机和它所连接的网络之间的软件或硬件。该计算机流入流出的所有网络通信和数据包均要经过此防火墙。
 
在网络中,所谓“防火墙”,是指一种将内部网和公众访问网(如Internet)分开的方法,它实际上是一种隔离技术。防火墙是在两个网络通讯时执行的一种访问控制尺度,它能允许你“同意”的人和数据进入你的网络,同时将你“不同意”的人和数据拒之门外,最大限度地阻止网络中的黑客来访问你的网络。换句话说,如果不通过防火墙,公司内部的人就无法访问Internet,Internet上的人也无法和公司内部的人进行通信。
 
1.2防火墙分类
 
1)网络防火墙
 
网络层防火墙可视为一种 IP 封包过滤器,运作在底层的TCP/IP协议堆栈上。我们可以以枚举的方式,只允许符合特定规则的封包通过,其余的一概禁止穿越防火墙(病毒除外,防火墙不能防止病毒侵入)。这些规则通常可以经由管理员定义或修改,不过某些防火墙设备可能只能套用内置的规则。
 
我们也能以另一种较宽松的角度来制定防火墙规则,只要封包不符合任何一项“否定规则”就予以放行。操作系统及网络设备大多已内置防火墙功能
 
2)应用防火墙
 
应用层防火墙是在 TCP/IP 堆栈的“应用层”上运作,您使用浏览器时所产生的数据流或是使用 FTP 时的数据流都是属于这一层。应用层防火墙可以拦截进出某应用程序的所有封包,并且封锁其他的封包(通常是直接将封包丢弃)。理论上,这一类的防火墙可以完全阻绝外部的数据流进到受保护的机器里。
 
防火墙借由监测所有的封包并找出不符规则的内容,可以防范电脑蠕虫或是木马程序的快速蔓延。不过就实现而言,这个方法既烦且杂(软件有千千百百种啊),所以大部分的防火墙都不会考虑以这种方法设计。
 
XML 防火墙是一种新型态的应用层防火墙。
 
根据侧重不同,可分为:包过滤型防火墙、应用层网关型防火墙、服务器型防火墙。
 
3)数据库防火墙
 
数据库防火墙是一款基于数据库协议分析与控制技术的数据库安全防护系统。基于主动防御机制,实现数据库的访问行为控制、危险操作阻断、可疑行为审计。
 
数据库防火墙通过SQL协议分析,根据预定义的禁止和许可策略让合法的SQL操作通过,阻断非法违规操作,形成数据库的外围防御圈,实现SQL危险操作的主动预防、实时审计。
 
数据库防火墙面对来自于外部的入侵行为,提供SQL注入禁止和数据库虚拟补丁包功能。
 
2、netfilter/iptables
 
在Linux系统中,提供了一个叫做netfilter的框架,用于对数据管理。
 
Netfilter官方网站:http://www.netfilter.org。
 
1)Netfilter的设计架构
 
在NetFilter的处理中,提供了一系列的钩子函数。
图中1、2、3、4、5就是钩子函数的位置。分为3条路径:
 
1、2:代表了到本机的封包。
 
5、4:代表了由本机发出的封包。
 
1、3、4:代表了需要转发的封包。
 
2)iptables
 
Iptables就是在netfilter框架基础上,实现相关钩子函数,从而提供了防火墙(packet filter)、网络地址转换(NAT)、封包修改(package mangle)等功能:
图中涉及的功能有:Filter、Connection Track、NAT、Mangle,其实还有两个:raw、Security。
 
Connection Track其实是NAT的一部分。
 
从上图,也能看出有3条数据流向,分别对应了:目的为本机的报文、由本机发出的报文、转发的报文。
 
Iptables实现了netfilter的钩子函数从而提供这些功能。在钩子的实现过程中,利用了一系列的规则链(rule chain),封包就是要在相应的规则链上进行检查,检查通过后才会到达最终目的地。
 
功能与规则链对照表
 

功能(表)

Filter

INPUT、FORWARD、OUTPUT

Nat

PREROUTING、OUTPUT、POSTROUTING

Mangle

PREROUTING、INPUT、OUTPUT、POSTROUTING

raw

PREROUTING、OUTPUT

Security

INPUT、FORWARD、OUTPUT

 
从该表也可以看出,规则链也正好与所处的钩子函数的位置是一一对应的。
 
如果系统中使用了多个功能,也就是配置了多个规则链是如何结合工作的呢?
上图就是封包在这些规则链的处理流程。
 
3、iptables命令详解
 
在终端使用man iptables就可以看到这个命令的说明。也可以在线查看:http://ipset.netfilter.org/iptables.man.html 。
 
3.1命令的语法
iptables [-t table] {-A|-C|-D} chain rule-specification
 
iptables [-t table] -I chain [rulenum] rule-specification
 
iptables [-t table] -R chain rulenum rule-specification
 
iptables [-t table] -D chain rulenum
 
iptables [-t table] -S [chain [rulenum]]
 
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
 
iptables [-t table] -N chain
 
iptables [-t table] -X [chain]
 
iptables [-t table] -P chain target
 
iptables [-t table] -E old-chain-name new-chain-name
 
rule-specification = [matches...] [target]
 
match = -m matchname [per-match-options]
 
target = -j targetname [per-target-options]  
 
其中最常用的规则是:
 
iptables –t command match_parameters –j target
 
下面使用一个例子来说明参数:
 
例子:允许以SSH方式连接到本机:
 
Iptables –t filter -A INPUT –p tcp –m tcp -–dport 22 –j ACCEPT
 
1)table 参数
 
-t :表名。Iptables提供了多种功能。table参数其实就是功能的名称。
 
上面例子中,使用了防火墙功能(filter),所以参数-t的值就是filter。table的可选值参见:功能与规则链对照表。
 
该参数默认值就是filter,所以配置防火墙时,可以不设置表名。
 
2)command 参数
 
command参数是对规则链进行操作,例如添加一条规则。Iptables提供了下面这些command。
 
-A,--append chain rule-specification追加一个规则。
 
-C,--check chain rule-specification检查你输入的规则在规则链中是否已存在。
 
-D,--delete(chain rule-specification | chain rulenum)删除指定规则链中的指定的规则。
 
-I, --insert chain [rulenum] rule-specification在指定规则链中插入规则。
 
-L,--list [chain]列出所有指定规则链中所有的规则。
 
-R,--replace chain rulenum rule-specification替换规则。
 
-S,--list-rules [chain]打出指定链中的所有规则。
 
-N,--new-chain chain自定义一条规则链。
 
-X,--delete-chain [chain]删除指定的用户自定义的规则链。
 
-P,--policy chain target 设置指定链的target参数的默认值。
 
-E,--rename-chain old-chain new-chain 对规则链重命名。
 
-F,清除规则。
 
-h 查看帮助。
 
4) match paramtes
 
[!] –p,--protocol protocol协议
 
用于判断一个packet是否采用了指定的协议。
 
参数值可以是:tcp、udp、udplit、icmp、esp、sh、sctp,或者是all(所有协议),或者是数字。数字0等价于all。
 
如果参数值前面有!,则是做相反的判断。即判断packet没有采用指定的协议。
 
[!] –s,--source address[/mask][,….]
 
用于匹配封包的来源,即判断一个封包的是否来自于指定的地址。
 
该参数值可以是网络名,主机名,IP地址(可以带有子网掩码)。如果参数值前面有!,则是做相反的判断。
 
[!] –d, --destination address[/mask][,…]
 
用于匹配封包的目的地址,即判断一个封包的是否要到达指定的地址。
 
参数值与-s类似。
 
-m,--match expression扩展匹配
 
-j,--jump target 这个参数的作用是在封包匹配上述规则的情况下,接下来要执行的规则。而接下来要执行的规则,则是由target参数指定的。
 
[!] –i,--in-interface name 指定接收时采用的网络接口
 
当一个packet进入了INPUT、FORWARD、PREROUTING链时,判断这个packet是否是指定的这个网络接口(interface)接收的。
 
如果参数值前面有!,则是做相反的判断。
 
如果参数值以+结尾,则是指所有的开始于指定的接口的那些网络接口都会被匹配到。
 
[!]-o ,--out-interface name 指定发送时采用的网络接口。
 
这与--in-interface是一样的。
 
-g,--goto chain
 
packet继续被指定的chain处理。
 
4)target 规则名称
 
       防火墙规则中不单单会对packet进行匹配限定,也会对target进行限定。如果packet 与指定的规则不匹配,就会执行下一条规则。如果匹配,执行target所代表的下一条规则。
 
       也就是说target是接下来要执行的规则的名称。此外,也提供了几个特定的值。
 
ACCEPT:接收该包,让该包通过。
 
DROP:在底层丢掉这个包。就是将该包废弃了。
 
QUEUE:传递该包到用户空间。
 
RETURN:停止在改chain上传输,继续执行前一条chain上的下一个规则。
 
5) match extension 匹配的扩展
 
在匹配参数中,只能针对协议、源地址、目标地址、网络接口等进行匹配。对于需要更细致的匹配(例如对目标端口的匹配),则无能为力。匹配参数中,有一个-m,这个可以提供更细致的匹配。
 
例如,要使接受SSH发的packet,则需要使用tcp的扩展,可以指定Packet的目标地址:
 
使用-m tcp –dport 就可以了。
 
Iptables –t filter -A INPUT –p tcp –m tcp –dport 22 –j ACCEPT
 
如果想要一次指定多个端口,可以使用multiport的扩展:
 
Iptables –t filter -A INPUT –p tcp –m tcp -–dport 22,21,8080,1900 –j ACCEPT
 
具体有哪些扩展匹配,可以参考:
 
http://ipset.netfilter.org/iptables-extensions.man.html
 
3.2、示例
 
网上有很多示例,可以参考:
 
http://www.cnblogs.com/argb/p/3535179.html
 
4、防火墙管理
 
service iptables {start|restart|stop|condrestart|status|panic|save}
start:启动
 
stop:停止
 
restart:重启
 
status:查看状态
 
save:保存到配置文件中
 
在配置防火墙时,通常会:
 
1、servic iptables start
 
2、使用iptables命令来配置规则
 
3、service iptables save,将配置保存到配置文件中
如果是远程进行防火墙配置时, 记得要将22(SSH)端口配置进去,不然自个不能登录操作了。

相关内容