我正在实现某种具有多个互联网连接的路由器,根据这些连接的当前吞吐量,它将使用更快的连接转发数据包/帧。
为了测试我的实现,我必须有一些实际的数据包要路由。为了生成一些流量,我实施了 IP 数据包分段。我几乎发现自己实现了 TCP 可靠连接来生成一些流量。我试图寻找一种方法来生成一些流量,并认为我会打开从本地计算机上的 IP A 到远程主机上的 IP B 的套接字连接。我会在该连接上发送一些数据,这样我就不必为数据包生成而烦恼。
问题是,我必须拦截这些数据包才能在路由器中路由它们。我最初以为我会创建一些规则将每个数据包转发到 IP B 回本地主机,我会在本地主机上打开原始套接字并过滤掉目标 IP B 的所有数据包。我尝试制定 iptables 规则:sudo iptables -t nat -A OUTPUT -d some_ip -j DNAT --to-destination 127.0.0.1
但我发现它是更改数据包的目标 IP 地址,我只想拦截原始数据包以便路由它。
您是否知道如何生成一些我可以捕获的流量,或者如何配置 iptables 将前往指定 IP 的数据包转发回主机,但保留原始目标 IP 地址?
说明:我正在开发的程序是分布式系统,可以将其视为几个Raspberry Pi,其中一个是实际进程路由数据包,其余的是具有专用互联网连接的中继,路由器进程选择最佳中继来转发数据包。整个系统的进程通过MPI通信器进行通信,整个过程都是使用MPI来实现的。因此,从某种意义上说,如果有意义的话,它是一种软件路由器。
答案1
我正在实现某种具有多个互联网连接的路由器,根据这些连接的当前吞吐量,它将使用更快的连接转发数据包/帧。
这不适用于 TCP 或 UDP 等标准协议,因为它们不是多宿主的。您的每个互联网“连接”都会有一个不同的 IP,并且该 IP 在单个 TCP 或 UDP 连接期间不能更改。
你能做的最好的事情就是分发新的TCP 或 UDP连接根据当前使用情况向您的不同互联网提供商提供。实际上,您可能可以通过iptables
根据需要更改 NAT 规则来做到这一点(Linux 内核的连接跟踪器将确保现有连接不会更改其路由)。
您是否知道如何配置 iptables 将前往指定 IP 的数据包转发回主机,但保留原始目标 IP 地址?
你不能。