如何在谷歌计算引擎上添加静态路由

0 routing linux-networking google-compute-engine

我正在 Google 计算引擎中构建一个集群,目前我需要添加到同一网络中另一台计算机的静态路由,但出现问题,我收到错误“RTNETLINK 答案:网络无法访问”。

重要提示:我不是网络专家,我可能在这个过程中犯了一些基本错误。

我有一台机器A和一台机器B,其中A有一个子网11.10.0.0/16,其他机器B无法到达,所以A将是B到它们的网关。两者都具有活动标志IP forwarding并且位于同一网络中(两者都使用 eth0)并且可以直接到达对方。

命令和错误(在B上执行)是:

B:~$ sudo ip 路由通过 10.240.0.8 dev eth0 添加 11.10.0.0/16
RTNETLINK解答:网络不可达

主机A

A:~$ip路由列表
默认通过 10.240.0.1 dev eth0
10.240.0.1 dev eth0 范围链接
11.10.0.0/16 通过 11.10.0.2 dev tun0
11.10.0.2 dev tun0 proto 内核范围链接 src 11.10.0.1
172.17.0.0/16 dev docker0 proto 内核范围链接 src 172.17.42.1
A:~$ ip 地址
1: lo: mtu 65536 qdisc noqueue 状态 UNKNOWN 组默认值
    链接/环回 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 范围主机 lo
       永远有效_lft 永远首选_lft
2: eth0: mtu 1460 qdisc pfifo_fast 状态 UP 组默认 qlen 1000
    链接/以太 42:01:0a:f0:00:08 brd ff:ff:ff:ff:ff:ff
    inet 10.240.0.8/32 brd 10.240.0.8 范围全局 eth0
       永远有效_lft 永远首选_lft
3: docker0: mtu 1500 qdisc noqueue 状态 DOWN 组默认
    链接/以太 02:42:7d:6d:9b:0b brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.1/16 范围全局 docker0
       永远有效_lft 永远首选_lft
7: tun0: mtu 1500 qdisc pfifo_fast 状态 UP 组默认 qlen 100
    链接/无
    inet 11.10.0.1 对等 11.10.0.2/32 范围全局 tun0
       永远有效_lft 永远首选_lft
答:~$ sudo iptables --list -t nat
链 PREROUTING(策略接受)
目标 prot 选择源目的地         
DOCKER all -- 任何地方任何地方 ADDRTYPE 匹配 dst 类型 LOCAL

链输入(策略接受)
目标 prot 选择源目的地         

链输出(策略接受)
目标 prot 选择源目的地         
DOCKER all --anywhere !loopback/8 ADDRTYPE 匹配 dst 类型 LOCAL

链 POSTROUTING(策略接受)
目标 prot 选择源目的地         
伪装所有人 -- 172.17.0.0/16 任何地方            

链 DOCKER (2 参考)
目标 prot 选择源目的地
答:~$ sudo iptables --list -t 过滤器
链输入(策略接受)
目标 prot 选择源目的地         

链转发(策略接受)
目标 prot 选择源目的地         
DOCKER all——任何地方、任何地方            
接受所有 - 任何地方 任何地方 ctstate 相关、已建立
接受所有——任何地方任何地方            
接受所有——任何地方任何地方            

链输出(策略接受)
目标 prot 选择源目的地         

链 DOCKER (1 参考)
目标 prot 选择源目的地

主机B

B:~$ip 路由
默认通过 10.240.0.1 dev eth0
10.240.0.1 dev eth0 范围链接
11.11.0.0/16 通过 11.11.0.2 dev tun0
11.11.0.2 dev tun0 proto 内核范围链接 src 11.11.0.1
172.17.0.0/16 dev docker0 proto 内核范围链接 src 172.17.42.1
B:~$ ip 地址
1: lo: mtu 65536 qdisc noqueue 状态 UNKNOWN 组默认值
    链接/环回 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 范围主机 lo
       永远有效_lft 永远首选_lft
2: eth0: mtu 1460 qdisc pfifo_fast 状态 UP 组默认 qlen 1000
    链接/以太 42:01:0a:f0:00:07 brd ff:ff:ff:ff:ff:ff
    inet 10.240.0.7/32 brd 10.240.0.7 范围全局 eth0
       永远有效_lft 永远首选_lft
3: docker0: mtu 1460 qdisc noqueue 状态 DOWN 组默认
    链接/以太 02:42:b0:25:d5:57 brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.1/16 范围全局 docker0
       永远有效_lft 永远首选_lft
17:tun0:mtu 1500 qdisc pfifo_fast状态UP组默认qlen 100
    链接/无
    inet 11.11.0.1 对等 11.11.0.2/32 范围全局 tun0
       永远有效_lft 永远首选_lft
B:~$ sudo iptables --list -t nat
链 PREROUTING(策略接受)
目标 prot 选择源目的地         
DOCKER all -- 任何地方任何地方 ADDRTYPE 匹配 dst 类型 LOCAL

链输入(策略接受)
目标 prot 选择源目的地         

链输出(策略接受)
目标 prot 选择源目的地         
DOCKER all --anywhere !loopback/8 ADDRTYPE 匹配 dst 类型 LOCAL

链 POSTROUTING(策略接受)
目标 prot 选择源目的地         
伪装所有人 -- 172.17.0.0/16 任何地方            

链 DOCKER (2 参考)
目标 prot 选择源目的地
B:~$ sudo iptables --list -t 过滤器
链输入(策略接受)
目标 prot 选择源目的地         

链转发(策略接受)
目标 prot 选择源目的地         
DOCKER all——任何地方、任何地方            
接受所有 - 任何地方 任何地方 ctstate 相关、已建立
接受所有——任何地方任何地方            
接受所有——任何地方任何地方            

链输出(策略接受)
目标 prot 选择源目的地         

链 DOCKER (1 参考)
目标 prot 选择源目的地

我希望我已经提供了有关该问题的足够信息。

And*_*hen 5

您在 GCE 实例上获得的虚拟网络实际上是/32仅连接实例本身和网关的网络(后者使用主机路由进行配置)。这意味着所有传出流量都会发送到网关。

这就是您收到以下错误的原因:

B:~$ sudo ip route add 11.10.0.0/16 via 10.240.0.8 dev eth0
RTNETLINK answers: Network is unreachable
Run Code Online (Sandbox Code Playgroud)

该错误只是告诉您没有匹配的主机或网络路由10.240.0.8(除了使用网关本身的默认路由)。

无法使用主机上的路由配置来设置所需的配置。相反,您需要在 GCE 本身中配置路由,如此处所述。从概念上讲,您可以将其视为在网关上配置路由表。您不需要在主机上进行任何其他配置,因为如上所述,它们将所有传出数据包发送到网关。