我家里有一台 Linux 服务器,其中的 DynDNS URL 设置指向我的公共 IP 地址。
我注意到的一件事是使用远程地址(例如url.dyn-dns.tv
或我的公共 IP)与本地 IP 相比连接到服务器的速度更快192.168.xx.xx
。
有人知道为什么会这样吗?
答案1
tl;dr 修复服务器上的 DNS 解析器配置。(一种解决方法是关闭 SSHD 中的反向查找,但最好修复损坏的部分)
原始答案
有人知道为什么会这样吗?
并非如此,但这里有一个轶事可能会有所帮助:
过去,在使用不同的协议时,我发现当建立连接需要异常长的时间时,其中一个原因是 DNS 超时,因为服务器会尝试查找 IP 地址的名称,以便将客户端名称记录在其日志中。如果本地 DNS 服务无法正确识别您的客户端 IP 地址,并且 DNS 配置不正确,那么服务器可能会等待很长时间,直到 DNS 超时。
寻找这种效果的方法是运行网络嗅探器,最初在客户端,但也在服务器上,然后您可能会看到一些与连接相关的网络流量,需要很长时间才能得到响应,或者没有得到响应(您可能会看到重试)
tcpdump 和 wireshark 很好。
更新 1
客户端连接延迟
找到客户端的 IP 地址
- 在 Windows 上,打开命令提示符窗口并输入
ipconfig
- 在 Linux 上,打开终端窗口并输入
ifconfig -a
- 在 Windows 上,打开命令提示符窗口并输入
可选择确认您可以快速查找服务器的 IP 地址
- 在窗户上
nslookup servername
- 在 Linux 上
dig servername
或者host servername
如果你没有 dig。
- 在窗户上
在服务器上
- 查找客户姓名
- 检查
/etc/resolv.conf
第一个 DNS 名称服务器的地址 - type
dig -x 192.168.n.m @nameserver
或host 192.168.n.m server
其中 192.168.nm 由客户端的实际 IP 地址替换,nameserver 是名称服务器的 IP 地址。 - 对列出的其他名称服务器重复上述操作
/etc/resolv.conf
- 检查
服务器应在几毫秒内收到响应。如果 DNS 配置有故障,则需要几秒钟才能超时。
好的配置
# time host 192.168.3.4
Host 4.3.168.192.in-addr.arpa. not found: 3(NXDOMAIN)
real 0m0.130s
user 0m0.000s
sys 0m0.020s
错误配置
# echo nameserver 1.2.3.4 > /etc/resolv.conf
# time host 192.168.3.4
;; connection timed out; no servers could be reached
real 0m10.010s
user 0m0.000s
sys 0m0.010s
请注意 10 秒的延迟。这意味着任何想要在其日志中包含客户端名称的 SSH 服务都需要 10 秒才能建立 SSH 连接。
更新 2
事实证明,这个 Q (可能) 与为什么当我通过 SSH 进入我的 Ubuntu 9.05 服务器时“密码”提示会持续很长时间?
解决方案
修复服务器上的 DNS 解析器配置。
答案2
我猜你没有运行本地 DNS,因此当 ssh 服务器尝试执行反向 DNS 查找时,它会等待超时。当你连接到外部地址时,你将通过通过 DNS 审核的 IP 地址进行 NAT。
要关闭反向 DNS 查找,您必须编辑 sshd_config 文件并找到“UseDNS”行并将其设置为“no”。(您必须重新启动 sshd 才能使其生效。)或者,您可以为本地子网设置自己的 DNS 服务器。(如果您不想使用 BIND,DNSMasq 是一个很好的轻量级服务器)
答案3
您可以尝试使用最大详细选项调用 ssh:。ssh -v -v -v
这
可能会提供一些有用的信息。
我能想到的一个解释是,如果你的服务器正在监听 iPv4,但你仍然在本地系统上启用了 iPv6。那么等待时间就是当 ssh 尝试在 iPv6 上访问服务器却无功而返时,然后放弃并尝试 iPv4 并成功。
无论如何,我建议验证哪些网络适配器已启用并禁用无用的网络适配器。