问题描述:
我有一个相当复杂的问题,我似乎无法弄清楚如何有效地解决它;假设有以下设置:
有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
我使用两个网络命名空间和两个 veth 对测试了以下配置:
+-- 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)路由Main
到wlan0
(网络 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
我在我的路由器上进行了测试,本地发起的连接符合规则,但路由连接不符合。