我想将 eth0 上收到的所有 L3 数据包转发到另一个接口,让我们调用 m0(m0 是一个自定义接口,绑定到具有独特 L2 成帧机制的自定义硬件)以及反向 m0->eth0。例如,m0 的示例实现可以是 SLIP 接口。我想最好使用用户空间工具来实现这一点。
棘手的部分是我不想路由。我不关心源或目标 ipv4 地址是什么,也不关心 MAC 地址是什么。我只是想盲目地从接口 0 获取所有内容并将其铲到接口 1 上(反之亦然),而不修改 L3 数据包。
我知道通过 eth0 传入的所有内容(在本用例中)都是适合以太网 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
应用上下文
这是针对具有自己的用于射频传输的 L2/L1 的无线电。它可以保证放置在网络边缘的系统中,并且它通过以太网接口接收的唯一数据包将通过 RF 发出。 RF 链中使用的 L2 接口是 DMA,我为 (m0) 构建了一个网络接口,因为我想法它将简化其与以太网接口的连接。用于 M0 的所有 L2/L1 都是 FPGA 实现,通过 m0 DMA 对数据包进行混洗。
从系统从无线电发送/接收数据包的角度来看,无线电基本上看起来像一根电线;数据包输入,数据包输出。
传输链:
[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
编辑:忘记了“无桥接”这一细节,但第二篇文章应该按照要求完成任务,提供可以连接不同网络类型(例如以太网和无线 LAN)的第 3 层解决方案。
原答案:
我使用短语“linux kernel interface passthrough”进行了一些搜索,这使我在 debian.org 上找到了几篇文章,这些文章似乎完全提供了您正在寻找的答案,因此这里没有进一步的花哨解释,因为我不这样做没有任何明智的补充。请注意,第二篇文章特别涉及将有线网络桥接到无线网络,处理与接入点安全相关的潜在问题。
文章中涉及的软件通常可以在当前的 Debian 存储库中找到。
第 1 条:“桥接网络连接”,位于https://wiki.debian.org/BridgeNetworkConnections
第 2 条:“使用代理 ARP 桥接网络连接”,网址为https://wiki.debian.org/BridgeNetworkConnectionsProxyArp(三层桥)
我希望这提供了一种明智的前进方式,因为如果重写给定的建议(无论如何都不会增加任何价值),我可能会感到头疼。
答案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