Before you start, create a Google Doc. Here, you will add screenshots / code snippets / comments for each exercise. Whatever you decide to include, it must prove that you managed to solve the given task (so don't show just the output, but how you obtained it and what conclusion can be drawn from it). If you decide to complete the feedback for bonus points, include a screenshot with the form submission confirmation, but not with its contents.
When done, export the document as a pdf and upload in the appropriate assignment on moodle. Remember, the cut-off time is 15m after the lab ends.
export MANPAGER='nvim +Man!'
Export the environment variable (source the shell config file) and test that it works.
Use tcpdump to output outgoing NTP queries and incoming http(s) responses. Use the -d
flag to see an objdump of the filter program's code.
Complete the tcpdump command in order to satisfy the following formatting requirements:
How to test:
$ ntpdate -q ro.pool.ntp.org
$ curl ocw.cs.pub.ro
-D
. In addition to your network interfaces, you may also see a Bluetooth device or the dbus-system (depending on your desktop).
If you don't specify the interface with -i
, the first entry in the printed list will be used by default. This may not always be your active network interface but in stead, your docker bridge (for example).
Write an iptables rule according to the following specifications:
How to test:
$ sudo curl www.google.com $ sudo dmesg
multiport, owner modules
$ man 8 iptables-extensions
Write an iptables rule according to the following specifications:
Continue appending the same rule with incremented TTL value until the DNS request goes through.
How to test:
$ dig +short fep.grid.pub.ro @8.8.8.8
$ man 8 iptables-extensions nfbpf_compile
If you are working on Ubuntu, there is a chance that nfbpf_compile did not come with the iptables package (oh Canonical… maybe there's something in the Universe repos?).
Anyway, you can still install it manually:
$ sudo apt install libpcap-dev $ wget https://raw.githubusercontent.com/netgroup-polito/iptables/master/utils/nfbpf_compile.c $ gcc -o nfbpf_compile nfbpf_compile.c -lpcap
Also, use this man page rather than installing it separately.
Give an example when iptables is unable to catch a packet.
Use arp-scan to scan your local network while monitoring ARP traffic with wireshark to get a sense of what's going on. After that, use the following script to identify hosts discoverable via ARP but not ICMP.
With 8.8.8.8 as a target, use wireshark to view the traffic generated by both nmap and traceroute. What differences can you find in their default mode of operation?
$ sudo nmap \ -sn `# disable port scan` \ -Pn `# disable host discovery` \ -tr `# perform traceroute` \ 8.8.8.8 $ traceroute 8.8.8.8
sudo snap remove nmap && sudo apt install nmap
snap connect nmap:network-control
If we do allow for a port scan by removing -sn
(default is a TCP-based scan; use -sU
for a UDP scan), this will take place before the actual traceroute. What changes does this bring?
When doing the TCP scan with nmap, you may have noticed a weird field in the TCP header: Options. Generate some TCP traffic with curl and look at the SYN packet in wireshark. What options do you see there?
Here is a quick break down of the more common TCP options and how they are used to overcome protocol limitations and improve throughput. Take a quick look if you want, then move on. We'll dive deeper into protocol options in the next task.
Earlier in Ex. 1, we mentioned that eBPF is used for more than traffic filtering. Some of you may have heard of the eXpress Data Path (XDP) or the more recent eXpress Resubmission Path (XRP). Both of these are eBPF-powered shunts of kernel data paths that are used to optimize the system for very specific types of workloads. We'll return to these in a future lecture (and maybe a lab as well) since they can be considered advanced topics. For now, we'll focus on the third purpose eBPF can serve: execution tracing.
pwru is a tool created by Cilium to help trace network packets in the kernel's network stack and debug network connectivity issues. It does this by attaching simple eBPF programs to certain function entry points. These programs can report back to a userspace process different kinds of information, including the function that was reached, the arguments that were passed, and a CPU clock timestamp. The method used for instrumenting kernel code is based on kprobes. Ask your assistant for more information.
Install pwru on your system. Check that the minimum requirements stated on the Github page are met. Note that this tool is already provided by some public package repos (e.g.: pacman: extra/).
Now, trace all outgoing DNS queries to the Google DNS (i.e.: 8.8.8.8
) and perform one using dig. Add relative timestamps to the individual trace entries, to get an idea of the computational cost of each operation.
Finally, insert an iptables rule on the OUTPUT chain that drops DNS queries to 8.8.8.8
and redo the experiment. Check where the packet's path is cut short (the reason should be obvious :p).
Analyze the call path in the kernel network stack for the first scenario (when the packet actually made it out). Explain each step of the packet's journey.
Please take a minute to fill in the feedback form for this lab.