使用frrouting、gns3、pim实现ipv6组播(三)

翻遍整个网络都没有找到用ipv6进行组播推流的实例。
朋友说:A true strong person never complains about the environment
那么,就由我来创造一个吧~

此文涉及到的所有软件均为开源软件,进行深入学习与其他平台移植时十分便利。
记得点赞额~

gns3介绍与安装

gns3

gns3,The software that empowers network professionals

支持私有vm、qemu、virtalbox、docker镜像、kvm等各种镜像,丰富的网络与GUI可视化界面
gns3-app

应用场景广泛,如:sonic
sonic-gns3

安装方式:https://docs.gns3.com/docs/

kvm方式安装gns3
解压kvm包,然后执行如下命令启动。

sudo virt-install \--name GNS3VM \--memory 20048 \--vcpus 8 \--disk path=/your/files/path/gns3/'GNS3 VM-disk001.qcow2',format=qcow2,bus=virtio \--disk path=/your/files/path/gns3/'GNS3 VM-disk002.qcow2',format=qcow2,bus=virtio \--network network=default,model=virtio \--import \--os-type=linux \--os-variant=generic

NOTE:路径根据实际目录替换

拓扑环境规划

topo

  1. 主机1、组播源(docker容器)
  • eth0(ens3),fc00:0:0:2006::6/64
  1. 主机2、组播接收者(qemu-ubuntu18.04)
  • eth0(ens3),fc00:0:0:2008::8/64
  1. frr路由器,3台,版本10.0.1
    1. R1
    • eth0,fc00:0:0:2001::2/64
    • eth1,fc00:0:0:2008::1/64
    1. R2
    • eth1,fc00:0:0:2001::1/64
    • eth2,fc00:0:0:2003::1/64
    1. R3
    • eth0,fc00:0:0:2003::3/64
    • eth1,fc00:0:0:2006::1/64

模拟器:gns3
收发组播包工具:python3(也可用vlc、iperf2等)

