iptables--转发流程

1.术语

名称 定义
DNAT Destination Network Address Translation 目的网络地址转换。 DNAT是一种改变数据包目的 ip 地址的技术,经常和 SNAT 联用,以使多台服务器能共享一个 ip 地址连入 Internet,并且继续服务。通过对同一个 ip 地址分配不同的端口,来决定数据的流向。
SNAT Source Network Address Translation 源网络地址转换。这是一种改变数据包源 ip 地址的技术,经常用来使多台计算机分享一个 Internet 地址。这只在 IPv4 中使用,因为 IPv4 的地址已快用完了,IPv6 将解决这个问题。
Stream 是指发送和接收的数据包和通信的双方都有关系的一种连接
State 指明数据包处于什么状态。状态在 RFC 793 - Transmission Control Protocol 中定义,或由用户在 Netfilter/iptables 中自定义。需要注意的是 Netfilter 设定了一些关于连接和数据包的状态,但没有完全使用使用RFC 793 的定义。
User space 用户空间,指在内核外部或发生在内核外部的任何东西。例如,调用 iptables -h 发生在内核外部,但 iptables -A FORWARD -p tcp -j ACCEPT(部分地)发生在内核内部,因为一条新的规则加入了规则集。
Kernel space 内核空间 ,与用户空间相对,指那些发生在内核内部。
target 表示对匹配的数据包所做的操作。

2.内核配置

为了运行 iptables,需要在内核配置期间,选择以下一些选项。

定义
CONFIG_PACKET 允许程序直接访问网络设备,例如tcpdump功能
CONFIG_NETFILTER 允许计算机作为网关或防火墙。这个是必需的。
CONFIG_IP_NF_CONNTRACK 连接跟踪模块,用于 NAT(网络地址转换)和Masquerading(ip地址伪装)。
CONFIG_IP_NF_FTP 这个选项提供针对 FTP 连接进行连接跟踪的功能。
CONFIG_IP_NF_IPTABLES 使用过滤、伪装、NAT。它为内核加入了 iptables 标识框架。没有它,iptables 毫无作用。
CONFIG_IP_NF_MATCH_LIMIT 提供匹配 LIMIT 的功能,以便于使用一个适当的规则来控制每分钟要匹配的数据包的数量。比如, -m limit --limit 3/minute的作用是每分钟最多匹配三个数据包。这个功能也可用来消除某种 DoS 攻击。
CONFIG_IP_NF_MATCH_MAC 可以根据 MAC 地址匹配数据包。
CONFIG_IP_NF_MATCH_MARK 这个选项用来标记数据包。对数据包做 MARK(标记)操作。
CONFIG_IP_NF_MATCH_MULTIPORT 选择这个模块我们可以使用端口范围来匹配数据包。
CONFIG_IP_NF_MATCH_TOS 可以设置数据包的 TOS(Type Of Service 服务类型)。这个工作也可以用命令 ip/tc 完成,还可在 mangle 表中用某种规则设定。
CONFIG_IP_NF_MATCH_TCPMSS 可以基于 MSS 匹配 TCP 数据包。
CONFIG_IP_NF_MATCH_STATE 对数据包做状态匹配,比如,在某个 TCP 连接的两个方向上已有通信,则这个连接上的数据包就被看作 ESTABLISHED(已建立连接)状态。
CONFIG_IP_NF_MATCH_UNCLEAN 匹配那些不符合类型标准或无效的 P、TCP、UDP、ICMP 数据包。
CONFIG_IP_NF_MATCH_OWNER 根据套接字的拥有者匹配数据包。
CONFIG_IP_NF_FILTER 这个模块为 iptables 添加基本的过滤表,其中包含INPUT、FORWARD、OUTPUT 链。通过过滤表可以做完全的 IP 过滤。只要想过滤数据包,不管是接收的还是发送的,也不管做何种过滤,都必需此模块。
CONFIG_IP_NF_TARGET_REJECT 这个操作使我们用 ICMP 错误信息来回应接收到的数据包,而不是简单地丢弃它。有些情况必须要有回应的,比如,相对于 ICMP和 UDP 来说,要重置或拒绝 TCP 连接总是需要一个 TCP RST 包。
CONFIG_IP_NF_TARGET_MIRROR 这个操作使数据包返回到发送它的计算机。例如,我们在 INPUT 链里对目的端口为 HTTP 的包设置了 MIRROR 操作,当有人访问HTTP 时,包就被发送回原计算机,最后,他访问的可能是他自己的主页。
CONFIG_IP_NF_NAT 提供 NAT 功能。这个选项使我们有权访问 nat 表。端口转发和伪装是必需此模块的。
CONFIG_IP_NF_TARGET_MASQUERADE 提供 MASQUERADE(伪装)操作。如果我们不知道连接 Internet 的 IP,首选的方法就是使用 MASQUERADE,而不是 DNAT 或SNAT。换句话说,就是如果我们使用 PPP 或 SLIP 等连入Internet,由 DHCP 或其他服务分配 IP,使用这个比 SNAT 好。因为 MASQUERADE 不需要预先知道连接Internet 的 IP,虽然对于计算机来说 MASQUERADE 要比 NAT 的负载稍微高一点。
CONFIG_IP_NF_TARGET_REDIRECT 这个操作和代理程序一起使用是很有用的。它不会让数据包直接通过,而是把包重新映射到本地主机,也就是完成透明代理。
CONFIG_IP_NF_TARGET_LOG 为 iptables 增加 LOG(日志)操作。通过它,可以使用系统日志服务记录某些数据包,这样我们就能了解在包上发生了什么。这对于我们做安全审查、调试脚本的帮助是无价的。
CONFIG_IP_NF_TARGET_TCPMSS 可以对付一些阻塞 ICMP 分段信息的ISP(服务提供商)或服务。没有 ICMP 分段信息,一些网页、大邮件无法通过,虽然小邮件可以,还有,在握手完成之后,ssh 可以但 scp 不能工作。我们可以用 TCPMSS 解决这个问题,就是使 MSS(Maximum Segment Size)

