eth0で受信したすべてのL3パケットを別のインターフェイスに転送したいと思います。 m0(m0は独自のL2フレーミングメカニズムを使用してカスタムハードウェアにバインドされたカスタムインターフェイス)を呼び出し、m0-> eth0を逆方向に設定します。たとえば、m0のサンプル実装はSLIPインタフェースです。これを達成するには、ユーザースペースツールを使用するのが最善です。
トリッキーな部分は、ルーティングしたくないということです。送信元または宛先IPv4アドレスが何であるか、MACアドレスが何であるかは関係ありません。私はL3パケットを変更せずにインターフェイス0のすべてを盲目的に取得し、インターフェイス1(またはその逆)に移動したいと思います。
私はeth0(このユースケースでは)を介して入ってくるすべてが断片なしでEthernet mtu 1500に適したipv4 UDPパケットであることを知っています。また、マルチキャストアドレス指定パケットを処理する必要があります。
残念ながら、これを達成する唯一の方法は、無差別モードでインターフェイスに常駐するカスタムソフトウェアを使用することです。パケットがソースにループバックする状況に陥ることを避けるのは難しいので、これを避けたいと思います。
例えば、
- eth0 と m0 をポーリングしてデータが受信されたことを確認する
- eth0 はパケット A を受信します。
- パケットAはeth0でキャプチャされ、m0に送信されます。
- m0 はパケット A を受信します。
- パケット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
コンピュータ0:
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
111号:
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
112号:
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
コンピュータ1:
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経由で送信されます。 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]
ラジオは全二重方式なので、同時に送信と受信の両方を実行できる必要があります。つまり、イーサネットからパケットを取得し、無線周波数で送信し、無線周波数でパケットを受信してイーサネットに送り返すということです。
問題なく通常のソケットコードを使用して、m0を介してRFチェーンにパケットを配置して復元できます。パケットに触れないでください、またはインターフェイスを乱雑に開いて、Cコード(言及したように独自のウォーム缶がある)で手動で実行せずに、インターフェイス間ですべてのトラフィックを転送する方法がわかりません。
答え1
編集:「ブリッジなし」の詳細を忘れましたが、2番目の記事では、要求どおりにタスクを実行して、イーサネットや無線LANなどのさまざまな種類のネットワークに接続できるレイヤ3ソリューションを提供する必要があります。
元の答え:
私は「linux kernel interface passthrough」というフレーズを使っていくつかの検索を行いました。したがって、ここでは、もはや素晴らしい説明は必要ありません。しないでください。 2番目の記事では、有線ネットワークをワイヤレスネットワークに接続する方法と、アクセスポイントのセキュリティに関する潜在的な問題について具体的に取り上げています。
記事で扱うソフトウェアは通常、現在のDebianリポジトリにあります。
項目1:「ブリッジネットワーク接続」https://wiki.debian.org/BridgeNetworkConnections
トピック2:「プロキシARPを使用してネットワーク接続をブリッジする」https://wiki.debian.org/BridgeNetworkConnectionsProxyArp(3階橋)
与えられた提案を書き直すと(とにかく価値は追加されません)、頭が痛くなる可能性があるので、これが将来の合理的な方法を提供することを願っています。
答え2
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -i wlan1 -o wlan0 -j ACCEPT
iptables -A FORWARD -i wlan0 -o wlan1 -m state --state ESTABLISHED,RELATED \
-j ACCEPT
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE