mysql、ssh、rsync、git 在 Ubuntu 12.04 上挂起,显示 dns 名称,但没有显示 IP 地址

mysql、ssh、rsync、git 在 Ubuntu 12.04 上挂起,显示 dns 名称,但没有显示 IP 地址

最近,某些基于网络的程序(几周前不存在此问题)开始挂起。我遇到过此问题的一些程序是 mysql、ssh、rsync 和 git。我首先想到的是网络连接问题,但 ping 有问题的主机(由 godaddy.com 托管的 Web 服务器和 mysql 服务器)显示它们处于活动状态。(在这两种情况下,我都使用域名进行 ping。)有一次,我尝试直接使用主机的 IP 地址,两个程序都按预期运行。

我还没有尝试将这些程序连接到其他主机。

我对 mysql 进行了 strace 检查它挂起的位置,这里是该输出的尾部:

stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=192, ...}) = 0
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
poll([{fd=3, events=POLLOUT}], 1, 0)    = 1 ([{fd=3, revents=POLLOUT}])
sendto(3, "\201\226\1\0\0\1\0\0\0\0\0\0\16mendelssohnalb\2db\0073"..., 62, MSG_NOSIGNAL, NULL, 0) = 62
poll([{fd=3, events=POLLIN}], 1, 5000)  = 1 ([{fd=3, revents=POLLIN}])
ioctl(3, FIONREAD, [78])                = 0
recvfrom(3, "\201\226\201\200\0\1\0\1\0\0\0\0\16mendelssohnalb\2db\0073"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, [16]) = 78
close(3)                                = 0
open("/etc/gai.conf", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=3343, ...}) = 0
fstat(3, {st_mode=S_IFREG|0644, st_size=3343, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe8a686a000
read(3, "# Configuration for getaddrinfo("..., 4096) = 3343
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7fe8a686a000, 4096)            = 0
futex(0x7fe8a5ad14a0, FUTEX_WAKE_PRIVATE, 2147483647) = 0
socket(PF_NETLINK, SOCK_RAW, 0)         = 3
bind(3, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0
getsockname(3, {sa_family=AF_NETLINK, pid=2640, groups=00000000}, [12]) = 0
sendto(3, "\24\0\0\0\26\0\1\3\255\241WS\0\0\0\0\0\0\0\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"0\0\0\0\24\0\2\0\255\241WSP\n\0\0\2\10\200\376\1\0\0\0\10\0\1\0\177\0\0\1"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 108
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"@\0\0\0\24\0\2\0\255\241WSP\n\0\0\n\200\200\376\1\0\0\0\24\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 128
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\24\0\0\0\3\0\2\0\255\241WSP\n\0\0\0\0\0\0\1\0\0\0\24\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 20
close(3)                                = 0
socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET6, sin6_port=htons(3306), inet_pton(AF_INET6, "::ffff:67.215.65.145", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0
getsockname(3, {sa_family=AF_INET6, sin6_port=htons(38834), inet_pton(AF_INET6, "::ffff:192.168.0.104", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0
connect(3, {sa_family=AF_UNSPEC, sa_data="\0\0\0\0\0\0\0\0\0\0\0\0\0\0"}, 16) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(3306), sin_addr=inet_addr("97.74.31.26")}, 16) = 0
getsockname(3, {sa_family=AF_INET6, sin6_port=htons(56707), inet_pton(AF_INET6, "::ffff:192.168.0.104", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0
close(3)                                = 0
socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP) = 3
connect(3, {sa_family=AF_INET6, sin6_port=htons(3306), inet_pton(AF_INET6, "::ffff:67.215.65.145", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = ? ERESTARTSYS (To be restarted)
--- SIGINT (Interrupt) @ 0 (0) ---
+++ killed by SIGINT +++

从这看来,这似乎是 getaddrinfo(3) 问题。它似乎试图使用 IPv6 进行连接,但我还没有为 IPv6 进行任何配置,而且我非常确定我必须在 godaddy 端进行一些配置才能使用 IPv6 连接到这些主机。

我的系统是 Xubuntu 12.04 LTS 系统,我接受常规更新。我的 /var/logs/apt/history.log 显示过去 2 周对 openssh-client、openssl 和 libssl1 的更新。还有其他更新,但这些是唯一与我相关的。

Uname 报告:

Linux Popwease 3.2.0-60-generic #91-Ubuntu SMP Wed Feb 19 03:54:44 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

从昨晚开始我就一直在谷歌和手册页上搜索,但对发生的事情却没有什么了解。


2014 年 4 月 24 日

一些附加信息。更多 getaddrinfo 问题的证据。我了解到 host 和 dig 使用较旧的 gethostbyname,但“getent hosts ---”使用 getaddrinfo。这解释了为什么我可以使用 host 从名称获取 IP 地址。

以下是我使用 getent 时得到的结果:

ccc@Popwease:~$ getent hosts amazon.com
::ffff:67.215.65.145 amazon.com.nycap.rr.com
ccc@Popwease:~$ getent hosts amazon.com.
176.32.98.166   amazon.com
205.251.242.54  amazon.com
72.21.194.212   amazon.com
72.21.215.232   amazon.com
ccc@Popwease:~$ getent hosts gutenberg.org
::ffff:67.215.65.145 gutenberg.org.nycap.rr.com
ccc@Popwease:~$ getent hosts gutenberg.org.
152.19.134.47   gutenberg.org
ccc@Popwease:~$ getent hosts www.gutenberg.org
152.19.134.47   gutenberg.org www.gutenberg.org
ccc@Popwease:~$ getent hosts www.amazon.com
::ffff:67.215.65.145 www.amazon.com.nycap.rr.com

请注意,“.nycap.rr.com” 是我的互联网提供商的域名。因此,除非我在域名末尾加上“.”,否则 getent 会返回一个虚假的 IPv6 地址。但 www.gutenberg.org 似乎是个例外。好的,amazon.com 是一个域名,您依靠 DNS 默认值来获取主机。但最后一个例子似乎混淆了这一理论。

我尝试访问的虚拟主机最初使用默认的域名主机,但确实有一个“www”。当我在名称上添加最后一个点或提供全名时,我不再能理解相关程序的意思。在我看来,godaddy DB 服务器是一个全名,但它也需要一个最后的“.”才能工作。

答案1

我在对原始帖子进行最后一次编辑后大约 1 小时回答了这个问题。我的系统没有任何变化,getent 开始正常工作,就像最初提示我发帖的程序一样。

我必须得出结论,该问题是由于 roadrunner 的 DNS 服务器出现错误,而该错误刚刚得到纠正。

答案2

我遇到了类似的问题。我的 CentOS 5.5 OpenVZ 服务器 (2.6.18-238.5.1.el5.028stab085.5) 会挂起许多程序,例如 ssh 甚至 sudo,它们全都停止在看似网络调用的地方:

socket(PF_NETLINK, SOCK_RAW, 0)         = 5
bind(5, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0
getsockname(5, {sa_family=AF_NETLINK, pid=115051, groups=00000000}, [1443221608318631948]) = 0
sendto(5, "\24\0\0\0\22\0\1\3\0345vS\0\0\0\0\0\0\0\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20

我甚至无法重新启动网络服务。需要重新启动才能恢复正常...有人知道这个套接字的远端是什么吗?

相关内容