使用SEED互联网平台仿真器创建小型网络(python程序)

创建小型网络

  • 底层硬件部署(cables)
    • 第一步:初始化
    • 第二步:创建星星(交换点)
    • 第三步:建核心网络(也即中间部分)AS-3(编号3)
    • 第四步:建立边缘网络AS(建了三个,编号分别151、152、153)
      • 编号151的AS
      • 建编号152的AS
      • 建编号为153的AS
  • 进行软连接(softwares)
    • 第五步:进行BGP peer
    • 第六步:加入网络服务程序
    • 第七步:实际绑定(称为render)
    • 第八步:编译的工作
  • 后续工作(非python,转到bash控制台)
    • 第九步:动态可视化(详见本专栏第一篇)

在看了杜教授简明易懂的视频后,我却琢磨了好久…
等到我大彻大悟之后,我决定用一个更傻瓜式的教程写出来

底层硬件部署(cables)

第一步:初始化

相关代码:

#!/usr/bin/env python3
# encoding: utf-8

 # 为方便起见import 所有 library
from seedemu import *

# Create the Emulator ,大部分情况下 import 一个就够了
emu = Emulator()

# Create the base layer
base = Base()

此步结果:无

第二步:创建星星(交换点)

相关代码:

ix100 = base.createInternetExchange(100) # 创建编号为100的网络
ix101 = base.createInternetExchange(101) # 创建编号为101的网络
ix100.getPeeringLan().setDisplayName('New York-100')#为编号100的网络进行定制(customization)
ix101.getPeeringLan().setDisplayName('Chicago-101')#为编号101的网络进行定制(customization)

此步结果:
使用SEED互联网平台仿真器创建小型网络(python程序)_第1张图片

第三步:建核心网络(也即中间部分)AS-3(编号3)

相关代码:

###############################################################################
# Create and set up a transit AS (AS-3)
#注:这里的(3):数字越小规模越大。ip地址:10.3.x.x(首位是10,因为10.x.x.x;172.16.0.0---172.31.255.254;192.168.x.x都是私有地址)(第二位是3,就是这里的3,避免用1,1是保留的)(第三位、第四位随便分配)
as3 = base.createAutonomousSystem(3)

# Create 3 internal networks
as3.createNetwork('net0')
as3.createNetwork('net1')
as3.createNetwork('net2')

# Create four routers and link them in a linear structure:
# ix100 <--> r1 <--> r2 <--> r3 <--> r4 <--> ix101
# r1 and r2 are BGP routers because they are connected to internet exchanges
as3.createRouter('r1').joinNetwork('net0').joinNetwork('ix100')
as3.createRouter('r2').joinNetwork('net0').joinNetwork('net1')
as3.createRouter('r3').joinNetwork('net1').joinNetwork('net2')
as3.createRouter('r4').joinNetwork('net2').joinNetwork('ix101')

此步结果:
使用SEED互联网平台仿真器创建小型网络(python程序)_第2张图片

第四步:建立边缘网络AS(建了三个,编号分别151、152、153)

编号151的AS

相关代码:

###############################################################################
# Create and set up the stub AS (AS-151)

as151 = base.createAutonomousSystem(151)

# Create an internal network and a router
as151.createNetwork('net0')
as151.createRouter('router0').joinNetwork('net0').joinNetwork('ix100')

# Create two host nodes 
as151.createHost('host0').joinNetwork('net0')
as151.createHost('host1').joinNetwork('net0', address = '10.151.0.80')

# Install additional software on a host
host0 = as151.getHost('host0')
host0.addSoftware('telnetd').addSoftware('telnet')

# Run an additional command inside the container 
# The command creates a new account inside the host (also sets its password)
host0.addBuildCommand('useradd -m -s /bin/bash seed && echo "seed:dees" | chpasswd')

此步结果:
使用SEED互联网平台仿真器创建小型网络(python程序)_第3张图片
AS151是边缘网络,顾名思义是有主机的,所以加了俩host上去。而host0上又部署了telnet服务,还有什么特殊命令。然后呢,这俩host应该分别叫host0和host1,但是为啥host0名字变成Web-1了呢?这个是后话,总之目前代码到这一步,它应该是host0的,马上继续往下看

建编号152的AS

相关代码:

