网络流量分析与安全远程访问

CompTIABeginner
立即练习

介绍

欢迎来到本次关于 Linux 中网络流量分析和安全远程访问的实验。理解如何监控网络活动和保护通信是任何系统管理员、开发人员或安全爱好者的关键技能。

在本次实验中,你将亲手实践一套强大的命令行工具。你将学习如何:

  • 使用 netstat 及其现代替代品 ss 来检查活动网络连接和监听服务。
  • 使用 tcpdump 捕获和分析实时网络数据包。
  • 使用 ssh 建立到你自己的机器的安全远程连接。
  • 使用 dig 和 DNSSEC 验证 DNS 响应的完整性。

完成本次实验后,你将对这些重要的网络工具及其在管理和保护 Linux 系统中的作用有实际的理解。

使用 Netstat/SS 检查活动网络连接

在此步骤中,你将学习如何查看系统上的活动网络连接和监听端口。这对于理解哪些服务正在运行以及可以通过网络访问至关重要。我们将使用两个常用工具:netstatss

首先,让我们使用 netstat,这是一个经典且广为人知的实用程序。包含 netstatnet-tools 包已在实验设置期间为你安装。

运行以下命令,以数字格式 (-n) 列出所有监听的 TCP (-t) 和 UDP (-u) 端口,不进行名称解析,并且只关注监听套接字 (-l):

netstat -tuln

你应该会看到类似以下的输出。请注意为你启动的 SSH 服务器(端口 22)和 Python Web 服务器(端口 8000)的条目,以及端口 3001 和 3002 上的其他服务:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:3001            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:3002            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.11:37199        0.0.0.0:*               LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN
udp        0      0 127.0.0.11:60120        0.0.0.0:*
udp        0      0 0.0.0.0:3001            0.0.0.0:*

现在,让我们使用 ss,它是 netstat 的现代替代品。它通常更快,并提供更详细的信息。命令和标志非常相似。

ss -tuln

输出的格式会略有不同,但会显示相同的重要信息:在端口 22、3001、3002 和 8000 上监听的服务,以及一些内部 Docker 服务:

Netid                        State                         Recv-Q                        Send-Q                                               Local Address:Port                                                 Peer Address:Port                        Process
udp                          UNCONN                        0                             0                                                       127.0.0.11:60120                                                     0.0.0.0:*
udp                          UNCONN                        0                             0                                                          0.0.0.0:3001                                                      0.0.0.0:*
tcp                          LISTEN                        0                             128                                                        0.0.0.0:22                                                        0.0.0.0:*
tcp                          LISTEN                        0                             5                                                          0.0.0.0:3001                                                      0.0.0.0:*
tcp                          LISTEN                        0                             128                                                        0.0.0.0:3002                                                      0.0.0.0:*
tcp                          LISTEN                        0                             5                                                          0.0.0.0:8000                                                      0.0.0.0:*
tcp                          LISTEN                        0                             4096                                                    127.0.0.11:37199                                                     0.0.0.0:*
tcp                          LISTEN                        0                             128                                                        [::]:22                                                           [::]:*

通过使用这些命令,你可以快速了解系统面向网络的服务的概况。

使用 Tcpdump 捕获本地网络流量

在此步骤中,你将使用 tcpdump,一个强大的命令行数据包分析器,来实时捕获和检查网络流量。这对于调试网络问题或理解协议工作原理非常有价值。

首先,让我们看看有哪些网络接口可用于捕获流量。

sudo tcpdump -D

输出将列出可用的接口。lo 是“回环”(loopback)接口,用于同一机器内的网络通信(例如,连接到 localhost)。你将看到各种接口,包括主要的网络接口 eth1

1.eth1 [Up, Running, Connected]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
4.bluetooth-monitor (Bluetooth Linux Monitor) [Wireless]
5.nflog (Linux netfilter log (NFLOG) interface) [none]
6.nfqueue (Linux netfilter queue (NFQUEUE) interface) [none]
7.dbus-system (D-Bus system bus) [none]
8.dbus-session (D-Bus session bus) [none]

