我有一台带有多个接口的机器,我可以根据需要进行配置,例如:
- eth1:192.168.1.1
- eth2:192.168.2.2
我想通过另一个接口转发发送到这些本地地址之一的所有流量。例如,对 192.168.1.1 的 iperf、ftp、http 服务器的所有请求不应仅在内部路由,而应通过 eth2 转发(外部网络将负责将数据包重新路由到 eth1)。
我尝试并查看了几个命令,例如 iptables、ip route 等……但没有任何效果。
我能得到的最接近的行为是:
ip route change to 192.168.1.1/24 dev eth2
它在 eth2 上发送所有 192.168.1.x,但仍在内部路由的 192.168.1.1 除外。也许我可以在 eth1 上对所有定向到假 192.168.1.2 的流量进行 NAT 转发,在内部重新路由到 192.168.1.1?我实际上正在为 iptables 苦苦挣扎,但这对我来说太难了。
此设置的目标是在不使用两台 PC 的情况下进行接口驱动程序测试。
我正在使用 Linux,但如果您知道如何使用 Windows 来做到这一点,我会购买它!
编辑:
外部网络只是 eth1 和 eth2 之间的交叉电缆。假设我的机器上有一个 http 服务器。现在我想从同一台机器访问这个服务器,但我想强制 TCP/IP 流量通过这个 eth1/eth2 电缆。我应该如何为此配置我的接口?
我成功地在 Linux 上使用以下方法在“环回”模式下测试了新的双端口 10Gbps 卡的吞吐量,即一个端口直接插入另一个端口。这只是为了将数据包从线路中强制发送出去,但如果您不这样做,Linux 只会使通过内核的流量短路(因此是 OP 的问题)。在上面凯西的回答中,我不确定是否真的需要外部路由器,但以下是完全独立的。两个接口分别是 eth2 和 eth3。
为接口分配 IP,并将它们放在不同的网络上:
接下来我们将设置一个双 NAT 场景:两个新的假网络用于到达另一个。在出去的路上,源 NAT 到你的假网络。在路上,确定目的地。对于另一个网络,反之亦然:
现在告诉系统如何访问每个虚假网络,并预先填充 arp 条目(确保替换您的 MAC 地址,不要使用我的):
这足以愚弄 Linux 以实际将数据包放到网络上。例如:
离开 eth2,源 IP 10.50.0.1 被 NAT 到 10.60.0.1,当它进入 eth3 时,目标 10.60.1.1 被 NAT 到 10.50.1.1。回复也经历了类似的过程。
现在使用 iperf 测试吞吐量。绑定到正确的 IP,并确定您正在联系的 IP(另一端的假地址):
确保流量确实流向了网络:
您还可以查看 /proc/interrupts 以确保卡正在被使用:
无论如何,我发现这篇文章正在寻找如何做到这一点,感谢问答人员,并希望这有助于其他人在未来找到这篇文章。
和往常一样——我来晚了——但现在可以使用网络命名空间来隔离接口并防止任何本地转发(以及摆弄 iptables :))。
创建命名空间(所有都使用所需的权限完成,例如以 root 身份):
请注意,现在必须在分配的命名空间的上下文中访问接口状态/配置 - 因此,如果您运行裸ip 链接,它们将不会出现,因为这是在默认命名空间的上下文中运行的。在命名空间中运行命令可以使用
作为前缀。
现在为接口分配命名空间,应用配置并设置接口:
现在您可以在命名空间内执行应用程序 - 用于 iperf 服务器运行
和客户:
流量现在将通过物理接口发送,因为整个网络堆栈、接口、路由......被命名空间隔离,因此内核无法将流量中使用的地址与本地(可用)接口相匹配。
如果您完成了实验,只需删除命名空间:
接口将重新分配给默认命名空间,并且在命名空间内完成的所有配置都将消失(例如,无需删除分配的 IP 地址)。
由于看不到响应数据包,因此我扩展了 caladona 的答案。对于这个例子:
本地 PC iptable 路由设置为到“假”IP 的 SNAT 和 DNAT 传出流量。
规则执行以下操作:
总而言之,本地系统现在可以与地址为 192.168.1.100 和 192.168.2.100 的“虚拟”机器通信。
接下来,您必须强制您的本地 PC 使用外部路由器来访问您的假 IP。为此,您可以通过路由器创建到 IP 的直接路由。您要确保将数据包强制到目标子网的对面。
最后,为了使这一切正常工作,外部路由器需要知道如何访问本地 PC 上的伪造 IP。您可以通过为您的系统打开代理 ARP 来进行精简。
通过此设置,您现在可以将假 IP 视为本地 PC 上的真实系统。将数据发送到 .1 子网将强制数据包从 .2 接口流出。将数据发送到 .2 子网将强制数据包从 .1 接口输出。
好的,我终于成功设置了我的配置。
这个想法是使用另一个假地址,强制这个假地址到接口 2 的路由,然后使用 NAT/iptables 将假地址转换为真实地址 2。
我的设置实际上是由一个路由器组成的,我可以在 IF1(接口 1)和 IF2 之间远程登录
在我的设置中,FAKE_ADDR 和 IF1_ADDR 在同一个子网上。
在路由器上:
如果我向 FAKE_ADDR 发送一些东西,pkt 通过 IF1 转发到路由器,再次转发到 IF2,然后 FAKE_IP 被 IF2_ADDR 替换。数据包由服务器处理,结果从 IF2_ADDR 发送回 IF1_ADDR,由 FAKE_ADDR 代替。
可能只用一根交叉电缆就可以使用更简单的配置,但由于我没有尝试过,我更愿意提供我的工作解决方案。
Thomas Tannhäuser 上面给出的答案是正确的!
我也遇到过类似的情况:一台机器有两个 enet 接口。我的计划是使用一个接口作为服务器(接收器),另一个作为客户端(发送器)。每个接口都将连接到路由器,iperf 将驱动流量通过路由器以测量吞吐量、PPS、延迟等。
不幸的是,iptables 方法不直观且充满问题。经过几个令人沮丧的小时后,我放弃了这个攻击计划。受到 Thomas 建议的启发,我在 Linux IP 命名空间上做了一些功课,并开始欣赏这个解决方案的简单和优雅。
下面是我用来配置我的 Fedora FC26 以提供这种能力的确切命令列表。这两个接口是 enp1s0 和 enp3s0。路由器有两个接口,地址分别为 192.168.2.112 和 172.16.16.2。每个 FC26 ENET 连接器都直接连接到相应的路由器接口。
听起来你想把你的 linux 盒子变成路由器/网桥/网关/防火墙类型的盒子。您可能正在寻找以下资源:
Linux 路由器项目
路由器或防火墙分布列表
Linux LiveCD 路由器
Linux 日志 - Linux 路由器
根据更多信息更新:
我不认为你将能够做你想做的事。操作系统总是会查看其内部路由表并在本地“查看”两个 IP 地址。然后它将在操作系统内路由流量,并且永远不会将其放在网络上。您将需要第二台机器或两台虚拟机(查看Xen)。
这里有很多东西要经过,所以我不能完全保证我的准确性,但最初的问题似乎是在寻找所谓的“发送给自己”技术。链接搜索显示了我认为维护得最好的内核补丁作为顶级链接+讨论以及各种邮件列表上的其他方法的补丁,特别是。LKML。
我认为还应该看看网络命名空间,用 iproute2 的"ip netns"完成。这也需要一些额外的接口和路由魔法,因此可能不会比其他答案中的大量 iptables hoopla 更复杂。
如果有人发现对这些有用的东西,绝对欢迎发表评论 - 关于您的实施的方式、内容、地点。
这就是我如何让它为 IPV6 工作
分配静态ip
设置仅主机路由到“假”地址
填充邻居表...就像 arp
添加了 ip6tables 条目