-
Notifications
You must be signed in to change notification settings - Fork 85
/
Copy pathreal_world.py
executable file
·130 lines (97 loc) · 4.35 KB
/
real_world.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/usr/bin/env python3
# encoding: utf-8
from seedemu.layers import Base, Routing, Ebgp, PeerRelationship, Ibgp, Ospf
from seedemu.services import WebService
from seedemu.core import Emulator, Binding, Filter
from seedemu.raps import OpenVpnRemoteAccessProvider
from seedemu.compiler import Docker, Platform
import os, sys
def run(dumpfile = None):
###############################################################################
# Set the platform information
if dumpfile is None:
script_name = os.path.basename(__file__)
if len(sys.argv) == 1:
platform = Platform.AMD64
elif len(sys.argv) == 2:
if sys.argv[1].lower() == 'amd':
platform = Platform.AMD64
elif sys.argv[1].lower() == 'arm':
platform = Platform.ARM64
else:
print(f"Usage: {script_name} amd|arm")
sys.exit(1)
else:
print(f"Usage: {script_name} amd|arm")
sys.exit(1)
emu = Emulator()
base = Base()
routing = Routing()
ebgp = Ebgp()
ibgp = Ibgp()
ospf = Ospf()
web = WebService()
ovpn = OpenVpnRemoteAccessProvider()
###############################################################################
base.createInternetExchange(100)
base.createInternetExchange(101)
###############################################################################
# Create a transit AS (AS-150)
as150 = base.createAutonomousSystem(150)
as150.createNetwork('net0')
as150.createNetwork('net1')
as150.createNetwork('net2')
# Create 4 routers: r1 and r4 are BGP routers (connected to internet exchange)
as150.createRouter('r1').joinNetwork('ix100').joinNetwork('net0')
as150.createRouter('r2').joinNetwork('net0').joinNetwork('net1')
as150.createRouter('r3').joinNetwork('net1').joinNetwork('net2')
as150.createRouter('r4').joinNetwork('net2').joinNetwork('ix101')
###############################################################################
# Create AS-151
as151 = base.createAutonomousSystem(151)
# Create a network and enable the access from real world
as151.createNetwork('net0').enableRemoteAccess(ovpn)
as151.createRouter('router0').joinNetwork('net0').joinNetwork('ix100')
# Create a web host
as151.createHost('web').joinNetwork('net0')
web.install('web1')
emu.addBinding(Binding('web1', filter = Filter(asn = 151, nodeName = 'web')))
###############################################################################
# Create AS-152
as152 = base.createAutonomousSystem(152)
# Create a network and enable the access from real world
as152.createNetwork('net0').enableRemoteAccess(ovpn)
as152.createRouter('router0').joinNetwork('net0').joinNetwork('ix101')
# Create a web host
as152.createHost('web').joinNetwork('net0')
web.install('web2')
emu.addBinding(Binding('web2', filter = Filter(asn = 152, nodeName = 'web')))
###############################################################################
# Create a real-world AS.
# AS11872 is the Syracuse University's autonomous system
# The network prefixes announced by this AS will be collected from the real Internet
# Packets coming into this AS will be routed out to the real world.
as11872 = base.createAutonomousSystem(11872)
as11872.createRealWorldRouter('rw').joinNetwork('ix101', '10.101.0.118')
###############################################################################
# BGP peering
ebgp.addPrivatePeering(100, 150, 151, abRelationship = PeerRelationship.Provider)
ebgp.addPrivatePeering(101, 150, 152, abRelationship = PeerRelationship.Provider)
ebgp.addPrivatePeering(101, 150, 11872, abRelationship = PeerRelationship.Unfiltered)
###############################################################################
# Rendering
emu.addLayer(base)
emu.addLayer(routing)
emu.addLayer(ebgp)
emu.addLayer(ibgp)
emu.addLayer(ospf)
emu.addLayer(web)
if dumpfile is not None:
emu.dump(dumpfile)
else:
emu.render()
###############################################################################
# Compilation
emu.compile(Docker(platform=platform), './output', override=True)
if __name__ == "__main__":
run()