无法使用 localhost,但 127.0.0.1 可以

无法使用 localhost,但 127.0.0.1 可以

我的用例是使用反向 SSH 隧道管理远程计算机。这非常有用,因为我们的客户启用了隧道,然后我就可以使用它登录。

然而,有一台机器的隧道停止了工作。

ssh -fN -R 9999:localhost:22 user@host

经过大量的故障排除后发现,使用 127.0.0.1 代替 localhost 仍然有效。

ssh -fN -R 9999:127.0.0.1:22 user@host

因此,当连接到目标机器时,我注意到更多功能无法通过 localhost 运行。例如 ping。

ping -v localhost
ping: socket: Permission denied, attempting raw socket...
ping: socket: Permission denied, attempting raw socket...
ping: localhost: System error

虽然使用 127.0.0.1 确实有效

ping -v 127.0.0.1
ping: socket: Permission denied, attempting raw socket...
ping: socket: Permission denied, attempting raw socket...
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.022 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.017 ms

sshd 也给了我同样无用的错误消息

error: connect_to localhost: unknown host (Bad file descriptor)
error: connect_to localhost: unknown host (Bad file descriptor)
error: connect_to localhost: unknown host (System error)
error: connect_to localhost: unknown host (System error)

我自然而然地查看了 /etc/hosts 文件。但我觉得它没问题。

cat /etc/hosts
#
# /etc/hosts: static lookup table for host names
#

#<ip-address>   <hostname.domain.org>   <hostname>
127.0.0.1   localhost.localdomain   localhost
::1     localhost.localdomain   localhost

# End of file

此外,hosts 文件中的查找至少在某种程度上是有效的。因为尝试 ping localhostq 时,我通常会得到“未知主机”的答复。

在目标机器上运行 arch linux。截至 2016-06-23 为最新信息(另一台装有完全相同 arch 版本的类似计算机也没有此问题)。

编辑(2016-06-23 15:30):

Iptables(目前非常宽松)

sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

根本不使用 nftables。

来自 /etc/nsswitch.conf 的主机:

cat /etc/nsswitch.conf | grep hosts
hosts: = files mdns4_minimal [NOTFOUND=return] dns mdns4

[编辑:2016-06-23 15:45] 实际上,在可以工作的机器上我有这个:

cat /etc/nsswitch.conf | grep hosts
hosts: files dns myhostname

看到这些行不同,我非常惊讶,因为我没有更改过这个文件。我也不知道这意味着什么 :)

答案1

原来是 /etc/nsswitch 文件

发现问题了吗?

cat /etc/nsswitch.conf | grep hosts
hosts: = files mdns4_minimal [NOTFOUND=return] dns mdns4

脚本中的“=”符号不正确。这是在我们的自定义包中发生的(不是我写的,归咎于分配!)。它没有安装在可以工作的包上,但安装在了不能工作的包上。

现在我可以纠正数据包(用于自动配置 avahi)并且一切应该恢复正常。

非常感谢所有提出后续问题的人。尤其是@7171u,他问了正确的问题 :)

相关内容