AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1018400
Accepted
Malvineous
Malvineous
Asked: 2020-05-24 10:43:45 +0800 CST2020-05-24 10:43:45 +0800 CST 2020-05-24 10:43:45 +0800 CST

在两个 NIC 之间共享相同的 IP,通过专用 NIC 路由一个 IP

  • 772

我有几台主机连接到同一个交换机,它们都在同一个子网(10.0.0.0/16)上。其中两台主机有更快的网络接口,所以我将它们连接在一起,这意味着这两台机器现在可以直接连接,无需通过交换机。

我现在需要设置路由,这样当这两台机器尝试相互通信时,数据包通过这个更快的直接链接而不是通过交换机的更慢的链接。

最简单的方法是将直接链接配置在不同的子网上,但是我需要根据要使用的接口使用不同的 IP 或主机名,并且我希望能够将标准配置部署到所有机器(例如 NFS 使用主机名挂载)并且不必维护自定义 IP 覆盖/etc/hosts,我觉得这个解决方案太容易得到错误的主机名并通过错误的接口发送流量。

我正在寻找一种方法来告诉两台 Linux 机器即使eth0处理 10.0.0.0/16,当你想与 10.0.0.5 通信时,即使它在 eth0 的子网中,也可以发送数据包eth1。

我尝试添加一个主机路由规则,route add -host 10.0.0.5 dev eth1它确实在正确的接口上发送数据包,但是它来自错误的 IP 地址(直接链接的子网而不是原始子网。)

我想解决这个问题的唯一方法是在两个接口上设置相同的 IP 地址,但这会导致任何问题吗?一台机器能否在多个 NIC 上正确地拥有相同的 IP 而不会导致问题?我假设我需要正确设置路由指标,以便为连接到交换机的 NIC 提供优先级(以避免子网的所有流量被错误地发送到另一台主机),但是我还需要什么知道这个设置吗?它会导致任何其他问题或难以解决的问题吗?

还是有更好、更强大的方法来实现这一目标?

编辑:这是@AB 要求的额外内容:

$ ip -br link
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP> 
eth0             UP             ec:f4:xx:xx:xx:a4 <BROADCAST,MULTICAST,UP,LOWER_UP> 
eth1             UP             ec:f4:xx:xx:xx:a5 <BROADCAST,MULTICAST,UP,LOWER_UP> 

$ ip -br address
lo               UNKNOWN        127.0.0.1/8
eth0             UP             10.0.0.4/16
eth1             UP             10.0.99.4/24

$ ip route
default via 10.0.0.1 dev eth0 proto static 
10.0.0.0/16 dev eth0 proto kernel scope link src 10.0.0.4
10.0.0.5 dev eth1 scope link 
10.0.99.0/24 dev eth1 proto kernel scope link src 10.0.99.4

我在一个单独的子网上设置了直接链接 ( eth1),然后尝试了route我原来帖子中的命令,这就是现在的情况。看起来我可能需要src为我的直接路线设置属性。

linux routing multi-homed
  • 2 2 个回答
  • 1136 Views

