openvSwitch创建两个隔离网路,并进行互ping测试

shell脚本练习生-openVswitch


OpenvSwitch (OVS) 常见操作命令表格

操作场景命令示例
添加网桥ovs-vsctl add-br br0
列出所有网桥ovs-vsctl list-br
判断网桥是否存在ovs-vsctl br-exists br0
将物理网卡挂载到网桥上ovs-vsctl add-port br0 eth0
列出指定网桥中的所有端口ovs-vsctl list-ports br0
查看网卡所连接的网桥ovs-vsctl port-to-br eth0
显示OVS的整体网络状态ovs-vsctl show
从网桥删除已挂载的网口ovs-vsctl del-port br0 eth0
删除网桥ovs-vsctl del-br br0
设置控制器ovs-vsctl set-controller br0 tcp:ip:6633
删除控制器ovs-vsctl del-controller br0
设置支持OpenFlow Version 1.3ovs-vsctl set bridge br0 protocols=OpenFlow13
删除OpenFlow协议设置ovs-vsctl clear bridge br0 protocols
添加并配置VLAN标签(例如 VLAN 3)ovs-vsctl add-port br0 vlan3 tag=3 -- set interface vlan3 type=internal
删除带有VLAN标签的端口ovs-vsctl del-port br0 vlan3
查询VLAN信息(结合ovs-vsctl )ovs-vsctl showip netns exec NetWorkNameSpace ip addr show
查看网桥上所有交换机端口的状态ovs-ofctl dump-ports br0
查看网桥上的所有流规则ovs-ofctl dump-flows br0
查看OVS版本信息ovs-ofctl -V
给端口配置tag(例如配置为101)ovs-vsctl set port br-ex tag=101

以上表格汇总了OpenvSwitch的常见操作指令及其使用场景,确保与官方文档保持一致。(通义千问整理,难免有误)

创建两个隔离网路,并进行互ping测试

  1. ovs通过设置vlan标签,创建隔离网络
  2. 建立两个不同tag的网络空间按,实现网络隔离
  3. 互ping测试
  4. 保存日志到文件
  5. 熟悉shell脚本,自动化,批量化,模块化?
  6. 多利用 AI助手 和 函数说明, 快速熟悉ovs指令操作;
# 定义一个包含配置参数的数组,每行代表一组配置
network_configs=(
  "bri_01   vent0  internal  200     ns0  10.0.0.10/24"
  "bri_01   vent1  internal  200     ns1  10.0.0.1/24 "
  "bri_01   vent2  internal  100     ns2  10.0.0.2/24 "
  "bri_01   vent3  internal  100     ns3  10.0.0.3/24 "
)  
# "$bridge" "$port" "$pType" "$pTag" "$ns" "$ipaddr" 
pingLog="pingLog.txt"       # 保存ping的测试结果的文件
configLog="configLog.txt"   # 保存配置的文件
function greeting() {
  echo "你好,世界! 
        openVswitch Test"
}

function help(){
    echo "__________________________________"
    echo "帮助信息:   "
    echo "  build | b |构建虚拟网络"
    echo "  show  | s |显示网络配置"
    echo "  ping  | p |互ping全部ip"
    echo "  delete| d |清除网络"
    echo "  help  | h |显示帮助信息"
    echo "例:  ./shellName.sh  b 构建网络"
    echo "没有用到getopt getopts函数识别长短选项, "
    echo "仅仅是简单的参数传入,仅支持单个参数."
    echo "__________________________________"
}

function show_network(){
    for config in "${network_configs[@]}"; do
        # 将每一项配置解包到对应的变量中
        IFS=' ' read -ra config_array <<< "$config"

        bridge="${config_array[0]}"
        port="${config_array[1]}"
        pType="${config_array[2]}"
        pTag="${config_array[3]}"
        ns="${config_array[4]}"
        ipaddr="${config_array[5]}"
        
        echo "_____________$port 信息如下______________"     
        echo "  bridge=$bridge"                                            
        echo "    port=$port    pType=$pType      pTag=$pTag"
        echo "    ns=$ns        ipaddr=$ipaddr              "
        echo "          -------------------           " 
        echo ">>>ip netns exec $ns ip addr show 如下<<<"    
        sudo ip netns exec $ns ip addr show                  
        echo "________________________________________"      
    done
    echo "________________________________________"      
    echo ">>>ovs-vsctl show 网桥bridge配置  如下<<<" 
    sudo ovs-vsctl show                    # 查看当前配置
    echo "保存配置信息到文件 $configLog.txt"
    echo "________________________________________"  
    echo 'bridge    port    pType   pTag    ns  ipaddr'
    for config in "${network_configs[@]}"; do
        echo "$config"
    done
    echo "________________________________________"  
}

