跳到主要内容

iptables2

前提基础

当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发。

iptables实现防火墙功能的原理是: 在数据包经过内核的过程中有五处关键地方,分别是 PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,称为钩子函数,iptables这款用户空间的软件可以在这5处地方写规则,对经过的数据包进行处理,规则一般的定义为“如果数据包头符合这样的条件,就这样处理数据包”。

iptables中定义有5条链,说白了就是上面说的5个钩子函数,因为每个钩子函数中可以定义多条规则,

  • 每当数据包到达一个钩子函数时,iptables就会从钩子函数中第一条规则开始检查,看该数据包是否满足规则所定义的条件。
  • 如果满足,系统就会根据该条规则所定义的方法处理该数据包;
  • 否则iptables将继续检查下一条规则,
  • 如果该数据包不符合钩子函数中任一条规则,iptables就会根据该函数预先定义的默认策略来处理数据包。

iptables中定义有表,分别表示提供的功能,有

  • filter表(实现包过滤)
  • nat表(实现网络地址转换)
  • mangle表(实现包修改)
  • raw表(实现数据跟踪)

这些表具有一定的优先级:raw-->mangle-->nat-->filter

一条链上可定义不同功能的规则,检查数据包时将根据上面的优先级顺序检查

iptables规则书写

基本语法:iptables [-t 表] [操作命令] [链][规则匹配器][-j 目标动作]

说明支持的链
raw一般是为了不再让iptables对数据包进行跟踪,提高性能PREROUTING、OUTPUT
mangle对数据包进行修改五个链都可以
nat进行地址转换PREROUTING、OUTPUT、POSTROUTING
filter(默认)对包进行过滤INPUT、FORWARD、OUTPUT
常用操作命令说明
-A在指定链尾部添加规则
-D删除匹配的规则
-R替换匹配的规则
-I在指定位置插入规则例:iptables -I INPUT 1 --dport 80 -j ACCEPT(将规则插入到filter表INPUT链中的第一位上)
-L/S列出指定链或所有链的规则
-F删除指定链或所有链的规则
-N创建用户自定义链例:iptables -N allowed
-X删除指定的用户自定义链
-P为指定链设置默认规则策略,对自定义链不起作用例:iptables -P OUTPUT DROP
-Z将指定链或所有链的计数器清零
-E更改自定义链的名称例:iptables -E allowed disallowed
-nip地址和端口号以数字方式显示例:iptables -Ln
常见规则匹配器说明
-p tcp|udp|icmp|all匹配协议,all会匹配所有协议
-s addr[/mask]匹配源地址
-d addr[/mask]匹配目标地址
--sport port1[:port2]匹配源端口(可指定连续的端口)
--dport port1[:port2]匹配目的端口(可指定连续的端口)
-o interface匹配出口网卡,只适用FORWARD、POSTROUTING、OUTPUT。例:iptables -A FORWARD -o eth0
-i interface匹配入口网卡,只使用PREROUTING、INPUT、FORWARD。
--icmp-type匹配icmp类型(使用iptables -p icmp -h可查看可用的ICMP类型)
--tcp-flags mask comp匹配TCP标记,mask表示检查范围,comp表示匹配mask中的哪些标记。例:iptables -A FORWARD -p tcp --tcp-flags ALL SYN,ACK -j ACCEPT(表示匹配SYN和ACK标记的数据包)
目标动作说明
ACCEPT允许数据包通过
DROP丢弃数据包
REJECT丢弃数据包,并且将拒绝信息发送给发送方
SNAT源地址转换(在nat表上)例:iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT --to 192.168.0.1
DNAT目标地址转换(在nat表上)例:iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT --to-destination 192.168.0.102
REDIRECT目标端口转换(在nat表上)例:iptables -t nat -D PREROUTING -p tcp --dport 8080 -i eth2.2 -j REDIRECT --to 80
MARK将数据包打上标记例:iptables -t mangle -A PREROUTING -s 192.168.1.3 -j MARK --set-mark 60

注意要点:

  • 目标地址转换一般在PREROUTING链上操作
  • 源地址转换一般在POSTROUTING链上操作