3.转发流程

当数据包到达防火墙时,如果 MAC 地址符合,就会由内核里相应的驱动程序接收,然后会经过一系列操作,从而决定是发送给本地的程序,还是转发给其他机子,还是其他的什么。
例如以本地(如路由器的服务程序或客户程序)为目标的包流程如下:

Step(步骤) Table(表) Chain(链) Comment(注释)
1 在线路上传输(比如,Internet)
2 进入接口 (比如, wan接口ppp0)
3 mangle PREROUTING 这个链用来 mangle 数据包,比如改变TOS 等
4 nat PREROUTING 这个链主要用来做 DNAT。不要在这个链做过滤操作,因为某些情况下包会溜过去。
5 路由判断,比如,包是发往本地的(为本例子流程),还是要转发的。
6 mangle INPUT 在路由之后,被送往本地程序之前,mangle 数据包。
7 filter INPUT 所有以本地为目的的包都要经过这个链,不管它们从哪儿来,对这些包的过滤条件就设在这里。
8 到达本地程序了(比如,服务程序或客户程序)

例如以本地(如路由器的服务程序或客户程序)为源的包流程如下:

Step(步骤) Table(表) Chain(链) Comment(注释)
1 本地程序(比如,服务程序或客户程序)
2 路由判断,要使用源地址,外出接口,还有其他一些信息。
3 mangle OUTPUT 在这儿可以 mangle 包。建议不要在这儿做过滤,可能有副作用哦。
4 nat OUTPUT 这个链对从防火墙本身发出的包进行DNAT操作。
5 filter OUTPUT 对本地发出的包过滤。
6 mangle POSTROUTING 这条链主要在包 DNAT 之后(译者注:作者把这一次 DNAT 称作实际的路由,虽然在前面有一次路由。对于本地的包,一旦它被生成,就必须经过路由代码的处理,但这个包具体到哪儿去,要由 NAT代码处理之后才能确定。所以把这称作实际的路由。),离开本地之前,对包mangle。有两种包会经过这里,防火墙所在机子本身产生的包,还有被转发的包。
7 nat POSTROUTING 在这里做 SNAT。但不要在这里做过滤,因为有副作用,而且有些包是会溜过去的,即使你用了 DROP 策略。
8 离开接口(比如: ppp0)
9 在线路上传输(比如,Internet)

例如一个包的目的是另一个网络中的一台机子,被转发的包流程如下:

