Linux bonding网卡与其slave共同使用

Dear 丶 2023-02-18 09:47 56阅读 0赞

在昨天的一文中,我吐槽了Linux各种虚拟网卡设计的不完备,也只是吐槽,其实我并没有别的意思,我也懒得去做一些hack型的配置去规避这些不完备,我只是吐槽而已。

昨晚,有网友要求我给出一些解法,因为他也遇到了这个问题:

  • 他希望被bonding的eth0可以独立工作,是的,作为管理口。

于是,这位朋友要求我给出一个解法,我意识到这个需求的普遍性,而且不是每个人都想去配置什么macvlan,ipvlan的,于是,我就想再写点。

在我的环境中:

  • enp0s9被bonding到bond0。
  • 我希望bond0处理2.0.0.0/8的流量。
  • 我希望enp0s9处理1.0.0.0/8的流量。
  • 我不希望以上通信受制于bonding的mode。

那么开始吧。

先看下为什么在enp0s9被bonding之后不通,stap一下子就看出来了,先看下现象:

  1. [root@localhost bond]# arp -n
  2. Address HWtype HWaddress Flags Mask Iface
  3. 192.168.56.1 ether 0a:00:27:00:00:00 C enp0s8
  4. [root@localhost bond]# ping 1.1.1.2
  5. PING 1.1.1.2 (1.1.1.2) 56(84) bytes of data.
  6. From 1.1.1.1 icmp_seq=1 Destination Host Unreachable
  7. From 1.1.1.1 icmp_seq=2 Destination Host Unreachable
  8. From 1.1.1.1 icmp_seq=3 Destination Host Unreachable
  9. From 1.1.1.1 icmp_seq=4 Destination Host Unreachable
  10. ^C
  11. --- 1.1.1.2 ping statistics ---
  12. 4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 2999ms
  13. pipe 4
  14. [root@localhost bond]# arp -n
  15. Address HWtype HWaddress Flags Mask Iface
  16. 1.1.1.2 (incomplete) enp0s9
  17. 192.168.56.1 ether 0a:00:27:00:00:00 C enp0s8

很清晰是不是?

再看下stap的输出:

  1. [root@localhost bond]# stap -e 'probe kernel.function("arp_process"){name = kernel_string($skb->dev->name); printf("%s\n", name);}'
  2. bond0
  3. bond0
  4. bond0

Oh,yes!arp被bond0接管了,enp0s9作为slave不再呈现独立的网卡。

怎么办?改了便是!

这里我觉得就是bonding本身以及其rx_handler实现有问题!!用MAC地址区分一下不就得了??
master把slave屏蔽本身就不合理!!

好,我就按照我的使用场景,改了它,首先,我把作为master的bond0和作为slave的enp0s9的MAC地址区分开,分别设置,然后再修改arp_process的处理逻辑:

  1. %{
  2. #include <linux/module.h>
  3. #include <net/bonding.h>
  4. %}
  5. function change_indev:long(skb:long)
  6. %{
  7. struct sk_buff *_skb = (struct sk_buff *)STAP_ARG_skb;
  8. STAP_PRINTF(" aa :%s\n", _skb->dev->name);
  9. if (!strcmp(_skb->dev->name, "bond0")) {
  10. struct bonding *bond = netdev_priv(_skb->dev);
  11. struct slave *curr = bond->curr_active_slave;
  12. STAP_PRINTF(" aa :%s\n", curr->dev->name);
  13. // 更换一下接收device即可
  14. _skb->dev = curr->dev;
  15. }
  16. %}
  17. probe kernel.function("arp_process")
  18. {
  19. change_indev($skb);
  20. }
  21. probe begin
  22. {
  23. }

OK,再来一次:

  1. [root@localhost bond]# stap -g ./probe.stp
  2. WARNING: side-effect-free probe: keyword at ./probe.stp:27:1
  3. source: probe begin
  4. ^
  5. aa :bond0
  6. aa :enp0s9
  7. ^C^[[A[

开始ping吧:

  1. [root@localhost bond]# ping 1.1.1.2
  2. PING 1.1.1.2 (1.1.1.2) 56(84) bytes of data.
  3. 64 bytes from 1.1.1.2: icmp_seq=1 ttl=64 time=0.480 ms
  4. 64 bytes from 1.1.1.2: icmp_seq=2 ttl=64 time=0.417 ms
  5. ^C
  6. --- 1.1.1.2 ping statistics ---
  7. 2 packets transmitted, 2 received, 0% packet loss, time 1001ms
  8. rtt min/avg/max/mdev = 0.417/0.448/0.480/0.037 ms

通了。

这种问题都是小问题,很容易就能解决,有人可能会说,配置一个macvlan不香吗?呵呵,我觉得这根本就不是一个问题。

我只管痛则不通,通则不痛,不通的给整通了就行,别的什么,我才不关心。

你能说出1000个理由证明这么做不合理,你也能说出1000个理由维护这么做的合理性,怎么说呢?都归于皮鞋吧。


浙江温州皮鞋湿,下雨进水不会胖!

发表评论

表情:
评论列表 (有 0 条评论,56人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Linux bonding网卡slave共同使用

    在昨天的一文中,我吐槽了Linux各种虚拟网卡设计的不完备,也只是吐槽,其实我并没有别的意思,我也懒得去做一些hack型的配置去规避这些不完备,我只是吐槽而已。 昨晚,有网友