When a network application does not run as expected, it is important to be able to look under the hood. Even when everything seems to run smoothly, running a network diagnosis can help ensure everything is working as it should. Several diagnosis tools exists for this purpose; each one operates on a different level. It would go beyond the scope of this book to discuss all tools, so we will focus on the more well-known and commonly used tools in the following sections.
10.9.1. بررسی محلی: netstat
بیایید ابتدا دستور netstat
را بررسی کنیم (در بسته net-tools)؛ این ابزار یک خلاصه وضعیت لحظهای از فعالیت شبکه نمایش میدهد. زمانی که بدون آرگومان فراخوانی شود، این دستور فهرستی از تمام ارتباطات باز را نمایش میدهد؛ این فهرست میتواند بسیار طولانی باشد چرا که شامل بسیاری از سوکتهای یونیکس (مورد استفاده فرآیندهای پسزمینه) است که اصلا کاری با شبکه ندارند (برای نمونه، ارتباطات dbus
یا ترافیک X11
ارتباطات بین فایلسیستمهای مجازی و محیط گرافیکی هستند).
فراخوانیهای متداول شامل گزینههایی است که عملکرد netstat
را تغییر میدهند. متداولترین گزینهها عبارتند از:
-t
، که با فیلترکردن خروجی تنها ارتباطات TCP را شامل میشود؛
-u
، که به شیوهای مشابه برای ارتباطات UDP استفاده میشود؛ این گزینهها با یکدیکر سازگار نبوده و استفاده یکی از آنها کافی است تا ارتباطات دامنه یونیکس نمایش داده نشوند؛
-a
، برای فهرست کردن سوکتهای منتظر (آنهایی که برای ارتباط دریافتی انتظار میکشند)؛
-n
، برای نمایش نتایج به صورت عددی: نشانیهای IP (بدون دخالت DNS)، شمارههای درگاه (بدون نام مستعار تعریف شده در /etc/services
) و شناسههای کاربری (بدون نام کاربری)؛
-p
، برای فهرستکردن فرآیندهای درگیر؛ این گزینه زمانی مفید است که netstat
به عنوان root اجرا شود، چرا که کاربران عادی تنها میتوانند فرآیندهای خود را مشاهده کنند؛
-c
، برای تازهسازی فهرست خروجی به صورت مداوم.
سایر گزینهها که در صفحه راهنمای netstat(8) مستندسازی شدهاند، کنترل بسیار بیشتری را فراهم میکنند. در عمل، پنج گزینه اول به اندازهای پرکاربرد هستند که مدیران شبکه و سیستم از عبارت netstat -tupan
برای اشاره به آنها استفاده میکنند. به طور معمول، نتایج قابل مشاهده در یک رایانه معمولی مانند زیر هستند:
#
netstat -tupan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 397/rpcbind
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 431/sshd
tcp 0 0 0.0.0.0:36568 0.0.0.0:* LISTEN 407/rpc.statd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 762/exim4
tcp 0 272 192.168.1.242:22 192.168.1.129:44452 ESTABLISHED 1172/sshd: roland [
tcp6 0 0 :::111 :::* LISTEN 397/rpcbind
tcp6 0 0 :::22 :::* LISTEN 431/sshd
tcp6 0 0 ::1:25 :::* LISTEN 762/exim4
tcp6 0 0 :::35210 :::* LISTEN 407/rpc.statd
udp 0 0 0.0.0.0:39376 0.0.0.0:* 916/dhclient
udp 0 0 0.0.0.0:996 0.0.0.0:* 397/rpcbind
udp 0 0 127.0.0.1:1007 0.0.0.0:* 407/rpc.statd
udp 0 0 0.0.0.0:68 0.0.0.0:* 916/dhclient
udp 0 0 0.0.0.0:48720 0.0.0.0:* 451/avahi-daemon: r
udp 0 0 0.0.0.0:111 0.0.0.0:* 397/rpcbind
udp 0 0 192.168.1.242:123 0.0.0.0:* 539/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 539/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 539/ntpd
udp 0 0 0.0.0.0:5353 0.0.0.0:* 451/avahi-daemon: r
udp 0 0 0.0.0.0:39172 0.0.0.0:* 407/rpc.statd
udp6 0 0 :::996 :::* 397/rpcbind
udp6 0 0 :::34277 :::* 407/rpc.statd
udp6 0 0 :::54852 :::* 916/dhclient
udp6 0 0 :::111 :::* 397/rpcbind
udp6 0 0 :::38007 :::* 451/avahi-daemon: r
udp6 0 0 fe80::5054:ff:fe99::123 :::* 539/ntpd
udp6 0 0 2001:bc8:3a7e:210:a:123 :::* 539/ntpd
udp6 0 0 2001:bc8:3a7e:210:5:123 :::* 539/ntpd
udp6 0 0 ::1:123 :::* 539/ntpd
udp6 0 0 :::123 :::* 539/ntpd
udp6 0 0 :::5353 :::* 451/avahi-daemon: r
همانطور که انتظار میرفت، این فهرست شامل ارتباطات جاری سیستم است از جمله دو ارتباط SSH و برنامههایی که منتظر دریافت ارتباطات هستند (که به عنوان LISTEN
آمدهاند)، مانند سرور ایمیل Exim4 که به درگاه ۲۵ گوش میکند.
10.9.2. بررسی راهدور: nmap
nmap
(در بستهای با همین نام) به نوعی معادل راهدور netstat
به حساب میآید. میتواند به پویش مجموعهای از درگاههای “شناخته-شده” برای یک یا چند سرور راهدور بپردازد و درگاههایی که برنامههای مختلف به آنها پاسخ میدهند را نمایش میدهد. علاوه بر این، nmap
میتواند برخی از این برنامهها را نیز تشخیص دهد، گاهی اوقات حتی نسخههای آنان را. از آنجا که این ابزار به صورت راهدور کار میکند، نمیتواند اطلاعات مربوط به فرآیندها یا کاربران را نمایش دهد؛ با این حال میتواند به صورت همزمان روی چندین هدف اجرا شود.
یک فراخوانی معمول nmap
تنها از گزینه -A
استفاده میکند (به منظور یافتن نسخه نرمافزار سرور که روی آن اجرا میشود) به همراه یک یا چند نشانی IP یا نامهای DNS رایانههایی که قصد پویش آنها را دارد. بسیاری گزینههای مختلف وجود دارد که به کنترل بیشتر عملکرد nmap
کمک میکنند؛ لطفا به مستندات صفحه راهنمای nmap(1) مراجعه کنید.
#
nmap debian
Starting Nmap 7.80 ( https://nmap.org ) at 2022-02-22 20:58 CET
Nmap scan report for debian (192.168.122.57)
Host is up (0.000087s latency).
Not shown: 996 closed ports
PORT STATE SERVICE
22/tcp open ssh
79/tcp open finger
80/tcp open http
113/tcp open ident
Nmap done: 1 IP address (1 host up) scanned in 0.07 seconds
#
nmap -A localhost
nmap -A localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2022-02-22 20:56 CET
Stats: 0:01:16 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 83.33% done; ETC: 20:57 (0:00:15 remaining)
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000086s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 994 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5 (protocol 2.0)
|_auth-owners: foobar
25/tcp open smtp Postfix smtpd
|_auth-owners: foobar
|_smtp-commands: debian, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8, CHUNKING,
| ssl-cert: Subject: commonName=debian
| Subject Alternative Name: DNS:debian
| Not valid before: 2022-02-22T14:48:42
|_Not valid after: 2032-02-20T14:48:42
|_ssl-date: TLS randomness does not represent time
79/tcp open finger?
|_auth-owners: foobar
|_finger: ERROR: Script execution failed (use -d to debug)
80/tcp open http Apache httpd 2.4.52 ((Debian))
|_auth-owners: foobar
|_http-server-header: Apache/2.4.52 (Debian)
|_http-title: Apache2 Debian Default Page: It works
113/tcp open ident Liedentd (Claimed user: foobar)
|_auth-owners: foobar
631/tcp open ipp CUPS 2.3
|_auth-owners: foobar
| http-robots.txt: 1 disallowed entry
|_/
|_http-server-header: CUPS/2.3 IPP/2.1
|_http-title: Home - CUPS 2.3.3op2
Service Info: Host: debian; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 87.91 seconds
As expected, e.g. the SSH, Apache and Postfix applications are listed. Note that not all applications listen on all IP addresses; since Postfix is only accessible on the lo
loopback interface, it only appears during an analysis of localhost
and not when scanning debian
(which maps to the enp1s0
interface on the same machine).
10.9.3. اسنیفرها: tcpdump
و wireshark
بعضی وقتها، نیاز است بدانیم چه چیزی به صورت بسته به بسته از شبکه عبور میکند. این موارد شامل یک “تحلیلگر فریم” هستند که به صورت کلیتر با نام sniffer شناخته میشوند. چنین ابزاری به مشاهده بستههای عبوری از یک رابط شبکه میپردازد و آنها را به شیوهای مرتب و خودمانی نمایش میدهد.
ابزار قدرتمند در این زمینه tcpdump
است که به عنوان یک ابزار استاندارد در طیف گستردهای از پلتفرمها موجود است. این ابزار امکان بسیاری از فرآیندهای مرتبط با شبکه را میدهد، اما شیوه نمایش این ترافیک کمی عجیب و غریب است. بنابراین به توضیح بیشتر آن نمیپردازیم.
یک ابزار جدیدتر، wireshark
(در بسته wireshark) به عنوان مرجع تحلیل ترافیک شبکه به دلیل ماژولهای بسیاری که در فرآیند تحلیل بستهها کمک میکنند، تبدیل شده است. بستهها به صورت گرافیکی و به ترتیب قرار گرفتن در لایههای مختلف شبکه نمایش داده میشوند. این امر به کاربر کمک میکند تا به صورت بصری به بررسی بستهها بپردازد. برای نمونه، بستهای که شامل درخواست HTTP است، wireshark
آن را به صورت جداگانه به همراه اطلاعات مرتبط با هر لایه شبکه نمایش میدهد و در نهایت به نمایش خود درخواست HTTP میرسد.
In our example, the packets traveling over SSH are filtered out (with the !tcp.port == 22
filter). The packet currently displayed was developed at the transport layer of the SSHv2 protocol.