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