如何解封装隧道并转发内部数据包

如何解封装隧道并转发内部数据包

我正在尝试解封装到达端口的隧道数据包eth0,并将它们解封装后转发到eth1Ubuntu 20.04 机器上的另一个端口,如下所示:

                                  ____________
         10.40.16.0/24           |            |
----(e.g. GRE, VXLAN tunnel)---->|eth0        |
                                 |     \      |
                                 |      tun0  |
           10.0.1.0/24           |     /      |
<---------(inner traffic)--------|eth1        |
                                 |____________|

对于隧道协议(例如 VXLAN 或 GRE),我很灵活。
可能的挑战是封装的数据包不是用于服务器,而是用于转发。

我的问题是:在 Linux 上,使用 OpenvSwitch、tc、iptables 等工具是否可行?
如果可以,我将非常感激任何最小工作示例或任何其他帮助。
如果不能,我是否可能忽略了 Linux 内核中网络堆栈的一个奇怪方面?

我尝试了多种方法,例如使用 Openvswitch、tc。这是我的tc示例:

IINF=${1:-eth0}
OINF=${1:-eth1}

ip link set dev ${IINF} up
ip link set dev ${OINF} up
ip link set dev ${IINF} promisc on
ip link set dev ${OINF} promisc on

ip link add vxlan0 type vxlan dstport 4789 external
ip link set dev vxlan0 up
ip link set dev vxlan0 promisc on

tc qdisc add dev ${IINF} handle ffff: ingress
tc qdisc add dev vxlan0 handle ffff: ingress

tc filter add dev ${IINF} parent ffff: protocol all u32 match u8 0 0 action mirred ingress redirect dev vxlan0

# see https://man7.org/linux/man-pages/man8/tc-tunnel_key.8.html
tc filter add dev vxlan0 protocol all parent ffff: flower enc_dst_port 4789 action tunnel_key unset action mirred egress redirect dev ${OINF}
# Filter rule is somehow not triggered.

# This would simply forward the tunneled traffic, but not decapsulate it.
# tc filter add dev vxlan0 protocol all parent ffff:  u32 match u8 0 0 action mirred egress redirect dev ${OINF}

例如,在此示例中,第二条用于解封装的过滤规则不会被满足。
我有完全相反情况的工作示例,即封装任何进入或的流量eth0tc但是openvswitch,我似乎忽略了解封装的某些内容。

可能的陷阱:

  • rp_过滤器
  • 校验和不正确
  • iptables 阻止流量
  • 错误的 MAC 地址(内部和外部)

相关内容