思科模拟器(SDN控制器使用教程二)
写在前面:
笔者在2021年5月份发布了一篇关于思科模拟器SDN控制器的使用教程,得到了大家的喜欢,这是笔者更新这篇文章的动力。在以后只要是有时间笔者就会多更新一点关于这方面的文章,和大家一起学习SDN相关技术。笔者技术能力有限,可能不是特别专业,如果在文中有什么错误,希望大家能够指出,笔者也希望和大家一起进步。在过去的两年里,笔者经历了一些生活的变故,以为不会在从事网络相关行业了,可命运弄人在从校园走出后还是从事了网络相关行业更准确的说是通信相关行业(笔者目前就职于某运营商从事网络、无线、通信相关的工作)。在工作过程中接触到了SD-WAN相关技术,奈何华为目前暂不支持SDN相关的模拟设备,无法和大家分享华为相关的技术。在接下来的日子里笔者也会不断学习来储备自己的知识。目前笔者具有华为HCIP(数通方向)
、软考的网络工程师
、软考软件设计师
、RedHat网络学院认证
,在某运行商和浪潮xx公司以及本地几家科技公司从事过运维、等保测评等工作。目前准备学习网络安全方向,如果后面有朋友想在考证方面咨询,也会进行积极的回复,笔者在低谷时得到了许许多多的好心人帮助,也希望自己能够为一些想从事网络方面的朋友提供力所能及的帮助。笔者并非机构,也会不定期更新文章。关于思科的SDN模拟器也更新到此,如果有英文能力好一点的朋友能够更深入的带着大家学习。希望大家不喜勿喷。
一、实验拓扑
各个设备配置:在各个设备中,配置了一个用户,用户名和密码为:admin
、admin
。为了后面在Web管理中作为管理设备的凭证。
路由器配置Lo:1.1.1.1路由器配置
hostname Router
username admin privilege 15 secret 5 $1$mERr$vTbHul1N28cEp8lkLqr0f/
interface Loopback0
ip address 1.1.1.1 255.255.255.255
interface GigabitEthernet0/0
ip address 10.0.0.1 255.255.255.0
duplex auto
speed auto
interface GigabitEthernet0/1
ip address 192.168.1.1 255.255.255.0
duplex auto
speed auto
interface GigabitEthernet0/2
ip address 10.0.1.1 255.255.255.0
duplex auto
speed auto
router ospf 1
log-adjacency-changes
network 192.168.1.0 0.0.0.255 area 0
network 10.0.0.0 0.0.0.255 area 0
network 1.1.1.1 0.0.0.0 area 0
network 10.0.1.0 0.0.0.255 area 0
路由器配置Lo:3.3.3.3路由器配置
hostname R1
username admin privilege 15 secret 5 $1$mERr$vTbHul1N28cEp8lkLqr0f/
interface Loopback0
ip address 3.3.3.3 255.255.255.255
interface FastEthernet0/0
ip address 10.0.1.2 255.255.255.0
duplex auto
speed auto
router ospf 1
log-adjacency-changes
network 10.0.1.0 0.0.0.255 area 0
network 3.3.3.3 0.0.0.0 area 0
核心交换机配置
hostname Switch
username admin secret 5 $1$mERr$vTbHul1N28cEp8lkLqr0f/
interface Loopback0
ip address 2.2.2.2 255.255.255.255
interface GigabitEthernet1/0/1
switchport access vlan 10
switchport mode access
interface GigabitEthernet1/0/2
switchport access vlan 100
switchport mode access
interface GigabitEthernet1/0/3
switchport access vlan 200
switchport mode access
interface Vlan10
mac-address 0002.4a7e.d901
ip address 192.168.1.2 255.255.255.0
interface Vlan100
mac-address 0002.4a7e.d902
ip address 192.168.100.1 255.255.255.0
interface Vlan200
mac-address 0002.4a7e.d903
ip address 172.16.0.1 255.255.255.0
router ospf 1
log-adjacency-changes
network 192.168.1.0 0.0.0.255 area 0
network 0.0.0.0 255.255.255.255 area 0
network 192.168.100.0 0.0.0.255 area 0
network 172.16.0.0 0.0.0.255 area 0
二层交换机配置
hostname Switch
username admin secret 5 $1$mERr$vTbHul1N28cEp8lkLqr0f/
interface FastEthernet0/24
switchport access vlan 100
switchport mode access
interface Vlan100
ip address 172.16.0.2 255.255.255.0
ip default-gateway 172.16.0.1
二、在Web平台中添加凭证
**打开Web管理界面我这里是监听了58001
端口。这里可以参考之前的文章。**添加设备登陆凭证,用于SDN控制器管理网络设备。
在Web管理页面中添加登录凭证
添加之后的效果图:
三、添加设备
**添加设备通过之前添加的登陆凭证以及设备的管理IP
地址进行设备管理。在之前,需要把设备做到全互联,在这里我用的是OSPF进行设备互联。**如果管理失败,那么检查登陆凭证与管理IP地址的路由是否可达。
添加完成之后可以查看设备的状态(如下图)
在下图中,
Collection Status
有两种不同的状态:Managed
、Unsupported
。官方也没有解释两种状态,如果是有知道的朋友可以联系。但是据我判断Managed
状态才是正常的。
在上述中,对于Unsupported
状态的设备,在设备详细页面中,可以看到对应的信息,如下图:
添加成功之后在主页就可以看到设备设备状态:主机
、网络设备
。
四、通过Python进行简单的网络管理
在上面对此步骤进行了铺垫,我们可以在控制器页面找到对应的API文档,API文档位于控制器页面的
API Docs
。SDN控制器提供了REST API来进行访问。这里REST API只是通过REST
标准提供的访问方式。不需要纠结。以后笔者给大家出一个REST API
的笔记。无外乎就是get
、post
、delete
等访问方式。在下面我通过Pycharm来进行操作。大家可以自己选择python的IDE。电脑必须安装Python3
以及Python的requests库。
以下是官方提供的demo:
不管是通过API做什么操作,获取网络设备信息等,都需要登陆获取token
,以保障访问者身份的合法性。
import json
import requests
def main():
#获取Token
securityUrl = "http://localhost:58001/api/v1/ticket"
securityData = json.dumps({"username": "admin", "password": "admin"})
securityHeader = {'Content-type': 'application/json'}
r = requests.post(securityUrl, data=securityData, headers=securityHeader)
print(r.text)
if __name__ == "__main__":
main()
securityUrl = "http://localhost:58001/api/v1/ticket" securityData = json.dumps({"username": "admin", "password": "admin"})
http://localhost:58001
是自己Web访问的地址,每个人怎样访问的通过这个地址调用API。在加上/api/v1/ticket
。
securityData
是一个用户名、密码的JSON数据,通过POST请求将JSON发送到服务器。以下是访问图。
上述代码执行结果:
serviceTicket
:是SDN控制器返回的token,如果用户名密码提供的不正确,则不能正确返回。
{
"response": {
"idleTimeout": 900,
"serviceTicket": "NC-14-45f8c34ac99b4b8c9617-nbi",
"sessionTimeout": 3600
},
"version": "1.0"
}
错误的返回结果如下:
{
"response": {
"detail": "Bad credentials",
"errorCode": "TICKET_BAD_USER",
"message": "Invalid user credentials. Provide valid user credentials."
},
"version": "1.0"
}
我们通过官方提供的API来对查看网络设备信息。
在每次操作时,我们需要在请求头中携带获取到的token。官方提供的方式如下:
在每次的请求头中添加
x-auth-token
字段。值为http://localhost:58001/api/v1/ticket
获取到的token。
apiAccessHeader = {}
apiAccessHeader['content-type'] = 'application/json'
apiAccessHeader['x-auth-token'] = token
r = requests.get('http://localhost:58000/api/v1/network-device', headers=apiAccessHeader)
以下是根据API文档进行操作:
获取主机
import json
import requests
def main():
# 获取token
securityUrl = "http://localhost:58001/api/v1/ticket"
securityData = json.dumps({"username": "admin", "password": "admin"})
securityHeader = {'Content-type': 'application/json'}
r = requests.post(securityUrl, data=securityData, headers=securityHeader)
token = r.json()["response"]["serviceTicket"]
# 获取主机
apiAccessHeader = {}
apiAccessHeader['content-type'] = 'application/json'
apiAccessHeader['x-auth-token'] = token
r = requests.get('http://localhost:58001/api/v1/host', headers=apiAccessHeader);
print(json.dumps(r.json(), indent=2))
if __name__ == "__main__":
main()
放回结果
{
"response": [
{
"connectedAPMacAddress": "",
"connectedAPName": "",
"connectedInterfaceName": "GigabitEthernet1/0/2",
"connectedNetworkDeviceIpAddress": "2.2.2.2",
"connectedNetworkDeviceName": "Switch",
"hostIp": "192.168.100.100",
"hostMac": "00D0.5895.E815",
"hostName": "PC0",
"hostType": "Pc",
"id": "PTT0810MH0S-uuid",
"lastUpdated": "2023-12-14 19:02:46",
"pingStatus": "SUCCESS"
}
],
"version": "1.0"
}
通过IP地址获取网络设备
import json
import requests
def main():
# 获取token
securityUrl = "http://localhost:58001/api/v1/ticket"
securityData = json.dumps({"username": "admin", "password": "admin"})
securityHeader = {'Content-type': 'application/json'}
r = requests.post(securityUrl, data=securityData, headers=securityHeader)
token = r.json()["response"]["serviceTicket"]
# 通过IP地址获取网络设备
apiAccessHeader = {}
apiAccessHeader['content-type'] = 'application/json'
apiAccessHeader['x-auth-token'] = token
r = requests.get('http://localhost:58001/api/v1/network-device/ip-address/1.1.1.1', headers=apiAccessHeader);
print(json.dumps(r.json(), indent=2))
if __name__ == "__main__":
main()
返回结果:
{
"collectionStatus": "Unsupported",
"errorDescription": "",
"globalCredentialId": "2016d592-7451-4828-80ea-dc812718334b",
"id": "FTX1524TRW4-uuid",
"interfaceCount": "5",
"inventoryStatusDetail": "Unsupported",
"ipAddresses": [
"10.0.0.1",
"192.168.1.1",
"10.0.1.1"
],
"lastUpdateTime": "13",
"lastUpdated": "2023-12-14 19:06:46",
"macAddress": "00E0.B0BA.ED72",
"managementIpAddress": "1.1.1.1",
"platformId": "",
"productId": "",
"reachabilityFailureReason": "NOT_VALIDATED",
"reachabilityStatus": "Reachable",
"serialNumber": "",
"type": "",
"upTime": ""
}