tcpdump เป็นโปรแกรมประเภทเดียวกับ Sniffer, Wireshark คือใช้ในการดักจับ (capture) Traffic หรือ Packet ที่ รับ/ส่ง เข้า/ออก ระหว่างพอร์ตแลน (LAN) ของเซิรฟ์เวอร์เครื่องที่รันคำสั่ง และอุปกรณ์เครือข่าย (Router, Switch, HUB)
มีประโยชน์อย่างมาก เพื่อใช้ในการวิเคราะห์ ตรวจสอบ หรือแก้ปัญหาเกี่ยวกับ Network ได้
tcpdump ต้องรันด้วย root หรือเทียบเท่า และรันแบบ command line ติดตั้งมาเป็นดีฟอลต์บนลีนุกซ์เกือบทุกตระกูล เวอร์ชั่น จึงใช้งานได้สะดวก ไม่ต้องติดตั้งเพิ่มเติมเหมือนโปรแกรมอื่นๆ
ในที่นี้ขอแนะนำวิธีการใช้งานเบื้องต้นของ tcpdump
รันคำสั่ง tcpdump
ล็อกอินเป็น root แล้วพิมพ์คำสั่ง tcpdump
หมายเหตุ พอร์ตที่ใช้ในดักจับ packet ไม่จำเป็นต้องใส่ IP Address หรือเป็น IP ในกลุ่มเดียวกับ IP อื่นๆ ใน Network ที่ต้องการดักจับ ขอให้สถานะ Up พอ
หากไม่ระบุออปชั่นใดๆ เลย tcpdump จะเลือกดักจับ packet ที่เข้าออก พอร์ตแลนแรก โดยทั่วไปคือ eth0
ตัวอย่างการรันคำสั่งแบบไม่ระบุออปชั่น
[root@server ~]# tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
09:15:53.948422 IP 192.168.1.102.jwalkserver > server.example.com.ssh: Flags [.], ack 1108, win 64623, length 0
09:15:53.955117 IP server.example.com.ssh > 192.168.1.102.jwalkserver: Flags [P.], seq 1108:1384, ack 1, win 8576, length 276
09:15:53.963948 IP server.example.com.ssh > 192.168.1.102.jwalkserver: Flags [P.], seq 1384:1548, ack 1, win 8576, length 164
09:15:53.964191 IP 192.168.1.102.jwalkserver > server.example.com.ssh: Flags [.], ack 1548, win 64183, length 0
09:15:53.972707 IP server.example.com.ssh > 192.168.1.102.jwalkserver: Flags [P.], seq 1548:1824, ack 1, win 8576, length 276
^C
102 packets captured 102 packets received by filter 0 packets dropped by kernel
กด [Ctrl-C] เพื่อออกจากคำสั่ง tcpdump ด้านล่างจะมีรายงานสรุปว่า ดักจับได้กี่ packet
ผลลัพธ์ที่แสดงจากคำสั่ง tcpdump จะแตกต่างกันไปขึ้นกับ Network Protocol ที่รับ/ส่ง เช่นถ้าเป็น IP Protocol (TCP, UDP) รูปแบบจะเป็น
- เวลา
- IP
- [Source IP Address].[Source Port]
- [Destination Address].[Destination Port]
- IP, TCP, UDP Headers
เลือกพอร์ตที่ดักจับ
ระบุออปชั่น “-i” แล้วตามด้วยชื่อพอร์ต เช่น ต้องการจับ packet ที่เข้าออก eth1
[root@server ~]# tcpdump -i eth1
tcpdump: WARNING: eth1: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
^C
ในที่นี้ พอร์ต eth1 ไม่มีการใส่ IP Address จึงขึ้นฟ้อง “WARNING: eth1: no IPv4 address assigned” แต่ก็ยังสามารถดักจับ Traffic ได้
ไม่ต้องแปลง IP เป็นชื่อ hostname
ผลลัพธ์ที่แสดงออกมา โปรแกรม tcpdump จะพยายามแปลง IP Address ทั้งต้นทาง ปลายทาง ของ packet ที่ดักจับได้ ให้เป็นชื่อ hostname โดยใช้ไฟล์ /etc/hosts หรือ บริการ DNS
ถ้าหาก traffic มีปริมาณมาก แนะนำให้ปิดคุณสมบัติการพยายามแปลง IP เป็น ชื่อ hostname ออกซะ ด้วยการระบุออปชั่น “-n” เพื่อลดโหลด DNS
[root@server ~]# tcpdump -i eth0 -l -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
09:31:10.322145 IP 192.168.1.1.ssh > 192.168.1.102.jwalkserver: Flags [P.], seq 1901277915:1901278111, ack 2244887520, win 8576, length 196
09:31:10.322752 IP 192.168.1.102.jwalkserver > 192.168.1.1.ssh: Flags [.], ack 196, win 65535, length 0
09:31:10.330843 IP 192.168.1.1.ssh > 192.168.1.102.jwalkserver: Flags [P.], seq 196:472, ack 1, win 8576, length 276
09:31:10.332785 IP 192.168.1.1.ssh > 192.168.1.102.jwalkserver: Flags [P.], seq 472:636, ack 1, win 8576, length 164
09:31:10.333209 IP 192.168.1.102.jwalkserver > 192.168.1.1.ssh: Flags [.], ack 636, win 65095, length 0
^C
ไม่ต้องแปลง Port Number เป็นชื่อ Port Name
หากต้องการแสดงชื่อพอร์ต (TCP, UDP ports) เป็นตัวเลข (ไฟล์ /etc/services) ให้ระบุออปชั่น “-n” เพิ่มอีกหนึ่ง หรือระบุเป็น “-nn” เลย
[root@server ~]# tcpdump -i eth0 -l -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
09:39:38.800430 IP 192.168.1.102.1289 > 192.168.1.1.22: Flags [.], ack 196, win 65535, length 0
09:39:38.802793 IP 192.168.1.1.22 > 192.168.1.102.1289: Flags [P.], seq 196:456, ack 1, win 8576, length 260
09:39:38.805709 IP 192.168.1.1.22 > 192.168.1.102.1289: Flags [P.], seq 456:604, ack 1, win 8576, length 148
09:39:38.805963 IP 192.168.1.102.1289 > 192.168.1.1.22: Flags [.], ack 604, win 65127, length 0
09:39:38.808655 IP 192.168.1.1.22 > 192.168.1.102.1289: Flags [P.], seq 604:848, ack 1, win 8576, length 244
^C
ผลลัพธ์แบบสั้นๆ
หากไม่สนใจ ข้อมูลใน IP, TCP, UDP Headers ต้องการรู้แค่ว่า IP อะไรคุยกัน ใช้พอร์ตอะไร แค่นั้นพอ ให้ระบุออปชั่น “-q”
[root@server ~]# tcpdump -i eth0 -l -nn -q
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
09:40:48.472427 IP 192.168.1.1.22 > 192.168.1.102.1289: tcp 196
09:40:48.473006 IP 192.168.1.102.1289 > 192.168.1.1.22: tcp 0
09:40:48.479252 IP 192.168.1.1.22 > 192.168.1.102.1289: tcp 164
09:40:48.487003 IP 192.168.1.1.22 > 192.168.1.102.1289: tcp 100
09:40:48.487311 IP 192.168.1.102.1289 > 192.168.1.1.22: tcp 0
^C
แสดงข้อมูล Layer 2 (MAC Address)
ระบุออปชั่น “-e” หากต้องการแสดงข้อมูล Layer 2 หรือแสดง Source, Destination MAC Address ด้วย
[root@server ~]# tcpdump -i eth0 -l -nn -e -q
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
09:44:05.644395 00:11:22:33:44:55 > 00:55:66:77:88:99, IPv4, length 250: 192.168.1.1.22 > 192.168.1.102.1289: tcp 196
09:44:05.644959 00:55:66:77:88:99 > 00:11:22:33:44:55, IPv4, length 60: 192.168.1.102.1289 > 192.168.1.1.22: tcp 0
09:44:05.652121 00:11:22:33:44:55 > 00:55:66:77:88:99, IPv4, length 314: 192.168.1.1.22 > 192.168.1.102.1289: tcp 260
09:44:05.660897 00:11:22:33:44:55 > 00:55:66:77:88:99, IPv4, length 218: 192.168.1.1.22 > 192.168.1.102.1289: tcp 164
09:44:05.661173 00:55:66:77:88:99 > 00:11:22:33:44:55, IPv4, length 60: 192.168.1.102.1289 > 192.168.1.1.22: tcp 0
^C
save ผลลัพธ์เก็บในไฟล์
หากต้องการบันทึก (save) ผลลัพธ์ที่ดักจับได้ ให้เหมือนกับหน้าจอที่แสดงขึ้นมา ก็ใช้การ redirection
ตัวอย่าง การเก็บผลลัพธ์ลงไฟล์ ให้เหมือนกับที่แสดงขึ้นมา
[root@server ~]# tcpdump -i eth0 -l -nn -q > catpure-display.log
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
^C
7 packets captured
7 packets received by filter
0 packets dropped by kernel
หากต้องการหยุด ก็กดปุ่ม [Ctrl-C] เหมือนกัน
ใช้คำสั่ง cat เพื่อดูเนื้อหาไฟล์ที่บันทึก
[root@server ~]# cat capture-display.log
09:57:08.118314 IP 192.168.1.1.22 > 192.168.1.102.1289: tcp 196
09:57:08.118515 IP 192.168.1.102.1289 > 192.168.1.1.22: tcp 0
09:57:09.138258 IP 192.168.1.102.1289 > 192.168.1.1.22: tcp 36
09:57:09.355761 IP 192.168.1.102.1289 > 192.168.1.1.22: tcp 36
09:57:09.356025 IP 192.168.1.1.22 > 192.168.1.102.1289: tcp 0
^C
แต่ถ้าต้องการบันทึกแบบเต็มรูปแบบ ให้ใช้ออปชั่น “-w” แล้วตามด้วยชื่อไฟล์ โดยทั่วไปนิยมบันทึกเป็นไฟล์นามสกุล “.cap”
[root@server ~]# tcpdump -i eth0 -w capture-raw.cap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
^C
24 packets captured
24 packets received by filter
0 packets dropped by kernel
ไฟล์ที่บันทึกด้วยออปชั่น “-w” สามารถนำมาเปิดย้อนหลังด้วยคำสั่ง tcpdump ตามด้วยออปชั่น “-r” นอกจากนี้ ยังสามารถนำไปเปิดกับโปรแกรม Wireshark ได้อีกด้วย
[root@server ~]# tcpdump -r capture-raw.cap -l -nn
reading from file capture-raw.cap, link-type EN10MB (Ethernet)
10:00:14.959339 IP 192.168.1.102.1289 > 192.168.1.1.22: Flags [P.], seq 105:157, ack 236, win 65431, length 52
10:00:14.972070 IP 192.168.1.1.22 > 192.168.1.102.1289: Flags [P.], seq 236:288, ack 157, win 8576, length 52
10:00:15.137079 IP 192.168.1.102.1289 > 192.168.1.1.22: Flags [.], ack 288, win 65379, length 0
10:00:15.221339 IP 192.168.1.102.1289 > 192.168.1.1.22: Flags [P.], seq 157:209, ack 288, win 65379, length 52
10:00:15.227905 IP 192.168.1.1.22 > 192.168.1.102.1289: Flags [P.], seq 288:340, ack 209, win 8576, length 52
^C