简单的 VPS 问题排错指南

简单的 VPS 问题排错指南


近期有人求助,我的 VPS 连不上了,怎么办?
可能有空的时候会帮一下:你先重启 VPS,然后 ping,再 console,都正常么?,通常最后发现都是防火墙没开啦,服务没启动等等。
其实这些并不是很难,问题都很容易解决,只需要你耐心的去寻找问题的原因。


1、你是如何访问服务器的?

在讲解排错之前,肯定要详细的了解一下流程,这样你才能知根知底。


首先,你需要知道计算机只认识 IP 地址,所以,所有你主机、网址、地址中输入的是域名的,则都需要额外增加一步,就是 DNS 解析。

用户发起浏览请求 (blog.starryvoid.com)
↓↓↓
计算机向【DNS 服务器】请求域名解析(UDP)
↓↓↓
【DNS 服务器】向计算机发送解析结果(UDP)
↓↓↓
用户获得解析的 IP 地址

以上是一段简单的解析流程,从流程中可以看到,假如这个【DNS 服务器】有问题或者错误的话,那么你的计算机完全获取不到任何解析结果,所以你需要使用 nslookup 命令测试【DNS 服务器】是否能正常解析。

正确的 nslookup 命令结果如下

C:\Users\StarryVoid>nslookup blog.starryvoid.com
服务器: SV-Route.StarryVoid-Net
Address: 192.168.1.1

非权威应答:
名称: blog.starryvoid.com
Addresses: 104.24.100.180
           104.24.101.180

此类错误判定方法:Windows 中使用 nslookup 命令进行手动域名解析,如果解析正常则此步骤正常,否则通常都是出错。或者修改原来使用域名的地方改为 IP(网页除外),如果改完正常了,那么也是这个步骤出错了。

此类错误处理方法:查看不同的 DNS 服务器的解析情况,选择更换正确的 DNS,如果实在不行可以手动修改本机 hosts 指定 IP,或者干脆修改域名为 IP 避开解析过程


其次,你需要知道你的网络能否与服务器正常通信?通信流程如下

用户发起 IP 请求 (104.24.100.180)
↓↓↓
用户计算机查询本机【路由表】可否到达 104.24.100.180 ?查询为本机【路由表】不存在此 IP,同时不在一个【子网】内,则将本条请求发往【网关】
↓↓↓
【网关】查询他的【路由表】,如果没找到则继续发往网关,期间可能经过 N 层网关,到达【公网互联网】
↓↓↓
【公网互联网】发现此条【路由】存在,则发往指定目标路由器,直到发到 VPS 运营商【路由器】
↓↓↓
VPS 运营商【路由器】将本条请求发往目的地 104.24.100.180
↓↓↓
服务器 104.24.100.180 收到此条数据,处理后如果存在回包则重新按照此流程走一遍到达用户计算机

看了半天是不是好几个名词不懂啥意思?那么我这么说,网关就是你电脑配置的网关,其他【路由器】你当成一个家里的 WIFI,不看就行。

正确的 Ping 命令结果如下

C:\Users\StarryVoid>ping 104.24.100.180

正在 Ping 104.24.100.180 具有 32 字节的数据:
来自 104.24.100.180 的回复: 字节=32 时间=42ms TTL=52
来自 104.24.100.180 的回复: 字节=32 时间=46ms TTL=52
来自 104.24.100.180 的回复: 字节=32 时间=39ms TTL=52
来自 104.24.100.180 的回复: 字节=32 时间=45ms TTL=52

104.24.100.180 的 Ping 统计信息:
 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间 (以毫秒为单位):
 最短 = 39ms,最长 = 46ms,平均 = 43ms

此类错误判定方法:常用 Ping 命令。而如果个别人的 VPS 用防火墙把【ICMP】限制了那么 Ping 命令会失效,就要用其他方法判别了。而如果 Ping 命令正常有效的情况下,发现你的电脑 Ping 不通对应设备,而一台国外的其他 VPS 可以 Ping 通你的 IP 地址,那么就是中间的【路由器】出现了问题,可能在中国这侧,可能在 VPS 运营商侧。

此类错误处理方法:通过不同网络环境的设备分别去 Ping 服务器,判断并定位哪种环境无法访问。

一些简单的命令如下

查看 VPS 网络信息
ip addr
查看 ARP 信息
ip neigh show
长时间 Ping 的命令(Windows)
ping 104.24.100.180 -t

如果你的【ICMP】被防火墙禁止了,那么你可以通过端口扫描达到同样的目的,使用 ScanPort 等端口扫描软件扫描你的服务器端口,比如 80 是 http,443 是 https,只要扫描成功出一个,那么你与服务器的连通性都是没问题的。


然后,你需要知道你的服务器是否允许了此次请求?服务器管理流程简单如下

收到一个数据包,看看信息是否完整,完整则下一步
↓↓↓
拆开得到【内容 ASD】,发往服务器的【缓存池】,如果【缓存池】满了则丢弃,并且回复一个【池满了请重发】的内容,没满则下一步
↓↓↓
服务器处理数据轮到了【缓存池】中的【内容 ASD】,交给【防火墙】,【防火墙】将其按照规则匹配,得出匹配结果并执行。(ICMP 一般是放行)
↓↓↓
服务器将【内容 ASD】匹配到对应的【监听】【进程】,如果此时【进程】没【监听】,则丢弃此内容,否则则交给【进程】并由程序处理。
↓↓↓
【进程】将【内容 ASD】解析,发现数据包是正确的,则开始处理此数据包;处理完毕此数据包后通常会回复一个数据包,此时反向往回走一遍此流程

