安価なシリアルコンソールサーバをなんちゃらPiで自作する

これは

リモートでVPNルータの設定をしていたら、リモートルータから応答がなくなって(接続が切れて)しまった際に、オンサイト保守を回避することができるかもしれない環境の作り方。

f:id:notoken3331:20200823024316j:plain:w300

シリアルコンソールサーバとは?

コンソールサーバへSSH等でログインし、コンソールサーバ上でシリアルコンソールを開くことで、シリアル接続にて設定を行う機材をリモートから設定できるようにするアイテム。

既製品も販売されている。なおかなり高い製品。

必要なもの

コンソールサーバを自作するために必要なもの。ここでは簡単にUSB to シリアルケーブルを利用する方法と、電子工作が必要なGPIOのUART端子を利用する方法の2種類について記載する。

共通

  • なんちゃらPI
  • microSDカード (なんちゃらPIが対応しているもの、最低8GB)
  • 電源アダプタ
  • LANケーブル
  • シリアルケーブル
    • クロス
    • ストレート
    • Ciscoのコンソールケーブル

USB to シリアルケーブルを使う

GPIOのUARTを使う場合

※I/F IC に実装する積層セラミックコンデンサ に関してはデータシートを参照してください。ここでは、ADM3202ANZ を利用した回路で作成します。

  • RS232Cインターフェース (例)
  • ICソケット
  • 切替えスイッチ
    • クロス/ストレートをケーブルを気にせずに切り替えられるようにする
  • D-Sub 9pin コネクタ
  • 積層セラミックコンデンサ 0.1uF 耐圧10V以上 x 5
  • 耐熱電子ワイヤーの細いやつ
  • スズメッキ線
  • ケース (プラケースを強く推奨)

別枠

  • 半田ごて
  • ニッパー
  • ドライバ
  • ドリル

Orange Pi の セットアップ

OSは Armbian を利用する

  1. OrangePi Zero 用のArmbianイメージをダウンロードする。バージョンは特に考えずに「Armbian Focal」あたりを利用すれば良い
  2. USBimager を利用して①でDLしたイメージをSDカードへ書き込む
  3. OrangePIへ②でイメージを書き込んだSDカードを差し込み、起動する
  4. DHCPサーバのログを見ながら、IPアドレスをOrange Pi が取得したことを確認し、Orange Pi へSSHで接続する
  5. User: root / PW: 1234 でログインする
  6. 初期設定ウィザードに従って、 root パスワードの変更とユーザアカウントの作成を行う
  7. OSのアップデートを実行する apt update && apt upgrade -y
  8. ⑥で作成したユーザに自分の公開鍵を登録する
  9. SSHでのrootログイン及びパスワードを使用したログインを禁止する

シリアル接続 の セットアップ

USB to シリアル変換を使う場合

  1. USBポートにシリアル変換アダプタを接続する
  2. 認識されていることを確認する
$ setserial -g /dev/ttyUSB*
/dev/ttyUSB0, UART: 16654, Port: 0x0000, IRQ: 0

GPIO の UART ポートを利用する場合

GPIOのピンアサイン

回路を作る

回路図は以下の通り。シリアルポート手前の切り替えスイッチはクロス/ストレートの切り替えを行うためのスイッチである。このスイッチのおかげでケーブル購入時に極性を考えないで済む。 すべての積層セラミックコンデンサ0.1uF / 50V で作成している f:id:notoken3331:20200819052912p:plain

GPIO の UART を有効化する

  1. # armbian-config を実行する
  2. System を選択
    f:id:notoken3331:20200822225245p:plain
  3. Hardware を選択
    f:id:notoken3331:20200822225339p:plain
  4. 利用するUARTポートにチェックを入れる。通常、 uart1 ~ uart3 のチェックを入れる。 なお、上記の回路図の通り作成する場合は 1 と 2 だけでOK
    f:id:notoken3331:20200822225454p:plain
  5. 再起動を求められるので再起動を行う
    f:id:notoken3331:20200822225730p:plain
  6. シリアルポートとして認識されていることを確認する 以下の場合はttyS0~4が有効なシリアルポート、ttyS4~7は無効なシリアルポート
