Не удается подключиться через SFTP с помощью команды sftp, но можно подключиться с помощью sftp:// и других клиентов SFTP.

Вопрос или проблема

Я застрял с этой проблемой весь день, и я не знаю, что происходит. Причина, по которой мне нужно использовать команду sftp, заключается в том, что я использую ее в оболочке скрипта. Если есть другая программа, которую я мог бы использовать и которая есть в CentOS 7 и позволяет мне загружать файл с помощью SFTP, то, пожалуйста, просветите меня.

ИЗМЕНЕНИЕ 1

Используемые клиенты SFTP: WinSCP и PSFTP.

Я тестировал это с разных компьютеров, работающих в одной сети и из Интернета (здесь использовались только IP-адреса). Это работает как ожидалось с того же компьютера (использовался localhost и адрес обратной связи).

Служба firewalld остановлена, и прокси-сервер не используется и не настраивался в любое время.

Ошибка, которую я получаю (используя sftp -vvv sftp@hostname):

debug1: connect to ipaddress port 22: Connection timed out
ssh: connect to host ipaddress port 22: Connection timed out
Couldn't read packet: Connection reset by peer

Мой файл sshd_config (серверная сторона):

#       $OpenBSD: sshd_config,v 1.93 2014/01/10 05:59:19 djm Exp $

# Это системный конфигурационный файл sshd. См.
# sshd_config(5) для получения дополнительной информации.

# Этот sshd был скомпилирован с PATH=/usr/local/bin:/usr/bin

# Стратегия, используемая для параметров в sshd_config по умолчанию, поставляемой с
# OpenSSH заключается в том, чтобы указывать параметры с их значением по умолчанию, где
# это возможно, но оставлять их закомментированными. Раскомментированные параметры переопределяют
# значение по умолчанию.

# Если вы хотите изменить порт на системе с SELinux, вам нужно сообщить
# SELinux об этом изменении.
# semanage port -a -t ssh_port_t -p tcp #НОМЕРПОРТА
#
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

# По умолчанию требуется явная активация протокола 1
#Protocol 2

# HostKey для версии протокола 1
#HostKey /etc/ssh/ssh_host_key
# HostKeys для версии протокола 2
HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

# Время жизни и размер эфирного ключа сервера версии 1
#KeyRegenerationInterval 1h
#ServerKeyBits 1024

# Шифры и ключи
#RekeyLimit default none

# Логирование
# устарели QuietMode и FascistLogging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
#LogLevel INFO

# Аутентификация:

#LoginGraceTime 2m
PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

#RSAAuthentication yes
#PubkeyAuthentication yes

# По умолчанию проверяются и .ssh/authorized_keys, и .ssh/authorized_keys2
# но это переопределяется, поэтому установки будут проверять только .ssh/authorized_keys
AuthorizedKeysFile      .ssh/authorized_keys

#AuthorizedPrincipalsFile none

#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody

# Чтобы это работало, вам также понадобятся ключи хоста в /etc/ssh/ssh_known_hosts
#RhostsRSAAuthentication no
# аналогично для версии протокола 2
#HostbasedAuthentication no
# Измените на yes, если вы не доверяете ~/.ssh/known_hosts для
# RhostsRSAAuthentication и HostbasedAuthentication
#IgnoreUserKnownHosts no
# Не читать файлы ~/.rhosts и ~/.shosts пользователя
#IgnoreRhosts yes

# Чтобы отключить туннелирование средств передачи открытых паролей, измените на no здесь!
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication yes

# Измените на no, чтобы отключить пароли s/key
#ChallengeResponseAuthentication yes
ChallengeResponseAuthentication no

# Опции Kerberos
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
#KerberosUseKuserok yes

# Опции GSSAPI
#GSSAPIAuthentication yes
GSSAPIAuthentication no
GSSAPICleanupCredentials no
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
#GSSAPIEnablek5users no

# Установите это значение на 'yes', чтобы включить аутентификацию PAM, обработку учетных записей
# и обработку сеансов. Если это включено, аутентификация PAM будет
# разрешена через ChallengeResponseAuthentication и
# PasswordAuthentication. В зависимости от вашей конфигурации PAM,
# аутентификация PAM через ChallengeResponseAuthentication может обойти
# настройку "PermitRootLogin without-password".
# Если вы просто хотите, чтобы проверки учетной записи PAM и сеанса выполнялись без
# аутентификации PAM, то включите это, но установите PasswordAuthentication
# и ChallengeResponseAuthentication на 'no'.
# ПРЕДУПРЕЖДЕНИЕ: 'UsePAM no' не поддерживается в Red Hat Enterprise Linux и может вызвать несколько
# проблем.
UsePAM yes

#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
UsePrivilegeSeparation sandbox          # По умолчанию для новых установок.
#PermitUserEnvironment no
#Compression delayed
ClientAliveInterval 60
#ClientAliveCountMax 3
#ShowPatchLevel no
#UseDNS yes
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none