可选项

  • 交换机:ovs(https://github.com/openvswitch/ovs)
  • 控制器:onos(https://github.com/opennetworkinglab/onos)

环境配置

涉及知识点

  1. ipv6组播,PIMv6
    https://docs.frrouting.org/en/latest/pimv6.html

pim6d supports pim-sm as well as MLD v1 and v2. PIMv6 is vrf aware and can work within the context of vrf’s in order to do S,G mrouting.

具体为PIM SM中的ASM
pim-sm
2. ipv6-OSPF,OSPFv3
https://docs.frrouting.org/en/latest/ospf6d.html

ospf6d is a daemon support OSPF version 3 for IPv6 network. OSPF for IPv6 is described in RFC 2740.

路由器配置

R1、R2、R3都打开OSPFv6与PIM6

sed -i ‘s/ospf6d=no/ospf6d=yes/g’ /etc/frr/daemons
sed -i ‘s/pim6d=no/pim6d=yes/g’ /etc/frr/daemons

R1

#/etc/frr/mgmtd.conf
!
hostname frr10-1
!
interface eth0ipv6 address fc00:0:0:2001::2/64
exit
interface eth1ipv6 address fc00:0:0:2008::1/64
exit
!
#/etc/frr/ospf6d.conf
!
interface eth0ipv6 ospf6 area 0.0.0.0ipv6 ospf6 instance-id 0
!
router ospf6ospf6 router-id 1.1.1.1area 0.0.0.0 range fc00:0:0:2001::/64redistribute connected
!

R2

#/etc/frr/mgmtd.conf
hostname frr10-2
!
interface eth1ipv6 address fc00:0:0:2001::1/64
exit
!
interface eth2ipv6 address fc00:0:0:2003::1/64
exit
!
#/etc/frr/ospf6d.conf
!
interface eth1ipv6 ospf6 area 0.0.0.0ipv6 ospf6 instance-id 0
!
interface eth2ipv6 ospf6 area 0.0.0.0ipv6 ospf6 instance-id 0
!
router ospf6ospf6 router-id 2.2.2.2area 0.0.0.0 range fc00:0:0:2001::/64area 0.0.0.0 range fc00:0:0:2003::/64redistribute connected
!

R3

#/etc/frr/mgmtd.conf
hostname frr10-3
!
interface eth0ipv6 address fc00:0:0:2003::3/64
exit
!
!
interface eth1ipv6 address fc00:0:0:2006::1/64
exit
!
#/etc/frr/ospf6d.conf
!
interface eth0ipv6 ospf6 area 0.0.0.0ipv6 ospf6 instance-id 0
!
router ospf6ospf6 router-id 3.3.3.3area 0.0.0.0 range fc00:0:0:2003::/64redistribute connected
!

中间路由节点(R1、R2、R3)打开ip转发

# /etc/frr/zebra.conf
ipv6 forwarding

为简化部署,笔者写了一个一键部署脚本,地址为:
https://github.com/puhaiyang/frr_gns_demo/blob/main/gns3_multicast/multicast_ipv6.py

主机配置

组播源主机–网络配置

ifconfig eth0 inet6 add fc00:0:0:2006::6/64
route -A inet6 add default gw fc00:0:0:2006::1 eth0

查看方式route -6 -n
source-host

验证:

root@multicast-sender:~# ping6  fc00:0:0:2006::1
PING fc00:0:0:2006::1(fc00:0:0:2006::1) 56 data bytes
64 bytes from fc00:0:0:2006::1: icmp_seq=1 ttl=64 time=0.838 ms
64 bytes from fc00:0:0:2006::1: icmp_seq=2 ttl=64 time=0.728 ms

组播接收者–网络配置

vim /etc/netplan/01-network-manager-all.yaml
---
network:version: 2ethernets:ens3:addresses:- fc00:0:0:2008::8/64gateway6: fc00:0:0:2008::1

#生效ip配置
sudo netplan apply

recv-host

验证

主机通信验证

sender-2-recevier
所有主机与路由器使用ipv6均互相可达

组播通信验证

接收者脚本

recv_multicast.py

import socket
import struct# bind udp socket
sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# bind a multicast address
multicast_group_ip = 'ffe8::2'
port = 5007
sock.bind(('::', port))# 告诉内核加入多播组
group = socket.inet_pton(socket.AF_INET6, multicast_group_ip)
# 第二个参数是接口索引,此处修改为实际接口填写
mreq = group + struct.pack('@I', 2)
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)print(f"绑定到组播地址 {multicast_group_ip}:{port}")# 接收数据
while True:data, addr = sock.recvfrom(1024)print(f"Received message: {data} from {addr}")

IPv6组播地址参考

ipv6addr

发送者脚本

send_multicast.py

import socket
import datetime# Multicast group and port
multicast_group_ip = 'ffe8::2'
port = 5007# Create a UDP socket
sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDP)# Set the time-to-live for messages to 5 hops
ttl = 5
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, ttl)# Get the current time
current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')# Create the message with current time and IP address using .format()
message = 'Hello, Multicast Group! Time: {}'.format(current_time).encode('utf-8')# Send the multicast message
sock.sendto(message, (multicast_group_ip, port))
print("Sent message:", message.decode('utf-8'))

验证结果

接收端执行

python3 recv_multicast.py

发送端执行

python3 send_multicast.py

demo-play

vlc方式推流

vlc --intf ncurses --vout dummy --aout dummy hdvideo.mp4 --sout udp:[ffe8::2] --ttl 6 --repeat

vlc-play

vlc推流示例截图
vlc-player

中间链路抓包
mit-cap

发包前组播路由截图
mroute-before

发包后组播路由截图
mroute-after

frr调试方式

验证过程中如发现网络不通,可打开frrouting的debug并配置日志进行查看

示例为:

touch /var/log/ttt.log
chmod 777 /var/log/ttt.logvtysh
enable 
configure terminal
log file /var/log/ttt.log
debug pim
debug mlb

ovs与onos验证

onos-ovs

给ONOS配置cloud网络后访问对应的http后台:

http://[yourBrigeIp]:8181/onos/ui

启动openflow

org.onosproject.openflow

然后再ovs中配置控制器,指定到onos的ip

#ovs
ip addr add 192.168.1.11/24 dev eth15
#onos
ip addr add 192.168.1.222/24 dev eth0
#onos与ovs网络可达
ping 192.168.1.11
#ovs-add ctl
ovs-vsctl set bridge br0 protocols=OpenFlow13
ovs-vsctl set-controller eth0 tcp:192.168.1.222:6653

onos-ovs-ping

控制器上查看流表
onos-flow

查看流表ovs-ofctl dump-flows br0

OpenvSwitch-1:/$ ovs-ofctl dump-flows br0cookie=0x0, duration=2965.183s, table=0, n_packets=319, n_bytes=35017, priority=0 actions=NORMAL

本文涉及到的配置与脚本已上传至github:https://github.com/puhaiyang/frr_gns_demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/51208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在GPU服务器上安装Stable Diffusion webUI

一、前提条件 1、硬件条件 GPU:12G,建议16G以上,还是尽量勾搭,好像现在最大32G,目前个人性价比24G有时长出售。 内存:16G以上,建议32G,也是越大越好。 硬盘:最好使用…

2024年【金属非金属矿山(地下矿山)安全管理人员】考试报名及金属非金属矿山(地下矿山)安全管理人员模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 2024年金属非金属矿山(地下矿山)安全管理人员考试报名为正在备考金属非金属矿山(地下矿山)安全管理人员操作证的学员准备的理论考试专题,每个月更新的金属非…

抖音矩阵管理系统功能说明:一站式掌握

在当下这个信息爆炸的时代,抖音作为短视频领域的佼佼者,其用户规模持续扩大,影响力日益增强。对于内容创作者和营销人员来说,如何高效管理抖音账号,实现内容的多平台分发和精准触达,成为了亟待解决的问题。…

Redis常用指令(不定期更新)

Redis常用指令(不定期更新) 查询指定前缀key的数量查看键空间事件开启键空间通知 查询指定前缀key的数量 查询【TEST前缀】的key数量 EVAL "return #redis.call(keys,TEST:*)" 0返回信息 查看键空间事件 config get notify-keyspace-even…

Navicat Charts Creator for Mac:数据可视化利器

Navicat Charts Creator for Mac是一款专为Mac用户设计的数据可视化工具,它将复杂的数据转化为直观、易懂的图表,帮助用户更好地理解和分析数据。 该软件支持连接到多种数据库,如MySQL、MariaDB、PostgreSQL等,轻松获取实时数据&…

【QGroundControl二次开发】七.QGC自定义MAVLink消息MavLink通信协议 C++应用

1. 接收解析源码分析 通过接收串口或UDP发来的的字节流buffer&#xff0c;长度lengthbuffer.size()&#xff0c;通过下列脚本解析&#xff0c;每解析出一个mavlink数据包就执行onMavLinkMessage函数 for(int i 0 ; i < length ; i){msgReceived mavlink_parse_char(MAVL…

VS2022下安装和配置OpenCV环境参数+QT开发环境搭建

1.工具准备 VS2022,OpenCV4.5.5版本&#xff0c;QT5.12.12 VisualStudio最新版直接官网下载&#xff0c;根据需要进行下载&#xff0c;我下载的免费社区版本。日常开发完全够用。 qt官网下载5.12版本。 OpenCVReleases - OpenCV 选择Windows版本下载并解压到本地磁盘&#xff0…

在Spring项目中使用Maven和BCrypt来实现修改密码功能

简介 在数字时代&#xff0c;信息安全的重要性不言而喻&#xff0c;尤其当涉及到个人隐私和账户安全时。每天&#xff0c;无数的用户登录各种在线服务&#xff0c;从社交媒体到银行账户&#xff0c;再到电子邮件和云存储服务。这些服务的背后&#xff0c;是复杂的系统架构&am…

