obfsucator / example / topology.py
topology.py
Raw
from mininet.net import Mininet
from mininet.node import RemoteController, OVSSwitch, OVSKernelSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel, info

import time

# Web server code -----
WEB_SERVER = '''
import json
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def cip():
    return json.dumps({
      "clientIP": "%s",
    }) 
if __name__ == '__main__':
    app.run(debug=False, port=%d, host="0.0.0.0")
'''
# -----------------------


def run_webserver(node, port, name):
    node.cmd('web=`cat <<EOF\n{}\nEOF` && nohup python3 -c "$web" > /dev/null 2>&1 &'.format(WEB_SERVER % (name, port)))


def ExampleNetwork():

    net = Mininet(switch=OVSSwitch, build=False, topo=None)

    info("*** Adding Controllers\n")
    ctrl = net.addController("ctrl", controller=RemoteController, port=6633)  # obfuscator controller

    info("*** Adding Switches\n")
    s1 = net.addSwitch("s1", cls=OVSKernelSwitch, dpid="0000000000000001")

    info("*** Adding Hosts\n")
    c1 = net.addHost("c1")
    plc = net.addHost("plc")
    hp1 = net.addHost("hp1")
    hp2 = net.addHost("hp2")

    info("*** Adding Links\n")
    net.addLink(c1, s1)
    net.addLink(plc, s1)
    net.addLink(hp1, s1)
    net.addLink(hp2, s1)

    info("*** Building Network\n")
    net.build()

    info("*** Setting Host Interface Values\n")

    c1.intf("c1-eth0").setIP("10.0.0.1", 24)
    c1.intf("c1-eth0").setMAC("00:aa:aa:aa:aa:aa")
    plc.intf("plc-eth0").setIP("10.0.0.2", 24)
    plc.intf("plc-eth0").setMAC("00:aa:aa:aa:aa:bb")
    hp1.intf("hp1-eth0").setIP("10.0.0.3", 24)
    hp1.intf("hp1-eth0").setMAC("00:aa:aa:aa:aa:cc")
    hp2.intf("hp2-eth0").setIP("10.0.0.4", 24)
    hp2.intf("hp2-eth0").setMAC("00:aa:aa:aa:aa:dd")

    info("*** Setting Switch Interface Values\n")

    s1.intf("s1-eth1").setMAC("00:cc:cc:cc:cc:aa")
    s1.intf("s1-eth2").setMAC("00:cc:cc:cc:cc:bb")
    s1.intf("s1-eth3").setMAC("00:cc:cc:cc:cc:cc")
    s1.intf("s1-eth4").setMAC("00:cc:cc:cc:cc:dd")

    for controller in net.controllers:
        controller.start()

    s1.start([ctrl])

    info("*** Starting Web Server...\n")
    run_webserver(plc, 80, "plc")
    run_webserver(plc, 8080, "plc")
    run_webserver(plc, 81, "plc")
    run_webserver(plc, 82, "plc")
    run_webserver(plc, 83, "plc")
    run_webserver(hp1, 80, "hp1")
    run_webserver(hp2, 8080, "hp2")
    time.sleep(3)

    info("*** Running CLI\n")
    CLI(net)

    info("*** Stopping Network\n")
    net.stop()


if __name__ == "__main__":
    setLogLevel("info")  # for CLI output
    ExampleNetwork()