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.3 | ovs-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 show 和 ip 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测试
- ovs通过设置vlan标签,创建隔离网络
- 建立两个不同tag的网络空间按,实现网络隔离
- 互ping测试
- 保存日志到文件
- 熟悉shell脚本,自动化,批量化,模块化?
- 多利用 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