我的用例是使用反向 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,他问了正确的问题 :)