记一次 CentOS 7 服务器网络配置与 SSH 远程连接排错

为实验室配网络配置与 SSH 远程连接排错的一次经历,仅作分享。

内容已经进行脱敏,IP地址非真实IP。

主题:从"进不去系统"到"配置 IP、连接 WiFi、开启 SSH、排查公网与局域网远程连接"的完整实践记录。

说明:本文已对用户名、SSID、MAC 地址、公网 IP、内网 IP、路径和密码等信息进行脱敏,所有地址均为示例。

适用对象:刚接触 Linux 服务器、CentOS 7、SSH 远程连接、校园网/内网环境排错的同学。

实验环境:普通台式主机 / CentOS Linux 7 / 有线公网 IP / 校园 WiFi / 手机热点 / Windows 客户端 / SSH 客户端。


一、背景说明

这次实践的目标很简单:

给一台进不去系统的 CentOS 7 主机重新设置密码、配置网络,并让它可以像 云服务器平台 云服务器一样,通过 SSH 地址、端口、用户名、密码进行远程登录。

但实际过程并不简单,中间遇到了很多典型问题:

  • 不知道 root 密码,无法登录系统;
  • 需要通过 GRUB 单用户模式重置密码;
  • 有线网卡配置了公网 IP,但网关不通;
  • Windows 电脑能 ping 通网关,但 ping 不通服务器公网 IP;
  • 学校 WiFi 下服务器能上网,但 Windows 不能 SSH 进服务器;
  • 误以为"同一个 WiFi"就一定能互通;
  • 最后发现:能上网不等于能被别人连进来;
  • 还尝试了手机热点、WiFi、SSH 密码登录、普通用户、私钥、ZeroTier、Tailscale、Stowaway、Proxifier 等思路。

这篇文章会把整个排错过程整理成一份教学博客,重点讲清楚:CentOS 7 如何重置 root 密码,如何配置有线静态 IP,如何配置 WiFi,如何开启 SSH,为什么 ping 通不代表 SSH 能连,为什么服务器能上网不代表别人能连进来,以及外地的人想 SSH 进来到底应该怎么做。


二、第一阶段:忘记密码,进入系统重置 root 密码

刚开始这台 CentOS 主机无法登录,因为不知道账号密码。如果你有物理控制台或虚拟机控制台,可以通过 GRUB 进入 emergency mode,重置 root 密码。

重启服务器,在 GRUB 菜单界面按 e 编辑启动项。找到类似下面这一行:

text 复制代码
linuxefi /vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/mapper/centos-root ro ...

把里面的:

text 复制代码
ro

改成:

text 复制代码
rw init=/sysroot/bin/sh

然后按:

text 复制代码
Ctrl + X

启动进入救援环境。

进入 emergency shell 后执行:

bash 复制代码
chroot /sysroot

然后重置 root 密码:

bash 复制代码
passwd root

输入两遍新密码。成功后一般会提示:

text 复制代码
passwd: all authentication tokens updated successfully.

CentOS 7 如果启用了 SELinux,重置密码后建议执行:

bash 复制代码
touch /.autorelabel

然后退出并重启:

bash 复制代码
exit
reboot

如果 reboot 不生效,可以执行:

bash 复制代码
exec /sbin/init

重启后就可以用新 root 密码登录系统。


三、第二阶段:查看网卡信息

登录系统后,第一步是查看网卡:

bash 复制代码
ip addr

或者:

bash 复制代码
nmcli device

当时机器里主要看到这些网卡:

text 复制代码
lo          loopback
p8p1        ethernet
wlp3s0      wifi
enp0s20u2   手机 USB 共享网卡

其中:

  • lo 是本地回环,不用管;
  • p8p1 是有线网卡;
  • wlp3s0 是无线网卡;
  • enp0s20u2 是手机 USB 共享网络时出现的临时网卡。

四、第三阶段:配置有线公网 IP

当时拿到的信息是:

text 复制代码
网关:203.0.113.9
掩码:10.0.99.1
DNS1:公共DNS-A
DNS2:10.0.99.2

掩码 10.0.99.1 对应 CIDR /29。这个网段大致是:

text 复制代码
网络地址:203.0.113.8
可用地址:203.0.113.9 - 10.0.99.3
广播地址:203.0.113.15

其中 .233 通常作为网关,所以服务器本机 IP 可以尝试:

