简单介绍一下,这是针对正在运行的执行呼叫处理的虚拟机。因此,我查看了虚拟机上的路由表,发现它有以下内容:
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 link
,ip address
,ip 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
将此套接字绑定到特定设备(如“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 行的开头)。