最近机场突然连不上了,一开始以为是正常网络波动,后来发现接连一两天都连不上,花了一天处理了这个事情。
正文
由于笔者人懒于折腾,在澳洲租的服务器搭好后什么都没部署,就只跑了个最为简陋的机场,也半年都没登录看看情况了。17号的时候跑到civitai
上下了几个diffusion模型,一天跑了几个G的流量,然后当晚机场就连接不上,于是先怀疑被GFW给gank了。
先ping
一下协议层以下的可达性,这个随便找个免费的提供这种服务的网站测一发就行了。发现国外以及全国各地网络都稳定可达且域名能正常解析,这说明DNS和IP层往下都没啥问题,大概率就不是被GFW了。
现这个在澳大利亚的服务器可以正常ssh
连接,登录之后咋一看好像没什么问题,没有占用爆炸,也没有冒很多错出来。用journalctl
看一下日志发现这段时间一直有一群疑似肉鸡的东西在尝试远程登陆我的服务器,随便查一下一个疑似肉鸡的IP,发现这个IP已经被多次报告有问题了。平均每三秒钟就有一个登录尝试,而且这些登录都来自不同的IP,那么应该有一个控制了许多肉鸡的自动恶意程序在尝试爆破我服务器的密码。
先处理这个问题,于是搜了一下按照网上的教程安装了fail2block
,让相同IP三次登录失败就直接封14天,启动服务后发现好像没跑起来,看一下日志文件。
2024-02-19 10:42:18,631 fail2ban.actions [29992]: NOTICE [sshd] Ban 77.82.84.12
2024-02-19 10:42:19,010 fail2ban.utils [29992]: ERROR 7fb012810e00 -- exec: ports="$(echo 'ssh' | sed s/:/-/g)"; for p in $(echo $ports | tr ", " " "); do firewall-cmd --add-rich-rule="rule family='ipv4' source address='77.82.84.12' port port='$p' protocol='tcp' reject type='icmp-port-unreachable'"; done
2024-02-19 10:42:19,011 fail2ban.utils [29992]: ERROR 7fb012810e00 -- stderr: 'FirewallD is not running'
2024-02-19 10:42:19,011 fail2ban.utils [29992]: ERROR 7fb012810e00 -- killed with signal 124 (return code: 252)
2024-02-19 10:42:19,011 fail2ban.actions [29992]: ERROR Failed to execute ban jail 'sshd' action 'firewallcmd-rich-rules' info 'ActionInfo({'ip': '77.82.84.12', 'fid': <function <lambda> at 0x7fb010eaa140>, 'family': 'inet4', 'raw-ticket': <function <lambda> at 0x7fb010eaa6e0>})': Error banning 77.82.84.12
fail2block
用firewalld
这个防火墙服务作为后端,但它没跑起来,systemctl enable firewalld
,systemctl start firewalld
启动一下就行了。启动完了还要清理一下fail2block
的已封禁列表,防止失败的ban被看作成功的ban。
一个中午就ban了三四十个IP。
然后回头继续解决机场连不上的问题,笔者使用的代理方式是走https
协议(Trojan Proxy),用Let's Encrypt的免费签名。先检查一遍httpd
服务(Apache)、v2ray
服务(代理后端)、签名是否过期,发现一切安好,那大概多半不是服务器的问题了。
在/var/log/httpd
下看一下Apache服务器的访问日志,发现有访问,但都不来自国内,而且我也打开不了之前部署的https
测试页面了。既然应用层一点动静没有,而IP层往下又都没问题,那问题必然是传输层。开始怀疑是不是GFW把传输层的TCP协议ban了。
没想到几年前学的网络课现在派上了用场...先用wireshark
本地抓包看看情况:
本地发送的SYN没有回音,反倒回来一些ICMP回复(Destination unreachable),上网查查看到底怎么回事,结果由于没有机场StackExchange根本加载不出来,气个半死。
总而言之先排除本地防火墙的问题吧,iptables --flush
,然后给三个主要的Chain全部允许。待会再重新启动防火墙把攻击我的肉鸡ban了,结果依然连接不上。再抓包,ICMP回复没了,说明刚才哪些回复大概率是本地防火墙搞的,这或许说明包是能到笔者的服务器的,但是防火墙配置出了问题导致无法链接。
反手把防火墙整个关掉:systemctl stop firewalld
,然后用http
协议直接访问站点,发现好像正常地按照Apache配置跳转到https
页面去了,抓包,发现可达,但是一到https
的443
TCP端口就连不上了。
排除了防火墙的问题,把防火墙重新装好。现在进入了一个很诡异的状态:
- 域名可以正确解析到IP。
http
协议(TCP 80端口)可以完整跑通。https
协议跑不通。根据服务器Apache Log和本地抓包信息表明,443端口的包能发出去,但没有TCP回音。这或许说明本地TCP 443端口链接的SYN包发出去后,Apache并未收到,或者说收到了但没能成功给出回复。- 虽然没有TCP回音,但如果再服务器防火墙把TCP 443端口的包给ban掉然后发一个ICMP Reject回来,那么本地也可以收到这个ICMP包,这说明服务器防火墙是能正常运行且于本地之间基本畅通无阻的。
所以,笔者能想到两个可能:
- Apache服务器出于某种原因突然变得未能正确处理443端口的TCP链接,也因此未能留下Log。
- GFW把443端口的入站包丢了,由于握手没完成,Apache服务器也没能留下Log。
但是劳资是个不喜欢折腾的懒人!我又不是网络专业的!具体原因什么的谁愿意分析就去分析吧!听JeremyGuo说不用Trojan也很稳定,现在https
网页我都访问不到了,栈道都没了还玩什么暗度陈仓?随便开个新端口用吧!