Notes - Network Simulation and Analysis
  • 網路模擬與分析
  • 期中
    • 20210222 Ubuntu 與 Mininet 的安裝
    • 20210308 Iperf
    • 20210315 Gnuplot
    • 20210322 Bridge ( 一 )
    • 20210329 Bridge ( 二 )
    • 20210412 Openvswitch ( 一 )
    • 20210419 期中週
  • 期末
    • 20210426 Group Table
    • 20210503 Containernet / Mininet-Wifi ( Miniedit )
    • 20210510 Programming Protocol-independent Packet Processors ( P4 ) - 1
    • 20210517 Programming Protocol-independent Packet Processors ( P4 ) - 2
    • 20210524 Programming Protocol-independent Packet Processors ( P4 ) - 3
    • 20210531 Programming Protocol-independent Packet Processors ( P4 ) - 4
    • 20210607 Programming Protocol-independent Packet Processors ( P4 ) - Finish
Powered by GitBook
On this page
  • 課堂資料
  • Containernet ( Dockernet )
  • Mininet-Wifi ( Miniedit )
  • 課堂練習
  • Containernet ( Dockernet )
  • Containernet ( SSH Tunnel )
  • Mininet-Wifi ( Miniedit )

Was this helpful?

  1. 期末

20210503 Containernet / Mininet-Wifi ( Miniedit )

Previous20210426 Group TableNext20210510 Programming Protocol-independent Packet Processors ( P4 ) - 1

Last updated 3 years ago

Was this helpful?

課堂資料

Containernet ( Dockernet )

Mininet-Wifi ( Miniedit )

進行Mininet-Wifi實驗時,需停下NetworkManager

課堂練習

Containernet ( Dockernet )

cd containernet
python3 ./setup.py install
docker pull ubuntu:16.04
docker images
apt update
apt upgrade
apt install openssh-server -y

建立兩組使用者密碼及sshd

docker run -it ubuntu:16.04 bash

建立 sshd1

adduser user

建立 sshd2

passwd user
apt update
apt install net-tools
ifconfig
apt install iputils-ping
ping 8.8.8.8
docker ps

建立 sshd1

docker commit 9f6 ubuntu:sshd1
docker images
docker rmi 4be
docker ps
docker commit 9f6 ubuntu:sshd1

建立 sshd2

docker commit 9f6 ubuntu:sshd2
docker images
docker ps

啟動 sshd

docker exec -it mn.d1 bash

d1

ifconfig d1-eth0 10.0.0.251/24
ifconfig
apt install openssh-server -y
/etc/init.d/ssh start
netstat -tulnp | grep 22

啟動 sshd

docker exec -it mn.d2 bash

d2

ifconfig d2-eth0 10.0.0.252/24
ifconfig
apt install openssh-server -y
/etc/init.d/ssh start
netstat -tulnp | grep 22
cd containernet-test
gedit 1.py
python3 1.py
xterm h1

1.py

#!/usr/bin/python
"""
This is the most simple example to showcase Containernet.
"""
from mininet.net import Containernet
from mininet.node import Controller
from mininet.cli import CLI
from mininet.link import TCLink
from mininet.log import info, setLogLevel
setLogLevel('info')

net = Containernet(controller=Controller)
info('*** Adding controller\n')
net.addController('c0')
info('*** Adding docker containers\n')
h1 = net.addHost('h1', ip='10.0.0.250/24')
d1 = net.addDocker('d1', ip='10.0.0.251/24', dimage="ubuntu:sshd1")
d2 = net.addDocker('d2', ip='10.0.0.252/24', dimage="ubuntu:sshd2")
info('*** Adding switches\n')
s1 = net.addSwitch('s1')
info('*** Creating links\n')
net.addLink(h1, s1)
net.addLink(d1, s1)
net.addLink(d2, s1)
info('*** Starting network\n')
net.start()
info('*** Running CLI\n')
CLI(net)
info('*** Stopping network')
net.stop()
cd ..
cd .ssh/
ls
rm known_hosts
ssh user@10.0.0.251

Containernet ( SSH Tunnel )

實驗一

cd server-test/test-sshtunnel
gedit 1.py 2.py 3.py 4.py 5.py
python3 1.py
xterm h1

1.py

