![GRE 隧道至本地主机](https://linux22.com/image/1554665/GRE%20%E9%9A%A7%E9%81%93%E8%87%B3%E6%9C%AC%E5%9C%B0%E4%B8%BB%E6%9C%BA.png)
我正在尝试使用 GRE 隧道(或 TAP)将本地 Linux 网络命名空间轻量级 VM 连接到本地主机。出现可以正常工作,但来自主机的答复不会传回虚拟机。
我的设置:
主机真实IP:10.1.101.101/24
HOST GRE(像这样设置):
ip l add dev gre1 type gretap remote 10.1.101.101 local 10.1.101.101 key 101
ip a add dev gre1 10.201.0.2/24
ip l set dev gre1 up
主机网络配置:
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:30:1b:42:65:ac brd ff:ff:ff:ff:ff:ff
inet 10.1.101.101/24 brd 10.1.101.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::230:1bff:fe42:65ac/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 00:50:04:d0:50:0f brd ff:ff:ff:ff:ff:ff
82: gre0@NONE: <NOARP> mtu 1476 qdisc noop state DOWN group default
link/gre 0.0.0.0 brd 0.0.0.0
83: gretap0@NONE: <BROADCAST,MULTICAST> mtu 1462 qdisc noop state DOWN group default qlen 1000
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
84: gre1@NONE: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65494 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/ether e2:83:0d:a4:cc:23 brd ff:ff:ff:ff:ff:ff
inet 10.201.0.2/24 scope global gre1
valid_lft forever preferred_lft forever
inet6 fe80::e083:dff:fea4:cc23/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
主机路线:
ip r
default via 10.1.101.1 dev eth0
10.1.101.0/24 dev eth0 proto kernel scope link src 10.1.101.101
10.201.0.0/24 dev gre1 proto kernel scope link src 10.201.0.2
169.254.0.0/16 dev eth0 scope link metric 1000
HOST iptables 为空白(例如iptables -F
:)
虚拟机网络配置:
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: gre0@NONE: <NOARP> mtu 1476 qdisc noop state DOWN group default
link/gre 0.0.0.0 brd 0.0.0.0
3: gretap0@NONE: <BROADCAST,MULTICAST> mtu 1462 qdisc noop state DOWN group default qlen 1000
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
114: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:00:00:aa:00:00 brd ff:ff:ff:ff:ff:ff
inet 10.201.0.1/24 brd 10.201.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::200:ff:feaa:0/64 scope link
valid_lft forever preferred_lft forever
虚拟机路由:
ip r
10.201.0.0/24 dev eth0 proto kernel scope link src 10.201.0.1
10.201.0.2
现在从虚拟机ping 主机10.201.0.1
并捕获数据包:
tcpdump -ni gre1
在主机上:
11:57:36.379404 ARP, Request who-has 10.201.0.2 tell 10.201.0.1, length 28
11:57:36.379431 ARP, Reply 10.201.0.2 is-at e2:83:0d:a4:cc:23, length 28
11:57:36.379455 ARP, Reply 10.201.0.2 is-at e2:83:0d:a4:cc:23, length 28
11:57:37.376634 ARP, Request who-has 10.201.0.2 tell 10.201.0.1, length 28
11:57:37.376658 ARP, Reply 10.201.0.2 is-at e2:83:0d:a4:cc:23, length 28
11:57:37.376683 ARP, Reply 10.201.0.2 is-at e2:83:0d:a4:cc:23, length 28
11:57:38.376539 ARP, Request who-has 10.201.0.2 tell 10.201.0.1, length 28
11:57:38.376567 ARP, Reply 10.201.0.2 is-at e2:83:0d:a4:cc:23, length 28
11:57:38.376596 ARP, Reply 10.201.0.2 is-at e2:83:0d:a4:cc:23, length 28
tcpdump -ni eth0
在虚拟机上:
11:57:36.379243 ARP, Request who-has 10.201.0.2 tell 10.201.0.1, length 28
11:57:37.376384 ARP, Request who-has 10.201.0.2 tell 10.201.0.1, length 28
11:57:38.376384 ARP, Request who-has 10.201.0.2 tell 10.201.0.1, length 28
因此,据我所知,VM 向 HOST 发送 ARP 请求,HOST 回答 ARP(正确),但是 ARP 数据包没有通过 GRE 隧道返回?
注 1:虚拟机由一款名为CORE 仿真器并由一个基本路由器附于GRE 节点,该节点指向10.1.101.101
且键为101
注 2:如果我不是在本地使用 Core Emulator,而是在另一台机器上运行它,但使用相同的设置,相同的配置可以正常工作(使用 10.1.101.101)。
我还尝试将 HOST GRE 隧道设置为:
ip l add gre1 type gretap remote 127.0.0.1 local 127.0.0.1 key 101
和虚拟机GRE 节点指向127.0.0.1
但我得到了相同的结果,ARP 被主机看到并回复,但是不是被 VM 看到。
编辑 1:
为了回答我的“现实世界”问题,CORE 确实为我提供了合适的解决方案,如下所述:https://downloads.pf.itd.nrl.navy.mil/docs/core/core-html/usage.html#other-methods
编辑 2:后续问题?
“Linux 容器/网络命名空间/LXC”等 VM 是否可以通过 GRE 隧道与主机计算机通信。GRE 隧道端点将类似于HOST:127.0.0.1
(VM:?.?.?.?
这些问号让我得出结论,虽然 VM 可能能够发送到 127.0.0.1,但主机没有返回 VM 的路径,这可能是我最初问题中的 ARP 无法到达 VM 的原因)。
感谢您花时间阅读本文,任何帮助都将不胜感激。
答案1
部分答案:GRE 隧道在正常连接上运行,并为您提供额外的网络接口,可在网络数据包中添加/删除隧道头。
因此,在两台机器 A 和 B 之间建立隧道的正常设置如下:
1) 检查 A 和 B 是否具有“正常”IP 地址,并且彼此可见。例如,如果 A 的 IP 地址为“10.0.0.1/24”,eth0
而 B 的 IP 地址为“10.0.0.2/24” ,则在 A 和B 上eth0
分别执行 a。ping 10.0.0.2
ping 10.0.0.1
2)在A上添加一个隧道设备,本地IP为A,远程IP为B,在接口上添加新的IP:
ip link add dev gre0 type gretap remote 10.0.0.2 local 10.0.0.1 key 123
ip addr add 10.0.44.1/24 dev gre0
ip link set gre0 up
3)对 B 执行相同操作,并设置适当的 IP 地址:
ip link add dev gre0 type gretap remote 10.0.0.1 local 10.0.0.2 key 123
ip addr add 10.0.44.2/24 dev gre0
ip link set gre0 up
4)ping 10.0.44.2
在 A 和ping 10.0.44.1
B 上执行操作,查看隧道是否通畅。
如您所见,这不是您所拥有的设置:HOST 上隧道的本地和远程地址相同,VM 上没有隧道的本地和远程地址,VM 上的隧道接口已关闭,并且属于隧道的 IP 地址已结束eth0
。 这些都没有任何意义,所以它不起作用也就不足为奇了。
我不知道核心模拟器如何处理“GRE 节点”,但从您展示的配置来看,这似乎只是用于配置 GRE 接口的一层。因此,要么弄清楚核心模拟器如何处理这些节点,要么忘记模拟器中的“GRE 节点”,然后手动配置它。
更好的是,作为练习,配置二在核心模拟器中连接的虚拟机 A 和 B,然后按上述方法手动添加 GRE 隧道。这是一种对称情况,应该是最不令人困惑的。