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 查看本文章