ssh总断 (by quqi99)

Linux Application 专栏收录该内容
75 篇文章 0 订阅

作者:张华 发表于:2020-10-28
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明

公司服务器今天升级了,结果遇到了一个问题,登录在该服务器上的bastion虚机在运行 一个名为configure的脚本的下列代码时总是中断.

set_img_properties ()
{
    img_name=$1
    img_version=$2
    img_file=$3

    ts=`stat ~/images/$img_file| sed -rn 's/Modify:\s+([[:digit:]-]+)\s+.+/\1/p'| tr -d '-'`
    declare -A props=( [architecture]=x86_64
                       [os_distro]='ubuntu'
                       [os_version]=$img_version
                       [version_name]="$ts"
                       [product_name]="com.ubuntu.cloud:server:${img_version}:amd64"
    )
    for p in ${!props[@]}; do
      openstack image set --property $p=${props[$p]} $img_name &
    done
    wait
}
set_img_properties bionic 18.04 bionic-server-cloudimg-amd64.img &

ssh中断之后,只能重启bastion才能解决.
因为一直没有问题,只是今天服务器升级才遇到问题,所以没想别的,只是要求同事也测了一下,他没遇到问题.
接着,以为是mtu问题,将mtu从8930改为1450依旧有问题.

ip netns exec qrouter-1c6f53cf-9b6d-4794-ae8e-61ad1b8e4042 ping -O -M do -s 8930 10.5.0.8
ip netns exec qrouter-1c6f53cf-9b6d-4794-ae8e-61ad1b8e4042 nc -vz 10.5.0.8 22

所以就以为是底层openstack有问题,但我没有底层openstack的管理权限,所以只好找有权限的同事帮忙,最后确定没有这方面的问题.
最后,就是怀疑bastion这台虚机有问题了.发现里面什么时候安装了devstack,删除devstack后,正常了.
但为什么之前一又没问题呢?在有devstack的情况下,代码作下列更改问题也消失.

#set_img_properties bionic 18.04 bionic-server-cloudimg-amd64.img &
set_img_properties bionic 18.04 bionic-server-cloudimg-amd64.img

devstack这些东西不要乱在机器上装啊,习惯要好.上了一大课.

另外,如果ssh连接慢的话,可以尝试在sshd.conf中添加:

UseDNS no
GSSAPIAuthentication no

20210826更新

ssh连不上也可检查一下是否加入了代理白名单

20210910更新

ssh连接不上,发现其他机器可以连接,只是从我working machine无法登录,重启远程机器就可以了

20210916更新 - time-wait

ssh连不上,或者一个服务忽然连不上了要重启才能连上,可能是因为time-wait连接数过多所致

$ netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'
LAST_ACK 1
LISTEN 14
SYN_RECV 3
CLOSE_WAIT 2
ESTABLISHED 194
FIN_WAIT1 16
FIN_WAIT2 2
SYN_SENT 23
TIME_WAIT 1016

一些网络优化的参数如下:

1, 列队优化
#添加列队最大数据包数,防止数据包在10G网络中被丢弃
sysctl net.core.netdev_max_backlog=4096
#连接请求的最大数量,低内存默认为128,超128M内存的系统默认为1024,这里默认是512, 如果服务器过载,请增加此数量
sysctl net.ipv4.tcp_max_syn_backlog=512
#最大待请求连接数, 对于发布大量连接的web服务器等此值高一些才能使这些连接正常工作
sysctl net.core.somaxconn = 4096

2, TCP FIN超时优化
#TCP主动关闭的一方会进入到time_wait状态,直到再收到对方的ack才会释放。默认值60非常高,可以减小以使TCP关闭连接并释放资源以进行另一个连接
sysctl sysctl net.ipv4.tcp_fin_timeout = 30

3, 重用TIME_WAIT状态的套接字进行新连接
#https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=79e9fed460385a3d8ba0b5782e9e74405cb199b1
#允许重新使用time_wait状态的套接字进行新连接。在处理必须time_wait状态下的许多短TCP连接的服务时是不错的选择
net.ipv4.tcp_tw_reuse = 1

4, tcp_keepalive_time优化
#TCP一方想终止连接时会发送RST数据包给另一方并关闭socket. 然而,在此之前,双方将无限期地保持其套接字开放。
# 这使得一方可能有意或由于某些错误而关闭其插座,而无需通过RST通知另一端。 为了检测此场景并关闭过时连接,使用TCP Keep Alive处理
# 本例,一旦另一端无响应1200+75*9秒,则会定期移除死TCP连接
net.ipv4.tcp_keepalive_time = 1200
# time-wait socket的数目,超过此数系统将开始销毁套接字。用于防止DoS攻击,若内存大可调大它
net.ipv4.tcp_max_tw_buckets = 32768

5, 启用MTU黑洞检测优化
#https://blog.cloudflare.com/path-mtu-discovery-in-practice/
#Path MTU Discovery通过ICMP在CS两端找到正确的MTU,但如果防火墙丢失ICMP包的情况称为ICMP black hole.
#此时整个连接会卡死, 发送方不断尝试重新发送丢失的数据包,而接收方仅确认传送的小数据包
#tcp_mtu_probing=1代表默认情况下禁用,但检测到ICMP黑洞时启用
sysctl net.ipv4.tcp_mtu_probing = 1

6, 内核缓存区优化
#最大写入、读取缓冲区大小, 默认设置比较保守,提高它有利于如nfs服务的性能。将它们增加到256k/4b将最有效
# 256 KB / 4 MB
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_max = 4194304
# Or 256 Kb / 64 MB
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864

7, TCP缓冲区优化
#自动优化net.ipv4.tcp_rmem与net.ipv4.tcp_wmem
sysctl -w net.ipv4.tcp_moderate_rcvbuf = 1

最终的设置是:

cat << EOF | sudo tee /etc/sysctl.d/98-network-custom.conf
net.core.netdev_max_backlog = 4096
net.ipv4.tcp_max_syn_backlog = 4096
net.core.somaxconn = 4096
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_mtu_probing = 1
EOF
sudo sysctl --system

sudo modprobe tcp_bbr
echo "tcp_bbr" |sudo tee -a /etc/modules-load.d/modules.conf
echo "net.core.default_qdisc=fq" |sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" |sudo tee -a /etc/sysctl.conf
sudo sysctl -p

但运行了上面的优化设置还是不行,感觉好像是服务器上也运行了公司的办公软件造成的它将到us.archive.ubuntu.com的一些路由改走tun0了, 另外可能和路由器上系统也有关

Reference

[1] https://vincent.bernat.ch/en/blog/2014-tcp-time-wait-state-linux

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:Age of Ai 设计师:meimeiellie 返回首页

打赏作者

quqi99

你的鼓励就是我创造的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值