=== Step 1 Download and "install" tcpdump on UML ===
== Get the file ==
On my UML host machine (Ubuntu HVM)
wget http://archive.ubuntu.com/ubuntu/pool/main/t/tcpdump/tcpdump_4.1.1-1ubuntu2_i386.deb
== Extra the file to a folder ==
dpkg -x tcpdump_4.1.1-1ubuntu2_i386.deb ./
cp ./sbin/tcpdump ~/uml/bin/
== Copy the necessary libs ==
vic@vicubuntu:~/tcpdump/usr/sbin$ cp /lib/i686/cmov/libcrypto.so.0.9.8 ~/uml/lib/
vic@vicubuntu:~/uml/lib$ cp /usr/lib/libpcap.so.0.8 ./
vic@vicubuntu:~/uml/lib$ cp /lib/tls/i686/cmov/libc.so.6 ./
vic@vicubuntu:~/uml/lib$ cp /lib/tls/i686/cmov/libdl.so.2 ./
vic@vicubuntu:~/uml/lib$ cp /lib/libz.so.1 ./
vic@vicubuntu:~/uml/lib$ cp /lib/ld-linux.so.2 ./
== Test on UML instance ==
Start the UML instance with my script
sudo ./network1 1
Within UML instance
# tcpdump
device eth0 entered promiscuous mode
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
It is working with the "default" configuration, next we have to make it work properly, like keep the logs in a designated folder.
=== Step 2 TCPDUMP options and change scripts ===
== TCPDUMP ==
I use the following tcpdump options
tcpdump stp -n -i eth0 -U -s 0 -w /tmp/var/log/$hostname-`date +%H%M`.dmp
* STP - only listen for STP packets as we are now focusing on layer2 topology. But I did not use it. I'd rather have the full dump and filter later by using other options.
* // -n // - turn off name resolution.
* // -i eth0 // - listen only on interface eth0
* // -U // - save the packet immediately instead of waiting till the buffer is full
* // -s 0 // - Do not slice the packet. Log the raw packet.
* // -w // - write the log to another file instead of the stdio
== Turn off protocols from sniffer port ==
In order not to interfere with the // "normal // network. We have to turn off the protocols of sniffing port.
// Take out IP address by only taking it up without an IP address//
ifconfig up
// Turn off ARP //
ifconfig -arp
== Change the scripts ==
Host script
#!/bin/sh
n=$1
echo "going to create $n hosts"
screen -dmS switch uml_switch -hub -unix /home/vic/umlswitch/sw1.ctl
screen -dmS sniffer1 linux.uml rootfstype=hostfs rootflags=/home/vic/uml/ r umlid=sniffer1 hostname=sniffer1 eth0=daemon,,unix,/home/vic/umlswitch/sw1.ctl role="sniffer"
for i in `seq 1 $n`
do
screen -dmS uml$i linux.uml rootfstype=hostfs rootflags=/home/vic/uml/ r umlid=uml$i hostname=uml$i eth0=daemon,,unix,/home/vic/umlswitch/sw1.ctl ip_eth0="10.0.0.$i" mask_eth0="255.255.255.0" bc_eth0="10.0.0.255"
done
Guest script
sniffer)
echo "sniffer"
ifconfig eth0 -arp up
tcpdump -i eth0 -U -s 0 -w /var/log/$hostname-`date +%H%M`.dmp &
echo "INFO: sniffer $hostname activated"
;;
=== Step 3 Rebuild the first network and start sniffing ===
The start script of the first network in assignment 1 plus a sniffer
// network1 //
vic@vicubuntu:~$ sudo ./network1 2
going to create 2 hosts
vic@vicubuntu:~$ sudo screen -ls
There are screens on:
1249.uml2 (02/14/2011 01:44:10 PM) (Detached)
1246.uml1 (02/14/2011 01:44:10 PM) (Detached)
1240.sniffer1 (02/14/2011 01:44:10 PM) (Detached)
1238.switch (02/14/2011 01:44:10 PM) (Detached)
4 Sockets in /var/run/screen/S-root.
After the execution, I have 2 hosts, 1 sniffer attached to 1 UML switch.
== Error ==
** Error 1 **
There is error in sniffer, the // date // command is not supported by busybox. I have to // cp // it from the host together with libs.
#copy the date binary file
cp /bin/date ~/uml/bin/
#ldd to get the libs
vic@vicubuntu:~/uml/bin$ ldd date
linux-gate.so.1 => (0x003f7000)
librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0x00e92000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00269000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x0064a000)
/lib/ld-linux.so.2 (0x00b93000)
#cp them to the corresponding location for UML instance
vic@vicubuntu:~/uml/bin$ cp /lib/tls/i686/cmov/librt.so.1 ../lib/
vic@vicubuntu:~/uml/bin$ cp /lib/tls/i686/cmov/libc.so.6 ../lib/
vic@vicubuntu:~/uml/bin$ cp /lib/tls/i686/cmov/libpthread.so.0 ../lib/
vic@vicubuntu:~/uml/bin$ cp /lib/ld-linux.so.2 ../lib/
=== Step 4 Observation ===
We can use a combination of // watch // and // tcpdump // to monitor the change of the log (hence the behavior of the network)
#watch every 2 seconds by default the tcpdump result
watch 'tcpdump -xx -vv -r sniffer1-1257.dmp | tail'
# display from the tcpdump with tail
Every 2.0s: tcpdump -xx -vv -r sniffer1-1257.dmp | tail Mon Feb 14 14:08:37 2011
reading from file sniffer1-1257.dmp, link-type EN10MB (Ethernet)
0x0050: 0000 0000 0000 0000 0000 0000 0000 0000
0x0060: 0000
14:05:22.577904 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.0.0.1 tell 10.0.0.2, length 2
8
0x0000: ca6e 4beb e34b f69e e7ad e026 0806 0001
0x0010: 0800 0604 0001 f69e e7ad e026 0a00 0002
0x0020: 0000 0000 0000 0a00 0001
14:05:22.577906 ARP, Ethernet (len 6), IPv4 (len 4), Reply 10.0.0.1 is-at ca:6e:4b:eb:e3:4b (oui Unkn
own), length 28
0x0000: f69e e7ad e026 ca6e 4beb e34b 0806 0001
0x0010: 0800 0604 0002 ca6e 4beb e34b 0a00 0001
0x0020: f69e e7ad e026 0a00 0002