服务连不上:网络连通性诊断

当有人反馈“公告服务打不开了”时,不能只凭感觉排查。建议按照下面这条链路,从本机内部开始,逐步向外检查:

[1. 服务进程是否在运行,端口是否在监听] ──> [2. 监听的是 127.0.0.1 还是 0.0.0.0] ──> [3. 路由、网关、DNS 解析是否正常] ──> [4. 防火墙或云平台安全组是否拦截]

1. 先确认端口有没有监听

服务是否真的在运行,第一步可以查看目标端口有没有进程在监听。这里以 8080 端口为例:

crow@opsbox:~/work$ sudo ss -ltnp 'sport = :8080'

如果这条命令没有任何输出,通常说明服务还没有启动,或者服务并没有监听 8080 端口。

如果看到输出,要重点查看监听地址。

2. 再确认监听地址是否正确

常见的监听地址有两种:

  • 127.0.0.1:8080:表示服务只监听本机回环地址。换句话说,只有这台机器自己可以访问 127.0.0.1:8080,局域网中的其他电脑无法通过这台机器的局域网 IP 直接访问它。
  • 0.0.0.0:8080:表示服务监听本机的所有网卡地址。局域网内的其他设备,或者经过网络策略允许的外部设备,都可以尝试访问这个端口。

如果业务确实需要让其他机器访问,通常要把服务配置里的绑定地址改掉。例如,将 server.env 中的:

BIND=127.0.0.1

改成:

BIND=0.0.0.0

改完之后,记得重启服务,并再次确认端口监听地址是否已经变化。

3. 检查网络接口、路由和主机名解析

确认服务本身已经在监听之后,下一步要看本机网络是否通畅。

crow@opsbox:~/work$ ip -brief addr    # 查看本机各网卡的 IP
crow@opsbox:~/work$ ip route          # 查看路由表和默认网关
crow@opsbox:~/work$ getent hosts opsbox # 查看主机名解析,先查 /etc/hosts,再查 DNS

排查时可以参考下面几种现象:

  • 如果直接用 IP 能访问,但用域名访问不了,大概率是 DNS 解析或 /etc/hosts 配置有问题。
  • 如果在这台机器上能访问,但局域网里的其他机器访问不了,重点检查本机防火墙、云平台安全组、网络 ACL,或者服务绑定地址是否仍然只监听在 127.0.0.1。
  • 如果本机连自己的局域网 IP 都无法访问,除了防火墙之外,还要确认网卡状态和路由是否异常。

4. 使用 SSH 远程管理服务器

实际生产环境中,服务器通常位于机房、专有网络或云平台中。日常维护一般通过 SSH(Secure Shell)建立加密连接,在本地终端里远程操作服务器。

这里先在实验机上启动 SSH 服务:

crow@opsbox:~/work$ sudo systemctl start practice-ssh

随后查看服务端的 SSH 主机公钥指纹:

crow@opsbox:~/work$ sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
256 SHA256:... /etc/ssh/ssh_host_ed25519_key.pub (ED25519)

这里的 SHA256:... 就是服务端公钥指纹。连接服务器之前,先记住这个值,之后第一次 SSH 登录时需要进行核对。

使用 editor 账号通过 2222 端口连接本机:

crow@opsbox:~/work$ ssh -p 2222 editor@127.0.0.1

第一次连接时,SSH 客户端会提示你确认远端服务器的公钥指纹。确认提示中的指纹和刚才查询到的值一致后,输入 yes 并按回车,然后输入 editor 的密码即可登录。

核对 SSH 主机指纹后以 editor 登录

登录成功后,终端提示符会变成:

editor@opsbox:~$

这说明当前已经进入 editor 账号的远程 Shell。输入 exit 即可退出 SSH 连接,回到 crow@opsbox:~/work$。

提示

SSH 主机指纹的作用 首次连接成功后,SSH 客户端会把服务端的公钥指纹记录在本地的 ~/.ssh/known_hosts 文件中。之后再次连接同一主机时,SSH 会自动比对指纹。 如果突然出现类似 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 的警告,通常有两种可能:目标服务器重装了系统,或者网络中有人正在尝试冒充服务器,也就是中间人攻击。遇到这种情况,应先确认服务端是否真的更换过 SSH 主机密钥,不要盲目继续连接。

5. 使用 scp 传输文件

scp 可以借助 SSH 连接,在不同主机或不同账号之间传输文件。使用时可以记住一个简单规则:

左边是源路径,右边是目标路径。

例如,把本地文件复制到远端 editor 账号的家目录下:

crow@opsbox:~/work$ scp -P 2222 downloaded-hours.txt editor@127.0.0.1:/home/editor/hours-copy.txt

复制完成后,也可以直接通过 SSH 在远端执行命令查看文件内容:

crow@opsbox:~/work$ ssh -p 2222 editor@127.0.0.1 'cat /home/editor/hours-copy.txt'
图书馆开放时间:09:00-18:00

注意:scp 指定端口时使用大写的 -P,而 ssh 指定端口时使用小写的 -p。

6. 配置 SSH 公钥免密登录

每次登录都输入密码会比较麻烦,在生产环境中更常见的做法是使用 SSH 密钥登录。简单来说,就是本地生成一对密钥,公钥放到远端服务器上,私钥留在本地。

先在本地生成 Ed25519 密钥对。为了演示方便,这里可以直接设置空密码:

crow@opsbox:~/work$ ssh-keygen -t ed25519 -f ~/.ssh/admin_practice

生成完成后,把公钥复制到远端 editor 账号的 ~/.ssh/authorized_keys 文件中:

crow@opsbox:~/work$ ssh-copy-id -i ~/.ssh/admin_practice.pub -p 2222 editor@127.0.0.1

这一步可能仍需要输入一次 editor 的密码。公钥部署成功后,就可以使用本地私钥免密登录:

crow@opsbox:~/work$ ssh -i ~/.ssh/admin_practice -p 2222 editor@127.0.0.1 whoami
editor

如果命令返回 editor,说明 SSH 公钥免密登录配置成功。

至此,服务运行状态、端口监听、网络连通性以及 SSH 远程访问配置就都完成了。

最后请继续完成实验任务:确认 bulletin.service 正在运行,并使用 curl 访问下面这个地址:

http://127.0.0.1:8080/weekend.txt

然后把页面返回的周末开放时段填写到第二题任务卡中。