スマホから別セグメントにあるCanonプリンタを使う

目次

別セグメントに置いているCanonのプリンタをスマホから使おうと思ったが、印刷アプリがプリンタを見つけてくれなかったのでなんとかしたメモ。

背景

自宅ではプリンタなどの装置と、PCやスマートフォンなどのネットワークを分けている。

ネットワーク概要図

基本的には間に入っているルータ兼ファイアウォールが適宜ルーティングをしてくれるので不便なことはない。 しかし、スマートフォン(iOS)から直接プリンタ(Canon TS8000 Series)へ印刷をかけようとしたところ、Canonの純正アプリがプリンタを検出してくれず、また直接プリンタのIPアドレスを指定するオプションも見つけられず、印刷できなかった。
(ビジネス向けのアプリの方ではプリンタのIPアドレスを直接指定して接続ができるようだが、今回のプリンタは指定しても認識しなかった。恐らくプリンタ側の対応プロトコルの影響だと思うが、何に対応していれば良いのか調べる元気がなかったので調べていない。)

そこで、なんとかしようとパケットキャプチャをしながら調べていたところ、ルータでmDNSのリレー(リフレクション)を実施すれば良さそうとわかったので実践してみた。

環境

  • プリンタ: Canon TS8000 Series
  • スマートフォン: iOS 18.0
  • ルータ: Ubuntu 24.04.1

手順

  1. Avahiのインストール

    Linux(Ubuntu)でmDNSをリレーするソフトウェアとして、今回は(デスクトップ版Ubuntuなどでは標準でインストールされている) Avahiを利用することにした。

    sudo apt install avahi-daemon
    
  2. Avahiの設定

    リレーする設定を入れていく。意図しないインターフェースからのアクセスを防止するため、ホワイトリスト形式でインターフェースの指定も行った。 (今回はeth1がプリンタのいるインターフェース、eth2がスマートフォンのいるインターフェース。)

    sudo nano /etc/avahi/avahi-daemon.conf
    
    [server]
    use-ipv4=yes
    use-ipv6=no
    allow-interfaces=eth1,eth2
    cache-entries-max=0
    ratelimit-interval-usec=1000000
    ratelimit-burst=1000
    
    [wide-area]
    enable-wide-area=yes
    
    [publish]
    publish-hinfo=no
    publish-workstation=no
    
    [reflector]
    enable-reflector=yes
    reflect-ipv=no
    reflect-filters=_canon-chmp._tcp.local
    
    [rlimits]
    
  3. avahi-daemonの再起動

    sudo systemctl restart avahi-daemon.service
    
  4. ファイアウォールの穴あけ

    プリンタがあるセグメント(インターフェース)とスマートフォンがあるセグメントの双方から、ルータのUDP Port 5353へアクセスできるようにする。
    もし特定のデバイスのみリレーをしたい場合は、ソースIPアドレスで制限をかけても良いかもしれない。

    nft add rule inet filter input udp dport 5353 iifname { eth1, eth2 } counter accept # mDNS
    

以上でスマートフォンアプリからプリンタが見えるようになる。

メモとか

パケットキャプチャした結果から、簡単にスマートフォンアプリとプリンタ間で発生していた通信をメモしておく。
順番通りではないし、何度か繰り返されている通信があったが一度しか記載していない。

  • mDNS(UDP 5353, multicast) PTR _canon-chmp._tcp.local “QU” question のリクエスト
  • HTTP(TCP 80だけどヘッダを見る限りこれがCHMPのネゴシエーション) POST /canon/ij/command2/port1
  • HTTP(TCP 80 同上) GET /canon/ij/command2/port1
  • SNMP(UDP 161) 1.3.6.1.2.1.2.2.1.6.1 や 1.3.6.1.4.1.1602.1.1.1.1.0 などのリクエスト
  • HTTP(TCP 80 同上) POST /canon/ij/command2/port3
  • HTTP(TCP 80 同上) GET /canon/ij/command2/port3
  • SLP(UDP 427) service:wakeup.canon リクエスト
  • PDL Data Streaming(TCP 9100) CHMP? データ量的に恐らく印刷するデータ転送

ということで、ファイアウォールの穴あけは以下が必要な様子だった。(未確認)

  • UDP 5353 (ルータ-プリンタ間、ルータ-スマートフォン間)
  • TCP 80, 9100 / UDP 161, 427 (プリンタ-スマートフォン間)

ちなみに、プリンタ側は今回リレーしたサービス以外にも以下のサービスを広告していた。

  • _http._tcp.local (HTTP)
  • _scanner._tcp.local (Scanner)
  • _ipp._tcp.local (IPP: Internet Printing Protocol)
  • _ipps._tcp.local (IPPS: Internet Printing Protocol w/TLS)
  • _canon-chmp._tcp.local
  • _printer._tcp.local (LPD/LPR)
  • _pdl-datastream.local (PDL Data Streaming)
  • _uscan._tcp.local
  • _uscans._tcp.local

参考にしたWebサイト