“ssh:连接到主机 myserver 端口 22:无效参数”(间歇性、ipv6、链接本地地址、dhcp 主机名)

网络工程 dhcp linux SSH dhcpv6
2022-02-20 14:55:14

由于这个问题是题外话,我将其移至超级用户。但我无法删除它。

这里是新位置。

这是原始问题:


我正在尝试通过笔记本电脑连接到无头服务器;它们通过 Linksys 无线路由器(“Linksys EA6350”)和 TP-Link 以太网交换机共享有线链路。我在两台机器上都运行 Arch Linux,使用非常默认的 Systemd 设置和 dhcpcd 进行网络配置。

我最近在尝试 ssh 到服务器时遇到以下错误:

$ ssh -v -v -F /dev/null myserver
OpenSSH_7.7p1, OpenSSL 1.1.0h  27 Mar 2018
debug1: Reading configuration data /dev/null
debug2: resolving "myserver" port 22
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to myserver [fe80::9cd8:b045:5974:c5cf] port 22.
debug1: connect to address fe80::9cd8:b045:5974:c5cf port 22: Invalid argument
ssh: connect to host myserver port 22: Invalid argument

运行相同的strace显示错误来自connect

connect(3, {sa_family=AF_INET6, sin6_port=htons(22), inet_pton(AF_INET6, "fe80::9cd8:b045:5974:c5cf", &sin6_addr), sin6_flowinfo=htonl(0), sin6_scope_id=0}, 28) = -1 EINVAL (Invalid argument)

通常我有一个本地named转发 DNS 查询,但是当我返回直接使用路由器的 DNS 服务器时,错误仍然存​​在:

$ sudo cat /etc/resolv.conf
# Generated by resolvconf
nameserver 192.168.1.1

错误是间歇性的:每隔几分钟我就能成功连接。当我可以成功连接时,我看到它connect使用的是 IPv4 地址:

connect(3, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("192.168.1.149")}, 16) = 0

但是,host无论连接是否正常,该命令都会显示相同的 IPv4 地址:

$ host myserver                   
myserver has address 192.168.1.149

读完这个问题后,我想手动指定接口(ssh -v -v -F /dev/null -B en0 myserver)。这在错误发生时消除了错误,但这对我来说不是永久的解决方案,也无法解释错误突然出现的原因。

1个回答

无论在做什么,主机名解析都会返回对所选接口无效的链路本地 IPv6 地址——即“任何”。链路本地地址必须指定接口——例如。fe80:...:1%eth0

为什么你得到一个链接本地地址是未知的。也许熟悉 Arch linux 的人可以提供进一步的帮助。

(此外,ip -6 [route|addr|...]显然有必要在您的系统上查看 IPv6 信息)