(Я понял, что это связано с nscd
; пожалуйста, смотрите в нижней части вопроса)
Я пытаюсь подключиться к автономному серверу через свой ноутбук; они совместно используют проводную связь через беспроводной маршрутизатор Linksys и коммутатор Ethernet TP-Link. Я использую Arch Linux на обеих машинах, используя настройки Systemd по умолчанию с dhcpcd для конфигурации сети.
После недавнего обновления системы на ноутбуке, я начал испытывать следующую ошибку при попытке ssh к серверу (назовем это "myserver"):
$ 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)
Однако ping myserver
работает нормально:
$ ping myserver
PING myserver(myserver (fe80::9cd8:b045:5974:c5cf)) 56 data bytes
64 bytes from myserver (fe80::9cd8:b045:5974:c5cf%en0): icmp_seq=1 ttl=64 time=0.533 ms
64 bytes from myserver (fe80::9cd8:b045:5974:c5cf%en0): icmp_seq=2 ttl=64 time=0.549 ms
Обычно у меня есть локальное 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
). Это устраняет ошибку, когда она возникает, но это не постоянное решение для меня, и это не объясняет, почему ошибка внезапно появилась.
Я использовал while
цикла в моей оболочке , чтобы определить время с точностью до секунды , когда ssh
идет от работы не работает, и наоборот, и я был не в состоянии связать эти события с чем - либо на выходе journalctl
включая dhcpcd
Сообщения.
Первоначально я опубликовал это в Network Engineering, где конфигурация хоста оказывается не по теме. На этом сайте пользователь Ricky Beam разместил частичный ответ:
Что бы ни делалось при разрешении имени хоста, возвращаются локальные IPv6-адреса канала (-ов), которые недопустимы для выбранного интерфейса, то есть "любой". Локальные адреса должны указывать интерфейс - например, fe80:...:1% eth0
Почему вы получаете локальный адрес ссылки, неизвестно. Возможно, люди, знакомые с Arch Linux, могли бы оказать дальнейшую помощь.
Обновление: похоже, проблема с nscd
"демон кеширования службы имен", который объясняет прерывистость, с которой я столкнулся (вероятно, из-за истечения срока действия кеша). Это фиксируется с помощью:
sudo systemctl stop nscd.service
Когда я останавливаю ncsd, тогда ssh
может подключиться, используя локальный адрес канала, но на этот раз вызов connect
также указывает мой основной интерфейс "en0", и он успешно выполняется:
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=if_nametoindex("en0")}, 28) = 0
write(2, "debug1: Connection established.\r"..., 33) = 33
Я предполагаю, что оставшийся вопрос (который я мог бы задать отдельно), это ошибка в nscd, и мне вообще следует использовать nscd?