萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 使用 ControlPersist 加速 SSH 連接:從 9.5s 降至 0.24s 的實戰優化

Ansible 並發管理數百台跨 IDC 服務器時,SSH 握手延遲會線性累積為分鐘級耗時。開啟 **ControlMaster + ControlPersist** 復用 TCP 連接,單次節省 ~1 秒,百台節省 ~1 分鐘。本文記錄 CentOS 6.4 編譯新版 OpenSSH、配置多路復用、驗證效果全過程。

原理速覽

  • ControlMaster auto:首次連接創建 Unix Domain Socket(~/.ssh/sockets/%r@%h-%p),後續連接復用此 Socket,跳過 TCP 握手、密鑰交換、認證。
  • ControlPersist 4h:Master 連接空閒 4 小時後自動關閉,平衡復用收益與資源佔用。
  • 僅需客戶端支持:服務端無需任何修改,極適合跳板機/Ansible 控制節點單側部署。

步驟 1:編譯安裝 OpenSSH 6.6p1+(CentOS 6 默認 5.3p1 不支持 ControlPersist)

1.1 安裝構建依賴

yum -y groupinstall "Development tools"
yum -y install pam-devel rpm-build rpmdevtools zlib-devel krb5-devel \
  tcp_wrappers tcp_wrappers-devel tcp_wrappers-libs

1.2 配置 RPM 構建環境

mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS,TMP}
cat > ~/.rpmmacros <<'EOF'
%_topdir /home/dong.guo/rpmbuild
%_tmppath /home/dong.guo/TMP
EOF

1.3 升級 OpenSSL(可選,建議)

yum update openssl

1.4 下載源碼、提取 SPEC、修改、構建 RPM

cd ~/rpmbuild/SOURCES
wget https://mirror.team-cymru.org/pub/OpenBSD/OpenSSH/portable/openssh-6.6p1.tar.gz
wget https://mirror.team-cymru.org/pub/OpenBSD/OpenSSH/portable/openssh-6.6p1.tar.gz.asc
openssl dgst -sha1 openssh-6.6p1.tar.gz  # 校驗

cd ~/rpmbuild/SPECS
tar xfz ../SOURCES/openssh-6.6p1.tar.gz openssh-6.6p1/contrib/redhat/openssh.spec
mv openssh-6.6p1/contrib/redhat/openssh.spec openssh-6.6p1.spec
rm -rf openssh-6.6p1

# 禁用 GNOME/X11 askpass 依賴
sed -i -e 's/%define no_gnome_askpass 0/%define no_gnome_askpass 1/g' openssh-6.6p1.spec
sed -i -e 's/%define no_x11_askpass 0/%define no_x11_askpass 1/g' openssh-6.6p1.spec
sed -i -e 's/BuildPreReq/BuildRequires/g' openssh-6.6p1.spec

rpmbuild -ba openssh-6.6p1.spec

1.5 安裝生成的 RPM

cd ~/rpmbuild/RPMS/x86_64
rpm -e openssh-askpass openssh-ldap  # 移除衝突包
rpm -Fvh openssh*6.6p1-1*rpm
# 注意:sshd_config 會備份為 .rpmnew,需手動合併自定義配置

步驟 2:配置 ~/.ssh/config 啟用多路復用

mkdir -p ~/.ssh/sockets
chmod 700 ~/.ssh/sockets

cat > ~/.ssh/config <<'EOF'
Host *
    Compression yes
    ServerAliveInterval 60
    ServerAliveCountMax 5
    ControlMaster auto
    ControlPath ~/.ssh/sockets/%r@%h-%p
    ControlPersist 4h
EOF

步驟 3:安裝 cmc 管理 Socket(可選)

yum install -y epel-release git
git clone https://github.com/ClockworkNet/cmc.git
cp cmc/cmc ~/bin/
# 用法:cmc -l 列出, cmc -X 關閉所有

步驟 4:實測效果對比

場景命令耗時說明
首次連接 (無 Socket)time ssh host 'hostname -s'9.48s完整 TCP+SSH 握手
復用 Sockettime ssh host 'hostname -s'0.24s直接走 Unix Socket,跳過握手
清理 Socket 後time ssh host 'hostname -s'9.46s恢復首次連接耗時

生產環境注意事項

  1. SSH 版本:OpenSSH ≥ 5.6 支持 ControlPersist,≥ 6.7 建議(安全修復)。
  2. 文件描述符限制:大量並發 Socket 可能觸發 ulimit -n,調大 /etc/security/limits.conf。
  3. 安全性:Socket 文件權限 0700,僅用戶可讀寫;ControlPersist 過長可能殘留殭屍 Master,建議 1-4h。
  4. Ansible 整合:ansible.cfg 中 [ssh_connection] control_path = ~/.ssh/sockets/%%r@%%h-%%p 即可複用。

在跨公網、高延遲鏈路、大規模並發運維場景下,ControlPersist 是**零代碼修改、即開即用、收益顯著**的 SSH 加速銀彈。

copyright © 萬盛學電腦網 all rights reserved