「PiKVM」にLTE対応USBドングルを挿して“モバイルできるリモートKVM”を作る

「PiKVM」にLTE対応USBドングルを挿して“モバイルできるリモートKVM”を作る
Page content

リモートKVMのモバイル化

本記事は次の記事の続編です。

前回の最後にはこんな予想を書きました。

さらに、データ通信用USBモデムがPiKVMで認識できるものであれば、インターネット環境が利用できないところでの機器の遠隔操作も可能だと思います。

そこで今回は、仕入れたLTE対応USBドングル (実は1個壊してしまったorzので2個目です) を使って、2年以上前のこの予想が実現できるかどうかを確認してみます。いわばお手軽な「モバイル回線対応のリモートKVM」を作ってみる実験です。

作ってみよう

実験に際して揃えた材料は次の通り。前回と同じく、ラズパイやUSBドングルは一般的な市販品のみ使い、PiKVMの純正ハードウェアは (出費を抑えるため) 使わずにどこまで出来るか作戦でいきます。

必要な材料今回の選択
Raspberry Pi 4 Model B4GBモデル
MicroSDカード64GB
HDMI to USBドングル; ビデオキャプチャデバイスTHANKO SHDSLRVC
LTE対応USBドングルPIXELA PIX-MT110
SIMカード (microSIM)IIJmio タイプD
各種ケーブル適当にあった物
PiKVMを接続する機器 (以下、接続機器)Raspbery Pi 400 + Kali Linux

Phase-1. LTE対応USBドングルでの通信を可能にする

  1. ラズパイ4にPiKVMイメージを導入して起動する
  2. SIM設定が完了しているLTE対応USBドングル「PIXELA PIX-MT110」をPiKVMに挿す
    • LTE対応USBドングルがID 15a9:0046 Gemtek 4G Modemとして認識される
      [root@pikvm ~]# lsusb
      Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
      Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
      Bus 001 Device 003: ID 15a9:0046 Gemtek 4G Modem
      Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
    • ネットワークインターフェースとしてeth1が増えている
      [root@pikvm ~]# ip a
      (途中省略)
      4: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
      	link/ether 80:02:9c:XX:XX:XX brd ff:ff:ff:ff:ff:ff
  3. 上記のeth1を設定する
    • PiKVMをrwモードへ切り替える
      [root@pikvm ~]# rw
      + mount -o remount,rw /
      + mount -o remount,rw /boot
      + set +x
      === PiKVM is in Read-Write mode ===
    • eth0用設定ファイルを元にして、Name部分のみ変更したeth1用ファイルを作成する
      [root@pikvm ~]# cd /etc/systemd/network/
      [root@pikvm network]# sed 's/Name=eth0/Name=eth1/' ./eth0.network > ./eth1.network
      [root@pikvm network]# diff ./eth0.network ./eth1.network
      2c2
      < Name=eth0
      ---
      > Name=eth1
    • PiKVMをroモードへ戻す
      [root@pikvm network]# ro
      + mount -o remount,ro /
      + mount -o remount,ro /boot
      + set +x
      === PiKVM is in Read-Only mode ===
  4. PiKVMを再起動する
  5. eth1の状態を確認する→DHCPサーバであるUSBドングルからIPアドレスを取得できている
    [root@pikvm ~]# ip addr show eth1      
    4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
    	link/ether 80:02:9c:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    	inet 192.168.0.42/24 metric 10 brd 192.168.0.255 scope global dynamic eth1
    	valid_lft 3175sec preferred_lft 3175sec
    	inet6 fe80::8202:9cff:feXX:XXXX/64 scope link proto kernel_ll 
    	valid_lft forever preferred_lft forever

Phase-2. Tailscaleを導入する

Tailscaleの導入方法は、PiKVMサイトの上記ドキュメントで詳しく説明されているので、ここではその手順をそのままなぞっています。

  1. PiKVMのパッケージを更新する
    [root@pikvm ~]# pikvm-update
    (再起動が実施される)
  2. tailscaleをインストールする
    [root@pikvm ~]# rw
    [root@pikvm ~]# pacman -S tailscale-pikvm
    [root@pikvm ~]# systemctl enable --now tailscaled
    [root@pikvm ~]# tailscale up
  3. tailscaleの認証 (表示されるURLをウェブブラウザで開く) を行い、PiKVMドキュメントのお勧め通りDisable key expiryも行う
  4. PiKVMを再起動する (再起動するとroモードに戻る)
  5. Tailscaleの動作状態を確認する
    • tailscale0インターフェースを確認する
      [root@pikvm ~]# ip addr show tailscale0
      5: tailscale0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1280 qdisc fq_codel state UNKNOWN group default qlen 500
      	link/none 
      	inet NNN.NNN.NNN.NNN/32 scope global tailscale0
      	valid_lft forever preferred_lft forever
      	inet6 fd7a:115c:a1e0::a3XX:XXXX/128 scope global 
      	valid_lft forever preferred_lft forever
      	inet6 fe80::5191:72ea:9aXX:XXXX/64 scope link stable-privacy proto kernel_ll 
      	valid_lft forever preferred_lft forever
    • tailscaleコマンドでIPアドレスを確認する
      [root@pikvm ~]# tailscale ip
      NNN.NNN.NNN.NNN
      fd7a:115c:a1e0::a3XX:XXXX
  6. PiKVMと同じtailnetに所属するマシンから、https://NNN.NNN.NNN.NNN/ (tailscale上のPiKVMのIPアドレス) へアクセスできることを確認する

