iptables是Linux上常用的防火墙软件,命令较复杂,功能也十分强大。用于转发过滤数据包。
1、防火墙的作用:
A.分割信任区域 or 不信任区域
B.限定可以提供外网访问的服务
C.分析可以接受 or 拒绝接受的封包
D.NAT功能-地址转换与端口重定向
2、组成部分:
2.1 三个表:
filter 与本机相关,用来过滤数据包
nat 仅用于NAT,转换数据包的源或目标地址
mangle 与特殊的封包的路由旗标相关
2.2 五个链:
PREROUTING 路由前判断
POSTROUTING 路由后判断
FORWARD 穿越防火墙时的包过滤判断
INPUT 进入本机时判断
OUTPUT 从本机出去时判断
2.3 包含关系:
filter–INPUT + OUTPUT + FORWARD
nat–PREROUTING + POSTROUTING + OUTPUT
mangle–所有的链
3、语法:
iptables [-t tables] command [match] [target]
-t tables:指定 iptables 表,若不指定,默认为filter表。
command:命令选项。
match:规则选项。
target:动作选项。
4、命令
命令 | 说明 |
-A,–append | 在所选择的链末添加规则。 |
-D,–delete | 从链中删除规则。 |
-I,–insert | 根据给出的序号插入规则,默认向顶部插入规则。 |
-R,–replace | 在所选中的链里指定的行上替换规则。 |
-L,–list | 显示所选链的所有规则。如果没有指定链,则显示指定表中的所有链。 |
-F,–flush | 清空所选的链。如果没有指定链,则清空指定表中的所有链。 |
-Z,–zero | 把指定链(如未指定,则认为是所有链)的所有计数器归零。 |
-N,–new | 创建一个新的用户自定义链。 |
-X,–delete-chain | 删除一个用户自定义链。 |
-P,–policy | 定义链的默target,这里的target只能是DROP和ACCEPT。 |
-E,–rename-chain | 对自定义的链进行重命名。 |
5、规则
把它们归为五类。第一类是generic matches(通用的匹配),适用于所有的规则;第二类是TCP matches,顾名思义,这只能用于TCP包;第三类是UDP matches,当然它只能用在UDP包上了;第四类是ICMP matches ,针对ICMP包的;第五类比较特殊,针对的是状态(state),所有者(owner)和访问的频率限制(limit)等,它们已经被分到更多的小类当中,尽管它们并不是完全不同的。
通用规则
命令 | 说明 |
-p,–protocol | 匹配协义类型。可以是协义名称(不分大小写),也可以是相应整数值,必需在/etc/protocols中定义,缺省设置为ALL。可以在协义前加英文感叹号取反。 |
-s,,–src,–source | 匹配源地址。单个地址:192.168.1.1 192.168.1.1/24;多个地址:192.168.1.0/24 192.168.1.0/255.255.255.0;在地址前加英文感叹号表示取反,注意空格:-s ! 192.168.1.0/24; 缺省是匹配所有地址。 |
-d,–dst,–destination | 匹配目标地址。语法和-s完全一样。 |
-i,–in-interface | 以包进入本地所使用的网络接口匹配包。要注意这个匹配操作只能用于INPUT,FORWARD,PREROUTING这三个链。感叹号表示取反,-i ! eth0。 |
-o,–out-interface | 以包离开本地所使用的网络接口来匹配包。语法和-i完全一样。 |
-f,–fragment | 用来匹配一个被分片的包的第二个片或及以后的部分。因为它们不包含源或目的地址,或ICMP类型等信息,因此其它规则无法匹配到它,所以才有这个匹配操作。要注意碎片攻击哦。这个操作也可以加英文感叹号表示取反,但要注意位置,如 ! -f。取反时,表示只能匹配到没有分片的包或者是被分片的包的第一个碎片,其后的片都不行。现在内核有完善碎片功能,可以防止碎片攻击,所以不必使用取反的功能来防止碎片通过。如果你使用连接跟踪,是不会看到任何碎片的,因为在它们到达任何链之前就被处理过了。 |
TCP规则
用于匹配TCP数据包,必需有-p tcp作为前提条件
命令 | 说明 |
–sport,–source-port | 基于TCP包的源端口来匹配包,不指定端口认为是全部端口。可以使用端口号或者服务名匹配,使用服务名时必需在/etc/servers中定义。可以使用连续的端口-sport 22:80,表示从22到80所有端口。使用连续端口时省略首位端口号时默认是0,如:-sport :80表示从0到80的所有端口,使用连续端口时省略末位端口时,默认是65535,如-sport 22:表示从22到65535的所有端口。在端口号前面加英文感叹号表示取反。 |
–dport,–destination-port | 基于TCP包的目的端口来匹配包。语法和-sport完全一样。 |
–tcp-flags | 匹配指定的TCP标记。有两个参数,它们都是列表,列表内部用英文逗号隔开,这两个列表之间用空格分开。第一个参数指定我们要检查的标记,第二个参数指定在第一个参数中设为1的标记(即状态是打开的标记),且其它标记值为0。这个匹配操作可以识别以下标记:SYN、ACK、FIN、RST、URG、PSH,另外还有两个词也可以使用就是ALL和NONE。ALL是指选定所有标记,NONE是不选定任何标记。-tcp-flags也可以使用英文感叹号取反值,如:-tcp-flags ! SYN,FIN,ACK SYN表示匹配FIN和ACK标记被设置而SYN标记没有设置的TCP包。 |
–syn | 这是ipchains时代的遗留物,和–tcp-flags SYN,RST,ACK SYN的作用完作一样。也可以使用英文感叹号,如:! -syn用来匹配状态为已建立的连接包。 |
–tcp-option | 根据匹配包。TCP选项是TCP头中的特殊部分,有三个不同的部分。第一个8位组表示选项的类型,第二个8位组表示选项的长度(这个长度是整个选项的长度,但不包含填充部分所占的字节,而且要注意不是每个TCP选项都有这一部分的),第三部分当然就是选项的内容了。和TCP数据包格式有关。 |
UDP规则
用于匹配UDP数据包,必需有-p udp作为前提条件
命令 | 说明 |
–sport,–source-port | 基于UDP的源端口匹配包,语法同-p tcp -sport完全一样。 |
–dport,–destination-port | 基于UDP的目的端口匹配包,语法同上。 |
ICMP规则
用于匹配ICMP数据包,必需有-p icmp作为前提条件
–icmp-type | 根据ICMP类型匹配包,类型的指定可以使用十进制数值和相应的名字。数值在RFC792中有定义,名字可以用iptables -p ICMP –help查看。这个选项也可以用英文感叹号取反。 |
高级规则
高级规则,要用-m装载扩展模块,平时用的不多。就不说了额。
动作规则
决定符合条件的包到何处去,语法是–jump target或-j target
-j ACCEPT | 对符合规则的包允许通过。 |
-j DROP | 对符合规则的包丢弃动作。 |
-j REJECT | 拒绝数据包,并返回错误信息。只能用于INPUT、FORWARD、OUTPUT链中。 -reject-with告诉REJECT target应向发送者反回什么样的信息。可用的信息类型可以man一下。 |
-j DNAT | 目的地址转换。DNAT只能应用于nat表的PREROUTING和OUTPUT中。 -to-destination 指定要写入的IP头的地址。可以使用这几种方式:1、单个IP;2、连续地址192.168.1.1-192.168.1.10,这种情况下每个流就会被随机分配一个要转发的地址,但同一个流总是使用同一个地址。3、我们还可以在地址后面指定端口或端口范围,如:192.168.1.1:80或192.168.1.1:80-100,要注意只有选用-p指定协议后,才能使用。 |
-j SNAT | 源地址转换。只能应用于nat表的POSTROUTING中。-to-source 指定要转换的源地址和端口。 |
-j MASQUERADE | 这个动作和SNAT的作用是一样的,区别就是它不需要指定源地址。MASQUERADE被设计用于那些动态获取IP地址的连接的,比如拨号上网。MASQUERADE和SNAT一样,只能应用于nat表的POSTROUTING中。 -to-ports 在指定协义的前提下,设置外出包能使用的端口。例:-to-ports 1025或–to-ports 1024-1050。 |
-j LOG | 记录包的有关信息,这个功能是通过内核的日志工具完成的,需要开启syslogd服务。 -log-level 记录等级设置,记录等级详细信息可以查看文件/etc/syslog.conf。 -log-prefix 在记录信息之前加上指定的前缀。如:–log-prefix “INPUT packets” -log-tcp-sequence 把包的TCP序列号和其它日志信息一起记录下来。 -log-tcp-options 记录TCP包头中的字段大小不变的选项。 -log-ip-options 记录IP包头中的字段大小不变的选项。 |
-j MARK | 用来设置mark值,这个值只能在本地的mangle表里使用,不能用在其它任何地方。 -set-mark 设置mark值,这个值是一个无符号的整数。 |
-j MIRROR | 颠倒IP头中的源地址和目的地址,然后转发包。这个动作只能应就于INPUT、FORWARD、PREROUTING链和被它们调用的自定义链中,如果外出的包是因MIRROR target发出的,则它们是不会被filter、net、mangle表内的链处理的。 |
-j QUEUE | 这个target为用户空间的程序或应用软件管理包队列。它是和iptables之外的程序或工具协同使用的,包括网络计数工具,高级的数据包代理或过滤应用,等等。 |
-j REDIRECT | 在防火墙所在的机子内部转发包或流到另一端口。换包话说,这个target把要转发的包的目的地址改写为我们自已机子的IP。我们在做透明代理时,这个target可是起了很大作用的。 -to-ports 在指定协义前提下,定义目的端口。不使用这个选项,目的端口不会被改变。指定一个端口,如-to-ports 8080。指定端口范围,如-to-ports 8080-8090。 |
-j RETURN | 若包在子链中遇到了RETURN target,则返回父链的下一条继续进行条件的比较。 |
-j TOS | TOS是用来设置IP头中的Type of Service字段的。这个target只能应用于mangle表内使用。 -set-tos设置TOS的值。 |
-j TTL | 修改IP头中的Time To Live字段的值。只能用于mangle表中。 -ttl-set设置TTL值。 -ttl-dec设定TTL要被减掉的值。 -ttl-inc设定TTL要被增加的值。 |
-ULOG | 可以在用户空间记录被匹配的包信息,这些信息和整个包都会通过netlink socket被多播。然后一个或多个用户空间的进程就会接受它们。我们可以在ULOGD project page里面找ULOGD用户空间的软件。 -ulog-nlgroup指定向哪个netlink组发送包。 -ulog-prefix指定记录信息的前缀。 -ulog-cprange指定每个包要向“ULOG在用户空间的代理”发送的字节数。 -ulog-qthreshold表示先在内核里积聚多个少包,再把它们发送到用户空间里。 |
这么多规则看的人都晕了。。。
看几个例子:
1)iptables -A INPUT -p tcp –dport 80 -j ACCEPT
允许访问80端口
2)iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT –to-source 184.22.201.112
将本地源地址是192.168.0网段的数据包经过路由之后(知道目的地是哪里了),离开本地之前做源地址转换,转换成184.22.201.112,用于PPTP VPN。
3)iptables –table nat –append POSTROUTING –jump MASQUERADE
将本地发出的数据包经过路由之后(知道目的地是哪里了),离开本地之前做源地址转换,和SNAT的区别是MASQUERADE(伪装)是自动获得要转换的地址,不用–to-source指定,用于L2TP VPN。好奇为什么PPTP VPN用MASQUERADE不行呢?可能是因为PPTP传输层上使用的是TCP协议,L2TP用的是UDP协议?不清楚啊= =。
4)iptables -A INPUT -p icmp –icmp-type 8 -s 0/0 -j DROP
将进入的所有ICMP数据包丢弃。禁止ping。
参考资料:
http://linux.gov.cn/netweb/iptables_guide.htm
http://blog.sina.com.cn/s/blog_62769ecf0100fto2.html
http://www.itwhy.org/linux/network/864.html