# нет пути к баннеру по умолчанию
#Banner none

# Принимать переменные среды, связанные с локализацией
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS

# переопределить значение по умолчанию с отсутствием подсистем
Subsystem       sftp    internal-sftp

# Пример переопределения настроек для каждого пользователя
#Match User anoncvs
#       X11Forwarding no
#       AllowTcpForwarding no
#       PermitTTY no
#       ForceCommand cvs server
Match User sftp
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /home/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no

Код, использованный для создания пользователя:

mkdir -p /home/sftp
chown root /home/sftp
chmod 755 -R /home/sftp
useradd -d /home/sftp -r sftp
usermod -s /sbin/nologin sftp
echo "password" | passwd --stdin sftp

Я не трогал файл sshd_config на клиентах, так что я предполагаю, что это просто значения по умолчанию из установки (в моей реализации я не могу изменять эти конфигурационные файлы).

Ваш WinSCP настроен на использование какого-либо прокси? PSFTP может использовать прокси только в том случае, если вы сохраняете конфигурацию сессии (включая настройки прокси) с помощью диалогового окна конфигурации PuTTY, а затем используете psftp -load <имя сохраненной сессии>.

Или возможно ли, что один из ваших SFTP-клиентов пытается использовать IPv4, а другой IPv6, и только один из них разрешен? (т.е. если вы используете имя хоста с WinSCP, он может искать как адреса IPv6, так и IPv4 и использовать адрес IPv6.)

Ответ или решение

Клиент, столкнувшийся с проблемой SFTP-соединения с использованием команды sftp, но успешно подключающийся через sftp:// и другие SFTP-клиенты, может испытывать ряд сетевых и конфигурационных ограничений. Рассмотрим обстоятельства подробно, чтобы выявить возможные причины проблемы и предложить пути ее решения.

1. Анализ проблемы

Ваша основная проблема заключается в том, что команда sftp, выполняемая в оболочке, не может установить соединение, несмотря на то что визуальные клиенты, такие как WinSCP и PSFTP, работают без проблем. Ошибка, которую вы получаете:

ssh: connect to host ipaddress port 22: Connection timed out
Couldn't read packet: Connection reset by peer

указывает на то, что при попытке соединения происходит тайм-аут, и сервер сбрасывает соединение. Это может быть связано с рядом причин.

1.1. Сетевые настройки

  • Firewall и Proxy: Вы упомянули, что служба firewalld остановлена и прокси не настроен. Однако возможно, что другие правила сетевой безопасности, такие как iptables, также могут блокировать соединение. Убедитесь, что порту 22 разрешен входящий трафик.

  • IPv4 vs IPv6: Как уже было упомянуто, существует вероятность того, что ваше SFTP-клиентское приложение использует различные протоколы (IPv4 или IPv6). Проверьте, что сервер правильно настроен для работы как с IPv4, так и с IPv6, если это необходимо. Попробуйте использовать явные IP-адреса при подключении для проверки этого вопроса.

1.2. Конфигурация SSH-сервера

Ваша конфигурация sshd_config выглядит в основном корректной, но проверьте следующие моменты:

  • ListenAddress: убедитесь, что сервер слушает подключения на правильных адресах. Если линия:

    ListenAddress 0.0.0.0

    закомментирована, это может привести к тому, что сервер прослушивает только локальные вызовы.

  • ForceCommand: вы установили ForceCommand для пользователя sftp, что ограничивает его действия. Убедитесь, что конфигурация пользователя sftp не блокирует нужные вам операции.

1.3. Конфигурация клиента

Для командной строки sftp проверьте следующие моменты:

  • Выполняйте команду sftp -vvv sftp@hostname, чтобы получить более детализированные журнальные записи для диагностики. Это может дополнительно проинформировать о том, где именно происходит сбой.

2. Альтернативы и решения

Если проблема не решается, вы можете рассмотреть возможность использования других инструментов SFTP, которые уже включены в CentOS 7:

  • lftp: это многофункциональный клиент, который поддерживает SFTP. Установите его с помощью:

    yum install lftp

    Пример команды для использования lftp:

    lftp sftp://username@hostname
  • ncftp: это еще один клиент FTP с поддержкой SFTP, который может решать некоторые проблемы, связанные с исходным sftp или ssh.

3. Заключение

Проблема соединения с помощью команды sftp может быть вызвана множеством факторов, включая сетевые, конфигурационные, а также различия в ипотеке между клиентами. Рекомендуется проверить настройки сети и SSH, а при необходимости использовать альтернативные клиенты, такие как lftp или ncftp, которые могут предложить дополнительную функциональность и устойчивость в вашем сценарии использования.

Оцените материал
Добавить комментарий

Капча загружается...