iptables 的链与表

目前在比较新的Linux发行版中,iptables已经被firewalld替代了,不过两者的都是用来配置防火墙策略的管理工具,内核中都是利用的netfilter这套架构。

1、netfilter链

文章《内核netfilter框架简析》中对netfilter框架进行了简要的说明,提到了其框架流程中的五个钩子点,也就是五个链:

  • PREROUTING:接收的数据包刚进来,还没有经过路由选择,即还不知道数据包是要发给本机还是其它机器。在报文作路由以前执行;
  • INPUT:在已经经过路由选择,并且该数据包的目的IP是本机,进入本地数据包处理流程;
  • FORWARD:已经经过路由选择,但该数据包的目的IP不是本机,而是其它机器,进入forward流程,在报文转向另一个NIC以前执行;
  • OUTPUT:本地程序要发出去的数据包刚到IP层,还没进行路由选择。在本地报文做流出路由前执行;
  • POSTROUTING:本地程序发出去的数据包,或者转发(forward)的数据包已经经过了路由选择,即将交由下层发送出去,在报文流出以前执行;

2、iptables表

iptables包含四个内建表:filter表,nat表,mangle表,raw表。

2.1、filter表

filter表是iptables的默认表,如果在执行iptables命令时没有指定表,就默认使用filter表。
filter表关联到以下3种内建链:

  • INPUT链:处理来自外部的数据;
  • FORWARD链:将数据转发到本机的其他网卡设备上;
  • OUTPUT链:处理向外发送的数据;

2.2、nat表

nat表关联到以下3种内建链:

  • PREROUTING链:处理刚到达本机,并在路由转发处理之前的数据包。它会转换数据包的目的IP地址,通常用于DNAT(Destination NAT);
  • POSTROUTING链:处理即将离开本机的数据包,它会转换数据包中的源IP地址,通常用于SNAT(Source NAT);
  • OUTPUT链:处理本机产生的数据包;

2.3、mangle表

mangle表用于指定如何处理数据包。它可以改变TCP头中的QoS位。
通常mangle表以给报文设置MARK为主,在这个表里面,千万不要做过滤/NAT/伪装这类的事情。
mangle表关联到5个内置链:

  • PREROUTING链:
  • INPUT链:
  • FORWARD链:
  • OUTPUT链:
  • POSTROUTING链:

2.4、raw表

raw表用于处理异常,关联到2个内置链:

  • PROROUTING链:
  • OUTPUT链:

其基本流程如下图:

3、SNAT与DNAT

SNAT通常在nat表的POSTROUTING 链完成,是在路由之后做源地址转换;
DNAT通常在nat表的PREROUTING链完成,是在路由之前做目的地址转换;

3.1 SNAT

一台位于内网的PC想访问internet,会用到SNAT源地址转换,将内网地址转换成公网的正式IP地址。
比如位于局域网的主机A,想要访问互联网上的百度等网站。

(1)内网主机A想访问互联网网上的某网站C,首先将数据包(源IP:A,目的IP:C)发送到防火墙B;
(2)防火墙B收到后,将数据包的源地址修改为防火墙B的公网IP地址(源IP:B,目的IP:C),经互联网发送给服务器C;
(3)服务器C收到后,将回应包(源IP:C,目的IP:B)发送给防火墙B;
(4)防火墙B收到后,将回应包的目的地址修改为内网主机A的IP地址(源IP:C,目的IP:A),之后将数据包发送给主机A;

在这个过程中,修改了请求数据包的源IP地址,因此叫做SNAT,用于局域网访问互联网;

不能在防火墙B的PREROUTING链上设置SNAT,因为在到达PREROUTING时,还不知道数据包中的目标主机需要经过本机的哪个网口发送出去,即还不知道需要将数据包的源地址修改为哪个网口的IP,因此需要在POSTROUTING设置源地址转换策略。

3.2 DNAT

一台位于内网的服务器想发布内容到公网上,供公网上的其他人来访问,这时会用到DNAT目的地址转换,将目的地址转换成内网服务器的IP地址。

比如主机A,想要访问网站C,网站C位于内网中。
(1)主机A想访问网站C,但A的地址是私有地址,无法直接访问,此时C可以访问防火墙B的公网地址;
(2)主机A的请求数据包(源IP:A,目的IP:B)到达防火墙B后,在PREROUTING将请求数据包的目的IP地址修改为C(源IP:A,目的IP:C),发送给服务器C;
(3)服务器C进行回复,将响应包(源IP:C,目的IP:A)发送给防火墙B;
(4)防火墙B对响应包进行修改,将源IP地址修改为防火墙B的地址(源IP:B,目的IP:A),发送给主机A;

在这个过程中,修改了请求数据包的目的IP地址,因此叫做DNAT,用于通过互联网访问局域网。

必须在防火墙的PREROUTING上设置修改目的IP的策略,因为如果不在这里修改,数据包达到PREROUTING时的目的IP地址是当前主机的IP地址,就会将数据包发到INPUT,进入到本机。

参考

————————————————————

原创文章,转载请注明: 转载自孙希栋的博客

本文链接地址: 《iptables 的链与表》

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Scroll Up