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