Я создаю кластер в Google Compute Engine, и в настоящее время мне нужно добавить статический маршрут к другому компьютеру в той же сети, но что-то идет не так, и я получаю сообщение об ошибке «RTNETLINK отвечает: сеть недоступна».
Важная заметка: Я не специалист по сетям и, вероятно, делаю некоторые основные ошибки в процессе.
У меня есть машина A и машина B, где у A есть подсеть 11.10.0.0/16, с которой другие машины B не могут связаться, поэтому A будет шлюзом B для них. У обоих есть флаг IP forwarding
активны и находятся в одной сети (используя eth0 на обоих) и могут напрямую подключаться к другой.
Команда и ошибка (выполняемые на B):
B:~$ sudo ip route add 11.10.0.0/16 via 10.240.0.8 dev eth0 RTNETLINK answers: Network is unreachable
A:~$ ip route list default via 10.240.0.1 dev eth0 10.240.0.1 dev eth0 scope link 11.10.0.0/16 via 11.10.0.2 dev tun0 11.10.0.2 dev tun0 proto kernel scope link src 11.10.0.1 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.42.1
A:~$ ip addr 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: mtu 1460 qdisc pfifo_fast state UP group default qlen 1000 link/ether 42:01:0a:f0:00:08 brd ff:ff:ff:ff:ff:ff inet 10.240.0.8/32 brd 10.240.0.8 scope global eth0 valid_lft forever preferred_lft forever 3: docker0: mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:7d:6d:9b:0b brd ff:ff:ff:ff:ff:ff inet 172.17.42.1/16 scope global docker0 valid_lft forever preferred_lft forever 7: tun0: mtu 1500 qdisc pfifo_fast state UP group default qlen 100 link/none inet 11.10.0.1 peer 11.10.0.2/32 scope global tun0 valid_lft forever preferred_lft forever
A:~$ sudo iptables --list -t nat Chain PREROUTING (policy ACCEPT) target prot opt source destination DOCKER all -- anywhere anywhere ADDRTYPE match dst-type LOCAL Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination DOCKER all -- anywhere !loopback/8 ADDRTYPE match dst-type LOCAL Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 172.17.0.0/16 anywhere Chain DOCKER (2 references) target prot opt source destination
A:~$ sudo iptables --list -t filter Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination DOCKER all -- anywhere anywhere ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain DOCKER (1 references) target prot opt source destination
B:~$ ip route default via 10.240.0.1 dev eth0 10.240.0.1 dev eth0 scope link 11.11.0.0/16 via 11.11.0.2 dev tun0 11.11.0.2 dev tun0 proto kernel scope link src 11.11.0.1 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.42.1
B:~$ ip addr 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: mtu 1460 qdisc pfifo_fast state UP group default qlen 1000 link/ether 42:01:0a:f0:00:07 brd ff:ff:ff:ff:ff:ff inet 10.240.0.7/32 brd 10.240.0.7 scope global eth0 valid_lft forever preferred_lft forever 3: docker0: mtu 1460 qdisc noqueue state DOWN group default link/ether 02:42:b0:25:d5:57 brd ff:ff:ff:ff:ff:ff inet 172.17.42.1/16 scope global docker0 valid_lft forever preferred_lft forever 17: tun0: mtu 1500 qdisc pfifo_fast state UP group default qlen 100 link/none inet 11.11.0.1 peer 11.11.0.2/32 scope global tun0 valid_lft forever preferred_lft forever
B:~$ sudo iptables --list -t nat Chain PREROUTING (policy ACCEPT) target prot opt source destination DOCKER all -- anywhere anywhere ADDRTYPE match dst-type LOCAL Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination DOCKER all -- anywhere !loopback/8 ADDRTYPE match dst-type LOCAL Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 172.17.0.0/16 anywhere Chain DOCKER (2 references) target prot opt source destination
B:~$ sudo iptables --list -t filter Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination DOCKER all -- anywhere anywhere ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain DOCKER (1 references) target prot opt source destination
Надеюсь, я дал достаточно информации о проблеме.
Виртуальная сеть, которую вы получаете на экземпляре GCE, фактически является /32
сеть, к которой подключены только сам экземпляр и шлюз (последний настраивается с использованием маршрута к хосту). Это означает, что весь исходящий трафик отправляется на шлюз.
По этой причине вы получаете следующую ошибку:
B:~$ sudo ip route add 11.10.0.0/16 via 10.240.0.8 dev eth0
RTNETLINK answers: Network is unreachable
Ошибка просто говорит вам, что нет ни одного хоста или сетевого маршрута, который соответствует 10.240.0.8
(кроме маршрута по умолчанию, который использует сам шлюз).
Невозможно настроить желаемую конфигурацию с помощью конфигурации маршрутизации на хостах. Вместо этого вам нужно настроить маршрутизацию в самом GCE, как описано Вот. Концептуально это можно представить как настройку таблицы маршрутизации на шлюзе. Вам не нужна дополнительная настройка на хостах, потому что, как объяснено выше, они отправляют все исходящие пакеты на шлюз.