Phase-1, Phase-2 が完了すれば、PiKVM化しているラズパイへは、それにLTE対応USBドングルが挿してあるだけでインターネットからアクセスできるはずです。これにて、携帯電話の電波の圏内であればどこに置いても使える「モバイル回線対応のリモートKVM」が完成しました。

注意: パケット残量には余裕が必要

LTE対応USBドングルでは一般的に従量課金もしくは通信量に上限があるデータ通信回線を使用するはずで、PiKVMの画面転送によるパケット使用量の増加には注意しておいてください。

今回の実験において、PiKVMを1Gbps LANに有線接続し、接続機器 (Raspberry Pi 400) の1920x1080画面出力をHDMI to USBデバイスでキャプチャして別PCのブラウザでモニターした際、下記写真のように左上部に文字があって他は真っ黒な画面を表示している時に、PiKVMからは常時5〜6Mbpsのデータ送信が行われていました。仮に6Mbpsだと→45MB/min→23分で1GBを消費する計算になります。

ちなみに本実験時の画面転送はMJPEG形式です。PiKVMでは転送効率が良いH.264も選択可能なようですが、H.264 / WebRTC - PiKVM Handbook によると USB capture devices are not supported となっています。

接続機器をPiKVM経由でインターネット通信させる

Phase-3. 「Ethernet-over-USB」機能の有効化

PiKVMのEthernet-over-USB機能を使うと、接続機器自体を有線 (LANケーブル) や無線 (Wi-Fi) でネットワーク接続していない状態でも、USB接続したPiKVMを経由してネットワーク通信させることができます。設定手順はPiKVMサイトの上記ドキュメントで詳しく説明されているので、ここではざっくりと書きます。

  1. PiKVMをrwモードに切り替える
  2. IPv4のパケット転送を有効化する
    [root@pikvm kvmd]# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/99-kvmd-extra.conf
  3. /etc/kvmd/override.yamlの末尾に次のブロックを追記する (forward_iface: eth1はLTE対応USBドングルのeth1経由で通信させるという設定)
    otg:
        devices:
            ethernet:
                enabled: true
                driver: ecm
    otgnet:
        firewall:
            allow_tcp: [80, 443]
            forward_iface: eth1
        commands:
            post_start_cmd_append:
                - "--dhcp-option=6,8.8.8.8"
        iface:
            ip_cmd:
                - /usr/bin/ip
            net: 10.65.0.0/28
  4. kvmd-otgnetサービスをenableする
    [root@pikvm kvmd]# systemctl enable kvmd-otgnet
    Created symlink /etc/systemd/system/multi-user.target.wants/kvmd-otgnet.service -> /usr/lib/systemd/system/kvmd-otgnet.service.
  5. PiKVMを再起動する
  6. 次のことを確認する (今回の接続機器のOSはKali Linuxなので、Linux環境を前提とした確認方法です)
    • 接続機器のusb0インターフェースがUP状態で、10.65.0.0/28に該当するIPアドレスがDHCPで付与されていること
    • 接続機器からインターネットへの通信ができること
    • PiKVMから接続機器のIPアドレスへ、SSH等のネットワークアクセスができること

まとめ・感想

ラズパイを用いて実現するリモートKVM・IP-KVMの「PiKVM」。このモバイル回線対応は、作業工数面において意外に簡単に行えると分かりました。ほぼどのような遠隔地にある機器の操作に使えるのはもちろん、ネット接続する手間が不要なシンプルさを生かして、自分が移動して操作するのはおっくうな距離にある機器にササッと接続しておいて使うのも、結構ありな気がします。

また、モバイル回線対応ということは、リモートKVMを介して操作される機器が移動しがちな形態にも対応可能なわけで、直感ですがそれっぽい面白い用途があるかもしれないと思いました。

参考リンク: PiKVMの純正ハードウェア