【BUG】已解决:No Python at ‘C:Users…Python Python39python. exe’

No Python at ‘C:Users…Python Python39python. exe’ 目录 No Python at ‘C:Users…Python Python39python. exe’ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班…

【linux服务器】大语言模型实战教程:LLMS大模型快速部署到个人服务器

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 说到大语言模型相信大家都不会陌生&#xff0c;大型语言模型(LLMs)是人工智能文本处理的主要类型,也现在最流行的人工智能…

【数据结构】线性表与顺序表

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

【算法】分布式共识Paxos

一、引言 在分布式系统中&#xff0c;一致性是至关重要的一个问题。Paxos算法是由莱斯利兰伯特&#xff08;Leslie Lamport&#xff09;在1990年提出的一种解决分布式系统中一致性问题的算法。 二、算法原理 Paxos算法的目标是让一个分布式系统中的多个节点就某个值达成一致。算…

【Django】前端技术-网页样式表CSS

文章目录 一、申明规则CSS的导入方式行内样式内部样式外部样式 二、CSS的选择器1. 基本选择器标签选择器&#xff1a; 选择一类标签 标签{}类选择器 class&#xff1a; 选择所有class属性一致的表情&#xff0c;跨标签.类名{}ID选择器&#xff1a;全局唯一 #id名{} 2.层次选择器…

束搜索(与贪心、穷举对比)

一、贪心搜索 1、基于贪心搜索从Y中找到具有最高条件概率的词元&#xff0c;但贪心可能不是最优解 2、比如 &#xff08;1&#xff09;贪心&#xff1a;.5*.4*.2*.1.0024 &#xff08;2&#xff09;另外&#xff1a;.5*.3*.6*.6.0054 二、穷举搜索 &#xff08;1&#xff0…

Transformer中的Multi-head Attention机制解析——从单一到多元的关注效益最大化

Transformer中的Multi-head Attention机制解析——从单一到多元的关注效益最大化 Multi-head Attention的核心作用 组件/步骤描述多头注意力机制&#xff08;Multi-head Attention&#xff09;Transformer模型中的关键组件&#xff0c;用于处理序列数据功能允许模型同时关注到…

数据库 执行sql添加删除字段

添加字段&#xff1a; ALTER TABLE 表明 ADD COLUMN 字段名 类型 DEFAULT NULL COMMENT 注释 AFTER 哪个字段后面; 效果&#xff1a; 删除字段&#xff1a; ALTER TABLE 表明 DROP COLUMN 字段;

科普文:分布式架构中的三高:高并发、高性能、高可用

关于高并发 高并发场景 互联网应用以及云计算的普及&#xff0c;使得架构设计和软件技术的关注点从如何实现复杂的业务逻 辑&#xff0c;转变为如何满足大量用户的高并发访问请求。 一个简单的计算处理过程&#xff0c;如果一旦面对大量的用户访问&#xff0c;整个技术挑战就…

人工智能类——计算机科学与技术

计算机科学与技术是一个非常大的门类。目前计算机科学与技术类招生的专业主要有计算机科学与技术、软件工程、网络工程、信息安全、物联网工程等&#xff0c;后面的几个专业是计算机科学与技术的重要分支&#xff0c;而这个门类的其他分支并没有单列出来一个本科专业&#xff0…

leetcode热题系列章节11

378. 有序矩阵中第K小的元素 给定一个 n x n 矩阵&#xff0c;其中每行和每列元素均按升序排序&#xff0c;找到矩阵中第k小的元素。 请注意&#xff0c;它是排序后的第k小元素&#xff0c;而不是第k个元素。 示例: matrix [ [ 1, 5, 9], [10, 11, 13], [12, 13, 15] ], k …

【数据结构】顺序表(c语言实现)(附源码)

​ &#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;数据结构 目录 前言 1.顺序表的概念与结构 2.顺序表的分类 3.顺序表的实现 3.1 结构定义及方法的声明 3.2 方法的实现 3.2.1 初始化 3.2.2 销毁 3.2…