我正在尝试了解数据包路由如何在基于 Linux 的路由器(在我的例子中是 OpenWRT)上工作,以便更好地设置一些项目/只是学习。参考下面的图表,我将其分为两个问题
- 我想知道在 iptables 之外,什么(比如进程、其他类型的路由表,或者我可以编辑的东西?)专门负责制定/指导下面节点中的“路由决策”。注意,我说的是下图中标记为“路由决策”的实际节点,而不是 iptables。 IE 在数据包通过 nat PREROUTING 后,必须有东西告诉数据包天气接下来进入本地进程的输入过滤器链,或者进入转发链,对吗?对于这个问题的两个部分,我想说我们可以坚持最上面的“路由决策”节点,因为我猜较低的节点包含更多的可能性和过程。
- 另外/或者,决定是如何做出的?是不是很简单,如果传入数据包的目的地是它进入的接口 ip(例如来自 LAN 连接的 192.168.1.1),那么它应该进入这台机器本身并通过输入表发送它,否则它应该转发到另一个接口以访问外部网络(在本例中只是互联网),因此将其转发到任何其他接受转发的接口。或者,是否还有其他可能的方式将数据包定向到路由器,由 DNS 服务器等某些进程处理,而不是直接转发到互联网连接的接口。
答案1
传入数据包是否应路由到本地系统仅取决于目标 IP 地址是否是本地系统任何接口上的 IP 地址之一。请注意,数据包进入哪个接口并不重要;重要的是。您可以有一个eth0
带有 IP 地址的接口,并且该接口上有192.168.1.1
一个额外的 IP 地址:到达的目标地址的数据包将在本地处理。192.168.1.2
lo
192.168.1.2
eth0
路由决策是根据IP路由表结合IP路由规则表做出的。这些表是在接口上设置IP地址时自动填充的部分。
ip rule show
可以使用以下命令(可以缩写)查看路由规则:
$ ip ru sh
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
您可以使用以下命令检查每个路由表ip route show table xxx
(也可以缩写)。该local
表涉及应发送至本地系统的数据包:
$ ip ro sh table local
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
broadcast 192.168.1.0 dev eth0 proto kernel scope link src 192.168.1.1
local 192.168.1.1 dev eth0 proto kernel scope host src 192.168.1.1
broadcast 192.168.1.255 dev eth0 proto kernel scope link src 192.168.1.1
该main
表是您在使用时通常会看到的内容route
(已不推荐使用,就像 一样ifconfig
),因此您不必指定其名称:
$ ip ro sh
default via 192.168.1.254 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.1
该default
表通常为空,但可用于保存默认路由,例如,如果您有多个网关。
欲了解更多信息,请阅读策略路由书