- 今天在使用自己的网页时,忽然发现自己的服务器访问网页资源变得极其之慢,以致于不能正常使用。于是便开始排查原因。结果就是多数时候遇到的“就这?”
首先,我需要确定是网络问题还是CPU负载问题,于是我通过netstat和top命令进行了确认。发现了大量来自全国各地的不明链接,故知道问题出在网络方面,而不是CPU被占满所导致的。
1. 排查n2n
接着,我考虑了一下是不是n2n虚拟局域网占用了我服务器的带宽,于是我停止了我的n2n访问,但问题并未得到解决。
2. 重启大法
我随后重启了整个服务器,发现对服务器的访问流畅了很多。但是我发现有一些服务没有配置自启动,因此我需要一个一个手动启动服务。
最终,我发现一个代理服务占用了网速,于是我开始定位问题所在,并找到了解决该问题的方法。
3. 关闭局域网连接
但是在完成这些工作之后,我面临着一个新问题,就是其他人正在利用我的服务。因此我需要关闭来自局域网的连接,以拒绝其他人的访问。在拒绝来自局域网的连接之后,我自己某个docker容器内部的另一个服务需要使用到这个服务器,因为对于docker容器的宿主机来说,docker容器内的服务是通过局域网连接过来的,所以我docker容器内的服务也无法走代理。该当如何解决呢?
4. 排查防火墙
我的服务器是开启了防火墙的,正常来说,即便我允许来自局域网的连接,在我关闭对应端口的情况下,其他人也无法通过这个端口来访问我的服务。
我通过宝塔面板加了一条规则,阻止了来自对应端口的所有互联网连接,发现没有生效,这个端口依旧畅通无阻。
手动通过iptables查询所有防火墙规则。
iptables -L
当然如果需要知道规则的编号则可以用如下命令。
iptables -v --line-numbers -L
通过查询规则,并未发现有什么异常的地方。一方面是自己看,另一方面我也把我查询到的输出交给了chatgpt,让它来帮我分析是否这个端口能通过这一系列防火墙,chatgpt告诉我是不能通过的。而实际情况是通过了,那么问题出在哪里呢?
- 发现预留端口。
后来我回到宝塔面板,发现了预留端口,当时我为了方便,设置了一条规则统一将7000-8000的端口全部说放行,导致最后无论我如何增加规则,7000-8000端口依旧畅通无阻。这件事说明了留这种绿色通道还是要小心谨慎,不然时间过得久了就容易被自己忽视,留下安全隐患。
5. 调整防火墙
最后一步,我先删除了宝塔那边放行的一条规则。经过测试,7000-8000端口无法连通,再在服务层面允许来自局域网的连接。但是此时来自局域网的连接同样会被防火墙阻拦,所以其他人依旧无法使用我的服务。
然后我手动通过iptables来调整了防火墙,删除了某些规则,比如说入流量的第31条规则,用的是这个命令。
iptables -D INPUT 31
6.放行指定ip
当然只禁止肯定是不行的,因此需要放行自己的服务。因为docker容器的访问宿主机的原理是通过一个虚拟局域网来访问的,docker容器和宿主机均处于同一虚拟局域网,对此只需要找到对应容器的ip,对该ip添加规则放行即可。
iptables -A INPUT -p tcp --dport 7890 -s 172.17.0.2 -j ACCEPT
总结
简单总结一下就是,不要给自己的服务器留绿色通道,可能会造成意想不到的错误,第一时间应该尽可能关闭对外通道。虽然表面看起来比较简单,实际调试的过程更加复杂和曲折。