V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
mingtdlb
V2EX  ›  Linux

小弟请教一下网络问题

  •  
  •   mingtdlb · 2023-05-21 16:27:19 +08:00 · 2485 次点击
    这是一个创建于 550 天前的主题,其中的信息可能已经有所发展或是发生改变。

    两台 centos7 系统,node1 和 node2

    node1 两个网卡 eth0 、eth1

    eth0

    • ip: 192.168.1.10/24
    • ip: 192.168.1.11/32

    eth1

    • ip: 192.168.1.12/32

    node2 一块网卡 eth0

    eth0

    • ip: 192.168.1.13/24

    192.168.1.13 和 192.168.1.12 、192.168.1.11 通信,数据包是怎么流转的?

    第 1 条附言  ·  2023-05-24 11:49:42 +08:00

    node1-ip node1-ip.png

    node1-eth0 node1-eth0.png

    node1-eth1 node1-eth1.png

    node2-ip node2-ip.png

    node2-eth0.png node2-eth0.png

    20 条回复    2023-05-24 13:45:43 +08:00
    msg7086
        1
    msg7086  
       2023-05-21 16:33:05 +08:00
    网段冲突了得看你路由表怎么写的。
    stcQ2G13k9yxep40
        2
    stcQ2G13k9yxep40  
       2023-05-21 16:47:31 +08:00
    根据你提供的网络配置,192.168.1.13 与 node1 的 192.168.1.12 和 192.168.1.11 之间的通信路径如下:

    1. 当 192.168.1.13 想要与 192.168.1.12 通信时,数据包首先发送到 node1 的 eth0 接口。

    2. node1 的网络堆栈会检查本地路由表,并发现目标 IP 地址( 192.168.1.12 )与其 eth1 接口的一个 IP 地址匹配。

    3. 因为 192.168.1.12 具有 /32 掩码,它被视为单个主机而不是一个网络。node1 将识别到目标 IP 地址属于本地主机。

    4. 数据包被直接传递给 node1 的 eth1 接口。

    5. 接下来,node1 的 eth1 接口将数据包传递给上层应用程序或处理程序,以便处理目标为 192.168.1.12 的通信。

    同样的步骤适用于 192.168.1.13 与 192.168.1.11 之间的通信。数据包会通过 node1 的 eth0 接口转发给 node1 的 eth1 接口进行处理。

    综上所述,当 192.168.1.13 与 node1 的 192.168.1.12 和 192.168.1.11 通信时,数据包将通过 node1 内部的网络接口进行转发,而不需要离开 node1 的主机。这是因为目标 IP 地址被视为本地主机,通过直接连接的方式进行通信。

    ------以上来自 chatgpt------
    mingtdlb
        3
    mingtdlb  
    OP
       2023-05-21 16:57:25 +08:00
    @qishouvip2022 看着像是这么回事,我把 192.168.1.10/24 ip 删了,他们就不通了。我问 chatgpt ,说要配路由...

    我疑惑的是为什么数据包会发往 node1 的 eth0 口?
    leonshaw
        4
    leonshaw  
       2023-05-21 17:23:11 +08:00
    看一下 sysctl 的 arp_ignore, arp_filter 和 rp_filter
    dem0ns
        5
    dem0ns  
       2023-05-21 17:52:08 +08:00
    /32 的只能与自己通讯
    dem0ns
        6
    dem0ns  
       2023-05-21 17:53:32 +08:00
    能互通的只有 10 和 13
    dode
        7
    dode  
       2023-05-21 17:53:34 +08:00
    192.168.1.13 不能直接与 11 ,12 通信,之所以 ping 通是 10 网络接受数据包给内核了,
    dode
        8
    dode  
       2023-05-21 17:58:13 +08:00
    luckjoe680
        9
    luckjoe680  
       2023-05-21 19:30:13 +08:00
    /32 的话 计算机都算不出子网 不知道自己跟谁是一起的 可以了解一下子网掩码的作用
    rrfeng
        10
    rrfeng  
       2023-05-21 20:39:00 +08:00 via Android
    这关键不在路由查找。

    假设他们是纯二层交换机互联:

    node2 发往 .11 的包,发现是本地网络,那么会启动 ARP 查询,广播询问 .11 的 Mac 地址。

    node1 收到了这个广播:注意,如果是从 eth0 收到,那么 node1 会直接响应,因为这是自己的地址。
    于是 node2 可以直接以 node1 eth0 的 Mac 为目的发送数据了。

    如果目标是是 .12 ,ARP 广播是一样的。node1 eth1 会响应它自己的 Mac 。
    rrfeng
        11
    rrfeng  
       2023-05-21 20:40:05 +08:00 via Android
    如果你把 /24 删了,系统不会生成路由,于是就不知道目标地址如何到达,不会进入下一步 ARP 阶段。
    piku
        12
    piku  
       2023-05-21 21:03:32 +08:00 via Android
    node1 的 /32 ,相当于 node1 的 loopback 口。由于 /24 是广播网,eth0 能收到数据报,且它知道“这是我本机上的 ip 地址”,于是进行内部转发。
    piku
        13
    piku  
       2023-05-21 21:04:21 +08:00 via Android
    rp_filter 有影响,默认是松散或关闭的。如果是严格,应该是收不到的。
    jeesk
        14
    jeesk  
       2023-05-21 21:26:30 +08:00
    详细了解可以看看计算机网络一书中网络层这一章, 这一章把网络路由讲的很详细, 就是有点烧脑。
    hefish
        15
    hefish  
       2023-05-21 21:29:36 +08:00
    你这得手动设置一个高级的路由表才行啊。 默认路由表看起来已经有点吃力了。
    用 ip ro 手动设一个高级的,定义一下入口,目标,出口。
    dem0ns
        16
    dem0ns  
       2023-05-21 22:05:29 +08:00
    和 rp_filter 关系应该不大,默认都是开着的,以前也遇到过这种问题,大概是会自动汇聚? 所以 /32 会失效,按 /24 来走。
    dem0ns
        17
    dem0ns  
       2023-05-21 22:08:21 +08:00
    或者是按路由表走,这样就说得通了
    stcQ2G13k9yxep40
        18
    stcQ2G13k9yxep40  
       2023-05-21 22:22:22 +08:00 via iPhone
    @mingtdlb 因为只有 192.168.1.10/24 这个地址,可用于与外部的 13 通信,或者你看下 node1 的路由表就一目了然了。/32 只能用于本机内部通信。
    leonshaw
        19
    leonshaw  
       2023-05-21 22:32:16 +08:00
    不知道你怎么连的,假设两个 eth0 在同一个广播域,eth1 不在,并且没有其它路由配置。

    node2 就是普通的主机直连网段通信行为,先发 ARP ,收到回复后发数据包。
    node1 有 /24 地址的情况,有这个网段的路由。linux 默认 arp_filter, arp_ignore 配置下会响应所有对本机 IP 的 ARP 请求,node2 收到 ARP 答复就可以往 eth0 发数据包,node1 收到包发现目的是本机 IP 就会走本地处理,不会到 eth1 。
    node1 没有 /24 地址,就没有这个网段的路由。如果 rp_filter 不是 0 ,不响应 ARP ,即使 node2 有 ARP 缓存,数据包到了 node1 也会被 rp_filter 过滤掉。如果 rp_filter 是 0 ,会处理收到的包,但是没有回去的路由,只能单通。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5202 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:56 · PVG 13:56 · LAX 21:56 · JFK 00:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.