Step(步骤) Table(表) Chain(链) Comment(注释)
1 在线路上传输(比如,Internet)
2 进入接口(比如, eth0)
3 mangle PREROUTING mangle数据包,比如改变 TOS 等。
4 nat PREROUTING 这个链主要用来做 DNAT。不要在这个链做过滤操作,因为某些情况下包会溜过去。稍后会做 SNAT。
5 路由判断,比如,包是发往本地的,还是要转发的(为本例子流程)。
6 mangle FORWARD 包继续被发送至 mangle表的FORWARD链,这是非常特殊的情况才会用到的。在这里,包被 mangle(还记得 mangle的意思吗)。这次 mangle 发生在最初的路由判断之后,在最后一次更改包的目的之前(译者注:就是下面的 FORWARD链所做的,因其过滤功能,可能会改变一些包的目的地,如丢弃包)。
7 filter FORWARD 包继续被发送至这条 FORWARD 链。只有需要转发的包才会走到这里,并且针对这些包的所有过滤也在这里进行。注意,所有要转发的包都要经过这里,不管是外网到内网的还是内网到外网的。在你自己书写规则时,要考虑到这一点。
8 mangle POSTROUTING 这个链也是针对一些特殊类型的包(译者注:参考第 6 步,我们可以发现,在转发包时,mangle 表的两个链都用在特殊的应用上)。这一步 mangle 是在所有更改包的目的地址的操作完成之后做的,但这时包还在本地上。
9 nat POSTROUTING 这个链就是用来做 SNAT 的,当然也包括Masquerade(伪装)。但不要在这儿做过滤,因为某些包即使不满足条件也会通过。
10 离开接口(比如: BR_LAN)
11 又在线路上传输了(比如,LAN)

所有要经防火墙/ 路由器转发的包都要经过FORWARD链,不要在 INPUT 链上做过滤,INPUT 是专门用来操作那些以我们的机子为目的地址的包的,它们不会被路由到其它地方的。具体流程图如下:
转发流程图

4.表

4.1 mangle表

这个表主要用来 mangle包,你可以使用mangle匹配来改变包的 TOS 等特性。建议你不要在这个表里做任何过滤,不管是 DANT,SNAT或者MASQUERADE。以下是mangle表中仅有的几种操作:

操作 定义
TOS 用来设置或改变数据包的服务类型域。这常用来设置网络上的数据包如何被路由等策略。注意这个操作并不完善,有时得不所愿。它在 Internet 上还不能使用,而且很多路由器不会注意到这个域值。换句话说,不要设置发往Internet 的包,除非你打算依靠 TOS 来路由,比如用 iproute2。
TTL 用来改变数据包的生存时间域,我们可以让所有数据包只有一个特殊的TTL。它的存在有一个很好的理由,那就是我们可以欺骗一些 ISP。为什么要欺骗他们呢?因为他们不愿意让我们共享一个连接。那些 ISP 会查找一台单独的计算机是否使用不同的 TTL,并且以此作为判断连接是否被共享的标志。
MARK 用来给包设置特殊的标记。iproute2 能识别这些标记,并根据不同的标记(或没有标记)决定不同的路由。用这些标记我们可以做带宽限制和基于请求的分类。

4.2 nat表

此表仅用于 NAT,也就是转换包的源或目标地址。只有流的第一个包会被这个链匹配,其后的包会自动被做相同的处理。以下是 nat表中仅有的几种操作:

操作 定义
DNAT 主要用在这样一种情况,你有一个合法的 IP 地址,要把对防火墙的访问重定向到其他的机子上(比如 DMZ)。也就是说,我们改变的是目的地址,以使包能重路由到某台主机。
SNAT 改变包的源地址,这在极大程度上可以隐藏你的本地网络或者 DMZ 等。一个很好的例子是我们知道防火墙的外部地址,但必须用这个地址替换本地网络地址。有了这个操作,防火墙就能自动地对包做 SNAT 和 De-SNAT(就是反向的 SNAT),以使 LAN 能连接到 Internet。如果使用类似 192.168.0.0/24 这样的地址,是不会从 Internet 得到任何回应的。因为 IANA 定义这些网络(还有其他的)为私有的,只能用于 LAN 内部。
MASQUERADE 作用和SNAT完全一样,只是计算机的负荷稍微多一点。因为对每个匹配的包,MASQUERADE 都要查找可用的 IP 地址,而不象 SNAT 用的 IP地址是配置好的。当然,这也有好处,就是我们可以使用通过 PPP、 PPPOE、SLIP等拨号得到的地址,这些地址可是由 ISP 的 DHCP 随机分配的。

4.3 filter表

filter 表用来过滤数据包,我们可以在任何时候匹配包并过滤它们。我们就是在这里根据包的内容对包做 DROP 或 ACCEPT 的。当然,我们也可以预先在其他地方做些过滤,但是这个表才是设计用来过滤的。几乎所有的 target 都可以在这儿使用。

温馨提示:
以上文章描述如有不清晰之处,欢迎在评论区评论,如有时间,会第一时间回复,谢谢!

扫描二维码关注公众号,回复: 11721501 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_20677327/article/details/107033775