text 复制代码
203.0.113.10

但要注意:这只是根据网关推测出来的地址,真实环境中必须以管理员分配为准。

CentOS 7 的网卡配置文件一般在:

bash 复制代码
/etc/sysconfig/network-scripts/

有线网卡 p8p1 对应配置文件:

bash 复制代码
/etc/sysconfig/network-scripts/ifcfg-p8p1

编辑:

bash 复制代码
vi /etc/sysconfig/network-scripts/ifcfg-p8p1

写入或修改成:

ini 复制代码
TYPE=Ethernet
BOOTPROTO=static
NAME=p8p1
DEVICE=p8p1
ONBOOT=yes
NM_CONTROLLED=yes
DEFROUTE=yes

IPADDR=203.0.113.10
PREFIX=29
GATEWAY=203.0.113.9
DNS1=公共DNS-A
DNS2=10.0.99.2

如果原来有 HWADDR=,一般可以保留,只要它和当前网卡 MAC 地址一致。查看当前网卡 MAC:

bash 复制代码
ip addr show p8p1

如果 HWADDR 不一致,要么改成一致,要么删掉 HWADDR 这一行。

重启网络:

bash 复制代码
systemctl restart network

查看 IP 和路由:

bash 复制代码
ip addr show p8p1
ip route

正常应该看到:

text 复制代码
inet 203.0.113.10/29

默认路由类似:

text 复制代码
default via 203.0.113.9 dev p8p1

五、第四阶段:有线公网为什么还是不通?

5.1 关键报错:NO-CARRIER

当时 ip addr show p8p1 里出现过:

text 复制代码
p8p1: <NO-CARRIER,BROADCAST,MULTICAST,UP> state DOWN

这里的 NO-CARRIER 非常关键。它表示:

text 复制代码
网卡没有检测到物理链路。

也就是说,可能是网线没插好、网线坏了、墙口或交换机端口没开、交换机端口没有信号、插错口、对端设备没开、端口 VLAN 不对。

这时候即使 IP 配得再正确,也无法通信。

5.2 关键报错:Destination Host Unreachable

尝试 ping 网关:

bash 复制代码
ping 203.0.113.9

返回:

text 复制代码
From 203.0.113.10 Destination Host Unreachable

这个意思是:本机知道要找 203.0.113.9,但根本找不到到达它的路径或二层邻居。

5.3 关键报错:ARP INCOMPLETE

查看邻居表:

bash 复制代码
ip neigh

看到:

text 复制代码
203.0.113.9 dev p8p1 INCOMPLETE

这说明系统正在问:

text 复制代码
谁是 203.0.113.9?请告诉我你的 MAC 地址。

但网关没有回应 ARP。这通常意味着网线或端口不通,这个交换机端口不在对应公网 VLAN,网关并不在当前二层网络,IP 或掩码不对,MAC 被绑定,或者运营商线路没有开通。

5.4 Windows 能 ping 网关,不代表服务器公网 IP 通

Windows 上能 ping 通:

cmd 复制代码
ping 203.0.113.9

只能说明 Windows 能访问这个公网网关。但服务器真正的公网 IP 是:

text 复制代码
203.0.113.10

如果:

cmd 复制代码
ping 203.0.113.10

不通,说明服务器这个公网 IP 还没有真正对外可达。不能把 .233 网关当成服务器 IP。


六、第五阶段:改用无线网卡

无线网卡为:

text 复制代码
wlp3s0

查看:

bash 复制代码
nmcli device

最开始可能显示:

text 复制代码
wlp3s0  wifi  unavailable

或者日志里出现:

text 复制代码
WiFi plugin not available

这说明可能缺少:

text 复制代码
NetworkManager-wifi
wpa_supplicant

由于有线没通,安装 WiFi 插件需要临时联网,于是使用手机 USB 共享网络。插入手机,打开 USB 网络共享。CentOS 上查看:

bash 复制代码
ip addr
nmcli device

出现新网卡:

text 复制代码
enp0s20u2

自动获取 IP:

bash 复制代码
dhclient enp0s20u2

测试:

bash 复制代码
ping baidu.com

如果通,说明临时联网成功。

6.1 解决 CentOS 7 yum 源失效

CentOS 7 默认源经常访问 mirrorlist.centos.org,但现在 CentOS 7 已停止维护,默认源可能失效,需要换成 Vault 源或国内镜像。

