GRE 隧道至本地主机

GRE 隧道至本地主机

我正在尝试使用 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.1VM:?.?.?.?这些问号让我得出结论,虽然 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.2ping 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.1B 上执行操作,查看隧道是否通畅。

如您所见,这不是您所拥有的设置:HOST 上隧道的本地和远程地址相同,VM 上没有隧道的本地和远程地址,VM 上的隧道接口已关闭,并且属于隧道的 IP 地址已结束eth0。 这些都没有任何意义,所以它不起作用也就不足为奇了。

我不知道核心模拟器如何处理“GRE 节点”,但从您展示的配置来看,这似乎只是用于配置 GRE 接口的一层。因此,要么弄清楚核心模拟器如何处理这些节点,要么忘记模拟器中的“GRE 节点”,然后手动配置它。

更好的是,作为练习,配置在核心模拟器中连接的虚拟机 A 和 B,然后按上述方法手动添加 GRE 隧道。这是一种对称情况,应该是最不令人困惑的。

相关内容