Назад | Перейти на главную страницу

как использовать ssh через последовательный порт без использования pppd? (Или как передавать TCP через последовательный порт без использования pppd)

На моем сервере много виртуальных машин на базе QEMU. Некоторым из них запрещено использовать сеть, и единственный способ подключить их - через виртуальный последовательный порт.

Из-за плохих функций последовательной консоли (например, плохой работы с tmux и vim) я хочу использовать ssh через последовательную линию.

Вот моя попытка: (QEMU сопоставляет серийный номер с сокетом unix на хост-машине)

#In Guest: (serial is /dev/ttyS1)
socat -d -d tcp:127.0.0.1:22 file:/dev/ttyS1,b115200

#In Host: (mapped to /var/run/qemu-server/vm.serial1)
socat -d -d tcp-l:10022 UNIX-CONNECT:/var/run/qemu-server/vm.serial1

Затем я попытался бежать ssh -vv root@127.0.0.1 -p 10022, но он предлагает:

Bad packet length 1349676916.
ssh_dispatch_run_fatal: Connection to UNKNOWN port 65535: message authentication code incorrect

Но когда я использую

# Ctrl+C to terminate
socat STDIO,raw,echo=0,escape=0x3 UNIX-CONNECT:/var/run/qemu-server/vm.serial1

я могу видеть

SSH-2.0-OpenSSH_7.6p1

Итак, туннель подключен, но кажется, что он не может передавать чистый TCP через последовательный порт (возможно, отсутствие кадрирования и управления пакетами).

Итак, я попытался использовать pppd в последовательной линии, а затем интерфейс, затем ssh через TCP через IP через PPP ...

Но есть много виртуальных машин, трудно справиться с таким количеством интерфейсов, созданных ppp, из-за отсутствия автоматического назначения IP. Кроме того, IP-адрес только для ssh слишком потрачен впустую.

Итак, можно ли запустить голый TCP-сокет через последовательный порт? Или пропуская IP-уровень, созданный pppd и откройте сокет TCP через PPP следующим образом:

+----------------------+
|                      |
|      TCP Socket      |
|                      |
+----------------------+
|                      |
| Data Link Layer(PPP) |
|                      |
+----------------------+

Я хочу только открыть TCP-порт (или сокет UNIX) для пользователей, которые хотят подключиться через ssh к виртуальной машине.

Я пытался найти решения, но все ответы касаются того, как передавать последовательный порт через TCP, но я хочу обратное: как передать TCP через последовательный порт?

Вы пытаетесь протолкнуть кучу протоколов, не имеющих ничего общего с последовательными консолями, через последовательную консоль. Это не даст разумных результатов, а нужные данные уже предлагаются в виде обычного текста.

Если вы используете libvirt для определения виртуальных машин и управления ими, эта работа уже сделана за вас. virsh console <VM Name> подключит вас к последовательной консоли виртуальной машины, и она работает нормально - вы также можете передать это через SSH с хоста или подключиться к virsh через ssh + qemu, если вы хотите это сделать. Точно так же большинство других систем управления и оркестрации, таких как OpenStack или Xenserver, имеют аналогичные методы подключения к последовательным устройствам виртуальных машин типа pty без необходимости использования сокетов unix.

tmux не работает так же хорошо с последовательными интерфейсами, как minicom или screen делает. Если вы используете ручной подход, подключение любого из них к устройствам PTY или сокетам даст удовлетворительные результаты.

Если у вас много последовательных консолей в плоскости ручной оркестрации, как это обычно бывает в чистом QEMU, разумнее будет использовать консольный сервер, а не подключаться к каждой виртуальной машине через отдельный специальный сокет или PTY. conserver хороший, с которым я работал довольно регулярно. Вы можете настроить псевдонимы для подключения последовательных программ к каждой виртуальной машине и подключаться к этим программам через conserver через SSH; это дает простой console <servername> с хоста-консерватора, подключенного через SSH, чтобы добраться туда, где вам нужно.

Это может сработать, я сделал это с помощью VMWare и гостевой системы Windows, на которой был запущен клиент IPSec VPN, который отключил другие сети, в том числе для хост-виртуальной машины.

Уловка, которую я обнаружил, заключалась в том, что и SSH-клиент, и SSH-сервер сразу же отправляли свой баннер при подключении. Если вы подключаете / dev / ttyS1 к tcp: 22 (и на другом конце ttyS1 ничего не слушает), баннер переходит в битбакет.

Точно так же, если вы ssh -O "ProxyCommand = 'socat - / dev / ttyS0'" target, и вы еще не установили socat на стороне сервера для tcp: 22, баннер клиента теряется. В конечном итоге это стало вопросом времени.

Вы ДОЛЖЕН уметь делать то, что вам нужно, в следующей последовательности:

#In Host: (mapped to /var/run/qemu-server/vm.serial1)
socat -d -d UNIX-CONNECT:/var/run/qemu-server/vm.serial1 tcp-l:10022

#In Guest: (serial is /dev/ttyS1)
socat -d -d tcp:127.0.0.1:22 file:/dev/ttyS1,b115200

#In host:
ssh -vv root@127.0.0.1 -p 10022

Существенные различия между тем, что вы сделали, и тем, что описано выше:

  1. На хосте я сначала устанавливаю соединение socat с сокетом Unix, а не ожидаю входящего TCP-соединения и только затем открываю сокет Unix. Таким образом, когда мы запускаем socat в гостевой системе, и сервер отправляет свой баннер, socat будет читать и буферизовать баннер до прихода входящего TCP-соединения.
  2. Затем я запускаю socat в гостевой системе, чтобы он мог отправить свой баннер ожидающему socat для буферизации.
  3. Только после этого мы сможем запустить ssh-клиент.