web-dev-qa-db-ja.com

pppdを使用せずにシリアル経由でsshを使用する方法は? (または、pppdを使用せずにシリアル経由でTCP)を転送する方法)

私のサーバーには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 [email protected] -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を使おうとしました、そしてインターフェースをアップしてからTCP over IP over PPP .. ..

しかし、VMはたくさんあり、自動IP割り当てがないため、pppによって作成された多くのインターフェースで管理するのは困難です。また、ssh専用のIPアドレスも無駄になります。

したがって、ベアTCPソケットオーバーシリアル?またはpppdによって作成されたIPレイヤーをスキップして、TCPソケットオーバー)を開くことが可能な場合PPPこのように:

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

TCPポート(またはUNIXソケット)をssh経由でVMに接続したいユーザーにのみ公開したい。

私は解決策を探しようとしましたが、すべての答えはTCPを介してシリアルを転送する方法に関するものですが、私が欲しいのは逆です:シリアルを介してTCPを転送する方法?

1
Komeiji Kuroko

あなたは、シリアルコンソールを介してシリアルコンソールとは何の関係もない一連のプロトコルを押し出そうとしています。妥当な結果が得られるわけではなく、必要なデータはすでにプレーンテキストで提供されています。

Libvirtを使用してVMを定義および管理している場合、この作業はすでに完了しています。 virsh console <VM Name>はVMのシリアルコンソールに接続し、問題なく動作します。ホストからSSH経由でパイプするか、必要に応じてssh + qemu経由でvirshに接続することもできます。同様に、OpenStackやXenserverのような他のほとんどの管理およびオーケストレーションシステムには、UNIXソケットを必要とせずにptyのようなVMシリアルデバイスに接続する同様の方法があります。

tmuxは、minicomまたはscreenのようにシリアルインターフェイスでは機能しません。手動でアプローチしている場合は、これらのいずれかをPTYまたはソケットデバイスに接続すると、満足のいく結果が得られます。

純粋なQEMUのように、手動のオーケストレーションプレーンに多数のシリアルコンソールがある場合は、コンソールサーバーを使用する方が、それぞれのVM専用のソケットまたはPTYに接続するよりも賢明です。conserverは、私がかなり定期的に使用している優れたものです。シリアルプログラムを各VMに接続し、SSH経由でサーバーを介してそれらのプログラムに接続するためのエイリアスを設定できます。これにより、シンプルな console <servername>SSH経由で接続された保存ホストから必要な場所に到達します。

3
Spooler

これは機能します。VMWareとIPSecVPNクライアントを実行していたWindowsゲストを使用して実行しました。これにより、ホストVMを含む他のネットワークが無効になりました。

私が見つけたトリックは、SSHクライアントとSSHサーバーの両方が接続時にすぐにバナーを送信することでした。/dev/ttyS1をtcp:22に接続すると(そしてttyS1のもう一方の端で何もリッスンしていない場合)、バナーはビットバケットに入ります。

同様に、ssh -O "ProxyCommand = 'socat-/dev/ttyS0'"ターゲットを使用していて、サーバー側のsocatをtcp:22にまだ確立していない場合、クライアントバナーは失われます。最終的に、それはタイミングの問題になりました。

あなた[〜#〜] should [〜#〜]次の順序で必要なことを実行できるはずです:

#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 [email protected] -p 10022

あなたがしたことと上記の本質的な違い:

  1. ホストでは、着信TCP接続を待ってから、Unixソケットを開くのではなく、最初にUnixソケットへのsocat接続を確立します。このように、ゲストであり、サーバーがバナーを送信すると、socatは、着信TCP接続が到着するまで、バナーを読み取ってバッファリングします。
  2. 次に、ゲストでsocatを実行して、バナーを待機中のsocatに送信し、バッファリングできるようにします。
  3. そうして初めて、sshクライアントを実行できます。
0
Rogan Dawes