首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

內網 SSH/MySQL 登錄緩慢根因與秒級優化:關閉 DNS 反向解析

     編輯:MySQL 資料庫相關知識

內網開發/測試環境常遇到 SSH 連接、MySQL 客戶端連接「卡住十幾秒才出現密碼提示」的問題。根因是服務端默認開啟 DNS 反向解析:嘗試將客戶端 IP 解析為主機名,內網無 DNS 服務器導致解析超時(默認 10-30 秒)後才繼續認證流程。本文給出 SSH 與 MySQL 服務端的標準關閉配置,經驗證可將連接耗時從 20s+ 降至 <1s。

現象與原理

服務默認行為內網後果
SSH (sshd)UseDNS yes:接受連接後反向解析客戶端 IP → PTR 記錄 → 再正向驗證 A/AAAA 記錄匹配無內網 DNS,PTR 查詢超時,登錄卡頓
MySQL (mysqld)skip_name_resolve=OFF:線程連接時解析客戶端 IP → 主機名,用於權限表 Host 列匹配(如 'user'@'hostname')同理,解析超時,show processlist 顯示 Unauthenticated 狀態

解決方案:服務端配置關閉反向解析

1. SSH 服務端

編輯 /etc/ssh/sshd_config:

# 關鍵三項
UseDNS no
GSSAPIAuthentication no
GSSAPICleanupCredentials yes

# 建議同步優化
ClientAliveInterval 60
ClientAliveCountMax 3
# 禁用密碼登錄,強制密鑰(安全加固)
# PasswordAuthentication no
# PubkeyAuthentication yes

生效:systemctl reload sshd 或 service sshd reload。

2. MySQL 服務端

編輯 /etc/my.cnf(或 /etc/mysql/my.cnf)[mysqld] 區塊:

[mysqld]
# 核心:跳過主機名解析,權限表 Host 列只能用 IP、localhost、%
skip_name_resolve = ON

# 注意:skip-grant-tables 是跳過權限檢查(緊急重置密碼用),生產嚴禁開啟!
# skip-grant-tables = OFF  # 確保關閉

生效:systemctl restart mysqld(需重啟進程)。

關鍵影響與應對

驗證優化效果

# SSH
time ssh user@internal-server 'echo connected'
# 預期:real < 1s

# MySQL
time mysql -h internal-db -u app_user -p'pass' -e 'SELECT 1;'
# 預期:real < 0.5s

# 觀察 MySQL 線程狀態
mysql -h internal-db -e 'SHOW PROCESSLIST;'
# 不應出現 "Unauthenticated" 狀態停留

生產環境安全提示

線上/對外服務器建議保持 DNS 解析開啟(配合內網 DNS 基礎設施),便於審計追蹤、基於主機名的訪問控制。內網開發/測試環境無 DNS 基建時,關閉解析是性價比最高的優化手段。

總結

內網 SSH/MySQL 登錄緩慢 90% 由服務端 DNS 反向解析超時導致。核心修復:SSHD 設置 UseDNS no,MySQL 設置 skip_name_resolve=ON,並同步清理權限表中的主機名賬號。操作後連接耗時通常降至亞秒級,體驗質的飛躍。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
配置影響應對策略
skip_name_resolve=ON權限表 mysql.user 的 Host 列不再支持主機名,僅識別 IP、localhost、%(通配所有 IP)排查現有賬號:SELECT User, Host FROM mysql.user WHERE Host NOT IN ('localhost','%','127.0.0.1','::1') AND Host NOT REGEXP '^[0-9.]+$'; 將主機名賬號改為 IP 或 %
UseDNS noSSH 日誌/審計記錄將顯示 IP 而非主機名日誌分析工具適配 IP 格式;如需主機名,部署內網 DNS 並開啟 UseDNS