function build_network() {
    # # 使用for循环遍历数组
    for config in "${network_configs[@]}"; do
        # 将每一项配置解包到对应的变量中
        IFS=' ' read -ra config_array <<< "$config"

        bridge="${config_array[0]}"
        port="${config_array[1]}"
        pType="${config_array[2]}"
        pTag="${config_array[3]}"
        ns="${config_array[4]}"
        ipaddr="${config_array[5]}"

        # 调用build_network函数并传入参数
        # echo "$bridge" "$port" "$pType" "$pTag" "$ns" "$ipaddr" 
        # 添加一个网桥(bridge)
        sudo ovs-vsctl br-exists $bridge
        if [ $? -eq 2 ]; then # 如果不存在这个网桥,就创建
            sudo ovs-vsctl add-br $bridge
        fi
        # 添加一个内部端口(port),并设置类型(type)
        sudo ovs-vsctl add-port $bridge $port 
        sudo ovs-vsctl set Interface $port type=$pType
        sudo ovs-vsctl set Port $port tag=$pTag

        # 添加一个网络名字空间(netns) 
        sudo ip netns add $ns

        # 将内部端口(port)分别移动到(netns)中
        sudo ip link set $port netns $ns

        # 启动端口并配置IP
        sudo ip netns exec $ns ip link set lo up
        sudo ip netns exec $ns ip link set $port up
        sudo ip netns exec $ns ip addr add $ipaddr dev $port
    done
}

function delete_network() {
    clearFlag=$1
    case $clearFlag in
        "delete" | "d" | "clear" | "c" )
        echo "删除/清除网络开始" 
        # # 使用for循环遍历数组
        for config in "${network_configs[@]}"; do
            # 将每一项配置解包到对应的变量中
            IFS=' ' read -ra config_array <<< "$config"

            bridge="${config_array[0]}"
            port="${config_array[1]}"
            pType="${config_array[2]}"
            pTag="${config_array[3]}"
            ns="${config_array[4]}"
            ipaddr="${config_array[5]}"

            sudo ovs-vsctl del-br $bridge          # > /dev/null  # 删除网桥
            sudo ovs-vsctl del-port $bridge $port  # > /dev/null  # 删除端口
            sudo ovs-vsctl del-br $ns              # > /dev/null
            sudo ip netns del $ns                  # > /dev/null  # 删除名字空间
        done
        ;;
    esac
    echo "删除/清除网络完成"
}

function one_Ping_all() {
    bridge=$1
    port=$2
    pType=$3
    pTag=$4
    ns=$5
    ipaddr=$6
    # 获取数组中其他接口的信息,并尝试在当前接口所在的网络命名空间中ping它们
    # ns=ns1, 那么 ns0 ping ns1~3遍历
    for config in "${network_configs[@]}"; do
        IFS=' ' read -ra config_array <<< "$config"
        if [[ "${config_array[0]}" == "$bridge" && "${config_array[4]}" != "$ns" && "${config_array[5]}" != "$ipaddr" ]]; then
            target_ns="${config_array[4]}"
            target_ip="${config_array[5]%%/*}"  # 这里,去除"/24" 子网掩码 | "10.0.0.3/24"
            sudo ip netns exec $ns ping -c 3 "$target_ip"  
        fi
    done
}

function all_Ping_all() {
    echo "批量互ping测试开始:" 
    total_configs="${#network_configs[@]}"
    index=0 
    for config in "${network_configs[@]}"; do
            # 将每一项配置解包到对应的变量中
            IFS=' ' read -ra config_array <<< "$config"

            bridge="${config_array[0]}"
            port="${config_array[1]}"
            pType="${config_array[2]}"
            pTag="${config_array[3]}"
            ns="${config_array[4]}"
            ipaddr="${config_array[5]}"
            
            # 打印进度
            index=$((index + 1))
            one_Ping_all "$bridge" "$port" "$pType" "$pTag" "$ns" "$ipaddr"  
        echo "              
        互ping处理进度 ($index/$total_configs) 互ping处理进度 $ns... ($index/$total_configs)"
    done
    echo "互ping处理完成 ($index/$total_configs)"
    echo "保存互ping结果到文件 $pingLog"
}


# 主入口点
cmd=$1

case "$cmd" in
    "greeting" | "g" | "test" | "t")
        greeting
        echo "测试运行应该正常"
        ;;
    "build" | "b" )
        echo "构建虚拟网络环境"
        build_network
        echo "创建完毕"
        :> "$configLog"  # 清空上次运行  configLog日志 
        show_network  | tee -a "$configLog"
        ;;
    "delete" | "d" | "clear" | "c" )
        delete_network "d"
        ;;
    "show"  | "s")
        :> "$configLog"  # 清空上次运行  configLog日志 
        show_network  | tee -a "$configLog"
        ;;
    
    "ping" | "p" )
        :> "$pingLog"  # 清空上次运行 ping日志 
        all_Ping_all | tee -a "$pingLog" #保存到日志文件
        ;;
    "help" | "h" | "man" | "manual" | "?")
        help
        ;;
    *)
        help
        for i in {1..3}; do
            echo "Invalid argument provided 不恰当的参数输入,查看帮助"
        done
        ;;
esac

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值