我试图镜像“所有”的网络流量从一个接口的帮助下,tc通过一个GRE隧道tun0。GRE-隧道工作正常,我可以通过它平和发送数据包,没有任何问题.我使用以下命令添加了tc-qdisc和tc-filter:
tc qdisc add dev ens5 ingress
tc filter add dev ens5 parent ffff: \
protocol all \
u32 match u8 0 0 \
action mirred egress mirror dev tun0和
tc qdisc add dev ens5 handle 1: root prio
tc filter add dev ens5 parent 1: \
protocol all \
u32 match u8 0 0 \
action mirred egress mirror dev tun0就像在这个教程
问题
问题是只有入口交通通过GRE隧道。当我在接口ens5上平另一台计算机时,我只能通过tun0接口获得icmp echo replies。我做错什么了?
Debug
ubuntu@switch:~$ tcpdump -i tun0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10:23:28.952197 IP 192.168.20.12 > 192.168.20.15: ICMP echo reply, id 3453, seq 1, length 64
10:23:29.954454 IP 192.168.20.12 > 192.168.20.15: ICMP echo reply, id 3453, seq 2, length 64
10:23:30.952864 IP 192.168.20.12 > 192.168.20.15: ICMP echo reply, id 3453, seq 3, length 64
10:23:31.953207 IP 192.168.20.12 > 192.168.20.15: ICMP echo reply, id 3453, seq 4, length 64
10:23:32.955350 IP 192.168.20.12 > 192.168.20.15: ICMP echo reply, id 3453, seq 5, length 64
10:23:33.957000 IP 192.168.20.12 > 192.168.20.15: ICMP echo reply, id 3453, seq 6, length 64
10:23:34.956313 IP 192.168.20.12 > 192.168.20.15: ICMP echo reply, id 3453, seq 7, length 64发布于 2016-12-15 13:04:39
我自己解决了这个问题。
tc将出口流量与(以太网报头)和不带以太网报头的入口流量(GRE-隧道只期望IP数据包)镜像,因此出现了报头不匹配。如果我使用的是VXLAN而不是GRE,它可以正常工作。
发布于 2016-12-13 08:44:23
我从来没有使用过GRE隧道,但是基于您发布的教程链接,它与桥接口有关吗?我目前还在桥接口上使用Linux流量控制(tc) --在我的例子中,它是Docker创建的一座桥,我必须操纵流量(不仅仅是重定向)。
根据我的经验,我可以告诉您,当您将tc类/过滤器添加到桥接口时,tc并不像预期的那样工作。它主要是基于对进出桥梁交通的定义,这(对我来说)非常令人困惑。我还测试了我的tc配置与ICMP功能,和你一样,我也只能操纵ICMP回复。
我的假设是tc没有对ICMP请求作出反应,就像我的情况一样,它只是在桥接端口之间切换,而不是路由。我能够使用tc来处理ICMP请求,方法是将它与ebtables (http://ebtables.netfilter.org)一起删除,从而强制它被路由,而不是在桥接端口之间切换。
不过,我不确定这是否能解决您的问题,因为我不确定GRE隧道是如何工作的,或者它们是如何实现的。
https://stackoverflow.com/questions/41037569
复制相似问题