Вопрос или проблема
Я застрял с этой проблемой весь день, и я не знаю, что происходит. Причина, по которой мне нужно использовать команду 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
, которые могут предложить дополнительную функциональность и устойчивость в вашем сценарии использования.