例如使用阿里云 CentOS Vault 源:

bash 复制代码
cat > /etc/yum.repos.d/CentOS-Base.repo <<'REPO'
[base]
name=CentOS-7.9.2009 - Base
baseurl=http://mirrors.aliyun.com/centos-vault/7.9.2009/os/x86_64/
enabled=1
gpgcheck=0

[updates]
name=CentOS-7.9.2009 - Updates
baseurl=http://mirrors.aliyun.com/centos-vault/7.9.2009/updates/x86_64/
enabled=1
gpgcheck=0

[extras]
name=CentOS-7.9.2009 - Extras
baseurl=http://mirrors.aliyun.com/centos-vault/7.9.2009/extras/x86_64/
enabled=1
gpgcheck=0
REPO

清缓存:

bash 复制代码
yum clean all
yum makecache

安装 WiFi 组件:

bash 复制代码
yum install -y NetworkManager-wifi wpa_supplicant

重启 NetworkManager:

bash 复制代码
systemctl restart NetworkManager

6.2 连接 WiFi

打开 WiFi:

bash 复制代码
nmcli radio wifi on
nmcli device set wlp3s0 managed yes

扫描:

bash 复制代码
nmcli device wifi list

连接 WiFi,例如连接 Campus-WiFi

bash 复制代码
nmcli device wifi connect "Campus-WiFi" password "WiFi密码"

后面又连接了手机热点 demo_user

bash 复制代码
nmcli device wifi connect "demo_user" password "WiFi密码"

查看 IP:

bash 复制代码
ip addr show wlp3s0

连上手机热点后,服务器 IP 变成:

text 复制代码
10.0.0.9

七、第六阶段:开启 SSH 服务

CentOS 上执行:

bash 复制代码
systemctl start sshd
systemctl enable sshd
systemctl status sshd

正常状态:

text 复制代码
Active: active (running)

查看端口监听:

bash 复制代码
ss -lntp | grep :22

正常应该看到:

text 复制代码
LISTEN 0 128 10.0.99.4:22
LISTEN 0 128 [::]:22

这说明 SSH 服务本身已经正常。

防火墙放行 SSH:

bash 复制代码
firewall-cmd --permanent --add-service=ssh
firewall-cmd --reload

排错阶段也可以临时关闭防火墙:

bash 复制代码
systemctl stop firewalld
iptables -F

不建议长期使用 root 远程登录,可以创建普通用户。例如创建 demo_user

bash 复制代码
useradd demo_user
passwd demo_user
usermod -aG wheel demo_user

或者创建 demo_user

bash 复制代码
useradd demo_user
passwd demo_user
usermod -aG wheel demo_user

查看:

bash 复制代码
id demo_user
id demo_user

编辑 SSH 配置:

bash 复制代码
vi /etc/ssh/sshd_config

建议普通用户登录配置:

conf 复制代码
PasswordAuthentication yes
UsePAM yes
PubkeyAuthentication yes
PermitRootLogin no

如果临时允许 root 登录:

conf 复制代码
PermitRootLogin yes
PasswordAuthentication yes
UsePAM yes

修改后重启:

bash 复制代码
systemctl restart sshd

八、第七阶段:为什么 WiFi 能上网,但 Windows SSH 不进去?

服务器连学校 WiFi 后:

bash 复制代码
ping baidu.com

能通。这说明服务器可以主动访问外网。

但 Windows 上执行:

powershell 复制代码
ping 192.0.2.45
Test-NetConnection 192.0.2.45 -Port 22

结果:

text 复制代码
PingSucceeded : False
TcpTestSucceeded : False

这说明 Windows 访问不到服务器。

即使服务器和 Windows 都连接了学校 WiFi,也不一定能互访。学校、公司、酒店 WiFi 经常开启 AP 隔离、客户端隔离、无线用户隔离、ACL 策略、不同 VLAN 隔离。表现为每台设备都能上网,但设备之间不能 ping,也不能 SSH。

所以:

text 复制代码
服务器能 ping baidu.com ≠ Windows 能 SSH 服务器

服务器和 Windows 都连接同一个手机热点 demo_user 后,服务器 IP 变成:

text 复制代码
10.0.0.9

此时 Windows 也在同一个手机热点局域网里,就可以尝试:

