我想镜像"所有"在tc
的帮助下,通过GRE隧道tun0
从一个界面进行网络流量。 GRE隧道工作正常,我可以ping通并发送数据包,没有任何问题。我使用以下命令添加了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
就像这个Tutorial
一样问题
问题是只有入口流量通过GRE隧道传输。当我通过接口ens5
ping另一台计算机时,我只通过icmp echo replies
接口获得tun0
。
我做错了什么?
调试
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
答案 0 :(得分:2)
自己解决问题。
tc镜像出口流量与以太网标头和入口流量没有以太网标头 GRE隧道只需要IP-Packets,因此存在标头不匹配。 如果我使用VXLAN而不是GRE,它可以正常工作。
答案 1 :(得分:0)
我从未使用GRE-Tunnels,但根据您发布的Tutorial链接,它与桥接接口有关?我目前还在桥接口上使用Linux Traffic Control(tc) - 在我的例子中,它是由Docker创建的桥接器,我必须操纵流量(不仅重定向它)。
根据我的经验,我可以告诉你,当你将tc类/过滤器添加到桥接接口时,tc不能正常工作。它主要基于桥上入口和出口流量的定义,这对我来说非常混乱。我还使用ICMP-Ping功能测试了我的tc配置,就像你一样,我也只能操作ICMP回复。
我的假设是tc没有对ICMP请求作出反应,因为在我的情况下,它只在桥接端口之间切换而不是路由。我能够通过使用ebtables(http://ebtables.netfilter.org)删除它来处理ICM请求,因此强制它被路由而不是在桥接端口之间切换。
我仍然不确定这是否是您问题的解决方案,因为我不确定GRE-Tunnel是如何工作的,或者它们是如何实现的。