###############################################################################
# Create and set up the stub AS (AS-152)
```python
as152 = base.createAutonomousSystem(152)
as152.createNetwork('net0')
as152.createRouter('router0').joinNetwork('net0').joinNetwork('ix101')
as152.createHost('host0').joinNetwork('net0')

# Install additional software on a host
as152.getHost('host0').addSoftware('telnet')

此步结果:
使用SEED互联网平台仿真器创建小型网络(python程序)_第4张图片
有了AS151的基础,AS152就显得很简单了,没啥好说的

建编号为153的AS

相关代码:

###############################################################################
# Create and set up the stub AS (AS-153)

# Use the utility function to create the AS
Makers.makeStubAs(emu, base, 153, 101, [None, None])

# Further customization
as153 = base.getAutonomousSystem(153)
as153.getHost('host_1').addSoftware('telnet')

此步结果:
这里有必要解释一下了,为什么AS153的创建跟151、152不一样呢?151、152都是先声明、再连接,但是153就直接一行代码轻轻松松解决了emu、base、所连星星交换点exchange、甚至两台主机(None代表主机上面没服务,假如写成[web,None]: 那就说明一个上面运行Web Server,另一个什么也不运行)!
不一样的原因是,这是创建的另一种简便的方法,相当于是把这些操作都给你封装半自动化了一遍。
详细解释一下:
① 153表示as153 = base.createAutonomousSystem(153),
② 101表示ix101星星交换点,然后[None,None]代表net上还连了俩没跑服务的主机。
使用SEED互联网平台仿真器创建小型网络(python程序)_第5张图片

进行软连接(softwares)

第五步:进行BGP peer

相关代码:

###############################################################################
# BGP peering

# Create the Ebgp layer
ebgp = Ebgp()

# Make AS-3 the internet service provider for all the stub ASes
# 两者关系:AS3 provide service for AS151
ebgp.addPrivatePeering (100, 3,   151, abRelationship = PeerRelationship.Provider)
# 三者关系:AS3  provide service for AS152、AS153
# 下面这个名字是“Peerings”,所以要带括号。
ebgp.addPrivatePeerings(101, [3], [152, 153], abRelationship = PeerRelationship.Provider)

# Peer AS-152 and AS-153 directly as peers
# 两者关系:peer对等关系
ebgp.addPrivatePeering(101, 152, 153, abRelationship = PeerRelationship.Peer)
## 也看到有的地方是这样写的Peering these ASes at Internet Exchange IX-100

# ebgp.addRsPeer(100, 150)
# ebgp.addRsPeer(100, 151)
# ebgp.addRsPeer(100, 152)
 

第六步:加入网络服务程序

###############################################################################
# Web Service Layer 

# Create the WebService layer
web = WebService()

# Create web service nodes (virtual nodes)虚拟的!以后要跟实体结点绑定的!
web.install('web01')
web.install('web02')

# Bind the virtual nodes to physical nodes 这里就是绑定虚实结点了
emu.addBinding(Binding('web01', filter = Filter(nodeName = 'host0', asn = 151)))
emu.addBinding(Binding('web02', filter = Filter(nodeName = 'host0', asn = 152)))
#意思是把web02虚节点绑定到asn152中的host0上。

第七步:实际绑定(称为render)

###############################################################################
emu.addLayer(base)
emu.addLayer(ebgp)
emu.addLayer(web)

emu.addLayer(Routing())
emu.addLayer(Ibgp())
emu.addLayer(Ospf())
###############################################################################

# Save it to a component file, so it can be used by other emulators

# This is optional
emu.dump('base-component.bin')


###############################################################################
# Rendering: This is where the actual binding happens

emu.render()

# Change the display name for the nodes hosting the web services
emu.getBindingFor('web01').setDisplayName('Web-1')
emu.getBindingFor('web02').setDisplayName('Web-2')
##这个地方就解释了为什么AS151的host0和AS152的host0名字都莫名其妙地各自变成了Web-1和Web2.注意哈,本来是AS151的host0是实结点,然后虚实绑定,那么就绑定了web01,然后这里web01又改名Web-1了,所以AS151的host0也就是web01也就是Web-1,同理web02 = Web-2 = AS151的host0

第八步:编译的工作

###############################################################################
# Compilation

# Generate the Docker files
emu.compile(Docker(), './output')

# Generate other type of outputs
## 比如这个第一条就是生成可视化静态文件的,我觉得还是很有用的,我有的时候想看这个网络生成的东西,我还必须开俩容器加一个网页,问题是我就想看个拓扑啊!!~~
#emu.compile(Graphviz(), './others/graphs')
#emu.compile(DistributedDocker(), './others/distributed-docker')
#emu.compile(GcpDistributedDocker(), './others/gcp-distributed-docker')     

后续工作(非python,转到bash控制台)

第九步:动态可视化(详见本专栏第一篇)

cd client
docker-compose build
docker-compose up

URL:http://localhost:8080/map.html
`

小小反思一下:

  1. 最近似乎在学又似乎没在学,每天摸一摸摩尔庄园页游,再摸一摸taptap,摸一摸C++,再划一划b站的杜教授视频;每天好像很长时间坐在电脑前面,但是复盘一下工作量反倒不大
  2. 最近每天学东西总是习惯性码到CSDN上…我觉得效率真低,但是确实感觉思路很通顺,至少我放上去的东西都是思路通畅、逻辑清晰的复盘出来的结果
  3. 今天白天摸了好久的鱼,到了晚上八点多开始疯狂补救,小小熬夜(12点还在工位,我该不该回去了)写下这篇,终于对毕设的第一步有了大概的思路。本来是跟着杜教授视频摸的,后来看了一遍还是浑浑噩噩的,索性自己去看了一遍几十行代码,原来是这个意思,遂重新按照自己的思路重新修改了一下博客。
  4. 自动化部署网络是不难的,这一篇是手动部署;那么明天可以再看一篇比较大型网络的拓扑和examples文件夹下的代码;后天就可以自己写一个网络,并初步实现自动化(我今天想了一下,这个应该就是文件输出的问题,并不难);8号可以学习一下bgp攻击,然后进行复现;3月份完成第一步工作和第二步工作的手动攻击应该是可以的。
  5. 这一篇有啥意义呢,大概意义还是对我自己比较大,至少我复盘或者写代码的时候顺着这个思路会挺通畅。对别人的话,技术好的一看就懂犯不着看这博客,技术拉的估计安装seed配环境可视化还捣鼓半天,就当我在自言自语吧。回去了,晚安

你可能感兴趣的:(ubuntu-seed实验,安全,网络安全,网络协议,python)