#!/usr/bin/python
from mininet.net import Containernet
from mininet.node import Docker
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Link
 
def topology():
 
    "Create a network with some docker containers acting as hosts."
    net = Containernet()
 
    info('*** Adding hosts\n')
    h1 = net.addHost('h1', ip='192.168.0.1/24')
    d1 = net.addDocker('d1', ip='192.168.0.2/24', dimage="smallko/php-apache-dev:v10")
 
    info('*** Creating links\n')
    net.addLink(h1, d1)
   
    info('*** Starting network\n')
    net.start()
    d1.cmd("/etc/init.d/ssh start")
    #d1.cmd("/etc/init.d/apache2 start")
    #h1.cmd("ssh -Nf -L 192.168.0.1:5555:192.168.0.2:80 user@192.168.0.2")   
 
    info('*** Running CLI\n')
    CLI(net)
 
    info('*** Stopping network')
    net.stop()
 
if __name__ == '__main__':
    setLogLevel('info')
    topology()

2.py

#!/usr/bin/python
from mininet.net import Containernet
from mininet.node import Docker
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Link
 
def topology():
 
    "Create a network with some docker containers acting as hosts."
    net = Containernet()
 
    info('*** Adding hosts\n')
    h1 = net.addHost('h1', ip='192.168.0.1/24')
    d1 = net.addDocker('d1', ip='192.168.0.2/24', dimage="smallko/php-apache-dev:v10")
    h2 = net.addHost('h2', ip='192.168.0.3/24')
    br1 = net.addHost('br1')
 
    info('*** Creating links\n')
    net.addLink(h1, br1)
    net.addLink(d1, br1)
    net.addLink(h2, br1)
   
    info('*** Starting network\n')
    net.start()
    d1.cmd("/etc/init.d/ssh start")
    br1.cmd("ifconfig br1-eth0 0")
    br1.cmd("ifconfig br1-eth1 0")
    br1.cmd("ifconfig br1-eth2 0")
    br1.cmd("brctl addbr br1")
    br1.cmd("brctl addif br1 br1-eth0")
    br1.cmd("brctl addif br1 br1-eth1")
    br1.cmd("brctl addif br1 br1-eth2")
    br1.cmd("ifconfig br1 up") 
 
    info('*** Running CLI\n')
    CLI(net)
 
    info('*** Stopping network')
    net.stop()
 
if __name__ == '__main__':
    setLogLevel('info')
    topology()

3.py

#!/usr/bin/python
from mininet.net import Containernet
from mininet.node import Docker
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Link
 
def topology():
 
    "Create a network with some docker containers acting as hosts."
    net = Containernet()
 
    info('*** Adding hosts\n')
    h1 = net.addHost('h1', ip='192.168.0.1/24')
    r1 = net.addHost('r1', ip='192.168.0.254/24')
    d1 = net.addDocker('d1', ip='10.0.0.1/24', dimage="smallko/php-apache-dev:v10")
 
    info('*** Creating links\n')
    net.addLink(h1, r1)
    net.addLink(r1, d1)
   
    info('*** Starting network\n')
    net.start()
    d1.cmd("/etc/init.d/ssh start")
    r1.cmd("ifconfig r1-eth1 0")
    r1.cmd("ip addr add 10.0.0.2/24 brd + dev r1-eth1")
    r1.cmd("echo 1 > /proc/sys/net/ipv4/ip_forward")
    r1.cmd("iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o r1-eth1 -j MASQUERADE")
    h1.cmd("ip route add default via 192.168.0.254")
    #h1.cmd("python -m SimpleHTTPServer 80 &") 
 
    info('*** Running CLI\n')
    CLI(net)
 
    info('*** Stopping network')
    net.stop()
 
if __name__ == '__main__':
    setLogLevel('info')
    topology()

4.py

#!/usr/bin/python
from mininet.net import Containernet
from mininet.node import Docker
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Link
 
