1

Я просто настроил Ubuntu Server и настроил его через SSH, используя openssh на сервере. Мне пришлось перезапустить и не могу подключиться через SSH из-за сбоя Write failed: Broken pipe ошибка сломанной трубы .

Что касается моего исследования (https://wiki.archlinux.org/index.php/SFTP_chroot - Устранение неполадок, первая запись), то это проблема с правами собственности в ChrootDirectory. Я, вероятно, что-то напутал при настройке веб-сервера Apache.

В любом случае, теперь я не могу войти через SSH с моим именем пользователя. К сожалению, у меня есть только один пользователь, поэтому я не могу использовать другого. Можно ли как-нибудь исправить владение или настройки openssh без физического доступа к серверу? Спасибо!

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

ssh -v username@123.123.123.123
OpenSSH_6.6.1, OpenSSL 1.0.1f 6 Jan 2014
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to 123.123.123.123 [123.123.123.123] port 22.
debug1: Connection established.
debug1: identity file /home/username/.ssh/id_rsa type -1
debug1: identity file /home/username/.ssh/id_rsa-cert type -1
debug1: identity file /home/username/.ssh/id_dsa type -1
debug1: identity file /home/username/.ssh/id_dsa-cert type -1
debug1: identity file /home/username/.ssh/id_ecdsa type -1
debug1: identity file /home/username/.ssh/id_ecdsa-cert type -1
debug1: identity file /home/username/.ssh/id_ed25519 type -1
debug1: identity file /home/username/.ssh/id_ed25519-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.4
debug1: match: OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.4 pat OpenSSH_6.6.1* compat 0x04000000
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5-etm@openssh.com none
debug1: kex: client->server aes128-ctr hmac-md5-etm@openssh.com none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ECDSA ...
debug1: Host '123.123.123.123' is known and matches the ECDSA host key.
debug1: Found key in /home/username/.ssh/known_hosts:7
debug1: ssh_ecdsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Trying private key: /home/username/.ssh/id_rsa
debug1: Trying private key: /home/username/.ssh/id_dsa
debug1: Trying private key: /home/username/.ssh/id_ecdsa
debug1: Trying private key: /home/username/.ssh/id_ed25519
debug1: Next authentication method: password
ufxray@123.123.123.123's password: 
debug1: Authentication succeeded (password).
Authenticated to 123.123.123.123 ([123.123.123.123]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
Write failed: Broken pipe

1 ответ1

0

В моем случае причиной оказалось взаимодействие между VPN и изворотливым модемом DSL с внешним портом SSH.

сценарий

Настроить:

  • 192.168.0.0/24 - сеть LAN
  • 192.168.1.0/24 - сеть VPN-клиентов
  • server1 (192.168.0.3) является сервером VPN
  • Модем DSL (192.168.0.10) является маршрутизатором по умолчанию для всех хостов.
  • Модем DSL имеет статический маршрут, который отправляет трафик VPN (т. Е. Предназначен для 192.168.1.0/24) на сервер1
  • В конфигурации модема DSL TCP-порт 22 перенаправляется на server1
  • В конфигурации модема DSL порт VPN перенаправляется на сервер1
  • server2 (192.168.0.223) - это сервер, к которому я пытаюсь подключиться по SSH

Признак состоял в том, что во время установления соединения клиентская сторона всегда говорила «Ошибка записи: сломанный канал» после проверки пароля или ключа. Это произошло сразу после команды debug1: Sending command: ... step. Я включил детальную регистрацию на сервере, и он сказал, что клиент отправил сброс TCP.

Анализ

Я проверил с Wireshark и обнаружил, что эта последовательность произошла:

 23.002349   192.168.1.6 -> 192.168.0.223  TCP 56677 > ssh [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=643508643 TSER=0 WS=8
 23.080714  192.168.0.223 -> 192.168.1.6   TCP ssh > 56677 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1369 TSV=1628354 TSER=643508643 WS=7
 23.080743   192.168.1.6 -> 192.168.0.223  TCP 56677 > ssh [ACK] Seq=1 Ack=1 Win=5888 Len=0 TSV=643508663 TSER=1628354
 23.399242  192.168.0.223 -> 192.168.1.6   SSH Server Protocol: SSH-2.0-OpenSSH_6.7p1 Debian-5+deb8u1\r
 23.399267   192.168.1.6 -> 192.168.0.223  TCP 56677 > ssh [ACK] Seq=1 Ack=40 Win=5888 Len=0 TSV=643508742 TSER=1628434
 23.399606   192.168.1.6 -> 192.168.0.223  SSH Client Protocol: SSH-2.0-OpenSSH_5.5p1 Debian-6+squeeze8\r
 23.479613  192.168.0.223 -> 192.168.1.6   TCP ssh > 56677 [ACK] Seq=40 Ack=42 Win=29056 Len=0 TSV=1628454 TSER=643508742
 23.479638   192.168.1.6 -> 192.168.0.223  SSHv2 Client: Key Exchange Init
 23.488855  192.168.0.223 -> 192.168.1.6   SSHv2 Server: Key Exchange Init
 23.528382   192.168.1.6 -> 192.168.0.223  TCP 56677 > ssh [ACK] Seq=890 Ack=960 Win=8960 Len=0 TSV=643508775 TSER=1628455
 23.607196  192.168.0.223 -> 192.168.1.6   TCP ssh > 56677 [ACK] Seq=960 Ack=890 Win=31872 Len=0 TSV=1628486 TSER=643508762
 23.607218   192.168.1.6 -> 192.168.0.223  SSHv2 Client: Diffie-Hellman GEX Request
 23.714323  192.168.0.223 -> 192.168.1.6   SSHv2 Server: Diffie-Hellman Key Exchange Reply
 23.714367   192.168.1.6 -> 192.168.0.223  TCP 56677 > ssh [ACK] Seq=914 Ack=1240 Win=10752 Len=0 TSV=643508821 TSER=1628512
 23.732326   192.168.1.6 -> 192.168.0.223  SSHv2 Client: Diffie-Hellman GEX Init
 23.837671  192.168.0.223 -> 192.168.1.6   SSHv2 Server: Diffie-Hellman GEX Reply
 23.876369   192.168.1.6 -> 192.168.0.223  TCP 56677 > ssh [ACK] Seq=1186 Ack=2088 Win=13568 L
 23.934571   192.168.1.6 -> 192.168.0.223  SSHv2 Client: New Keys
 24.052445  192.168.0.223 -> 192.168.1.6   TCP ssh > 56677 [ACK] Seq=2088 Ack=1202 Win=33664 Len=0 TSV=1628598 TSER=643508876
 24.052465   192.168.1.6 -> 192.168.0.223  SSHv2 Encrypted request packet len=52
 24.130296  192.168.0.223 -> 192.168.1.6   TCP ssh > 56677 [ACK] Seq=2088 Ack=1254 Win=33664 Len=0 TSV=1628617 TSER=643508906
 24.131032  192.168.0.223 -> 192.168.1.6   SSHv2 Encrypted response packet len=52
[...]
 29.775083   192.168.1.6 -> 192.168.0.223  SSHv2 Encrypted request packet len=136
 29.897679  192.168.0.223 -> 192.168.1.6   TCP ssh > 56677 [ACK] Seq=2728 Ack=2586 Win=39936 Len=0 TSV=1630059 TSER=643510336
 30.986259  192.168.0.223 -> 192.168.1.6   SSHv2 Encrypted response packet len=52
 30.986704   192.168.1.6 -> 192.168.0.223  SSHv2 Encrypted request packet len=136
 31.066976  192.168.0.223 -> 192.168.1.6   TCP ssh > 56677 [ACK] Seq=2780 Ack=2722 Win=41600 Len=0 TSV=1630351 TSER=643510639
 31.068851   192.168.0.10 -> 192.168.1.6   SSH Encrypted response packet len=88
 31.068874   192.168.1.6 -> 192.168.0.10   TCP 56677 > ssh [RST] Seq=1 Win=0 Len=0
 61.015948   192.168.1.6 -> 192.168.0.223  SSHv2 Encrypted request packet len=68
 61.094573  192.168.0.223 -> 192.168.1.6   TCP ssh > 56677 [RST] Seq=2780 Win=0 Len=0

Здесь происходит то, что все (некоторые детали пропущены) в порядке до 31.066976 секунды (где server2 отправляет ACK для запроса). Но затем, следующий пакет (в 31.068851) прибывает из МОДЕМА DSL, который конечно заставляет мой ноутбук отправлять ему TCP RST (сброс соединения), сообщая, что он использует старое соединение или что-то еще. (Я знаю, что это было связано, потому что RST отправляется с порта 56677.)

НО модем DSL, кажется, пересылает этот сброс обратно на server1, что, конечно, убивает фактическое соединение SSH. Итак, после 30-секундного тайм-аута (в 61.015948) мой ноутбук пытается отправить другой запрос, не получив ответа по фактическому TCP-соединению на запрос в 30.986704. Естественно, server1 затем отправляет ему TCP RST, потому что он уже отказался от этого соединения. Следовательно, Write failed: Broken pipe ошибка сломанной трубы на моем ноутбуке.

Заключение

Модем DSL видит половину соединения, т.е. отвечает на пакеты от server2 и пересылает их на server1 как трафик VPN. Но, по крайней мере, некоторые из этих пакетов интерпретируются модемом DSL каким-то образом, потому что он отправляет случайные ответы (используя SSHv1, кстати). Обратите внимание, что модем DSL не видит пакет по адресу 30.986704, поскольку он выходит из туннеля на сервере server1 и отправляется через локальную сеть на сервер server2. Так что я не совсем уверен, что происходит.

Временное решение

Я добавил статический маршрут на server2 для 192.168.1.0/24 со шлюзом 192.168.0.3 (server1), который позволяет избежать трафика ответа для клиентов VPN, идущих через модем DSL. Задача решена.

PS - для новичков в TCP помните, что отдельные сообщения ACK отправляются только в том случае, если нет доступных данных ответа для отправки в течение установленного интервала; если есть, флаг ACK просто устанавливается на это сообщение данных.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .