相关代码:
#!/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)
相关代码:
###############################################################################
# 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')
相关代码:
###############################################################################
# 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')
此步结果:
AS151是边缘网络,顾名思义是有主机的,所以加了俩host上去。而host0上又部署了telnet服务,还有什么特殊命令。然后呢,这俩host应该分别叫host0和host1,但是为啥host0名字变成Web-1了呢?这个是后话,总之目前代码到这一步,它应该是host0的,马上继续往下看
相关代码:
###############################################################################
# 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')
此步结果:
有了AS151的基础,AS152就显得很简单了,没啥好说的
相关代码:
###############################################################################
# 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上还连了俩没跑服务的主机。
相关代码:
###############################################################################
# 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上。
###############################################################################
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')
cd client
docker-compose build
docker-compose up
URL:http://localhost:8080/map.html
`
小小反思一下:
- 最近似乎在学又似乎没在学,每天摸一摸摩尔庄园页游,再摸一摸taptap,摸一摸C++,再划一划b站的杜教授视频;每天好像很长时间坐在电脑前面,但是复盘一下工作量反倒不大
- 最近每天学东西总是习惯性码到CSDN上…我觉得效率真低,但是确实感觉思路很通顺,至少我放上去的东西都是思路通畅、逻辑清晰的复盘出来的结果
- 今天白天摸了好久的鱼,到了晚上八点多开始疯狂补救,小小熬夜(12点还在工位,我该不该回去了)写下这篇,终于对毕设的第一步有了大概的思路。本来是跟着杜教授视频摸的,后来看了一遍还是浑浑噩噩的,索性自己去看了一遍几十行代码,原来是这个意思,遂重新按照自己的思路重新修改了一下博客。
- 自动化部署网络是不难的,这一篇是手动部署;那么明天可以再看一篇比较大型网络的拓扑和examples文件夹下的代码;后天就可以自己写一个网络,并初步实现自动化(我今天想了一下,这个应该就是文件输出的问题,并不难);8号可以学习一下bgp攻击,然后进行复现;3月份完成第一步工作和第二步工作的手动攻击应该是可以的。
- 这一篇有啥意义呢,大概意义还是对我自己比较大,至少我复盘或者写代码的时候顺着这个思路会挺通畅。对别人的话,技术好的一看就懂犯不着看这博客,技术拉的估计安装seed配环境可视化还捣鼓半天,就当我在自言自语吧。回去了,晚安