def topology():
 
    "Create a network with some docker containers acting as hosts."
    net = Containernet()
 
    info('*** Adding hosts\n')
    h1 = net.addHost('h1', ip='192.168.0.1/24')
    h2 = net.addHost('h2', ip='192.168.0.2/24')
    br1 = net.addHost('br1')
    r1 = net.addHost('r1', ip='192.168.0.254/24')
    d1 = net.addDocker('d1', ip='10.0.0.1/24', dimage="smallko/php-apache-dev:v10")
 
    info('*** Creating links\n')
    net.addLink(h1, br1)
    net.addLink(h2, br1)
    net.addLink(r1, br1)
    net.addLink(r1, d1)
    
    info('*** Starting network\n')
    net.start()
    d1.cmd("/etc/init.d/ssh start")
    r1.cmd("ifconfig r1-eth1 0")
    r1.cmd("ip addr add 10.0.0.2/24 brd + dev r1-eth1")
    r1.cmd("echo 1 > /proc/sys/net/ipv4/ip_forward")
    r1.cmd("iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o r1-eth1 -j MASQUERADE")
    h1.cmd("ip route add default via 192.168.0.254")
    br1.cmd("ifconfig br1-eth0 0")
    br1.cmd("ifconfig br1-eth1 0")
    br1.cmd("ifconfig br1-eth2 0")
    br1.cmd("brctl addbr br1")
    br1.cmd("brctl addif br1 br1-eth0")
    br1.cmd("brctl addif br1 br1-eth1")
    br1.cmd("brctl addif br1 br1-eth2")
    br1.cmd("ifconfig br1 up") 
 
    info('*** Running CLI\n')
    CLI(net)
 
    info('*** Stopping network')
    net.stop()
 
if __name__ == '__main__':
    setLogLevel('info')
    topology()

5.py

#!/usr/bin/python
from mininet.net import Containernet
from mininet.node import Docker
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Link
 
def topology():
 
    "Create a network with some docker containers acting as hosts."
    net = Containernet()
 
    info('*** Adding hosts\n')
    h1 = net.addHost('h1', ip='192.168.0.1/24')
    r1 = net.addHost('r1', ip='192.168.0.254/24')
    d1 = net.addDocker('d1', ip='10.0.0.1/24', dimage="smallko/php-apache-dev:v10")
    br1 = net.addHost('br1')
    h2 = net.addHost('h2', ip='10.0.0.3/24')
    h3 = net.addHost('h3', ip='10.0.0.4/24')
 
    info('*** Creating links\n')
    net.addLink(h1, r1)
    net.addLink(r1, br1)
    net.addLink(d1, br1)
    net.addLink(h2, br1)
    net.addLink(h3, br1)
   
    info('*** Starting network\n')
    net.start()
    d1.cmd("/etc/init.d/ssh start")
    r1.cmd("ifconfig r1-eth1 0")
    r1.cmd("ip addr add 10.0.0.2/24 brd + dev r1-eth1")
    r1.cmd("echo 1 > /proc/sys/net/ipv4/ip_forward")
    r1.cmd("iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o r1-eth1 -j MASQUERADE")
    r1.cmd("iptables -A FORWARD -s 192.168.0.1 -p tcp --dport 80 -j REJECT")
    h1.cmd("ip route add default via 192.168.0.254")
    br1.cmd("ifconfig br1-eth0 0")
    br1.cmd("ifconfig br1-eth1 0")
    br1.cmd("ifconfig br1-eth2 0")
    br1.cmd("ifconfig br1-eth3 0")
    br1.cmd("brctl addbr br1")
    br1.cmd("brctl addif br1 br1-eth0")
    br1.cmd("brctl addif br1 br1-eth1")
    br1.cmd("brctl addif br1 br1-eth2")
    br1.cmd("brctl addif br1 br1-eth3")
    br1.cmd("ifconfig br1 up") 
   
    info('*** Running CLI\n')
    CLI(net)
 
    info('*** Stopping network')
    net.stop()
 
if __name__ == '__main__':
    setLogLevel('info')
    topology()
docker pull smallko/php-apache-dev:v10
ifconfig
docker exec -it mn.d1 bash
python -m SimpleHTTPServer 80
curl 192.168.0.2

建立 ssh 加密登入

ssh -Nf -L 5555:192.168.0.2:80 user@192.168.0.2
curl 127.0.0.1:5555

exit

實驗二

python3 2.py
xterm h2
xterm h1
ls
cat hi.htm
python -m SimpleHTTPServer 80
ssh -Nf -L 5555:192.168.0.3:80 user@192.168.0.2
curl 127.0.0.1:5555
curl 127.0.0.1:5555/hi.htm
exit

