我在Linux 2.6.30.9上运行,一直试图在GRE隧道上build立一个透明的以太网。 使用的networking拓扑结构如下所示:

我想通过GRE使用透明以太网桥接PC1和PC2。 RouterA作为RouterB通过ppp0连接到Internet。 两个互联网连接都是PPPOE(PPPoEoA PVCs)。
所以我做:
在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
然后我做PING请求从PC1到PC2:
ping 192.168.1.33
我在RouterA中运行tcpdump,并通过ppp0(Wireshark打开的pcap文件)看到ARP请求帧:

我在连接到ppp1的RouterB上运行tcpdump,发现ARP请求已经到达,但是不会在L2转发给PC2。 我没有看到PC2中的ARP请求。
我尝试使用静态ARP条目,但ICMP请求具有相同的问题,不会将其转发给PC2。
没有ebtables规则。 也没有iptables规则(默认行动是接受ebtables和iptables)。 我应该添加ppp0桥接接口或类似的东西? 任何build议都欢迎。
这个问题和我在内核编译的服务器故障IP / GRE问题有关, 但是gre0接口不存在 。
我通过让gre.c GRE多路分解器驱动程序在内核中注册GRE协议处理程序来解决第一个问题。 但是我发现,当GRE数据包到达时,GRE处理程序没有指向任何ip_gre.c函数(GRE解复用器驱动程序用于检查数据包中的GRE版本,并将数据包传递给正确的协议处理程序,但在本例中指向NULL) 。
我评论了gre.c注册GRE协议处理程序的代码片段,并且我已经取消了ip_gre.c注册GRE协议处理程序的一段代码。 现在,当一个GRE数据包到达时,它被很好的解封装,并提交到下一层,现在我可以ping PC1到PC2没有任何问题。 我认为这个问题是发生在他们的embedded式设备的许多人,因为我search谷歌的错误消息https://www.google.com/search?q=ipgre+init%3A+can%27t+add+protocol当IP GRE驱动程序无法启动,因为GRE多路分解器驱动程序尚未注册GRE处理程序,并且发现有几个设备出现此错误。