我有一台带有 2 个网络接口卡的 Linux 机器,我需要使用一个来接收数据包,另一个来接收传出的数据包。
答案1
如果您接受在您的机器上使用单个 IP/前缀(我们将其命名为 XXXX/Y,网关为 GGGG),那么这可以轻松完成。
将您的地址添加到
eth0
,但带有完整的前缀子网。例如
ip addr add X.X.X.X/32 dev eth0
不要在 eth1 上设置地址。如果有,请使用以下命令清除它
ip -4 addr flush dev eth1
通过添加子网和网关路由
eth1
ip route add X.X.X.X/Y dev eth1
ip route add default via G.G.G.G dev eth1
如果在 Ubuntu 或其他默认启用反向路径过滤的 Linux 发行版上,请禁用它,因为它们假定并强制执行对称路由。
sysctl -w net.ipv4.conf.eth0.rp_filter = 0
sysctl -w net.ipv4.conf.eth1.rp_filter = 0
如果您的两个网络接口都连接到交换机,那么您将需要不回答 eth1 上的 ARP。由于我们将 IP 地址添加到了
eth0
,因此我们可以将 设置arp_ignore
为eth1
1(仅回答eth1
地址的 ARP)或 8(不回答任何内容)。sysctl -w net.ipv4.conf.eth1.arp_ignore = 8
一旦完成此配置,将只有一个流量以相反的顺序流动:如果内核从 收到 XXXX 的 ARP 请求eth0
,那么它将使用 进行回复eth0
。