實驗三

python3 3.py
xterm h1
xterm h1
docker exec -it mn.d1 bash
ifconfig
ping 192.168.0.1
netstat -tulnp | grep ssh
curl 127.0.0.1:5555/hi.htm
ifconfig
ping 10.0.0.1 -c 5
python -m SimpleHTTPServer 80
ssh -Nf -R 10.0.0.1:5555:192.168.0.1:80user@10.0.0.1
  • -R:反向

exit

實驗四

python3 4.py
xterm h1 h2
docker exec -it mn.d1 bash
curl 127.0.0.1:5555/hi.htm
ping 192.168.0.1 -c 5
python -m SimpleHTTPServer 80

ping 10.0.0.1 -c 5
ssh -Nf -R 10.0.0.1:5555:192.168.0.2:80user@10.0.0.1
exit

實驗五

python3 5.py
xterm h2 h3
xterm h1
ocker exec -it mn.d1 bash
python -m SimpleHTTPServer 80
python -m SimpleHTTPServer 80
ping 10.0.0.3 -c 5
ping 10.0.0.4 -c 5
curl 10.0.0.3/hi.htm
curl 10.0.0.4/hi.htm
ssh -Nf -D 127.0.0.1:8080 user@10.0.0.1
  • -D:Dynamic

su - user
firefox

設定 firefox

exit

Static routing vs Dynamic Routing

cd containernet
python3 ./setup.py install
cd ..
cd server-test/test-quagga/
 python3 static_routing.py
xterm h1 r1
ping 192.168.2.1 -c 5
traceroute 192.168.2.1
route -n
docker images
docker pull kathara/quagga
cd dynamic_routing
cd r1
cd quagga
ls
pwd
cd ..
cd ..
cd ..
python3 dynamic_routing.py
exit
ping 192.168.2.1
traceroute 192.168.2.1
docker ps
docker exec -it mn.r1 bash
telnet localhost 2601
sh ip ro
docker exec -it mn.r2 bash
telnet localhost 2601
sh ip ro

OSPF

exit
cd server-test/test-quagga-ospf/
ls
docker images
python3 dynamic_routing.py
h1 ping h2 -c 5
xterm h2 h1
docker exec -it mn.r1 bash
telnet localhost 2604
en
sh ip
sh ip ospf
sh ip ospf nei
sh ip ospf ro

關閉eth1後

sh ip ospf ro
traceroute 192.168.2.1
ping 192.168.2.1 -c 5
traceroute 192.168.2.1
docker exec -it mn.r1 bash
ifconfig r1-eth1 down

Mininet-Wifi ( Miniedit )

cd mininet-wifi
cd examples
python miniedit.py
cd ..
cd ..
cd test-miniedit
gedit lab3.py

更改 Controller Type 後

lab3.py

#!/usr/bin/python

from mininet.net import Mininet
from mininet.node import RemoteController, OVSKernelSwitch, Host
from mininet.cli import CLI
from mininet.link import TCLink, Intf
from mininet.log import setLogLevel, info
from subprocess import call


def myNetwork():

    net = Mininet(topo=None,
                       build=False,
                       ipBase='10.0.0.0/8')

    info( '*** Adding controller\n' )
    c0 = net.addController(name='c0',
                           controller=RemoteController,
                           ip='127.0.0.1',
                           protocol='tcp',
                           port=6633)

    info( '*** Add switches/APs\n')
    s2 = net.addSwitch('s2', cls=OVSKernelSwitch)
    s1 = net.addSwitch('s1', cls=OVSKernelSwitch)

    info( '*** Add hosts/stations\n')
    h2 = net.addHost('h2', cls=Host, ip='10.0.0.2', defaultRoute=None)
    h1 = net.addHost('h1', cls=Host, ip='10.0.0.1', defaultRoute=None)

    info( '*** Add links\n')
    net.addLink(s1, s2)
    net.addLink(s2, h2)
    net.addLink(h1, s1)

    info( '*** Starting network\n')
    net.build()
    info( '*** Starting controllers\n')
    for controller in net.controllers:
        controller.start()

    info( '*** Starting switches/APs\n')
    net.get('s2').start([c0])
    net.get('s1').start([c0])

    info( '*** Post configure nodes\n')

    CLI(net)
    net.stop()