我们将捕获回环接口 (lo) 上的流量,以查看对本地 Web 服务器的请求。为此,你需要两个终端。

在当前终端中,运行以下 tcpdump 命令。它将在 lo 接口上监听 (-i lo),并在捕获 5 个数据包后停止 (-c 5)。

sudo tcpdump -i lo -c 5

现在,点击终端标签栏中的 + 图标以打开一个新终端。在新终端中,通过 curl 请求本地 Web 服务器来生成一些网络流量。

curl http://localhost:8000

切换回你的第一个终端。你将看到 tcpdump 已捕获与你的 curl 请求相关的流量包。输出将类似于此,显示 TCP 握手和数据传输:

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
14:57:14.158058 IP localhost.57272 > localhost.8000: Flags [S], seq 2025143228, win 65495, options [mss 65495,sackOK,TS val 1006286113 ecr 0,nop,wscale 7], length 0
14:57:14.158072 IP localhost.8000 > localhost.57272: Flags [S.], seq 403368374, ack 2025143229, win 65483, options [mss 65495,sackOK,TS val 1006286113 ecr 1006286113,nop,wscale 7], length 0
14:57:14.158083 IP localhost.57272 > localhost.8000: Flags [.], ack 1, win 512, options [nop,nop,TS val 1006286113 ecr 1006286113], length 0
14:57:14.158129 IP localhost.57272 > localhost.8000: Flags [P.], seq 1:79, ack 1, win 512, options [nop,nop,TS val 1006286113 ecr 1006286113], length 78
14:57:14.158133 IP localhost.8000 > localhost.57272: Flags [.], ack 79, win 511, options [nop,nop,TS val 1006286113 ecr 1006286113], length 0
5 packets captured
24 packets received by filter
0 packets dropped by kernel

请注意,如果你在没有生成特定流量的情况下运行 tcpdump,你可能会看到后台的 DNS 查询和其他系统通信,如你的日志所示。这是正常的系统行为,并表明即使你没有主动浏览,你的系统也在维护各种网络通信。

你已成功捕获并查看了实时网络流量。

演示使用 SSH 进行安全远程访问

在此步骤中,你将学习使用 SSH (Secure Shell) 进行安全远程访问。我们将配置基于密钥的身份验证,这比使用密码更安全,用于登录你自己的机器 (localhost)。openssh-server 已为你启动。

首先,你需要生成一个 SSH 密钥对(一个私钥和一个公钥)。我们将创建一个位长度为 2048 的 RSA 密钥。-f 标志指定用于保存密钥的文件,而 -N "" 为方便在此实验中设置了一个空的密码短语。

ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa -N ""

此命令将在 ~/.ssh 目录中创建 id_rsa(你的私钥)和 id_rsa.pub(你的公钥)。

接下来,为了允许你自己的用户使用此密钥登录,你必须将公钥添加到 authorized_keys 文件中。此文件列出了所有允许登录的公钥。

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

出于安全考虑,SSH 要求对 .ssh 目录及其文件设置严格的权限。让我们确保它们设置正确。设置脚本已创建了具有正确权限的这些文件,但了解这些命令是很好的实践。

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

现在一切都已设置好。你可以测试到 localhost 的安全连接。该命令将在远程端(即你自己的机器)执行 echo "Hello from SSH" 并打印结果。

ssh labex@localhost 'echo "Hello from SSH"'

第一次连接时,你可能会被要求验证主机的指纹。输入 yes 并按 Enter。然后你应该会看到 echo 命令的输出。

The authenticity of host 'localhost (127.0.0.1)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'localhost' (ED25519) to the list of known hosts.
Hello from SSH

你已成功配置并使用了 SSH 进行安全的、基于密钥的身份验证。

使用 Dig 验证 DNSSEC 解析

在此步骤中,你将使用 dig (Domain Information Groper) 执行 DNS 查询并了解 DNSSEC (DNS Security Extensions)。DNSSEC 通过向 DNS 数据添加加密签名来帮助防止 DNS 欺骗。

