在 Linux 上通过另一个网络路由本地主机且仅本地主机?

在 Linux 上通过另一个网络路由本地主机且仅本地主机?

问题描述:

我有一个相当复杂的问题,我似乎无法弄清楚如何有效地解决它;假设有以下设置:

有1台Linux机器,连接到3组网络,我们称之为A,B和C。

Linux 机器可以通过网络 A 上网。它有一个私人的此网络上的 IP 地址,但NAT 已在其上启用;例如,通过此网络路由的任何其他机器,如果民众它给出的ip可以通过它连接到互联网,但是该计算机却无法连接到互联网。

网络 B 是民众ip 网络集;一组公共网络。默认情况下,来自 B 的数据包要么路由回 B,要么通过 A 路由到 B 之外的所有其他目的地。

网络 C 与 A 类似,也是一个具有私人的地址。但是,这里 NAT已启用。网络 C 可用于与互联网通信,但网络 B 上的设备不允许通过 C 路由,而必须通过 A 路由。

目前,Linux 机器无法与互联网通信。我希望它能够这样做(例如 ping www.stackoverflow.com 不返回超时)。

如何告诉 Linux 使用另一个网关来传输自己的流量,并且只传输自己的流量(源或目标 == 本地主机)?

重要的

我不想通过一个网络将所有流量路由到互联网。进出互联网的流量需要使用网络,取决于来源:来自 Linux 机器的所有内容都通过一个网络 (C),它路由的所有内容(不在其本地范围之一内)都通过另一个网络 (A) 路由。

暂定解决方案

首先,我想到只需将“来自/到 localhost”添加到表中ip rule,但这是不允许的。允许此路由器使用网络 C 上的另一个路由器作为其网关的最简单方法是什么,但仅限于来自机器本身的流量?

本质上,我想要的是与下面的例子等同的东西,如果它能以天真的、直观的方式真正发挥作用的话:

0: from all lookup local
32000: from localhost lookup myroute
32100: from all lookup main 
32767: from all lookup default

答案1

我使用两个网络命名空间和两个 v​​eth 对测试了以下配置:

+-- Main --+
|          | 192.168.2.21/24
|    wlan0 | ------------------- ...
|          |
|          | 10.0.0.254/24   10.0.0.1/24 +-- NS0 --+
|   veth0a | --------------------------- | veth0b  |
|          |                             +---------+
|          |
|          | 10.0.1.254/24   10.0.1.1/24 +-- NS1 --+
|   veth1a | --------------------------- | veth1b  |
|          |                             +---------+
+----------+

目标是将所有流量从(网络 C)路由Mainwlan0(网络 C),同时将所有流量从veth0(网络 A)路由到veth1(网络 B)。

有一个正常的默认路由wlan0,通过 DHCP 获取:

$ ip route
default via 192.168.2.1 dev wlan0 
...

已启用转发:

echo "1" | sudo tee /proc/sys/net/ipv4/ip_forward

veth1a我们在新表中添加一条默认路由,假设10.0.1.1是网关:

sudo ip route add 10.0.1.0/24 table 250 dev veth1a src 10.0.1.254
sudo ip route add default table 250 dev veth1a via 10.0.1.1

所有来自和到veth0a(10.0.0.0/24) 的流量都使用此表:

sudo ip rule add from 10.0.0.0/24 table 250
sudo ip rule add to 10.0.0.0/24 table 250

如果veth1b(10.0.1.0/24) 后面的某个人有愚蠢的想法试图将我们用作网关,则wlan0使用同一张表阻止转发并直接转发回来。这通常会生成 ICMP 错误数据包:

sudo ip rule add from 10.0.1.0/24 table 250
sudo ip rule add to 10.0.1.0/24 table 250

根据需要适应您的设置。

根本没有在任何地方提到过“没有” localhost

答案2

尝试从 0.0.0.0 添加 ip ru

我在我的路由器上进行了测试,本地发起的连接符合规则,但路由连接不符合。

相关内容