4

我有一个双端口以太网 NIC,假设我已将 2 个端口连接成一个循环,并将以下 IP 分配给 2 个以太网接口:

  • eth2 -> 192.168.2.1
  • eth3 -> 192.168.3.1

我想通过物理网络将流量从 1 个端口发送到另一个端口,例如 ping192.168.3.1192.168.2.1. 但是,Linux 内核中的 TCP/IP 堆栈识别这两个地址是本地地址,而是将流量发送到环回适配器,因此流量永远不会到达物理网络。

我最接近的解决方案是 Anastasov 的send-to-self 补丁,不幸的是,它自内核 3.6 以来已停产,因此它不适用于我的 Ubuntu 13.10(内核 3.11)。我尝试过为 3.11 重写补丁,但我似乎无法在 Ubuntu 发行版中找到这些补丁:

  • 包括/linux/inetdevice.h
  • 净/ipv4/devinet.c
  • 网络/ipv4/fib_frontend.c
  • 网络/ipv4/route.c
  • 文档/网络/ip-sysctl.txt

有没有办法让发送到自我的补丁工作,或者替代?

4

2 回答 2

4

您可以为此目的使用网络命名空间。

正如ip-netns手册页所说:

A network namespace is logically another copy of the network stack,
with its own routes, firewall rules, and network devices.

以下只是此答案的副本:

创建一个网络命名空间并将其中一个接口移入其中:

ip netns add test
ip link set eth1 netns test

在新命名空间中启动一个 shell:

ip netns exec test bash

然后继续,就好像你有两台机器一样。完成后退出 shell 并删除命名空间:

ip netns del test
于 2018-12-04T13:32:44.603 回答
1

您可以尝试通过运行“ip”命令来配置路由表:

ip route add to unicast 192.168.3.1 dev eth2
ip route add to unicast 192.168.2.1 dev eth3

新路由会被添加到路由表中,并且它应该能够在出口路由查找命中“192.168.3.1”和“192.168.2.1”之间的主机本地路由之前生效,因此应该通过物理接口发送流量“eth2”和“eth3”,而不是环回“lo”

从未尝试过自己,但应该可以。

于 2014-04-15T07:39:18.887 回答