2 个回答

  • Voted
  1. Best Answer
    A.B
    2020-05-25T02:29:50+08:002020-05-25T02:29:50+08:00

    由于 10.0.99.4 是 10.0.0.0/16 的一部分,因此应避免使用此 IP 地址。否则会与实际的 10.0.99.4/16 地址发生冲突,即使在eth0上,考虑到 Linux 使用的是弱主机模型,并且默认情况下也会在eth0上为 10.0.99.4 响应此 IP 地址的 ARP 请求,从而产生 ARP 冲突. 不要使用有冲突的 IP 地址。

    清理:

    ip route flush dev eth1
    ip address flush dev eth1
    

    粘合 IP 地址的标准方法

    让我们选择两个不相关的地址供两台主机使用。它们必须不与您网络上使用的其他任何东西发生冲突,但由于它们是点对点/32 地址,任何事情都可以做,它们不会被用作 LAN 的一部分,而只能用作点对点点/对等地址。我会随意使用192.168.100.4/32和192.168.101.5/32。如果稍后超过 2 个这些主机继承了一个更快的交换机并使用这个单独的交换机连接在一起,这可以稍微修改,并且在同一个块中拥有相关的 IP 地址再次变得更容易。

    主机 10.0.0.4 的配置:

    # /32 : no route gets created (beside the hidden *local* routing table)
    ip address add 192.168.100.4/32 dev eth1 
    # add the peer (point to point) route on the same link
    ip route add 192.168.101.5/32 dev eth1
    

    实际上上面的两个命令有一个快捷方式,你可以用下面的这个命令替换它们:

    ip address add 192.168.100.4 peer 192.168.101.5/32 dev eth1
    

    现在告诉主机到达 10.0.0.5/32(比 10.0.0.0/16 更具体)有一个使用对等 IP 地址的路由,但更喜欢与默认选择不同的源 IP 地址(过时的route命令不能这样做):

    ip route add 10.0.0.5/32 via 192.168.101.5 dev eth1 src 10.0.0.4
    

    有了这个,你会得到:

    # ip route get 10.0.0.5
    10.0.0.5 via 192.168.101.5 dev eth1 src 10.0.0.4 uid 0 
        cache 
    

    有一个小缺点:IP 广播仍然发送到eth0并且如果严格反向路径转发处于活动状态(sysctl net.ipv4.conf.eth0.rp_filter或者sysctl net.ipv4.conf.all.rp_filter给出 1 而不是 0 或 2)这些广播,当由对等方发送时(例如在对等主机 10.0.0.5 上运行类似的东西to echo test | socat udp4-datagram:10.0.255.255:5555,broadcast -) 将被忽略,因为在现在错误的接口上收到。因此,如果您正在使用依赖于此的协议并且已经应用​​了严格的反向路径转发,请在需要时将eth0切换到松散模式:

    sysctl -w net.ipv4.conf.eth0.rp_filter=2
    

    主机 10.0.0.5 的等效配置:

    ip address add 192.168.101.5 peer 192.168.100.4/32 dev eth1
    ip route add 10.0.0.4/32 via 192.168.100.4 dev eth1 src 10.0.0.5
    sysctl -w net.ipv4.conf.eth0.rp_filter=2
    

    例如,在类似 Debian 的ifupdown interface配置文件中,您可以对没有等效方向配置的任何命令使用pointopoint关键字和一些附加命令。up(sysctl宁愿放入/etc/sysctl.d)。

    无需额外(或重复)IP 地址的简化方法

    实际上 192.168.100.4 和 192.168.100.5 的唯一作用是解析链路层地址以了解 10.0.0.4 和 10.0.0.5 的路由:它们被用作某种胶水,不会起到任何其他作用。这些 IP 地址将完全不可见,并且任何 IP 数据包都不会在其内容中使用 192.168.100.4 或 192.168.100.5(除非明确使用它们),只有 ARP 请求和应答才会。根本不需要使用这种粘合 IP 地址。

    例如,主机提供商Hetzner 举了一个例子:

    ip route add 203.0.113.40/32 dev tap0
    

    到达接口上的 IP 地址,而不在该接口上配置 IP 地址(也不将此接口用作桥接端口)。在此示例中,对等方tap0(它是以太网模式下的 tun/tap 设备,链接到另一端的 VM)必须回答 ARP 请求以解析链路层地址。

    但是再次出于对称原因,如果它已经在其他地方配置了 IP 地址,它也不需要在那里配置 IP 地址,以正确回答通过eth1完成的 ARP 请求:这又是 Linux弱主机模型实现的一部分。

    所以这可以简单地用于主机 10.0.0.4,而无需使用任何额外的 IP 地址,只使用一个命令:

    ip route add 10.0.0.5/32 dev eth1
    

    或者指定来源(以避免在主机有多个的情况下产生歧义):

    ip route add 10.0.0.5/32 dev eth1 src 10.0.0.4
    

    对于主机 10.0.0.5:

    ip route add 10.0.0.4/32 dev eth1 src 10.0.0.5
    

    为了从对等点接受eth0上的“慢”广播,他们仍然需要像以前一样:

    sysctl -w net.ipv4.conf.eth0.rp_filter=2
    

    解析其 IP 地址的 ARP 请求可以在两个接口上得到响应(如上面链接的那样,Linux 默认会这样做),但这里的解析或通常(旧)端eth0上的条目( 如果有)(例如:在这些设置到位之前)不会触发诸如ARP 通量之类的影响,因为两个对等点都配置在一起以使用eth1,而对路由没有其他可能的解释。


    选择您喜欢的方法。第一个更经典,第二个设置更简单(但您可能会从同行那里得到一些“这行不通”)。请记住,当接口被管理性关闭然后启动时,手动添加的路由会丢失,因此必须将这些设置放入适当的网络配置设置中以保持正确有效。

    • 2
  2. Malvineous
    2020-09-12T18:40:30+08:002020-09-12T18:40:30+08:00

    使用 AB 的出色解释,这就是我最终为使其正常工作所做的工作,以造福于其他使用systemd:

    # /etc/systemd/network/50-eth1.network
    [Match]
    Name=eth1   # NIC with the peer on it to take priority over the normal NIC
    
    [Network]
    # For IPv6 it only appears to work when setting the same address on both interfaces
    Address=10::5/64          # Same address as on the main NIC
    DefaultRouteOnDevice=false
    
    [Route]
    Scope=link
    PreferredSource=10.0.0.5  # Host IP address from the main NIC
    Destination=10.0.0.4/32   # Peer's IP address on the other end of the PtP link
    
    [Route]
    Scope=link
    PreferredSource=10::5     # Host IPv6 address from the main NIC
    Destination=10::4/128     # Peer's IPv6 address
    

    当然,另一台主机的源和目标 IP 地址(但不是网络掩码)是翻转的。

    • 0

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve