Giriş
tcpdump aracı Wireshark veya
tshark kadar gelişmiş değil. Ancak çoğu Linux'ta kurulu geldiği için öğrenmekte fayda var.
İsminden sadece tcp trafiğinin analiz edilebildiği sanılmasın, udp ve icmp trafiğini de gösterebiliyor. Hatta tcpdump ile "-e" seçeneği kullanılarak Layer 2 MAC adreslerini görmek bile mümkün.
tcpdump Alternatifleri
1. Wireshark
2. tshark
ip6 seçeneği
Şöyle
yaparız.
tcpdump -ni eth3 ip6 -s0
-c seçeneğiKaç tane paketi işledikten sonra durması gerektiğini belirtir.
Örnek
50 paketi yakalamak için şöyle
yaparız.
tcpdump -s0 -i wlan0 -C 50 -w /path/to/ capture-$(date +%a-%d%m%y-%H%M-%S).pcap
dst seçeneği
Hedef ip ve port numarasını görmek için şöyle
yaparız.
tcpdump -i eth0 dst port 6005
-e seçeneği
MAC zarfını da yakalar. Şöyle
yaparız.
tcpdump -e -i eth0
-ether seçeneği
Belli bir mac adresine göre filtreleme yapabilmeyi
Örnek
sudo tcpdump ether host aa:bb:cc:11:22:33
-i seçeneği - interface
Kullanılması istenilen arayüzü belirtir.
Örnek
eth0'daki paketleri yakalayıp dosyaya yazmak için şöyle
yaparız. -s ile snaplen tanımlanır. 0 verilirse 65535 byte anlamına gelir.
tcpdump -s0 -i eth0 -w eth0_traffic.pcap
-n
Açıklaması
şöyle. IP adresini rakam olarak gösterir.
-n Don’t convert host addresses to names. This can be used to avoid DNS lookups.
-nn Don’t convert protocol and port numbers etc. to names either.
Örnek
# tcpdump -nn 'icmp and (src a.b.0.1 or dst a.b.0.1)'
-p seçeneği
Açıklaması
şöyle. Gösterilmesi istenen protocol belirtilir
Packet capture utilities can trivially put the network device into promiscuous mode, which is to say that the device accepts everything it receives. In fact, this is usually the default: with tcpdump, you have to specify the -p option in order to not do it.
host seçeneğiÖrnek
tcpdump -i lo -nnvvv host 192.168.1.100 and port 8000
port seçeneği
Ağ arayüzü belirtmezsek default arayüz kullanır. Şöyle
yaparız.
tcpdump port 80
Ağ arayüzü ile kullanmak için şöyle
yaparız.
tcpdump -i eth0 port 80
udp seçeneği
Şöyle
yaparız
tcpdump udp port 53
src seçeneği
Source alanı belirtilen IP olan paketleri yakalamak için şöyle
yaparız.
tcpdump -n src host 192.168.1.m2 -w network.pcap
-t seçeneği
tcpdump çıktısından timestamp görmek istemiyorsak -t kullanırız.
-v seçeneğiÇıktının verbose olmasını sağlar.
-vv seçeneği
Çıktının daha da verbose olmasını sağlar. Şöyle
yaparız.
tcpdump -nnvvXSs 1514 -i <interface> port 80 -w output.pcap.
-w seçeneği - write
Belirtilen dosyaya yazar.
Örnek
Şöyle
yaparız
tcpdump -i eth0 'port 443' -vvv -w network.cap
Örnek
$ tcpdump tcp ‘port 443 or port 80’ -w out-file
-X seçeneği
Gelen paketlerin sadece header alanını değil, içini de gösterir. Açıklaması
şöyle-X When parsing and printing, in addition to printing the headers of each packet, print the data of each packet (minus its link level header).
filtre Örnekleri
Önce Berkeley Packet Filter (BPF) açıklamasına
bakalım.
What is BPF?
BPF (or more commonly, the extended version, eBPF) is a language that was originally used exclusively for filtering packets, but it is capable of quite a lot more. On Linux, it can be used for many other things, including system call filters for security, and performance monitoring, as you pointed out. While Windows did add eBPF support, that is not what Windows' perfmon utility uses. Windows only added support for compatibility with non-Windows utilities that rely on OS support for eBPF.
The eBPF programs are not executed in userspace. Instead, the application creates and sends an eBPF program to the kernel, which executes it. It is actually machine code for a virtual processor that is implemented in the form of an interpreter in the kernel, although it can also use JIT compilation to enhance performance considerably. The program has access to some basic interfaces in the kernel, including those related to performance and networking. The eBPF program then communicates with the kernel to provide it the computational results (such as dropping a packet).
BPF bazı kısıtlamalar ile geliyor. Açıklaması
şöyle
Restrictions on eBPF programs
In order to protect from denial-of-service attacks or accidental crashes, the kernel first verifies the code before it is compiled. Before being run, the code is subject to several important checks:
- The program consists of no more than 4096 instructions in total.
- Backwards jumps cannot occur, with the exception of bounded loops.
- There are no instructions that are always unreachable.
The upshot is that the verifier must be able to prove that the eBPF program halts. It hasn't found a solution to the halting problem, of course, which is why it only accepts programs that it knows will halt. To do this, it represents the program as a directed acyclic graph. In addition to this, it tries to prevent information leaks and out-of-bounds memory access. The verifier thus further ensures:
- Pointer comparison cannot be performed.
- Pointer arithmetic can only be done with a scalar (a value not derived from a pointer).
- No pointer arithmetic results in a pointer outside of its designated memory space.
Pointers cannot be stored or returned as a value, so the eBPF program is "blind" to them.
The verifier is rather complex and does far more, although it has itself been the source of serious security bugs, at least when the bpf(2) syscall is not disabled for unprivileged users.
BPF kodunu görmek için -d seçeneği kullanılır. Şöyle
yaparız# tcpdump -i eth0 "dst host 192.168.1.0" -d
(000) ldh [12]
(001) jeq #0x800 jt 2 jf 4
(002) ld [30]
(003) jeq #0xc0a80100 jt 8 jf 9
(004) jeq #0x806 jt 6 jf 5
(005) jeq #0x8035 jt 6 jf 9
(006) ld [38]
(007) jeq #0xc0a80100 jt 8 jf 9
(008) ret #262144
(009) ret #0
Örnek
Şöyle
yaparız.
tcpdump -i eth0 "dst host 192.168.1.0"
Örnek
Şöyle
yaparız.
tcpdump -i eno1 -v "icmp or arp"
Örnek
udp ve ip alanlarına göre filtrelemek için şöyle
yaparız.
tcpdump -i tun1001 "(udp[2:2]==3784) and ip[9] &255==17 and ((udp[8] &0x1f)>0)"
-vvv -s 0 -XX
Örnek
Şöyle
yaparız.
tcpdump -i eth0 'tcp[13] & 16!=0'