# setserial -g /dev/ttyS*
/dev/ttyS0, UART: undefined, Port: 0x0000, IRQ: 41
/dev/ttyS1, UART: undefined, Port: 0x0000, IRQ: 42
/dev/ttyS2, UART: undefined, Port: 0x0000, IRQ: 43
/dev/ttyS3, UART: undefined, Port: 0x0000, IRQ: 44
/dev/ttyS4, UART: unknown, Port: 0x0000, IRQ: 0
/dev/ttyS5, UART: unknown, Port: 0x0000, IRQ: 0
/dev/ttyS6, UART: unknown, Port: 0x0000, IRQ: 0
/dev/ttyS7, UART: unknown, Port: 0x0000, IRQ: 0

上記の状態で、ttyS1 または ttyS2 がシリアルポートとして動作するような実装となっているので、ルータやスイッチなどをつなげた状態で screen でシリアルポートを開き、シリアルポートとして動いていることを下記の手順で確認する

動作確認

以下はNVR500をつなげた状態で起動させた場合のログを表示している。テキトウにコマンドをいくつか実行して、対象の機材と正しく通信ができていることを確認することを強く推奨する

◯ if ttyS1 に接続している場合
$ screen  /dev/ttyS1 9600
◯ if ttyUSB0 に接続している場合
$ screen /dev/ttyUSB0 9600


N500 BootROM Ver. 1.02
N500 FlashROM Table Ver. 1.00

N500 Rev.11.00.39 (Tue Jul 10 13:35:37 2018)
  Copyright (c) 1994-2018 Yamaha Corporation. All Rights Reserved.
  Copyright (c) 1998-2000 Tokyo Institute of Technology.
  Copyright (c) 2000 Japan Advanced Institute of Science and Technology, HOKURIKU.
  Copyright (c) 2002 RSA Security Inc. All rights reserved.
  Copyright (c) 1997-2010 University of Cambridge. All rights reserved.
  Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, All rights reserved.
  Copyright (c) 1995 Tatu Ylonen , Espoo, Finland All rights reserved.
  Copyright (c) 1998-2004 The OpenSSL Project.  All rights reserved.
  Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) All rights reserved.
  Copyright (C) 1994-2012 Lua.org, PUC-Rio.
  Copyright (c) 1988-1992 Carnegie Mellon University All Rights Reserved.
  Copyright (C) 2004-2007 Diego Nehab. All rights reserved.
00:a0:de:c8:28:06, 00:a0:de:c8:28:07
Memory 64Mbytes, 2LAN, 1BRI

screen を閉じる場合は以下のコマンドで閉じることができる Ctrl + a → k

conserver の導入

conserver の設定

screen /dev/ttyS1 9600 と入力するのが若干面倒くさいので、Windowsみたいに console com0 とかで利用できるようにする com0 の部分は任意の文字列を設定できるので例えば「IX2215」とか「core_switch」とかにすることも可能なのでおそらく人間の使いやすい文字列を設定するのが最適解と思われる

# apt install conserver-*

### conserver の設定 ###
# vim /etc/conserver/conserver.cf
config * {
}
default full {
        rw *;
}
default * {
        logfile /var/log/conserver/&.log;
        timestamp "";
        include full;
}
### ここから GPIO UART を使う場合 ###
console com0 {
        master localhost;
        type device;
        device /dev/ttyS1;
        parity none;
        baud 9600;
}
console com1 {
        master localhost;
        type device;
        device /dev/ttyS2;
        parity none;
        baud 9600;
}
### ここまで GPIO UART を使う場合 ###
### ここから USB シリアル変換 を使う場合 ###
console com0 {
        master localhost;
        type device;
        device /dev/ttyUSB0;
        parity none;
        baud 9600;
}
### ここまで USB シリアル変換 を使う場合 ###
access * {
        trusted 127.0.0.1;
        allowed 127.0.0.1;
}

### conserver 認証の設定 ###
# vim /etc/conserver/conserver.passwd
*any*:*

### conserver を再起動して設定を反映する ###
# service conserver-server restart

console コマンドで接続を試しみる

