iptables是Linux中基于内核的防火墙,功能十分强大。 iptables工作在网络层,不需要把数据发送到用户空间,在系统内核空间中进行数据过滤可以保证数据处理效率。 当数据包到达iptables之后,如果MAC地址相符,就会由内核中的相应驱动程序接收,通过一系列操作决定将数据包发送给本地程序或转发到其他主机,或进行其他操作。 iptables由一系列表(table)组成,表再由一系列链(chain)组成,当数据包到达iptables之后,就会基于规则按一定顺序穿越不同的表和链。

1.数据报的流向

iptables数据包的流向主要有以下两种:

  • PREROUTING -> FORWARD -> POSTROUTING
  • PREROUTING -> INPUT -> localhost(本机内部传输) -> OUTPUT -> POSTROUTING

iptables-data-direction.jpg

iptables根据数据包的流向和对数据包的处理使用不同的规则表,如:filter表,nat表,mangle表。

2.iptables的表

2.1 filter表

filter表是默认的表,用来过滤数据包。filter表内建3个链:

  • INPUT作用于进入本机的数据包(即入站)
  • OUTPUT作用于本机送出的包(即出站)
  • FORWARD作用于经过本机与本机无关的包(即路由)

2.2 nat表

nat表用来做NAT(Network Address Traslation),即网络地址转换,转换包的源或目标地址。nat表包含源地址、目标地址以及端口转换的使用规则。 nat表内建3个链:

  • PREROUTING用于改变到达防火墙的包的目标地址,在路由前修改目的地址实现DNAT
  • OUTPUT用于改变本地产生的包的目标地址
  • POSTROUTING用于在包要离开时改变其源地址

NAT的操作包含以下几类:

  • DNAT( Destination Network Address Translation)即目标地址转换,将对防火墙的访问重定向到其他主机上,即改变数据包的目标地址,使其路由到其他主机
  • SNAT 即源地址转换,改变数据包的源地址

2.3 mangle表

mangle表用来给数据打标记,然后根据标记去操作那些包,包含用于设置特殊的数据包路由标志的规则,这些标志随后可以被filter表中的规则检查。 mangle表内建的链包括PREROUTING, INPUT, FORWARD, POSTROUTING, OUTPUT.

2.4 raw表和security表

iptables还包含raw表和security表,这里不展开了。可以man iptables查看关于这两个表的介绍。

3. iptables命令

iptables命令的语法如下:

1iptables -t [表名]  <-A | I | D | R> 链名 [规则编号] [-i | o 网卡名称] [-p 协议] [-s 源ip地址 | 源子网] [--sport 源端口] [-d 目标ip地址 | 目标子网] [--dport 目标端口] <-j target>
  • -A新增一条规则,该规则增加到规则列表的最后一行,使用该参数时不能使用规则编号
  • -I插入一条规则,如果指定了规则编号,原本该位置上的规则会向后顺序移动,如果没有指定规则编号,将在第一条规则前插入
  • -D从规则列表中删除一条规则,可以输入完整的规则进行删除,也可以直接指定规则编号进行删除
  • -R替换某条规则,规则被替换时不会改变其顺序,必须指定要替换的规则编号
  • 规则编号 规则列表的第一条规则的编号为1
  • -i指定数据包进入的网卡,-o指定数据包输出的网卡
  • -p指定规则应用的协议,可以是tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh
  • -s指定源主机的IP地址或子网地址,格式为address[/mask][,...]
  • -d指定指定目标主机的IP地址或子网地址,格式为address[/mask][,...]
  • -j target--jump target决定符合条件的包到何处去。target可以指定另一个链,常用的Target/Jumps包含:
    • ACCEPT表示允许包,即满足匹配条件的包被允许,并且不会再匹配当前链中的其他规则或同一个表内的其他规则,但这个包还会通过其他表中的链
    • DROP表示丢弃包,即将符合条件的包丢弃,不会再向下走。效果就是包被阻塞,不会像发送者返回任何信息。
    • REJECT表示拒绝包,REJECT和DROP类似,在阻塞包时会向发送者返回错误信息。
    • REDIRECT表示将数据包重定向到本机或另一台主机的某个端口,通常用来实现透明代理或对外开放内网的某些服务
    • SNAT源地址转换,即改变数据包的源地址
    • DNAT目标地址转换,即改变数据包的目标的地址
    • LOG将符合规则的数据包相关规则信息记录在日志中,便于管理员分析问题

3.1 链的默认策略(Policy)

当数据包不符合链中的任一规则时,将会使用该链预定义的默认策略(Policy)处理数据包。

1iptables -nvL
2Chain INPUT (policy ACCEPT 249M packets, 162G bytes)
3 pkts bytes target     prot opt in     out     source               destination                                                       
4
5Chain FORWARD (policy ACCEPT 8248K packets, 4343M bytes)
6 pkts bytes target     prot opt in     out     source               destination 
7......

上面命令的输出filter表INPUT链和FORWARD链的默认策略都是ACCEPT。

使用下面的命令定义默认策略:

1iptables [-t 表名] <-P> <链名> <动作>

-P即定义默认策略Policy。

例如:

1iptables -P FORWARD ACCEPT

3.2 查看规则

查看规则的命令语法:

1iptables [-t 表名] <-L> [链名]

查看filter表的规则:

1iptables -nvL

查看nat表的规则:

1iptables -t nat -nvL

3.3 添加规则

filter表增加一条规则:

1iptables -A INPUT -p tcp -s 192.168.0.15  --sport 1234 -d 192.168.1.10 --dport 80 -j ACCEPT

3.4 删除规则

-D指定删除规则,必须与添加的规则完全一致:

1iptables -D INPUT -p tcp -s 192.168.0.15  --sport 1234 -d 192.168.1.10 --dport 80 -j ACCEPT

还通过行号删除:

1iptables -nvL --line-numbers
2
3iptables -D INPUT <line-number>

3.5 清除规则和计数

1iptables [-t 表名] <-F | Z>

删除filter表所有规则

1iptables -F

将filter表数据包和流量计数清零:

1iptables -Z

参考