路由表有多个子网条目吗?

路由表有多个子网条目吗?

简单介绍一下,这是针对正在运行的执行呼叫处理的虚拟机。因此,我查看了虚拟机上的路由表,发现它有以下内容:

  12.12.12.64/28 dev bond15 proto kernel scope link src 12.12.12.12
  12.12.12.64/28 dev bond19 proto kernel scope link src 12.12.12.12
  12.12.12.64/28 dev bond11 proto kernel scope link src 12.12.12.12
  12.12.12.64/28 dev bond8 proto kernel scope link src 12.12.12.12

所以我的问题是,这有意义吗?我没有自己将它们添加到路由表中,这些是在配置 IP 时设置的。但我的问题是,这如何工作?如果发往 12.12.12.64/28 上任何内容的数据包进入,它总是会转到 bond15 接口,对吗?这不会完全否定 bond19 和 bond11 接口吗?

话虽如此,我还对虚拟机进行了 ifconfig,并注意到所有这些 BOND 接口都有相同的 IP:

  bond8: flags=209<UP,POINTOPOINT,RUNNING,NOARP>  mtu 1472
          inet 12.12.12.12  netmask 255.255.255.240  destination 12.12.12.12
 bond11: flags=209<UP,POINTOPOINT,RUNNING,NOARP>         mtu 1472
          inet 12.12.12.12  netmask 255.255.255.240  destination 12.12.12.12
        bond15: flags=209<UP,POINTOPOINT,RUNNING,NOARP>  mtu 1472
    inet 12.12.12.12  netmask 255.255.255.240    destination 12.12.12.12
  bond19: flags=209<UP,POINTOPOINT,RUNNING,NOARP>  mtu 1472
    inet 12.12.12.12  netmask 255.255.255.240  destination 12.12.12.12

因此,鉴于这两条信息,我很好奇如何将它们整合在一起。这是否意味着所有这些 BOND 都使用相同的接口?如果是这样,为什么路由表中需要有多行?为什么不在 ifconfig 中只设置一个条目将所有 4 个 Bond 合并为一个?那么 12.12.12.12 只有一个 Bond0,而 12.12.12.12 的 ipconfig 条目中只有一个 Bond0?

它给我的印象是,根据路由表,任何发往该子网的数据包都只能发往 Bond15,因为它在路由列表中排在第一位?

谢谢大家..

答案1

首先你应该知道,对于任何高级网络设置,ifconfig应该route完全避免,并且ip linkip addressip route(也ip rule对于策略路由,bridge除了ip link替换brctl之外,还使用 ​​)。 某些功能在较旧的工具中不可用,因为较新的功能仅在较新的内核 API 中实现((rt)网络链接而不是 ioctl)。

这些路由被标记proto kernel:这意味着它们是由内核在向接口添加地址时自动添加的,可能类似于:

ip address add 12.12.12.12 peer 12.12.12.64/28 dev bond8

因为单独使用时没有多大意义:只能使用在 equals 中列出的第一个路线:bond15,必须有其他元素才能实现正确的路线。

我能想到至少两种实现此目的的方法:

  • 附加路由表

    这可能必须与连接跟踪区域(避免混合两个除其接口之外的相同流),商标分数(使用iptables或者nftables)来标记数据包,以便了解它们来自哪个路由,并允许内核在那里回复。该ip rule命令在标准系统上返回以下内容:

    0:  from all lookup local
    32766:  from all lookup main
    32767:  from all lookup default
    

    如果你有额外的条目,这可能是你选择的方法,如果使用以下方法进行额外的设置,可能会变得相当复杂iptables或者nftables对于每个带有 的附加条目lookup XXXX,您可以使用以下命令显示附加路由表:

    ip route show table XXXX
    

    可能只有一个债券XX其中引用的设备(可能沿着其他接口)。

  • 直接绑定到接口

    使用SO_BINDTODEVICE

    SO_BINDTODEVICE

    将此套接字绑定到特定设备(如“eth0”),如传递的接口名称中指定的那样。 [...] 如果套接字绑定到接口,则套接字只会处理从该特定接口接收的数据包。请注意,这仅适用于某些套接字类型,特别是 AF_INET 套接字。

    这通常需要离开反向路径转发例如使用以下方法进行过滤:

    sysctl -w net.ipv4.conf.all.rp_filter=0
    
    sysctl -w net.ipv4.conf.bond8.rp_filter=0
    sysctl -w net.ipv4.conf.bond11.rp_filter=0
    sysctl -w net.ipv4.conf.bond15.rp_filter=0
    sysctl -w net.ipv4.conf.bond19.rp_filter=0
    

    实际上在创建接口之前可能只需这样做:

    sysctl -w net.ipv4.conf.default.rp_filter=0
    

    我可以使用这个来工作socat及其so-bindtodevice=选项,但只能作为客户端(连接),不能作为服务器(监听),所以我不知道它是否适用于所有情况,或者这是一个限制socat或我遗漏了什么。类似的东西:

    socat tcp4:12.12.12.65:5555,so-bindtodevice=bond11 -
    

    与拥有 12.12.12.65 的系统上端口 5555/tcp 上的服务进行通信债券11侧面(而不是债券15边)。

尽管这些接口有这样的名字,但它们似乎并不属于纽带,但可能是某种隧道。使用ip -details link show将显示它们的实际类型(在每个接口的第 3 行的开头)。

相关内容