內網開發/測試環境常遇到 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 狀態 |
編輯 /etc/ssh/sshd_config:
# 關鍵三項
UseDNS no
GSSAPIAuthentication no
GSSAPICleanupCredentials yes
# 建議同步優化
ClientAliveInterval 60
ClientAliveCountMax 3
# 禁用密碼登錄,強制密鑰(安全加固)
# PasswordAuthentication no
# PubkeyAuthentication yes
生效:systemctl reload sshd 或 service sshd reload。
編輯 /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(需重啟進程)。
| 配置 | 影響 | 應對策略 |
|---|---|---|
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 no | SSH 日誌/審計記錄將顯示 IP 而非主機名 | 日誌分析工具適配 IP 格式;如需主機名,部署內網 DNS 並開啟 UseDNS |