20210503 Containernet / Mininet-Wifi ( Miniedit )
課堂資料
Containernet ( Dockernet )
Mininet-Wifi ( Miniedit )
課堂練習
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

Previous20210426 Group TableNext20210510 Programming Protocol-independent Packet Processors ( P4 ) - 1
Last updated
Was this helpful?