网络服务与诊断工具全解析
1. 网络消息处理机制
在网络通信中,尽管调试输出会显示“Recv header”和“Recv data”,表明服务器存在两种不同类型的消息,但
curl
与操作系统交互获取这两种消息的方式并无差异,操作系统处理它们以及网络处理底层数据包的方式也相同。这种差异完全存在于用户空间的
curl
应用程序中。
curl
知道在接收到空白行(中间有2字节的部分),即HTTP头部结束的标志之前,它获取的是头部信息,之后的内容则是所请求的文档。对于发送这些数据的服务器而言,在发送响应时,它不会对发送给操作系统的头部和文档数据进行区分,这种区分是在用户空间的服务器程序内完成的。
2. 常见网络服务器
大多数网络服务器与系统中的其他守护进程类似,如
cron
,但它们会与网络端口进行交互。以下是一些常见的网络服务器:
-
Web服务器
:
httpd
、
apache
、
apache2
-
安全外壳守护进程
:
sshd
-
邮件服务器
:
postfix
、
qmail
、
sendmail
-
打印服务器
:
cupsd
-
网络文件系统守护进程
:
nfsd
、
mountd
-
Windows文件共享守护进程
:
smbd
、
nmbd
-
RPC端口映射服务守护进程
:
rpcbind
多数网络服务器通常以多进程方式运行。至少有一个进程监听网络端口,当接收到新的传入连接时,监听进程会使用
fork()
创建一个新的子进程,该子进程负责处理新连接。子进程通常被称为工作进程,当连接关闭时,工作进程结束,而原监听进程继续监听网络端口。不过,也有一些例外情况。调用
fork()
会给系统带来显著的开销,像高性能的TCP服务器(如Apache Web服务器)可以在初始化时创建多个工作进程,以便随时处理连接。而接受UDP数据包的服务器只需接收数据并做出响应,无需监控连接。
3. Secure Shell (SSH)
SSH(安全外壳)是一种常见的网络服务应用,是远程访问Unix计算机的行业标准。配置后,SSH允许安全的shell登录、远程程序执行、简单的文件共享等功能,它通过公钥加密进行身份验证,使用更简单的加密器处理会话数据,取代了旧的远程访问系统(如
telnet
和
rlogin
)。大多数互联网服务提供商(ISP)和云服务提供商要求使用SSH进行shell访问,许多基于Linux的网络设备(如NAS设备)也支持通过SSH访问。OpenSSH(http://www.openssh.com/)是Unix上流行的免费SSH实现,几乎所有Linux发行版都预装了它。OpenSSH的客户端是
ssh
,服务器是
sshd
。SSH协议有两个主要版本:1和2,OpenSSH支持这两个版本,但版本1很少使用。
SSH具有以下功能:
-
数据加密
:对密码和所有会话数据进行加密,保护用户免受窥探。
-
隧道传输
:可以对其他网络连接进行隧道传输,包括X Window System客户端的连接。
-
多平台支持
:为几乎所有操作系统提供客户端。
-
主机认证
:使用密钥进行主机认证。
然而,SSH也有一些缺点。建立SSH连接需要远程主机的公钥,并且不一定能安全地获取该公钥(尽管可以手动验证以确保不被欺骗)。
3.1 SSH服务器(sshd)
运行
sshd
需要配置文件和主机密钥。大多数发行版将配置文件存储在
/etc/ssh
目录中,并在安装
sshd
包时尝试进行适当的配置。
sshd_config
文件由关键字/值对组成,以下是一个示例:
Port 22
#Protocol 2,1
#ListenAddress 0.0.0.0
#ListenAddress ::
HostKey /etc/ssh/ssh_host_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
以
#
开头的行是注释,
sshd_config
中的许多注释可能表示默认值。以下是一些重要的配置项:
| 配置项 | 说明 |
| ---- | ---- |
|
HostKey arquivo
| 使用指定文件作为主机密钥。 |
|
LogLevel nível
| 记录具有指定syslog级别的消息。 |
|
PermitRootLogin valor
| 如果值为
yes
,允许超级用户通过SSH登录;设置为
no
则禁止。 |
|
SyslogFacility nome
| 使用指定的设施在syslog中记录消息。 |
|
X11Forwarding valor
| 如果值为
yes
,启用X Window System客户端的隧道传输。 |
|
XAuthLocation path
| 提供
xauth
的路径,没有该路径,X11隧道传输将无法工作。 |
OpenSSH有三组主机密钥:一组用于协议版本1,两组用于协议版本2。每组都有一个公钥(扩展名为
.pub
)和一个私钥(无扩展名)。切勿让他人看到私钥,否则可能会遭受入侵。SSH版本1只有RSA密钥,而版本2有RSA和DSA密钥。通常,OpenSSH安装程序或发行版的安装脚本会为你创建这些密钥,但如果你计划使用
ssh-agent
等程序,需要知道如何创建它们。创建协议版本2的密钥可以使用以下命令:
# ssh-keygen -t rsa -N '' -f /etc/ssh/ssh_host_rsa_key
# ssh-keygen -t dsa -N '' -f /etc/ssh/ssh_host_dsa_key
创建协议版本1的密钥使用以下命令:
# ssh-keygen -t rsa1 -N '' -f /etc/ssh/ssh_host_key
SSH服务器和客户端还使用一个名为
ssh_known_hosts
的密钥文件,其中包含其他主机的公钥。如果要使用基于主机的认证,服务器的
ssh_known_hosts
文件应包含所有可信客户端主机的公钥。了解这些密钥文件在更换计算机时很有用,安装新计算机时,可以导入旧计算机的密钥文件,以确保用户连接到新计算机时密钥不会出现差异。
大多数发行版预装了SSH,但
sshd
默认不会启动。在Ubuntu和Debian中,安装SSH服务器包会创建密钥、启动服务器并将其添加到启动配置中。在Fedora中,
sshd
默认安装但未启用。要在启动时启用
sshd
,可以使用以下命令(该命令不会立即启动服务,使用
service sshd start
启动服务):
# chkconfig sshd on
Fedora通常会在第一次启动
sshd
时创建任何缺失的主机密钥文件。如果没有安装
init
支持,以root身份运行
sshd
将启动服务器,并在初始化时将其PID写入
/var/run/sshd.pid
。
sshd
也可以作为
systemd
的套接字单元或使用
inetd
启动,但通常不建议这样做,因为服务器有时需要生成密钥文件,这可能会花费很长时间。
3.2 SSH客户端
要登录远程主机,可以使用以下命令:
$ ssh nome_de_usuário_remoto@host
如果本地用户名与远程主机的用户名相同,可以省略
nome_de_usuário_remoto@
。还可以通过
ssh
命令执行管道操作,例如将本地目录
dir
复制到远程主机:
$ tar zcvf - dir | ssh host_remoto tar zxvf -
SSH客户端的全局配置文件
ssh_config
应位于
/etc/ssh
目录中,与
sshd_config
文件在一起。客户端配置文件也由键值对组成,但通常不需要修改。
使用SSH客户端时最常见的问题是本地
ssh_known_hosts
或
.ssh/known_hosts
文件中的SSH公钥与远程主机的密钥不匹配。错误的密钥会导致类似以下的错误或警告信息:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
38:c2:f6:0d:0d:49:d4:05:55:68:54:2a:2f:83:06:11.
Please contact your system administrator.
Add correct host key in /home/user/.ssh/known_hosts to get rid of this message.
Offending key in /home/user/.ssh/known_hosts:12❶
RSA host key for host has changed and you have requested
strict checking.
Host key verification failed.
通常,这意味着远程主机的管理员更改了密钥(通常在更换硬件时会发生)。如果不确定,可以向管理员核实。如果不怀疑存在恶意情况,只需删除有问题的行或用正确的公钥替换它。
OpenSSH包含
scp
和
sftp
程序用于文件传输,它们是旧的、不安全的
rcp
和
ftp
程序的替代品。
scp
可以将文件从远程计算机复制到本地计算机,反之亦然,也可以在不同主机之间复制文件,其使用方式类似于
cp
命令。以下是一些示例:
$ scp usuário@host:arquivo .
$ scp arquivo usuário@host:dir
$ scp usuário1@host1:arquivo usuário2@host2:dir
sftp
的工作方式类似于
ftp
命令行客户端,使用
get
和
put
命令。远程主机必须安装
sftp-server
程序,如果远程主机也使用OpenSSH,通常会有该程序。如果需要比
scp
和
sftp
更多的功能和灵活性(例如频繁传输大量文件),可以考虑使用
rsync
。
此外,OpenSSH的网站(http://www.openssh.com/)列出了适用于所有流行操作系统的SSH客户端。例如,PuTTY是一个基本的Windows客户端,包含安全的文件复制程序;MacSSH在Mac OS 9.x及更早版本中运行良好;Mac OS X基于Unix,预装了OpenSSH。
4. inetd和xinetd守护进程
为所有服务实现独立的服务器在某种程度上可能效率低下。每个服务器都需要单独配置以处理监听端口、访问控制和端口配置等任务。对于大多数服务,这些操作的执行方式相同,只有在服务器接受连接时,处理方式才会有所不同。
传统上,简化服务器使用的一种方法是使用
inetd
守护进程,它是一种超级服务器,用于标准化对网络端口的访问以及服务器程序与网络端口之间的接口。启动
inetd
后,它会读取配置文件并监听其中定义的网络端口。当新的网络连接出现时,
inetd
会将新创建的进程与该连接关联起来。
xinetd
是
inetd
的较新版本,它允许更简单的配置并提供更好的访问控制,但
xinetd
正逐渐被
systemd
取代,
systemd
可以通过套接字单元提供相同的功能。虽然
inetd
现在不常用,但它的配置展示了配置服务所需的所有内容。实际上,
sshd
也可以由
inetd
调用,而不是作为独立服务器运行,以下是
/etc/inetd.conf
文件中的一个示例:
ident stream tcp nowait root /usr/sbin/sshd sshd -i
这里的七个字段从左到右分别是:
| 字段 | 说明 |
| ---- | ---- |
| 服务名称 |
/etc/services
中的服务名称。 |
| 套接字类型 | 通常
stream
表示TCP,
dgram
表示UDP。 |
| 协议 | 传输协议,通常是
tcp
或
udp
。 |
| 数据报服务器行为 | 对于UDP,是
wait
或
nowait
;使用其他传输协议的服务应使用
nowait
。 |
| 用户 | 执行服务的用户名称,可以添加
.group
来定义组。 |
| 可执行文件 |
inetd
应连接到服务的程序。 |
| 参数 | 可执行文件的参数,第一个参数应为程序名称。 |
在低级别防火墙流行之前,许多管理员使用TCP wrapper库和守护进程对网络服务进行主机控制。在这些实现中,
inetd
执行
tcpd
程序,
tcpd
首先观察传入连接以及
/etc/hosts.allow
和
/etc/hosts.deny
文件中的访问控制列表。
tcpd
记录连接信息,如果认为传入连接没有问题,会将其传递给最终的服务程序。不过,由于该系统已基本过时,这里不再详细讨论。
5. 网络诊断工具
5.1 netstat
netstat
是一种基本的网络服务调试工具,可以显示传输层和网络层的各种统计信息。以下是一些用于查看连接信息的有用选项:
| 选项 | 说明 |
| ---- | ---- |
|
-t
| 显示TCP端口信息。 |
|
-u
| 显示UDP端口信息。 |
|
-l
| 显示正在监听的端口。 |
|
-a
| 显示所有活动端口。 |
|
-n
| 禁用名称查找(提高速度,在DNS无法工作时也很有用)。 |
5.2 lsof
lsof
不仅可以监控打开的文件,还可以列出当前正在使用或监听端口的程序。要获取使用或监听端口的程序的完整列表,可以执行以下命令:
# lsof -i
当以普通用户身份执行时,该命令仅显示该用户的进程。以root身份执行时,输出类似于以下内容,显示了各种进程和用户:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 700 root 6u IPv4 10492 0t0 UDP *:sunrpc
rpcbind 700 root 8u IPv4 10508 0t0 TCP *:sunrpc (LISTEN)
avahi-dae 872 avahi 13u IPv4 21736375 0t0 UDP *:mdns
cupsd 1010 root 9u IPv6 42321174 0t0 TCP ip6-localhost:ipp (LISTEN)
ssh 14366 juser 3u IPv4 38995911 0t0 TCP thishost.local:55457->
somehost.example.com:ssh (ESTABLISHED)
chromium- 26534 juser 8r IPv4 42525253 0t0 TCP thishost.local:41551->
anotherhost.example.com:https (ESTABLISHED)
这个输出示例显示了服务器和客户端程序的用户和进程ID,从早期的RPC服务到avahi提供的多播DNS服务,再到为IPv6准备的打印服务(
cupsd
)。最后两行显示了客户端连接:一个SSH连接和一个Chromium浏览器的安全Web连接。由于输出可能很长,通常最好进行过滤。
lsof
和
netstat
类似,会尝试将找到的每个IP地址反向解析为主机名,这会使输出变慢。可以使用
-n
选项禁用名称解析:
# lsof -n -i
还可以使用
-P
选项禁用在
/etc/services
中查找端口名称。
如果要查找特定端口正在被哪个进程使用,可以使用以下命令:
# lsof -i:porta
完整的语法是:
# lsof -iprotocolo@host:porta
protocolo
、
@host
和
:porta
参数都是可选的,它们会根据值过滤
lsof
的输出。主机和端口可以是名称或数字。例如,要查看TCP端口80的连接,可以使用:
# lsof -iTCP:80
lsof
还有一个实用的过滤功能,与连接状态有关。例如,要显示仅监听TCP端口的进程,可以使用:
# lsof -iTCP -sTCP:LISTEN
由于UDP服务器不监听端口也没有连接,要查看UDP客户端和服务器,可以使用
-iUDP
。通常,系统中UDP服务器数量不多,这不会是一个问题。
5.3 tcpdump
如果需要确切了解网络中传输的数据,
tcpdump
可以将网络接口卡设置为混杂模式,并提供通过它的所有数据包的信息。不带参数运行
tcpdump
会生成类似以下的输出,包括一个ARP请求和一个Web连接:
# tcpdump
tcpdump: listening on eth0
20:36:25.771304 arp who-has mikado.example.com tell duplex.example.com
20:36:25.774729 arp reply mikado.example.com is-at 0:2:2d:b:ee:4e
20:36:25.774796 duplex.example.com.48455 > mikado.example.com.www: S
3200063165:3200063165(0) win 5840 <mss 1460,sackOK,timestamp 38815804[|tcp]> (DF)
20:36:25.779283 mikado.example.com.www > duplex.example.com.48455: S
3494716463:3494716463(0) ack 3200063166 win 5792 <mss 1460,sackOK,timestamp 4620[|tcp]> (DF)
20:36:25.779409 duplex.example.com.48455 > mikado.example.com.www: . ack 1 win
5840 <nop,nop,timestamp 38815805 4620> (DF)
20:36:25.779787 duplex.example.com.48455 > mikado.example.com.www: P 1:427(426)
ack 1 win 5840 <nop,nop,timestamp 38815805 4620> (DF)
20:36:25.784012 mikado.example.com.www > duplex.example.com.48455: . ack 427
win 6432 <nop,nop,timestamp 4620 38815805> (DF)
20:36:25.845645 mikado.example.com.www > duplex.example.com.48455: P 1:773(772)
ack 427 win 6432 <nop,nop,timestamp 4626 38815805> (DF)
20:36:25.845732 duplex.example.com.48455 > mikado.example.com.www: . ack 773
win 6948 <nop,nop,timestamp 38815812 4626> (DF)
9 packets received by filter
0 packets dropped by kernel
可以通过添加过滤器让
tcpdump
更具针对性。它可以根据源主机和目标主机、网络、以太网地址、网络模型不同层的协议等进行过滤。
tcpdump
识别的数据包协议包括ARP、RARP、ICMP、TCP、UDP、IP、IPv6、AppleTalk和IPX数据包等。例如,要只显示TCP数据包,可以执行:
# tcpdump tcp
要查看Web数据包和UDP数据包,可以使用:
# tcpdump udp or port 80
在上述示例中,
tcp
、
udp
和
port 80
被称为原语。以下是一些重要的原语:
| 原语 | 数据包规范 |
| ---- | ---- |
|
tcp
| TCP数据包 |
|
udp
| UDP数据包 |
|
port porta
| 来自或发往指定端口的TCP和/或UDP数据包 |
|
host host
| 来自或发往指定主机的数据包 |
|
net rede
| 来自或发往指定网络的数据包 |
tcpdump
可以使用各种运算符(如
and
和
!
),运算符可以用括号分组。如果要认真使用
tcpdump
,一定要阅读手册页,特别是描述原语的部分。使用
tcpdump
时要非常小心,前面的输出示例仅显示了TCP数据包(传输层)和IP头部信息(网络层),但也可以让
tcpdump
显示数据包的全部内容。除非是自己的网络,否则不要随意窥探网络。
5.4 netcat
如果需要比
telnet host porta
命令更灵活地连接到远程主机,可以使用
netcat
(或
nc
)。
netcat
可以连接到远程的TCP/UDP端口,允许指定本地端口、监听端口、进行端口扫描、将标准I/O重定向到网络连接等。要使用
netcat
打开一个TCP连接到指定端口,可以执行:
$ netcat host porta
netcat
只有在连接的另一端关闭时才会终止,如果将标准输出重定向到
netcat
,可能会导致情况混乱。可以随时使用
Ctrl-C
关闭连接。如果希望程序和网络连接根据标准输入流终止,可以尝试使用
sock
程序。要监听特定端口,可以使用:
$ netcat -l -p número_da_porta
5.5 端口扫描
有时候,可能不知道网络中的计算机提供哪些服务,甚至不知道使用了哪些IP地址。
Nmap
(Network Mapper)可以扫描计算机或计算机网络中的所有端口,查找开放的端口并列出找到的端口。大多数情况下,它能帮助我们快速了解网络中计算机的服务状况。
网络服务与诊断工具全解析(续)
6. 网络服务及工具总结与应用场景分析
6.1 网络服务总结
-
服务器类型多样
:涵盖了 Web 服务器(如
httpd、apache等)、安全外壳守护进程sshd、邮件服务器(postfix、qmail等)、打印服务器cupsd、网络文件系统守护进程(nfsd、mountd)、Windows 文件共享守护进程(smbd、nmbd)以及 RPC 端口映射服务守护进程rpcbind等。不同类型的服务器满足了网络中各种不同的应用需求,如 Web 服务用于网站访问,邮件服务器用于邮件收发等。 - 运行模式 :多数网络服务器以多进程方式运行,通过监听端口、创建子进程处理新连接,但也存在高性能服务器提前创建工作进程以及 UDP 服务器无需监控连接等特殊情况。
6.2 SSH 服务总结
- 优势与不足 :SSH 作为主流的远程访问协议,具有数据加密、隧道传输、多平台支持和主机认证等优点,能有效保障远程访问的安全性和便捷性。然而,获取远程主机公钥的安全性是其面临的一个挑战。
-
配置要点
:运行
sshd需要配置文件和主机密钥,配置文件sshd_config包含多个重要配置项,如HostKey、LogLevel等。创建主机密钥需要根据不同的 SSH 协议版本使用相应的命令。同时,ssh_known_hosts文件在基于主机的认证中起着关键作用。
6.3 守护进程总结
-
inetd 和 xinetd
:
inetd作为传统的超级服务器,标准化了网络端口访问和服务器程序与端口的接口;xinetd是其改进版本,提供了更简单的配置和更好的访问控制,但逐渐被systemd取代。 - TCP wrapper :曾经用于网络服务的主机控制,但现已基本过时。
6.4 诊断工具总结
- netstat :基本的网络服务调试工具,通过不同选项可显示传输层和网络层的各种统计信息,帮助了解端口使用情况。
- lsof :可列出正在使用或监听端口的程序,支持多种过滤方式,如按协议、端口、连接状态等进行过滤。
- tcpdump :能将网络接口卡设置为混杂模式,提供通过它的所有数据包信息,可使用原语和运算符进行灵活过滤,但使用时需谨慎。
-
netcat
:提供了比
telnet更灵活的远程主机连接方式,可进行端口连接、监听、扫描等操作。 - Nmap :用于扫描计算机或网络中的开放端口,帮助了解网络中计算机的服务状况。
6.5 应用场景分析
| 场景 | 适用工具 | 操作步骤 |
|---|---|---|
| 查看网络端口使用情况 |
netstat
、
lsof
|
使用
netstat -tulna
查看所有 TCP 和 UDP 端口信息;使用
lsof -i
列出使用或监听端口的程序
|
| 排查 SSH 连接问题 |
ssh
客户端、
sshd
服务器配置检查
|
检查
sshd_config
配置文件,确保各项配置正确;检查
ssh_known_hosts
文件,处理密钥不匹配问题
|
| 分析网络数据包 |
tcpdump
|
根据需求添加原语和运算符进行过滤,如
# tcpdump tcp
查看 TCP 数据包
|
| 远程连接和文件传输 |
ssh
、
scp
、
sftp
|
使用
ssh
登录远程主机;使用
scp
进行文件复制;使用
sftp
进行交互式文件传输
|
| 端口扫描 |
Nmap
|
运行
Nmap
扫描目标计算机或网络的开放端口
|
7. 网络服务与工具的交互流程
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(客户端):::process -->|请求连接| B(网络服务器):::process
B -->|响应| A
A -->|SSH 连接| C(sshd 服务器):::process
C -->|认证和服务提供| A
D(inetd/xinetd):::process -->|管理服务| B
E(netstat):::process -->|监控| B
F(lsof):::process -->|监控| B
G(tcpdump):::process -->|监听| B
H(netcat):::process -->|连接| B
I(Nmap):::process -->|扫描| B
这个流程图展示了客户端与网络服务器之间的基本交互,以及各种诊断工具与网络服务器的关系。客户端可以发起普通连接或 SSH 连接,
inetd
或
xinetd
对服务器进行管理,而
netstat
、
lsof
、
tcpdump
、
netcat
和
Nmap
等工具则用于监控、监听、连接和扫描服务器,以确保网络服务的正常运行和故障排查。
8. 网络服务与安全建议
-
SSH 安全
:定期更新 SSH 服务器和客户端软件,避免使用 SSH 协议版本 1。设置强密码或使用密钥认证,限制
PermitRootLogin为no,防止超级用户直接登录。 -
网络监控
:定期使用
netstat、lsof等工具监控网络端口使用情况,及时发现异常连接。使用tcpdump进行数据包分析时,确保在合法合规的前提下进行。 -
服务配置
:合理配置服务器的各项参数,如
LogLevel、SyslogFacility等,便于日志记录和问题排查。
通过对网络服务和诊断工具的全面了解和合理应用,可以更好地管理和维护网络环境,确保网络的安全和稳定运行。
超级会员免费看
1761

被折叠的 条评论
为什么被折叠?



