【云网络】软件定义网络SDN的概念与应用(以PVE8用户隔离,TLS证书介绍,自签证书等为例)
文章目录
-
- 1、软件定义网络SDN
- 2、PVE8用户隔离(SDN工具)
- 3、TLS证书介绍(SDN应用)
-
- [3.1 证书的用途,类别,格式](#3.1 证书的用途,类别,格式)
- [3.2 什么是自签证书,有什么用](#3.2 什么是自签证书,有什么用)
- [3.3 如何自签证书(补充)](#3.3 如何自签证书(补充))
1、软件定义网络SDN
软件定义网络(SDN)
- 一种将网络资源抽象到虚拟化系统中的 IT 基础架构方法。这被称为网络虚拟化。
- SDN 将网络转发功能与网络控制功能分离开来,目的是创建可集中管理且可编程的网络,这也就是说将控制平面与数据平面分离。
- SDN 允许 IT 运维团队通过集中面板来控制复杂网络拓扑中的网络流量,而无需手动处理每个网络设备。
- 引用:1 2,3
软件定义网络(SDN)与网络功能虚拟化(NFV)
- 对于电信公司来说,还有一种网络抽象,称为网络功能虚拟化(NFV)。与软件定义网络类似,NFV 将网络功能从硬件中抽象出来。NFV 通过提供可运行 SDN 软件的基础架构来支持软件定义网络。
- NFV 使提供商可以灵活地在不同服务器上运行相应的功能,或在需求发生变化时根据需要移动这些功能。有了这种灵活性,电信服务提供商可以更快地交付服务和应用。
- 例如,如果客户请求一项新的网络功能,他们可以启动新的虚拟机(VM)来处理该请求。当不再需要该功能时,可停用此虚拟机。这是一种低风险测试潜在新服务价值的方法。
vf - 虚拟网卡
基本概念与架构组成:
- 控制平面与数据平面分离:
控制平面:负责网络设备的决策和管理,例如路由选择和流量工程。
数据平面:负责数据包的实际转发和处理。通过将这两个平面分离,SDN 使得网络管理更集中化和灵活。 - 集中化控制:SDN 采用一个或多个集中式控制器来管理网络设备(如交换机和路由器),提供统一的管理界面。
- SDN 控制器: SDN 的核心组件,处理网络流量的控制逻辑,使用开放协议(如 OpenFlow)与网络设备通信。
- 数据平面设备:包括交换机和路由器,这些设备根据控制器的指令来转发流量。
- 应用层:运行在 SDN 控制器上的应用程序,提供网络服务、策略管理和网络监控等功能。
自己实现一个SDN网络:
- 硬件选型:
物理设备:选择支持 OpenFlow 协议的交换机和路由器,或者使用虚拟交换机如 Open vSwitch (OVS)。
服务器:用于运行 SDN 控制器和其他网络应用。 - 软件选型
操作系统:Linux 是推荐的操作系统,因为许多 SDN 工具和控制器在 Linux 环境下表现最佳。
编程语言:Python、Java 和 Go 是实现 SDN 应用和控制器的常用语言。 - 开源 SDN 控制器:
Open daylight:一个功能强大的开源 SDN 控制器,支持多种协议。
Floodlight:一个轻量级的 Java 控制器,易于使用和扩展。
Ryu:基于 Python 的控制器,适合开发快速原型。 - 搭建基础网络环境
规划网络拓扑,设计网络结构(如星型、环形等),考虑网络中的设备之间的连接方式。
安装 Open vSwitch,创建虚拟交换机并配置端口 - 配置SDN控制器
安装控制器:根据选择的控制器,参照官方文档安装并配置。
连接交换机:配置交换机与控制器的连接,确保 OpenFlow 协议正确配置。 - 开发SDN应用
使用控制器的 API 开发自定义应用,监控流量、调整流表、实现负载均衡等功能。
(网络管理与SDN:私有子网,虚拟IP,访问控制,安全组, 带宽管理,网络拓扑管理, 网络故障检测和恢复, 虚拟网络功能)
(相关应用但不属于SDN的:负载均衡,证书管理,DNS域名管理,安全防火墙,网络监控,边缘计算 )
PVE集成的SDN的使用
- 引用1, 2
- Proxmox VE SDN 允许使用灵活的软件控制配置对虚拟访客网络进行分离和细粒度控制。
分离是通过区域进行管理的,其中区域是其自己的虚拟分离网络区域。VNet是一种连接到区域的虚拟网络。根据区域使用的类型或插件,它的行为可能有所不同,并提供不同的功能、优点和缺点。通常,VNet 显示为带有 VLAN 或VXLAN标记的常见 Linux 网桥,但是,有些也可以使用第 3 层路由进行控制。从集群范围的数据中心 SDN 管理界面进行配置后,VNet会本地部署在每个节点上。 - 在 Web 界面上,SDN 具有 3 个主要部分:
SDN:SDN 状态概述
区域:创建和管理虚拟分离的网络区域
VNet:创建虚拟网桥并管理子网 - 除此之外,还提供以下选项:
控制器:用于控制复杂设置中的第 3 层路由
子网:用于在 VNet 上定义的 IP 网络
IPAM:允许使用外部工具进行 IP 地址管理(来宾 IP)
DNS:定义 DNS 服务器 API,用于注册虚拟访客的主机名和 IP 地址
2、PVE8用户隔离(SDN工具)
参考资料:1
什么是用户隔离
- PVE8在Web管理后台集成了易于操作的SDN(软件定义网络)功能插件,其实质是对不同的PVE用户指定不同的网络,进行逻辑隔离,避免不同的用户设置相同的网络地址而产生冲突。
- 例如用户A,给他指定地址段172.16.10.0/24,另外一个用户的地址段是172.16.20.0/24,如果这个用户A,误操作把它所管理的虚拟机设置成B用户所在网段的地址,是不会有效的,也不会对其他用户产生影响。
功能实现
shell
# 安装包
apt update
apt install libpve-network-perl
apt install dnsmasq
apt install frr-pythontools
# 修改宿主机的网络配置。
Debian命令行下,进入目录"/etc/network"
将文本行"source /etc/network/interfaces.d/*"追加到网络配置文件"interfaces"
注意别丢掉那个星号通配符。
测试验证
- 在单节点上两个资源池、创建两个组及用户,两个虚拟网络并将分别授权给已经创建好的用户组,接着创建两个虚拟机,使虚拟机属于不同的网络及资源组。
- PVE数据中心级别,权限-群组=创建,创建了两个群组。
- PVE数据中心级别,分别创建两个用户,隶属于两个不同的群组。
- 创建SDN区域:即虚拟网络隔离标识,PVE支持五种类型的隔离方式,它们是:Simple、VLAN、QinQ、VxLAN、EVPN。以Simple区域为例。
- PVE数据中心级别,SDN-区域-创建,2个区域,选择对应物理节点。
- 数据中心级别,SDN-Vnets-创建,选择对应区域。
- 选定已经创建好的虚拟网络(Vnet),创建子网(虚拟网段),输入网络地址及默认网关,并勾选"SNAT"(源地网络地址转换)。应用SDN后生效。
- 创建两个虚拟机,使其属于两个不同的资源组,并为其指定不同的桥接网卡(虚拟网卡)。
3、TLS证书介绍(SDN应用)
3.1 证书的用途,类别,格式
数字证书通常是用于加密和认证的,主要应用于 HTTPS,但并不局限于此。以下是一些常见的用途:
- HTTPS: 证书确保与服务器之间的通信是加密的,保护数据传输的安全性。
- 邮件安全: 如 S/MIME 证书,用于加密和签名电子邮件。
- 代码签名:软件开发者使用证书对应用程序和软件进行签名,确保代码在传输过程中未被修改,并表明发布者的身份。
- VPN:用于建立和验证虚拟专用网络的安全连接。
- 身份验证:硬件安全模块(HSM)和其他设备使用证书进行身份验证。
- 其他协议:如 FTPS、SMTPS,也会使用证书进行安全通信。
介绍一下HTTPS的应用
- HTTPS 其实是有两部分组成:HTTP + SSL/TLS
- 也就是在 HTTP 的基础上又加了一层处理加密信息的模块。
- 服务端和客户端的信息传递都会通过 TLS 进行加密,所以传输的数据都是加密后的数据。
- TLS和SSL的区别:
TLS 是 SSL 的继任者,提供了更好的安全性和性能。在现代网络通信中,通常使用 TLS,因为 SSL 已被认为不再安全。大多数应用和系统现在都支持 TLS,而不再使用 SSL。因此,建议使用最新版本的 TLS(目前为 TLS 1.3)来确保最高的安全级别。
SSL:使用较老的加密算法,某些算法在现代安全标准下被认为是不安全的。
TLS:支持更多现代的加密算法,并允许使用更强的加密方法。
TLS:通常可以与较旧版本的 SSL 进行兼容,但不建议使用 SSL。
证书的类别
- SSL/TLS 证书
域名验证 (DV):确认域名所有权,适合小型网站。
企业验证 (OV):验证域名及组织身份,适合商业网站。
扩展验证 (EV):进行严格验证,提供最高信任级别,适合大型或交易型网站。 - 代码签名证书
用于对软件应用进行签名,以确保代码的完整性和发布者的身份。 - S/MIME 证书
用于加密和签名电子邮件,确保邮件的私密性和完整性。 - 客户端证书
用于验证用户身份,常用于 VPN 访问和安全区域。 - 根证书和中间证书
根证书:信任链的顶层,用于签名中间证书。
中间证书:由根证书签发,用于签发终端证书,提供证书链。
证书的格式(PEM, DER, CRT, CER, KEY等各类证书与密钥文件后缀解析)
- .crt和.key分别代表证书和私钥文件,扩展名是按照文件用途来分的。而.pem是一种文件格式, pem文件是文本格式的,其他证书格式还有DER。引用, 2
- 所以证书.crt和.key文件可以是PEM格式文件, 也可以是其他证书格式比如DER(二进制格式)
- nginx证书文件可以重命名,如果你喜欢用文件格式命名。 mv signed.crt cert.pem 。mv signed.key key.pem。
3.2 什么是自签证书,有什么用
自签证书介绍
- 定义:自签证书是指由证书所有者自我签署的证书,而不是由受信任的证书颁发机构(CA)签署。
- 受信任性:自签证书不会被默认信任。用户需要手动安装证书的信任链。
- 用途:可以用于内部开发、测试环境、私人网络等,适合不需要公信力的场合。
- 成本:创建和管理自签证书成本低,无需支付给第三方 CA。
- 证书自签背后的逻辑:密钥对:每个证书都有一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据。
- 签名过程:自签证书用私钥对证书的哈希值进行签名,生成签名部分。其他方用公钥验证这个签名。
- 信任模型:在正式环境中,信任模型依赖于 CA 链 ,但 在自签证书中,信任完全依赖于使用者手动验证。
- 自签证书在不同场合(如 HTTPS 网站、客户端验证、代码签名等 )的使用需求和签名方式基本上是相同的,但关键的区别在于证书的具体内容和使用的扩展字段。
- HTTPS 证书:
必须包含用于身份验证的域名 (CN 或 Subject Alternative Name)。
常用的扩展字段包括 Key Usage 和 Extended Key Usage,通常指定为 TLS Web Server Authentication。 - 客户端证书:
用于用户或设备身份验证 ,通常在扩展字段中指明 Client Authentication。
也需要包含用户或设备的特定信息。 - 代码签名证书:
针对软件的签名验证 ,适合将 Code Signing 设置为扩展用途。
证书内容可能包括开发者的身份或组织信息。
以ssh服务的pem证书为例
shell
# 生成证书
ssh-keygen -t rsa -b 2048 -m PEM -f notice-server.pem
ssh-copy-id -i notice-server.pem.pub root@xxx
# 使用
chmod 400 notice-server.pem
ssh -i notice-server.pem root@xxx
scp -i notice-server.pem /xxx root@xxx:/xxx
以nginx部署https需要的服务为例
shell
# 1、创建证书, 密钥文件(key)
[root@Nginx ~]# openssl genrsa -des3 -out server.key 1024
...
Enter pass phrase for server.key: # 输入密码
Verifying - Enter pass phrase for server.key: # 确认密码
# 2、创建证书,申请文件(csr)
[root@Nginx ~]# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key: # 输入前面创建的密码
...
Country Name (2 letter code) [XX]:CN # 国家代号. 中国输入 CN
State or Province Name (full name) []:Shanghai # 省的全名. 拼音
Locality Name (eg, city) [Default City]:Shanghai # 市的全名. 拼音
Organization Name (eg, company) [Default Company Ltd]:xxx # 公司英文名
Organizational Unit Name (eg, section) []: # 可以不输入
Common eg your name or your server s hostname []:www.xxx.com # 域名
Email Address []:xxx@163.com # 电子邮箱. 可随意填
A challenge password []: # 可以不输入
An optional company name []: # 可以不输入
# 3、备份一份服务器密钥文件 & 去除文件口令
(注意这里不去除口令的话后面证书用不了)
[root@Nginx ~]# cp server.key server.key.org
[root@Nginx ~]# openssl rsa -in server.key.org -out server.key
Enter pass phrase for server.key.org: # 输入密码
# 4、创建证书,证书本体(crt, 或者说pem)
[root@Nginx ~]# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=CN/ST=BeiJing/L=BeiJing/O=Coco/CN=www.Coco.com/emailAddress=ChenZhuang1217@163.com
Getting Private key
其他,如安装软件时,手动信任证书等等。
3.3 如何自签证书(补充)
以软件为例
在macOS上生成自签名证书并导入到系统信任的证书中:
shell
#!/bin/bash
# 设置主机名和有效期
HOSTNAME="localhost"
DAYS_VALID=365
CERT_NAME="rewinged"
# 提取本地IP地址
IP_LIST=$(ifconfig en0 | grep 'inet ' | awk '{print $2}' | awk '{for (i=0;i<NF;i++)printf("IP:%s,",$i);} END {print "";}'| sed 's/,$//')
# 生成subjectAltName部分
SAN="DNS:$HOSTNAME"
if [ -n "$IP_LIST" ]; then
SAN+=",${IP_LIST}"
fi
# 创建OpenSSL配置文件
OPENSSL_CONF="openssl.cnf"
cat > $OPENSSL_CONF << EOF
[req]
distinguished_name = req_distinguished_name
req_extensions = req_ext
x509_extensions = v3_ca
prompt = no
[req_distinguished_name]
commonName = $HOSTNAME
[req_ext]
subjectAltName = $SAN
[v3_ca]
subjectAltName = $SAN
EOF
# 生成私钥和证书
openssl req -x509 -newkey rsa:2048 -keyout private.key -out cert.pem -days $DAYS_VALID -nodes -config $OPENSSL_CONF
# 添加私钥和证书到系统钥匙串
sudo security add-trusted-cert -d -r trustRoot -k "/Library/Keychains/System.keychain" cert.pem
# 删除OpenSSL配置文件
rm $OPENSSL_CONF
powershell自签
windows添加证书
shell
# Because we are adding a certificate to the local machine store, this has to be run in an elevated PowerShell session
$IPs = [System.Net.NetworkInformation.NetworkInterface]::GetAllNetworkInterfaces() |
Foreach-Object GetIPProperties |
Foreach-Object UnicastAddresses |
Foreach-Object Address |
Foreach-Object {
"&IPAddress=$( [System.Net.IPAddress]::new($_.GetAddressBytes() ))"
}
[string]$SanIPs = -join $IPs
$SelfSignedCertificateParameters = @{
'Subject' = 'localhost'
'TextExtension' = @("2.5.29.17={text}DNS=localhost${SanIPs}")
'NotAfter' = (Get-Date).AddYears(1)
'FriendlyName' = 'rewinged HTTPS'
'KeyAlgorithm' = 'RSA'
'KeyExportPolicy' = 'Exportable'
}
$cert = New-SelfSignedCertificate @SelfSignedCertificateParameters
$RSAPrivateKey = [System.Security.Cryptography.X509Certificates.RSACertificateExtensions]::GetRSAPrivateKey($cert)
$PrivateKeyBytes = $RSAPrivateKey.Key.Export([System.Security.Cryptography.CngKeyBlobFormat]::Pkcs8PrivateBlob)
$PrivateKeyBase64 = [System.Convert]::ToBase64String($PrivateKeyBytes, [System.Base64FormattingOptions]::InsertLineBreaks)
$CertificateBase64 = [System.Convert]::ToBase64String($cert.Export('Cert'), [System.Base64FormattingOptions]::InsertLineBreaks)
Set-Content -Path private.key -Encoding Ascii -Value @"
-----BEGIN RSA PRIVATE KEY-----`r`n${PrivateKeyBase64}`r`n-----END RSA PRIVATE KEY-----
"@
Set-Content -Path cert.pem -Encoding Ascii -Value @"
-----BEGIN CERTIFICATE-----`r`n${CertificateBase64}`r`n-----END CERTIFICATE-----
"@
$store = [System.Security.Cryptography.X509Certificates.X509Store]::new('Root', 'LocalMachine')
$store.Open('ReadWrite')
$store.Add($cert)
$store.Close()
Remove-Item $cert.PSPath