我在 Linux 2.6.30.9 上运行,并一直在尝试设置透明以太网 GRE 隧道。使用的网络拓扑如下:
我想使用 GRE 上的透明以太网桥接 PC1 和 PC2。RouterA 通过 ppp0 连接到互联网,就像 RouterB 一样。两个互联网连接都是 PPPOE(PPPoEoA PVC)。
所以我这么做了:
在 RouterA(linux 2.6.30.9)中:
ip link add testgre type gretap remote 193.152.243.206 local 95.121.205.77 ttl 255
brctl addif br0 testgre
ip link set testgre up
在 RouterB(linux 2.6.30.9)中:
ip link add testgre type gretap remote 95.121.205.77 local 193.152.243.206 ttl 255
brctl addif br0 testgre
ip link set testgre up
一些命令输出:
在 RouterA 中(RouterB 中的输出类似):
# ip link show testgre
36: testgre: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1442 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 5f:79:cd:4d:c6:57 brd c1:98:f3:ce:ff:ff
# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.5f79cd4dc657 no eth0.5
eth0.4
eth0.3
eth0.2
wlan0
testgre
然后我从 PC1 向 PC2 发出 PING 请求:
ping 192.168.1.33
我在 RouterA 中运行 tcpdump,看到 ppp0 上的 ARP 请求帧(用 Wirehark 打开的 pcap 文件):
我在连接到 ppp1 的 RouterB 中运行 tcpdump,发现 ARP 请求已到达,但未在 L2 转发到 PC2。我在 PC2 中没有看到 ARP 请求。
我尝试使用静态 ARP 条目,但 ICMP 请求存在同样的问题,它没有转发到 PC2。
没有 ebtables 规则。也没有 iptables 规则(ebtables 和 iptables 的默认操作是 ACCEPT)。我应该将 ppp0 添加到桥接接口或类似的东西吗?欢迎提出任何建议。
答案1
该问题与我在 Server Fault 上提出的问题有关IP/GRE 在内核中编译,但 gre0 接口不存在。
我通过让 GRE 解复用器驱动程序gre.c
在内核中注册 GRE 协议处理程序解决了第一个问题。但我发现,当 GRE 数据包到达时,GRE 处理程序没有指向任何ip_gre.c
函数(GRE 解复用器驱动程序应该检查数据包中的 GRE 版本并将存储桶传递给正确的协议处理程序,但在我的例子中它指向 NULL)。
我注释了注册 GRE 协议处理程序的代码片段gre.c
,并取消了注册 GRE 协议处理程序的代码片段的注释ip_gre.c
。现在,当 GRE 数据包到达时,它已被很好地解封装并提交到下一层,现在我可以毫无问题地从 PC1 ping 到 PC2。我认为这个问题发生在许多人的嵌入式设备上,因为我用谷歌搜索了错误消息 https://www.google.com/search?q=ipgre+init%3A+can%27t+add+protocol当 IP GRE 驱动程序无法启动时,因为 GRE 解复用器驱动程序尚未注册 GRE 处理程序,并且我发现多个设备都出现此错误。