· 6 years ago · Dec 03, 2018, 02:48 AM
1#!/usr/bin/python
2
3"""
4hl hr
57.100 8.100
6| |
77.1 8.1
8r1--9--r2--10-r3--11-r4--12-r5--13-r6
91.1 2.1 3.1 4.1 5.1 6.1
10| | | | | |
111.100 2.100 3.100 4.100 5.100 6.100
12h1 h2 h3 h4 h5 h6
13
14
15"""
16
17
18from mininet.topo import Topo
19from mininet.net import Mininet
20from mininet.node import Node
21from mininet.log import setLogLevel, info
22from mininet.cli import CLI
23
24
25class LinuxRouter( Node ):
26 "A Node with IP forwarding enabled."
27
28 def config( self, **params ):
29 super( LinuxRouter, self).config( **params )
30 # Enable forwarding on the router
31 self.cmd( 'sysctl net.ipv4.ip_forward=1' )
32
33 def terminate( self ):
34 self.cmd( 'sysctl net.ipv4.ip_forward=0' )
35 super( LinuxRouter, self ).terminate()
36
37
38class NetworkTopo( Topo ):
39 "A LinuxRouter connecting three IP subnets"
40
41 def build( self, **_opts ):
42
43 r1 = self.addNode( 'r1', cls=LinuxRouter, ip='192.168.1.1/24' )
44 r2 = self.addNode( 'r2', cls=LinuxRouter, ip='192.168.2.1/24' )
45 r3 = self.addNode( 'r3', cls=LinuxRouter, ip='192.168.3.1/24' )
46 r4 = self.addNode( 'r4', cls=LinuxRouter, ip='192.168.4.1/24' )
47 r5 = self.addNode( 'r5', cls=LinuxRouter, ip='192.168.5.1/24' )
48 r6 = self.addNode( 'r6', cls=LinuxRouter, ip='192.168.6.1/24' )
49
50 h1 = self.addHost('h1', ip='192.168.1.100/24', defaultRoute='via 192.168.1.1')
51 h2 = self.addHost('h2', ip='192.168.2.100/24', defaultRoute='via 192.168.2.1')
52 h3 = self.addHost('h3', ip='192.168.3.100/24', defaultRoute='via 192.168.3.1')
53 h4 = self.addHost('h4', ip='192.168.4.100/24', defaultRoute='via 192.168.4.1')
54 h5 = self.addHost('h5', ip='192.168.5.100/24', defaultRoute='via 192.168.5.1')
55 h6 = self.addHost('h6', ip='192.168.6.100/24', defaultRoute='via 192.168.6.1')
56 hl = self.addHost('hl', ip='192.168.7.100/24', defaultRoute='via 192.168.7.1')
57 hr = self.addHost('hr', ip='192.168.8.100/24', defaultRoute='via 192.168.8.1')
58
59 self.addLink(h1, r1, intfName2='r1-eth1', params2={'ip': '192.168.1.1/24'})
60 self.addLink(h2, r2, intfName2='r2-eth1', params2={'ip': '192.168.2.1/24'})
61 self.addLink(h3, r3, intfName2='r3-eth1', params2={'ip': '192.168.3.1/24'})
62 self.addLink(h4, r4, intfName2='r4-eth1', params2={'ip': '192.168.4.1/24'})
63 self.addLink(h5, r5, intfName2='r5-eth1', params2={'ip': '192.168.5.1/24'})
64 self.addLink(h6, r6, intfName2='r6-eth1', params2={'ip': '192.168.6.1/24'})
65 self.addLink(hl, r1, intfName2='r1-eth2', params2={'ip': '192.168.7.1/24'})
66 self.addLink(hr, r6, intfName2='r6-eth2', params2={'ip': '192.168.8.1/24'})
67
68 self.addLink(r1, r2, intfName1='r1-eth3', intfName2='r2-eth2',
69 params1={'ip': '192.168.9.1/24'}, params2={'ip': '192.168.9.2/24'})
70 self.addLink(r2, r3, intfName1='r2-eth3', intfName2='r3-eth2',
71 params1={'ip': '192.168.10.1/24'}, params2={'ip': '192.168.10.2/24'})
72 self.addLink(r3, r4, intfName1='r3-eth3', intfName2='r4-eth2',
73 params1={'ip': '192.168.11.1/24'}, params2={'ip': '192.168.11.2/24'})
74 self.addLink(r4, r5, intfName1='r4-eth3', intfName2='r5-eth2',
75 params1={'ip': '192.168.12.1/24'}, params2={'ip': '192.168.12.2/24'})
76 self.addLink(r5, r6, intfName1='r5-eth3', intfName2='r6-eth3',
77 params1={'ip': '192.168.13.1/24'}, params2={'ip': '192.168.13.2/24'})
78
79
80def run():
81 "Test linux router"
82 topo = NetworkTopo()
83 net = Mininet( topo=topo ) # controller is used by s1-s3
84 net.start()
85 r1 = net.getNodeByName('r1')
86 r2 = net.getNodeByName('r2')
87 r3 = net.getNodeByName('r3')
88 r4 = net.getNodeByName('r4')
89 r5 = net.getNodeByName('r5')
90 r6 = net.getNodeByName('r6')
91
92 r1.popen("ip route add 192.168.2.0/24 via 192.168.9.2 dev r1-eth3")
93 r1.popen("ip route add 192.168.3.0/24 via 192.168.9.2 dev r1-eth3")
94 r1.popen("ip route add 192.168.4.0/24 via 192.168.9.2 dev r1-eth3")
95 r1.popen("ip route add 192.168.5.0/24 via 192.168.9.2 dev r1-eth3")
96 r1.popen("ip route add 192.168.6.0/24 via 192.168.9.2 dev r1-eth3")
97 r1.popen("ip route add 192.168.8.0/24 via 192.168.9.2 dev r1-eth3")
98 r1.popen("ip route add 192.168.9.0/24 dev r1-eth3")
99 r1.popen("ip route add 192.168.10.0/24 via 192.168.9.2 dev r1-eth3")
100 r1.popen("ip route add 192.168.11.0/24 via 192.168.9.2 dev r1-eth3")
101 r1.popen("ip route add 192.168.12.0/24 via 192.168.9.2 dev r1-eth3")
102 r1.popen("ip route add 192.168.13.0/24 via 192.168.9.2 dev r1-eth3")
103
104 r2.popen("ip route add 192.168.1.0/24 via 192.168.9.1 dev r2-eth2")
105 r2.popen("ip route add 192.168.7.0/24 via 192.168.9.1 dev r2-eth2")
106 r2.popen("ip route add 192.168.3.0/24 via 192.168.10.2 dev r2-eth3")
107 r2.popen("ip route add 192.168.4.0/24 via 192.168.10.2 dev r2-eth3")
108 r2.popen("ip route add 192.168.5.0/24 via 192.168.10.2 dev r2-eth3")
109 r2.popen("ip route add 192.168.6.0/24 via 192.168.10.2 dev r2-eth3")
110 r2.popen("ip route add 192.168.8.0/24 via 192.168.10.2 dev r2-eth3")
111 r2.popen("ip route add 192.168.9.0/24 dev r2-eth2")
112 r2.popen("ip route add 192.168.10.0/24 dev r2-eth3")
113 r2.popen("ip route add 192.168.11.0/24 via 192.168.10.2 dev r2-eth3")
114 r2.popen("ip route add 192.168.12.0/24 via 192.168.10.2 dev r2-eth3")
115 r2.popen("ip route add 192.168.13.0/24 via 192.168.10.2 dev r2-eth3")
116
117 r3.popen("ip route add 192.168.1.0/24 via 192.168.10.1 dev r3-eth2")
118 r3.popen("ip route add 192.168.2.0/24 via 192.168.10.1 dev r3-eth2")
119 r3.popen("ip route add 192.168.7.0/24 via 192.168.10.1 dev r3-eth2")
120 r3.popen("ip route add 192.168.4.0/24 via 192.168.11.2 dev r3-eth3")
121 r3.popen("ip route add 192.168.5.0/24 via 192.168.11.2 dev r3-eth3")
122 r3.popen("ip route add 192.168.6.0/24 via 192.168.11.2 dev r3-eth3")
123 r3.popen("ip route add 192.168.8.0/24 via 192.168.11.2 dev r3-eth3")
124 r3.popen("ip route add 192.168.9.0/24 via 192.168.10.1 dev r3-eth2")
125 r3.popen("ip route add 192.168.10.0/24 dev r3-eth2")
126 r3.popen("ip route add 192.168.11.0/24 dev r3-eth3")
127 r3.popen("ip route add 192.168.12.0/24 via 192.168.11.2 dev r3-eth3")
128 r3.popen("ip route add 192.168.13.0/24 via 192.168.11.2 dev r3-eth3")
129
130 r4.popen("ip route add 192.168.1.0/24 via 192.168.11.1 dev r4-eth2")
131 r4.popen("ip route add 192.168.2.0/24 via 192.168.11.1 dev r4-eth2")
132 r4.popen("ip route add 192.168.3.0/24 via 192.168.11.1 dev r4-eth2")
133 r4.popen("ip route add 192.168.7.0/24 via 192.168.11.1 dev r4-eth2")
134 r4.popen("ip route add 192.168.5.0/24 via 192.168.12.2 dev r4-eth3")
135 r4.popen("ip route add 192.168.6.0/24 via 192.168.12.2 dev r4-eth3")
136 r4.popen("ip route add 192.168.8.0/24 via 192.168.12.2 dev r4-eth3")
137 r4.popen("ip route add 192.168.9.0/24 via 192.168.11.1 dev r4-eth2")
138 r4.popen("ip route add 192.168.10.0/24 via 192.168.11.1 dev r4-eth2")
139 r4.popen("ip route add 192.168.11.0/24 dev r4-eth2")
140 r4.popen("ip route add 192.168.12.0/24 dev r4-eth3")
141 r4.popen("ip route add 192.168.13.0/24 via 192.168.12.2 dev r4-eth3")
142
143 r5.popen("ip route add 192.168.1.0/24 via 192.168.12.1 dev r5-eth2")
144 r5.popen("ip route add 192.168.2.0/24 via 192.168.12.1 dev r5-eth2")
145 r5.popen("ip route add 192.168.3.0/24 via 192.168.12.1 dev r5-eth2")
146 r5.popen("ip route add 192.168.4.0/24 via 192.168.12.1 dev r5-eth2")
147 r5.popen("ip route add 192.168.7.0/24 via 192.168.12.1 dev r5-eth2")
148 r5.popen("ip route add 192.168.6.0/24 via 192.168.13.2 dev r5-eth3")
149 r5.popen("ip route add 192.168.8.0/24 via 192.168.13.2 dev r5-eth3")
150 r5.popen("ip route add 192.168.9.0/24 via 192.168.12.1 dev r5-eth2")
151 r5.popen("ip route add 192.168.10.0/24 via 192.168.12.1 dev r5-eth2")
152 r5.popen("ip route add 192.168.11.0/24 via 192.168.12.1 dev r5-eth2")
153 r5.popen("ip route add 192.168.12.0/24 dev r5-eth2")
154 r5.popen("ip route add 192.168.13.0/24 dev r5-eth3")
155
156 r6.popen("ip route add 192.168.1.0/24 via 192.168.13.1 dev r6-eth3")
157 r6.popen("ip route add 192.168.2.0/24 via 192.168.13.1 dev r6-eth3")
158 r6.popen("ip route add 192.168.3.0/24 via 192.168.13.1 dev r6-eth3")
159 r6.popen("ip route add 192.168.4.0/24 via 192.168.13.1 dev r6-eth3")
160 r6.popen("ip route add 192.168.5.0/24 via 192.168.13.1 dev r6-eth3")
161 r6.popen("ip route add 192.168.7.0/24 via 192.168.13.1 dev r6-eth3")
162 r6.popen("ip route add 192.168.9.0/24 via 192.168.13.1 dev r6-eth3")
163 r6.popen("ip route add 192.168.10.0/24 via 192.168.13.1 dev r6-eth3")
164 r6.popen("ip route add 192.168.11.0/24 via 192.168.13.1 dev r6-eth3")
165 r6.popen("ip route add 192.168.12.0/24 via 192.168.13.1 dev r6-eth3")
166 r6.popen("ip route add 192.168.13.0/24 dev r6-eth3")
167 info("echo 0000 > /proc/sys/net/ipv4/icmp_ratemask\n")
168 CLI( net )
169 net.stop()
170
171if __name__ == '__main__':
172 setLogLevel( 'info' )
173 run()