if __name__ == '__main__':
    setLogLevel( 'info' )
    myNetwork()
python lab3.py
h1 ping h2 -c 5

更改 Controller Type 後

python lab3.py
h1 ping h2 -c 5

ryu 實驗後

h1 ping h2 -c 5
sh ovs-ofctl dump-flows s1
sh ovs-ofctl dump-flows s2

h1 ping h2 之前

ovs-ofctl dump-flows s1
ovs-ofctl dump-flows s2

h1 ping h2 之後

ovs-ofctl dump-flows s1
ovs-ofctl dump-flows s2

更改 Controller Type 後

cd ..
cd ryu
cd ryu
cd app
ryu-manager simple_switch.py

cd mininet-wifi
util/install.sh -n
cd examples
python miniedit.py
py sta1.params
py sta1.wintfs
py sta1.wintfs[0].txpower
sta1 iwconfig
py sta1.setRange(10, intf='sta1-wlan0')
cd test-miniedit
gedit 7.py
python 7.py
sta1 ifconfig

與無線網路相關

sta1 iwconfig
sta2 iwconfig
sta1 ping sta2 -c 5
xterm sta1

7.py

#!/usr/bin/python

from mininet.log import setLogLevel, info
from mn_wifi.net import Mininet_wifi
from mn_wifi.node import Station, OVSKernelAP
from mn_wifi.cli import CLI
from mn_wifi.link import wmediumd
from mn_wifi.wmediumdConnector import interference
from subprocess import call


def myNetwork():

    net = Mininet_wifi(topo=None,
                       build=False,
                       link=wmediumd,
                       wmediumd_mode=interference,
                       ipBase='10.0.0.0/8')

    info( '*** Adding controller\n' )
    info( '*** Add switches/APs\n')
    ap3 = net.addAccessPoint('ap3', cls=OVSKernelAP, ssid='ap3-ssid',
                             channel='1', mode='g', position='526.0,325.0,0')
    ap1 = net.addAccessPoint('ap1', cls=OVSKernelAP, ssid='ap1-ssid',
                             channel='1', mode='g', position='442.0,199.0,0')
    ap2 = net.addAccessPoint('ap2', cls=OVSKernelAP, ssid='ap2-ssid',
                             channel='1', mode='g', position='372.0,328.0,0')

    info( '*** Add hosts/stations\n')
    sta1 = net.addStation('sta1', ip='10.0.0.1',
                           position='297.0,199.0,0')
    sta2 = net.addStation('sta2', ip='10.0.0.2',
                           position='590.0,200.0,0')

    info("*** Configuring Propagation Model\n")
    net.setPropagationModel(model="logDistance", exp=3)

    info("*** Configuring wifi nodes\n")
    net.configureWifiNodes()

    info( '*** Add links\n')
    net.addLink(sta1, ap1)
    net.addLink(ap1, sta2)

    net.plotGraph(max_x=1000, max_y=1000)

    info( '*** Starting network\n')
    net.build()
    info( '*** Starting controllers\n')
    for controller in net.controllers:
        controller.start()

    info( '*** Starting switches/APs\n')
    net.get('ap3').start([])
    net.get('ap1').start([])
    net.get('ap2').start([])

    info( '*** Post configure nodes\n')

    CLI(net)
    net.stop()


if __name__ == '__main__':
    setLogLevel( 'info' )
    myNetwork()
mx sta1 iwconfig

主動式掃描附近基地台

mx sta1 iwlist sta1-wlan0 scan
mx sta2 iwlist sta2-wlan0 scan
mx sta1 iw dev sta1-wlan0 disconnect
mx sta1 iwconfig
mx sta1 iwlist sta1-wlan0 scan
mx sta1 iw dev sta1-wlan0 connect ap1-ssid
mx sta1 ping 10.0.0.2
mx ap1 iwconfig
mx ap1 iw dev ap1-wlan1 station dump
mx ap1 iw dev ap1-wlan1 station dump | grep Station
http://csie.nqu.edu.tw/smallko/sdn/routing.htmcsie.nqu.edu.tw
mininetDropbox
Logo
UsageMininet-WiFi