# console com0
[Enter `^Ec?' for help]

Password:

N500 BootROM Ver. 1.02
N500 FlashROM Table Ver. 1.00

N500 Rev.11.00.39 (Tue Jul 10 13:35:37 2018)
  Copyright (c) 1994-2018 Yamaha Corporation. All Rights Reserved.
  Copyright (c) 1998-2000 Tokyo Institute of Technology.
  Copyright (c) 2000 Japan Advanced Institute of Science and Technology, HOKURIKU.
  Copyright (c) 2002 RSA Security Inc. All rights reserved.
  Copyright (c) 1997-2010 University of Cambridge. All rights reserved.
  Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, All rights reserved.
  Copyright (c) 1995 Tatu Ylonen , Espoo, Finland All rights reserved.
  Copyright (c) 1998-2004 The OpenSSL Project.  All rights reserved.
  Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) All rights reserved.
  Copyright (C) 1994-2012 Lua.org, PUC-Rio.
  Copyright (c) 1988-1992 Carnegie Mellon University All Rights Reserved.
  Copyright (C) 2004-2007 Diego Nehab. All rights reserved.
00:a0:de:c8:28:06, 00:a0:de:c8:28:07
Memory 64Mbytes, 2LAN, 1BRI

以下の手順でコンソールを閉じることができる Ctrl + E → c → . (ドット)

ネットワーク的な設定をする

操作対象のルータを経由せずに外部から到達できるネットワークに接続し、捜査対象のルータの設定が吹っ飛んでも設定が行えるような経路を確実に確保しないと意味がないので十分に注意する

IPv4 の場合

ネットワークマネージャでIPv4アドレスを固定する

IPv6 の場合

ネットワークマネージャで一時IPv6アドレスを無効にし、インターフェースIDを任意のものに変更する

ネットワークマネージャで利用されている接続設定名を取得する

# nmcli device
DEVICE         TYPE      STATE         CONNECTION
eth0           ethernet  connected     Wired connection 1
wlan0          wifi      disconnected  --
lo             loopback  unmanaged     --

IPv6 一時アドレスを無効化する

# nmcli c m "Wired connection 1" ipv6.ip6-privacy 0

IPv6 アドレスの生成方法を MAC アドレスベースのものに変更(固定)する

# nmcli c m "Wired connection 1" ipv6.addr-gen-mode eui64

IPv6 アドレスのインターフェースIDを指定する 例: 配布されている IPv6 の prefix が 2001:2:3:4::/64 のとき

# nmcli c m "Wired connection 1" ipv6.token ::cafe
→ 2001:2:3:4::cafe
# nmcli c m "Wired connection 1" ipv6.token ::891:cafe
→ 2001:2:3:4::891:cafe

tips

発熱がすごいんですが

はい。そのとおりです

ヒートシンクを付けても無負荷時にだいたい60度位を維持するくらい熱いです。 Raspberry Pi用のヒートシンクを設置しましょう

SDカードの寿命を伸ばしたいの

一般的ななんとかPiのSDカード寿命の伸ばし方とか高耐久なSDカードを利用してください

1~2年に1回程度、SDカードを新しいものに差し替えるなどの対策をすることを強く推奨します

SD カードのバックアップ方法を知りたい

  • 構築方法をansibleとかで記述しておくと便利です
  • Raspberry Pi SD カード バックアップ 等でググった方法でバックアップすれば大丈夫です
    • 複数台にイメージ展開して使う場合は、IPアドレスの重複だけはお気をつけください

1段目がそもそも操作したいルータなのですが

  • ひかり電話なしやひかり電話ルータを利用している場合はRAでIPv6受け取ればいいと思います
  • グローバルIPが割り当てられるSIM+LTEモデム+RTX810とかで裏口を作るのもいいと思います
  • PPPoEのプロバイダを追加で契約するという手段もあります

工作例

f:id:notoken3331:20200823023326j:plain:w300

f:id:notoken3331:20200823023330j:plain:w300

  • シリアルポートは3本のみの接続なので、穴あけが面倒くさいD-Subではなく 3.5mm ステレオフォン端子を利用している
  • ヒートシンクの性能が足りなかったため、10円玉で増強しています……
  • 電源は3端子レギュレータで降圧することで12Vの入力が可能になるように実装しています
    • スルー出力端子を設けているのは、そのまま他の機器に電源供給できるようにするためです
    • そのため、12Vを入力できるようにしたかったわけです