根据输出地址端口将数据包发送到不同的 vLAN

根据输出地址端口将数据包发送到不同的 vLAN

我有一块板发送两种 UDP 数据包。在同一块板上我配置了几个 vLAN:

sudo modprobe 8021q 
sudo ip link add link enP2p1s0 name enP2p1s0.5 type vlan id 5 
sudo ip link set enP2p1s0.5 up
sudo ip link add link enP2p1s0 name enP2p1s0.8 type vlan id 8 
sudo ip link set enP2p1s0.8 up

我想设置系统,以便如果我向 IP 发送数据包:端口1其中 port1 值为 X,数据包在 ID 为 5 的 VLAN 上发出,如果我在 IP 上发出数据包:端口2其中 IP 是相同的 IP,但 port2 值为 Y - 数据包在 ID 为 8 的 VLAN 上发出。

这可能吗?

答案1

是的,您可以使用 iptables 来做到这一点。您可以更改数据包的源地址 (SNAT),让路由根据目标端口上的 IP 决定接口。或者您可以根据目标端口设置标记,拥有多个路由表并设置 ip 规则来分配特定的路由表。

答案2

我认为这可能有效:

sudo ip link add link enP2p1s0 name enP2p1s0.5 type vlan id 5  
sudo ip link set enP2p1s0.5 up  
sudo ip link add link enP2p1s0 name enP2p1s0.8 type vlan id 8  
sudo ip link set enP2p1s0.8 up  
sudo iptables-legacy -A OUTPUT -p udp --dport 15004 -j MARK --set-mark 1  
sudo iptables-legacy -A OUTPUT -p udp --dport 14002 -j MARK --set-mark 2  
sudo ip rule add fwmark 1 table 11  
sudo ip rule add fwmark 2 table 22  
sudo ip route add 192.168.0.0/24 dev enP2p1s0.5 table 11  
sudo ip route add 192.168.0.0/24 dev enP2p1s0.8 table 22

@EOhm 可以看一下吗?

答案3

再次感谢您的所有投入。发布的另一个答案(然后消失了?)是这个:

还有一种非常奇特的方法,使用 tc 及其 vlan 操作,完全忽略网络(路由)层。

通常的准备工作:添加最简单的有类 qdisc(prio),仅在此处用于允许附加出口过滤器,并添加入口 qdisc:

sudo tc qdisc add dev enP2p1s0 root handle 1: prio
sudo tc qdisc add dev enP2p1s0 ingress

添加过滤规则,两种方式:标记出口,取消标记入口。 u8 在 9 层网络 eq 17 表示 UDP,u16 在 2 层传输表示目的端口:

sudo tc filter add dev enP2p1s0 parent 1: protocol ip basic match 'cmp(u8 at 9 layer network eq 17) and cmp(u16 at 2 layer transport eq 15004)' action vlan push id 151
sudo tc filter add dev enP2p1s0 parent 1: protocol ip basic match 'cmp(u8 at 9 layer network eq 17) and cmp(u16 at 2 layer transport eq 14002)' action vlan push id 150
sudo tc filter add dev enP2p1s0 ingress basic match 'meta(vlan eq 150) or meta(vlan eq 151)' action vlan pop

网络堆栈的其余部分甚至永远不会意识到 VLAN,因为它发生得非常早(对于入口)和晚(对于出口)。

事实证明,这种方法对于我的目的来说更简单、更强大。我必须重建 Linux 内核以支持 prio、vlan action、cmp 和 ingress 功能(sch_prio、sch_ingress、cls_basic、act_vlan、em_cmp),但到目前为止,该解决方案看起来很有希望。

需要注意的是:NIC 倾向于剥离 VLAN 标记。这对于测试来说是一个真正的无赖,并且是一个完全不同的帖子/论坛的主题

相关内容