我正在尝试解封装到达端口的隧道数据包eth0
,并将它们解封装后转发到eth1
Ubuntu 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}
例如,在此示例中,第二条用于解封装的过滤规则不会被满足。
我有完全相反情况的工作示例,即封装任何进入或的流量eth0
。tc
但是openvswitch
,我似乎忽略了解封装的某些内容。
可能的陷阱:
- rp_过滤器
- 校验和不正确
- iptables 阻止流量
- 错误的 MAC 地址(内部和外部)