首先,让我们对 labex.io 执行标准的 DNS 查询,以查看其 IP 地址。

dig labex.io

输出将显示查询详细信息,最重要的是 ANSWER SECTION 中的 A 记录(IP 地址)。请注意,labex.io 有多个 IP 地址用于负载均衡:

; <<>> DiG 9.18.24-0ubuntu0.22.04.1-Ubuntu <<>> labex.io
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9789
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;labex.io.                      IN      A

;; ANSWER SECTION:
labex.io.               10      IN      A       104.26.10.219
labex.io.               10      IN      A       104.26.11.219
labex.io.               10      IN      A       172.67.72.162

;; Query time: 0 msec
;; SERVER: 127.0.0.11#53(127.0.0.11) (UDP)
;; WHEN: Tue Aug 05 14:58:16 CST 2025
;; MSG SIZE  rcvd: 85

现在,让我们执行相同的查询,但通过添加 +dnssec 选项,让 DNS 解析器提供与 DNSSEC 相关的数据。

dig labex.io +dnssec

输出在 OPT PSEUDOSECTION 中包含额外的 DNSSEC 相关信息,显示已请求 DNSSEC(do 标志表示“DNSSEC OK”)。但是,请注意 flags 部分不包含 ad(Authenticated Data)标志:

; <<>> DiG 9.18.24-0ubuntu0.22.04.1-Ubuntu <<>> labex.io +dnssec
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1042
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 65494
; OPT=5: 05 07 08 0a 0d 0e 0f (".......")
; OPT=6: 01 02 04 ("...")
; OPT=7: 01 (".")
;; QUESTION SECTION:
;labex.io.                      IN      A

;; ANSWER SECTION:
labex.io.               5       IN      A       172.67.72.162
labex.io.               5       IN      A       104.26.11.219
labex.io.               5       IN      A       104.26.10.219

;; Query time: 0 msec
;; SERVER: 127.0.0.11#53(127.0.0.11) (UDP)
;; WHEN: Tue Aug 05 14:58:21 CST 2025
;; MSG SIZE  rcvd: 108

缺少 ad 标志表明,虽然请求了 DNSSEC 信息,但解析器要么无法验证签名,要么该域名未启用 DNSSEC。

让我们尝试另一个使用 DNSSEC 的知名域名 icann.org,再次查看。

dig icann.org +dnssec

同样,检查输出中的头部:

; <<>> DiG 9.18.24-0ubuntu0.22.04.1-Ubuntu <<>> icann.org +dnssec
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54437
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 65494
; OPT=5: 05 07 08 0a 0d 0e 0f (".......")
; OPT=6: 01 02 04 ("...")
; OPT=7: 01 (".")
;; QUESTION SECTION:
;icann.org.                     IN      A

;; ANSWER SECTION:
icann.org.              10      IN      A       192.0.43.7

;; Query time: 72 msec
;; SERVER: 127.0.0.11#53(127.0.0.11) (UDP)
;; WHEN: Tue Aug 05 14:58:26 CST 2025
;; MSG SIZE  rcvd: 77

与之前的查询类似,响应中没有 ad 标志。这表明此环境中的 DNS 解析器未执行 DNSSEC 验证,这在容器化或虚拟化环境中很常见,因为这些环境中的 DNS 解析器可能与标准系统解析器的配置不同。

总结

恭喜你完成了本次实验!你获得了使用多个关键 Linux 网络和安全工具的实践经验。

在此次实验中,你学习了:

  • 使用 netstatss 来检查正在运行并监听连接的网络服务。
  • 使用 tcpdump 在特定接口上捕获实时网络数据包以分析流量。
  • 配置并使用 ssh 进行基于密钥的身份验证,以实现安全远程访问。
  • 利用 dig 查询域名系统 (Domain Name System) 并理解 DNSSEC 概念,包括如何请求 DNSSEC 信息和解读结果。

这些是基础技能,对于管理、故障排除和保护任何 Linux 环境都至关重要。我们鼓励你继续探索这些强大工具提供的众多选项。