注意,在这个流程中,所有的步骤都是必须满足条件,否则就丢弃。也就是,你需要保证服务器没被数据包塞到【缓存池】爆炸(通常是被 DDOS 了),【防火墙】的规则没错并且正确匹配,开启了对应【进程】并且正常运行,而且【进程】认为此数据包正确并予以处理,否则数据包就白发送了一次。

此类错误判定方法:首先应该优先查看防火墙与对应进程的运行情况,绝大多数问题都是在这两点出错,比如有的人 SSR 无法使用,可能防火墙没开端口,可能 SSR 进程没开端口进行【监听】,可能 SSR 进程发现这个数据包不符合自己的要求比如不是 chacha20 协议丢掉了。所以这一步问题是最多的,但是也最容易定位的

此类错误处理方法:查看防火墙,查看进程,查看监听端口,查看配置是否存在错误,查看……等各种查看与排错。注意!慢工出细活。

一些简单的命令如下

关闭防火墙
service iptables stop(CentOS-6 的命令)
systemctl stop firewalld.service(CentOS-7 的命令)
查看本机进程列表
ps -ef
查看本机端口监听情况
netstat -ano

2、出现问题如何快速定位

排错有很多方法,我就简单的说一种

搜集信息 –> 分析信息 –> 推断故障原因 –> 排除故障原因 –> 推断根本性故障原因(未成功退回第一步)–> 制作解决方法 –> 验证解决方法 –> 实施解决方法(未成功退回第一步或第五步) –> 解决故障

也简单的举一个例子

故障

StarryVoid 站点由于不知名原因现在无法访问
(被 DDOS 并由于运营商策略将服务器 IP 隔离了)

解决方法

1、我使用普通电脑的 Ping 命令查看服务器,发现无法 Ping 通
2、我使用国外的 VPS 同样的 Ping 命令查看服务器,发现无法 Ping 通(此时初步定位为后端服务器侧故障)
3、由于之前好用的,突然挂掉了,期间没有别的问题,于是我选择对服务器进行重启(重启后发现问题依旧,此时怀疑网络故障,但是防火墙和网络分不清楚)
4、使用 Console 访问服务器,关闭防火墙,然后查看服务器内部能否正常向外访问,结果发现服务器无法 Ping 通 8.8.8.8,并且使用 ip addr 查看到本机的 IP 地址状态正常(定位服务器侧网络故障)
5、使用服务器 Ping 网关地址,发现可以获得网关 IP 地址的 ARP,但是网关 Ping 不通(定位在网关出现故障)
6、开始查看服务器近期状态,发现在 22 时左右存在瞬间 8GB 流量以及高 CPU 占用,于是初步判断,服务器被人恶意 DDOS,并且现在依旧无法访问(由于 DDOS 期间服务器不能处理网络数据,于是我选择等待)
7、等待了 1 天后,发现流量再无增加,同时服务器依旧无法访问,于是开始向 VPS 商发送工单,请求恢复
8、VPS 商通知了原因,并将服务器恢复正常。

3、排错之后?

如果有经验了,其实你可以跳过推断故障原因,直接开始验证解决方法。当然没有经验就慢慢做,或者采用更合适的方法。

而如果这次错误你成功的解决了,对你也算是一种提升,你可以记录下来此次错误的发生原因,并且以后可以尽量避免重复出现这个错误、

反过来,如果你什么都没试试,上去直接问 “大佬,我服务器坏了怎么办”,除非大佬和你关系好或者心情好,要么基本送你两句没有营养的话,因为你提供的信息根本不足以去解决问题(详情请 Google《提问的智慧》)

最后奉劝一句:排错重在参与


最后附一点常见错误与解决方法


1、使用 netstat -ano 时发现端口绑定在 IPV6 上而非 IPV4,导致无法正常使用

1A:可以通过关闭 IPV6 来达到目的。在 CentOS7 中,可以通过禁止 IPV6 模块加载来实现

if grep -q "ipv6.disable=1" /etc/default/grub
then
  echo "\"ipv6.disable=1\" found in /etc/default/grub"
else
  sed -i.ori 's/^GRUB_CMDLINE_LINUX="/&ipv6.disable=1 /' /etc/default/grub
  /usr/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg
fi

做完后需要 reboot 重启一下,之后开机就不会有 IPV6 的支持了


2、编译组件时出现 configure: error: no acceptable C compiler found in $PATH 错误

2A:这个情况是提示你没有 GCC 编译环境,你需要安装,使用命令 yum -y install gcc 即可


3、如何在 yum update 更新的时候不更新最新版本的内核?

3A:可以通过配置 yum 从而屏蔽某些关键字的更新包。编辑/etc/yum.conf 文件,在 [main]函数中,添加 exclude=kernel* centos-release*即可。注意如果以后安装组件时可能会出现 error,你可以通过注释掉这条命令再次尝试一下。


4、搬瓦工端口死活启动不了,也访问不上,怎么回事?

4A、一些特殊情况下,VNC 所属的用户权限太低,这时你需要修改一下设置(仅供参考)

VNCSERVERS="1:root"
VNCSERVERARGS[1]="-geometry 800x600 -nolisten tcp -localhost"

 

点赞