
为实验室配网络配置与 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、外部访问不到服务器的环境。
基本流程:
- 注册 ZeroTier;
- 创建 Network;
- 服务器安装 ZeroTier;
- Windows 安装 ZeroTier;
- 两台机器加入同一个 Network ID;
- 控制台授权设备;
- 使用 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 命令不会,而是网络链路判断容易混淆。
最重要的经验如下:
- 先看物理链路:
NO-CARRIER就先别纠结 IP; - 有线公网要先确保服务器能 ping 通网关;
- 学校 WiFi 即使同网段,也可能禁止终端互访;
- 手机热点适合临时搭一个小局域网;
- SSH 服务正常不代表外部一定能访问;
- 外地访问本地服务器,必须有公网入口或内网穿透;
- ZeroTier / Tailscale 是无公网环境下最省事的方案;
- 云服务器平台 能直接 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 端口
↓
账号密码或密钥认证
只要按照这个顺序排查,就不会在"为什么我能上网但别人连不上我"这个问题上反复绕圈。