解决华为云CentOS 7 SSH 远程连接不上的问题

博客讲述了在使用华为云ECS时遇到的SSH连接不稳定问题,问题根源在于net.ipv4.tcp_tw_recycle参数设置为1导致的网络异常。内容解释了tcp_tw_recycle工作原理,以及在NAT环境下的问题,指出该参数应设置为0以避免连接问题。解决方案包括禁用tcp_tw_recycle或调整tcp_timestamps。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

买了华为云的多台ECS,使用的CentOS 7.5 x64系统,对系统做了网络优化,优化的参数在公司LAN和阿里云服务器上均试验无问题。

问题描述:

1. 使用一段时间后,会出现不定期的公司办公室内ssh连接不上ECS的问题,既连不上22端口,也连不上其他服务端口。

2. ECS之间网络互访没问题。

3. 公司内用手机开了热点连接ECS也没问题。

4. 管理后台重启ECS后,网络连接恢复正常。

5. 公司内有一台安装了CentOS 7 的Linux服务器可以正常连接ECS,MacOS和Windows的工作机出问题时都连不上。

经过和华为云客服的三次排查,终于定位了问题,即net.ipv4.tcp_tw_recycle不能设置为1,必须设置为0

参考https://blog.youkuaiyun.com/jueshengtianya/article/details/52130667

有些服务器(当然客户端也可以)为了避免TIME_WAIT状态占用连接,希望能加快TIME_WAIT状态的回收,通常将net.ipv4.tcp_tw_recycle选项开启。当然这个选项的生效要依赖net.ipv4.tcp_timestamps选项的开启。虽然开启这个选项能够加快TIME_WAIT连接的回收,但却引入了另一个问题。我们先看下tcp_tw_recycle选项的工作机制:
当开启了tcp_tw_recycle选项后,当连接进入TIME_WAIT状态后,会记录对应远端主机最后到达分节的时间戳。如果同样的主机有新的分节到达,且时间戳小于之前记录的时间戳,即视为无效,相应的数据包会被丢弃(rfc1323)。
    Linux是否启用这种行为取决于tcp_timestamps和tcp_tw_recycle,因为tcp_timestamps缺省就是开启的,所以当tcp_tw_recycle被开启后,实际上这种行为就被激活了。
    现在很多公司都用LVS做负载均衡,通常是前面一台LVS,后面多台后端服务器,这其实就是NAT,当请求到达LVS后,它修改地址数据后便转发给后端服务器,但不会修改时间戳数据,对于后端服务器来说,请求的源地址就是LVS的地址,加上端口会复用,所以从后端服务器的角度看,原本不同客户端的请求经过LVS的转发,就可能会被认为是同一个连接,加之不同客户端的时间可能不一致,所以就会出现时间戳错乱的现象,于是后面的数据包就被丢弃了,具体的表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK,还可以通过下面命令来确认数据包不断被丢弃的现象:

shell> netstat -s | grep timestamp
… packets rejects in established connections because of timestamp
    如果服务器身处NAT环境,安全起见,通常要禁止tcp_tw_recycle,至于TIME_WAIT连接过多的问题,可以通过激活tcp_tw_reuse来缓解(只对客户端有作用)。

当然关闭tcp_timestamps选项也是可以避免这个问题的:
设置sysctl.conf里面tcp_timestamps=0也可以只用命令sysctl -w net.ipv4.tcp_timestamps=0
    但个人建议关闭tcp_tw_recycle选项,而不是timestamp;因为 在tcp timestamp关闭的条件下,开启tcp_tw_recycle是不起作用的;而tcp timestamp可以独立开启并起作用。此外tcp timestamp还和其他选项起作用有关,如tcp_tw_reuse。

写到最后,总结一个问题:为什么net.ipv4.tcp_tw_recycle在内网的服务器和阿里云的服务器可以设置为1而无此问题呢?

大概是华为云的ECS在某后代理之后,用了NAT连接到的,所以会出现这种问题,当然这只是猜测。

### 如何使用SSH连接华为云服务器 #### 准备工作 为了能够顺利通过SSH连接华为云服务器,需先完成必要的准备工作。这包括但限于创建并配置好华为云服务器实例,确保已安装有支持SSH协议的客户端软件(对于Linux和Mac操作系统,默认自带OpenSSH工具)。另外,还需获取目标服务器的相关信息,比如分配给它的公共IP地址或是私有网络内的IP地址。 #### 导入公钥 在尝试首次建立无密码认证方式下的SSH会话之前,应该把本地计算机上的SSH密钥对中的公钥上传到远端机器上。按照指导说明,经过一系列设置之后,应当能实现无需手动输入密码就能访问的目的[^1]。 ```bash ssh-copy-id root@your_server_ip_address ``` 此命令将会自动将用户的公钥复制到指定的目标主机,并适当调整权限以便于后续免密登录操作正常运作。(请注意替换`your_server_ip_address`为实际使用的服务器IP) #### 进行基本测试 一旦完成了上述步骤,则可以直接运行如下所示简单的SSH命令来验证能否成功接入: ```bash ssh root@your_server_ip_address ``` 如果一切设定都正确的话,这时应可以无障碍地进入远程shell环境而需要再额外提供任何凭证信息了。 当遇到因更换系统镜像等原因造成原有SSH连接失效的情况时,可能需要参照特定解决方案来进行排查修复。例如针对从CentOS切换成Ubuntu后产生的兼容性问题,就需要采取相应措施恢复正常的SSH服务功能[^2]。 #### 使用图形化IDE集成开发环境进行SSH链接 除了传统的命令行界面外,现代许多编程编辑器也提供了内置的支持用于简化这一过程。以Visual Studio Code为例,只需简单几步即可建立起安全稳定的通道直达云端资源位置。具体做法是在VSCode里找到对应的功能入口,依据提示依次填写必要参数直至最终确立起有效的关联关系[^3]。 #### 应对稳定连接状况 即使前期准备充分,在某些特殊场景下仍可能会碰到间歇性的连通障碍现象。对此类情况的一个潜在解决策略是借助于`/etc/hosts.allow`文件定义允许访问的具体源地址列表,从而提高稳定性并减少误判几率。当然这只是众多可行方案之一,具体情况还需要结合实际业务需求和技术条件综合考量处理方法[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值