web-dev-qa-db-ja.com

すべてのパケットをあるインターフェースから別のインターフェースに盲目的に転送する方法は?

Eth0で受信したすべてのL3パケットを別のインターフェイスに転送したいのですが、m0(m0は個別のL2フレーミングメカニズムを備えたカスタムハードウェアに関連付けられたカスタムインターフェイス)と逆のm0-> eth0を呼び出します。 m0のサンプル実装は、たとえばSLIPインターフェースです。できればユーザー空間ツールを使ってこれを実現したいと思います。

トリッキーな部分は、ルーティングしたくないことです。送信元または宛先のIPv4アドレスが何であるかは気にせず、MACアドレスも何であるかは気にしません。 L3パケットを変更せずに、インターフェース0からすべてを盲目的に取得し、インターフェース1をシャベルで動かしたい(逆も同様)。

Eth0を介して受信されるすべて(この使用例)は、イーサネットMTU 1500に適合するipv4 UDPパケットであり、フラグメントはないことを知っています。さらに、マルチキャストアドレス指定されたパケットを処理する必要があります。

これを実現する唯一の方法は、無差別モードでインターフェイスにキャンプしているカスタムソフトウェアを使用することです。パケットをOriginにループバックするシナリオに入るのを避けるのは難しいので、これを避けたいと思います。

例えば、

  1. Eth0とm0をポーリングして、データが受信されたかどうかを確認します
  2. eth0で受信したパケットA
  3. eth0でキャプチャされ、m0に送信されたパケットA
  4. m0 で受信したパケットA
    1. パケットAはすでに処理されていますが、ソフトウェアはそれをどのようにして知っていますか?以前に処理したパケットのある種のテーブルを保持する必要があります...厄介です。

Linuxでの設定に関しては、これまでに行ったすべての調査の結果、次の組み合わせを使用するようになりましたが、この使用例では適切ではないと思います。

_echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -i eth0 -o m0 -j ACCEPT
iptables -A FORWARD -i m0 -o eth0 -j ACCEPT
_

静的ルーティングで実現可能

静的ルートを設定し、双方向メッセージングを確認することにより、インターフェースがすべて機能し、ハードウェアの問題ではないことを確認しました。私はそれが単に達成できないと考え始めています。

PC0がPC1に直接接続できるようになりました。テスト済み:

_    ping 192.168.2.110 -t 10
_

無線を介してPC1から応答を受信しました。

ネットワークマップ:

_                              eth0               eth0
                          192.168.0.111      192.168.2.112
              PC0 --- eth --- unit111 --- rf --- unit112 --- eth --- PC1
        192.168.0.110     192.168.1.111      192.168.1.112       192.168.2.110
                               m0                 m0
_

PC0:

_        IFPC=enx4865ee1495b5
        ip link set $IFPC up
        ip addr flush $IFPC
        ip addr add 192.168.0.110/24 dev $IFPC
        ip route add 192.168.1.0/24 via 192.168.0.111
        ip route add 192.168.2.0/24 via 192.168.0.111
_

unit111:

_        ip link set eth0 up
        ip addr flush eth0
        ip addr add 192.168.0.111/24 dev eth0
        ip link set m0 up
        ip addr flush m0
        ip addr add 192.168.1.111/24 dev m0
        ip route add 192.168.2.0/24 via 192.168.1.111
        echo 1 > /proc/sys/net/ipv4/ip_forward
_

unit112:

_        ip link set eth0 up
        ip addr flush eth0
        ip addr add 192.168.2.112/24 dev eth0
        ip link set m0 up
        ip addr flush m0
        ip addr add 192.168.1.112/24 dev m0
        ip route add 192.168.0.0/24 via 192.168.1.112
        echo 1 > /proc/sys/net/ipv4/ip_forward
_

PC1:

_        IFPC=enp0s31f6
        ip link set $IFPC up
        ip addr flush $IFPC
        ip addr add 192.168.2.110/24 dev $IFPC
        ip route add 192.168.1.0/24 via 192.168.2.112
        ip route add 192.168.0.0/24 via 192.168.2.112
_

アプリケーションコンテキスト

これは、RF送信に使用される独自のL2/L1を持つ無線用です。ネットワークのエッジでシステムに配置されることが保証されており、イーサネットインターフェイス経由で受信する唯一のパケットはRFチェーンで使用されているL2へのインターフェースは、DMAであるため、(m0)のネットワークインターフェースを構築したため、 思考イーサネットインターフェイスへの接続を簡素化しますM0に使用されるすべてのL2/L1は、m0 DMAを介してパケットをシャッフルするFPGA実装です。

無線からパケットを送受信するシステムの観点から見ると、無線は基本的に有線のように見えます。パケットイン、パケットアウト。

送信チェーン:

[eth rx frame]->[??forward to m0??]->[m0 places pkt in dma for l2 chain]->[frame (L2),mod,out to rf]

受信チェーン:

[rf,demod,deframe(L2)]->[m0 rx pkt creates skb]->[??forward to eth0??]->[eth0 rx skb transmits ethernet frame]

無線は全二重で、送信と受信を同時に実行できる必要があります。つまり、イーサネットからパケットを取得してrf経由で送信し、rf経由でパケットを受信して​​イーサネットに送り返します。

パケットをRFチェーンに入れ、m0を介して通常のソケットコードを使用して問題なく回復できます。パケットに触れたり開いたりせずにインターフェース間ですべてのトラフィックを転送する方法を理解できません。無差別にインターフェイスし、Cコードで手動で実行します(前述のように、独自のワームのバッグがあります)。

6
gutelfuldead

編集:「ブリッジングなし」の詳細を忘れたが、2番目の記事は要求どおりにトリックを実行し、イーサネットや無線LANなどの異なるネットワークタイプに接続できるレイヤー3ソリューションを提供する必要があります。

元の回答:

「linux kernel interface passthrough」というフレーズを使用して少し検索したところ、debian.orgにいくつかの記事が表示されましたが、これはあなたが探している答えを正確に提供しているようです。追加するのに意味のあるものはありません。 2番目の記事では特に、有線ネットワークを無線ネットワークにブリッジすること、およびアクセスポイントのセキュリティに関連する潜在的な問題を扱っていることに注意してください。

記事に関連するソフトウェアは通常、現在のDebianリポジトリで入手できます。

記事1: https://wiki.debian.org/BridgeNetworkConnections の「ネットワーク接続のブリッジ」

記事2:「プロキシARPによるネットワーク接続のブリッジ」 https://wiki.debian.org/BridgeNetworkConnectionsProxyArp (レイヤー3ブリッジ)

与えられたアドバイスを書き換えると頭が痛くなるかもしれないので、これが前向きな方法を提供することを願っています(これは、とにかく値を追加しません)。

3
Mr. Donutz