我知道linux有3个内置表,每个表都有自己的链,如下所示:
筛选:预布线、转发、后布线
网络地址转换:预布线、输入、输出、后布线
曼乐:预布线、输入、转发、输出、后布线
但我不明白它们是如何遍历的,按什么顺序,如果有的话。例如,在以下情况下如何遍历它们:
- 我向同一本地网络中的电脑发送一个数据包
- 当我向不同网络中的电脑发送数据包时
- 当网关收到数据包并且必须转发它时
- 当我收到寄给我的包裹时
- 任何其他情况(如有)
答案1
维基百科有一个很棒的图表显示处理顺序。
有关更多详细信息,您还可以查看 iptables 文档,特别是表链遍历章节。其中还包括一个流程图。
顺序的变化取决于 netfilter 的使用方式(作为网桥或网络过滤器以及它是否与应用层交互)。
一般来说(尽管上面链接的章节中有更多细节)链的处理方式如下:
- 将 INPUT 链视为“从外部入站的流量”到这位主持人”。
- 将 FORWARD 链视为“使用该主机作为路由器的流量”(源和目标是不是本主机)。
- 将 OUTPUT 链视为“流量这主人要发出去”。
- PREROUTING / POSTROUTING 对于每种表类型都有不同的用途(例如,对于 nat 表,PREROUTING 用于入站(路由/转发)SNAT 流量,POSTROUTING 用于出站(路由/转发)DNAT 流量。有关更多信息,请参阅文档具体细节。
各种表是:
- Mangle 是在遍历时更改数据包(服务类型、生存时间等)。
- Nat就是放入NAT规则。
- Raw 用于标记和连接跟踪。
- Filter用于过滤数据包。
因此,对于您的五个场景:
- 如果发送主机是带有 iptables 的主机,则 OUTPUT
- 与上面相同
- FORWARD 链(前提是网关是带有 iptables 的主机)
- 如果“me”是具有 iptables 的主机,则 INPUT
- 查看上面的链式规则(这是一般经验法则)和流程图(这也因情况而异)什么您正在尝试使用 IPTables 来实现)
答案2
Fwiw,我已经适应了菲尔·哈根的流程图(正如 @slm 在之前的回答中提到的)下面的 ASCII 流程图。
network -> PREROUTING -> routing -> INPUT -------> process
raw decision mangle
(conntrack) | filter
mangle | security
nat(*) | nat
V
FORWARD ----\
mangle |
filter |
security |
V
process -> OUTPUT ------------------> POSTROUTING -> network
(routing decision??) mangle
raw nat(*)
(conntrack)
mangle
nat
(output interface assigned here?)
filter
security
(*) Certain localhost packets skip the PREROUTING and POSTROUTING nat
chains. See the post and diagram by Phil Hagen for details.
欢迎评论、建议和更正,因为我当然不是iptables
Netfilter 方面的专家。