powershell 复制代码
ping 10.0.0.9
Test-NetConnection 10.0.0.9 -Port 22
ssh demo_user@10.0.0.9

手机热点通常不会做复杂的客户端隔离,所以更容易成功。


九、第八阶段:为什么外地的人不能直接 SSH?

外地的人要 SSH 进来,必须访问到一个"公网可达入口"。

IP 类型 外地能否直接访问
10.0.0.9 手机热点内网 IP 不能
192.0.2.45 学校 WiFi 内网 IP 通常不能
203.0.113.10 有线公网 IP 理论可以,但当前链路没通

所以外地的人不能直接连:

bash 复制代码
ssh demo_user@10.0.0.9

也不能直接连:

bash 复制代码
ssh demo_user@192.0.2.45

如果想从外地访问,必须使用公网 IP、ZeroTier、Tailscale、frp、cpolar、ngrok 等方案之一。


十、让外地的人能 SSH 的三种方案

10.1 方案 A:修好公网 IP

如果要像 云服务器平台 一样:

bash 复制代码
ssh demo_user@203.0.113.10

服务器上必须满足:

bash 复制代码
ip addr show p8p1
ping 203.0.113.9
ss -lntp | grep :22

其中 ping 203.0.113.9 必须通,并且网卡不能是 NO-CARRIER,必须是 LOWER_UP。如果服务器自己都 ping 不通公网网关,那么外地的人肯定连不上 203.0.113.10

10.2 方案 B:使用 ZeroTier

ZeroTier 适合服务器能上网但没有公网 IP、外部访问不到服务器的环境。

基本流程:

  1. 注册 ZeroTier;
  2. 创建 Network;
  3. 服务器安装 ZeroTier;
  4. Windows 安装 ZeroTier;
  5. 两台机器加入同一个 Network ID;
  6. 控制台授权设备;
  7. 使用 ZeroTier 分配的 IP SSH。

CentOS 安装:

bash 复制代码
curl -s https://install.zerotier.com | bash
systemctl enable --now zerotier-one
zerotier-cli join 你的NetworkID

查看:

bash 复制代码
zerotier-cli status
zerotier-cli listnetworks
ip addr

假设服务器 ZeroTier IP 是:

text 复制代码
10.0.99.5

外地电脑也加入同一 ZeroTier 网络后,可以:

bash 复制代码
ssh demo_user@10.0.99.5

SSH 客户端 填:

text 复制代码
Address:10.0.99.5
Port:22
Username:demo_user
Password:<登录密码>

10.3 方案 C:使用 Tailscale

Tailscale 和 ZeroTier 类似,也很适合无公网环境。

服务器安装:

bash 复制代码
curl -fsSL https://tailscale.com/install.sh | sh
systemctl enable --now tailscaled
tailscale up

查看 IP:

bash 复制代码
tailscale ip -4

假设得到:

text 复制代码
10.0.99.6

外地电脑也加入同一 Tailscale 网络后:

bash 复制代码
ssh demo_user@10.0.99.6

10.4 方案 D:frp / cpolar / ngrok / Stowaway

这类属于内网穿透或代理隧道方案。如果有公网 VPS,可以用 frp:

text 复制代码
外地电脑 → 公网 VPS → 内网服务器 SSH

最终形式可能是:

bash 复制代码
ssh demo_user@公网VPS_IP -p 60022

Stowaway 更偏红队/内网代理工具,不太适合日常稳定运维。Proxifier 只能让客户端流量走代理,不能单独把服务器暴露出来。


十一、关键概念总结

11.1 能上网和能被连接是两回事

text 复制代码
服务器能 ping baidu.com
= 服务器能访问外网

Windows 能 ssh 服务器
= Windows 能访问服务器入站端口

两者不是一回事。

11.2 ping 通不代表 SSH 能通

ping 使用 ICMP,SSH 使用 TCP 22 端口。所以可能出现:

text 复制代码
PingSucceeded : True
TcpTestSucceeded : False

这说明 IP 能到,但 22 端口不通。

排查命令:

powershell 复制代码
Test-NetConnection 服务器IP -Port 22

服务器上:

bash 复制代码
ss -lntp | grep :22
systemctl status sshd

11.3 ping 网关不代表 ping 服务器

例如:

text 复制代码
203.0.113.9 是网关
203.0.113.10 是服务器 IP

Windows 能 ping 通 .233,不代表 .234 就一定通。

11.4 内网 IP 不能直接被外网访问

这些地址通常是内网地址:

text 复制代码
192.168.x.x
172.16.x.x - 172.31.x.x
10.x.x.x

例如:

text 复制代码
10.0.0.9
192.0.2.45

外地的人不能直接通过公网访问它们。


十二、本次实践最终经验

本次实践真正暴露的问题不是 Linux 命令不会,而是网络链路判断容易混淆。

最重要的经验如下:

  1. 先看物理链路:NO-CARRIER 就先别纠结 IP;
  2. 有线公网要先确保服务器能 ping 通网关;
  3. 学校 WiFi 即使同网段,也可能禁止终端互访;
  4. 手机热点适合临时搭一个小局域网;
  5. SSH 服务正常不代表外部一定能访问;
  6. 外地访问本地服务器,必须有公网入口或内网穿透;
  7. ZeroTier / Tailscale 是无公网环境下最省事的方案;
  8. 云服务器平台 能直接 SSH,是因为平台已经帮你做好了公网映射。

十三、推荐最终部署方案

如果只是本地临时连接:

text 复制代码
Windows 和服务器连接同一个手机热点
ssh demo_user@10.0.0.9

如果要外地长期连接:

text 复制代码
推荐 ZeroTier 或 Tailscale

最终可以给外地人这样的信息:

text 复制代码
Host:ZeroTier 或 Tailscale 分配的 IP
Port:22
Username:demo_user
Password:<登录密码>

如果想用真正公网 IP:

text 复制代码
必须修好 203.0.113.10 对应的有线公网链路

十四、常用命令速查

查看网卡

bash 复制代码
ip addr
nmcli device
ip route

查看有线链路

bash 复制代码
ip addr show p8p1
ip neigh
ping 203.0.113.9

查看 WiFi

bash 复制代码
nmcli radio wifi on
nmcli device wifi list
nmcli device wifi connect "WiFi名称" password "WiFi密码"

查看 SSH

bash 复制代码
systemctl status sshd
systemctl enable --now sshd
ss -lntp | grep :22

关闭防火墙测试

bash 复制代码
systemctl stop firewalld
iptables -F

Windows 测试端口

powershell 复制代码
ping 服务器IP
Test-NetConnection 服务器IP -Port 22

创建用户

bash 复制代码
useradd demo_user
passwd demo_user
usermod -aG wheel demo_user

SSH 登录

bash 复制代码
ssh demo_user@服务器IP

指定端口:

bash 复制代码
ssh demo_user@服务器IP -p 2222

十五、结语

这次实践最核心的收获是:

Linux 服务器远程连接问题,不要一上来就怀疑账号密码。要先判断网络路径是否通、端口是否通、服务是否监听、认证是否允许。

完整排查顺序应该是:

text 复制代码
物理链路
  ↓
IP 配置
  ↓
路由
  ↓
能否 ping 网关
  ↓
能否出网
  ↓
SSH 服务是否监听
  ↓
防火墙是否放行
  ↓
客户端是否能访问 22 端口
  ↓
账号密码或密钥认证

只要按照这个顺序排查,就不会在"为什么我能上网但别人连不上我"这个问题上反复绕圈。

相关推荐
hbugs0014 小时前
PNetLab-vs-EVE-NG安全性分析
网络·eve-ng·eve-ng模拟器
Jtti4 小时前
多IP站群服务器有什么用?
运维·服务器·搜索引擎
一个想打拳的程序员4 小时前
把%20NAS、服务器、各种后台入口聚合到一个页面,Sun-Panel%20五分钟搭好
linux·运维·服务器·自动化
Yeats_Liao4 小时前
BLE Mesh能承载AI推理吗?分布式边缘AI节点部署实战
服务器·人工智能·分布式·架构·边缘计算
それども14 小时前
Gradle 构建疑难杂症 Could not find netty-transport-native-epoll-linux-aarch_64.ja
java·服务器·gradle·maven
NightReader15 小时前
CPU 高使用率,怎么降下来
运维·服务器
Yang961115 小时前
无损精准查缆:鼎讯 G-340A 在铁路高速场景的应用
网络·信息与通信
开开心心就好16 小时前
免费流畅的远程控制实用工具
linux·运维·服务器·网络·智能手机·excel
代码熬夜敲Q18 小时前
ENSP 网络工程实验
linux·运维·服务器