На моем сервере много виртуальных машин на базе 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
Существенные различия между тем, что вы сделали, и тем, что описано выше: