出力アドレスポートに基づいて別のvLANにパケットを送信します。

出力アドレスポートに基づいて別のvLANにパケットを送信します。

2種類の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にパケットを送信したら、次のようにシステムを設定したいと思います。ポート1port1 の値が X で IP からパケットを送信すると、パケットは ID 5 の VLAN で送信されます。ポート2ここで、IPは同じIPですが、port2の値はYです。パケットは ID 8 の VLAN で送信されます。

可能ですか?

答え1

はい、iptablesを使用してこれを実行できます。ルーティングが宛先ポートのIPに基づいてインターフェイスを決定するように、パケットの送信元アドレス(SNAT)を変更できます。または、ターゲットポートに基づいてタグを設定し、複数のルーティングテーブルを持ち、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

2 つの方法でフィルタリングルールを追加します。出口を表示し、入口を表示解除します。 U8はレイヤ9ネットワークeq17の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が非常に早く(受信の場合)発生し、非常に遅く(送信の場合)に発生するため、VLANをまったく認識しません。

このアプローチは、私の目的と比較して、よりシンプルでより強力であることがわかりました。 prio、vlan action、cmp、およびingress機能(sch_prio、sch_ingress、cls_basic、act_vlan、em_cmp)をサポートするには、Linuxカーネルを再構築する必要がありますが、これまで解決策は有望です。

注:NICはVLANタグを削除する傾向があります。これはテストするのが本当に残念で、まったく異なる投稿/フォーラムのトピックです。

関連情報