なんで
普段の作業はFig.1中のrouter-2配下にあるネットワーク内のPCやMacで作業しています。ですのでスマホからプリントする機会もなく今に至ります。
そんな中、なんでまたAirPrintを使ってみたくなったかと言うと、ただただ技術的な興味としか言いようがないです。
ともあれ、タイトルの通り別ネットワークのiPhone1からAirPrintしてみようと思います。
Fig.1
調査
現状MacからのプリントのためにServer1でCUPS+GutenPrintが動作しており、AirPrint相当のサービスは動作しています。
詰めるところBonjourでプリンタのサービスを知らせ、プリントはIPPを使うだけなんですが。
この状態で別ネットワークからAirPrintしようとしてもiPhone1側にAirPrint対応プリンタは表示されません。理由は明白でServer1がbonjourでプリンタサービスを知らせるブロードキャスト到達範囲がrouter-2配下のみだから。iPhone1でプリンタが見えるためにはbonjourでAirPrintサービスがiPhone1まで届く必要がある。
解決策として考えてみると
- Server1〜iPhone1の間にはルータが2台あり、そこにbonjourのパケット(含むブロードキャストパケット)が通過するようにする
- router-1配下でbonjourサービスを立ち上げAirPrintサービスをアドバタイズするようにする
- 他
があるのかなと。
(a)はなんとなく気持ち悪いので却下。(c)はrouter-2とrouter-1の2者間でbonjourをリレーするような仕組みとかできそうだけど調査自体の時間コストがかかりそうなので却下。
残った(b)ですが作業コスト的に楽そうなのでbonjourサービスとしてAvahiでやってみることにします。
対応作業
先に対応作業を施した最終構成をFig.2に示します。
Fig.2
手順ですが
(1) AirPrintサービスのサービス情報をrouter-2配下で取得
1 |
dns-sd -B _ipp._tcp . # Macの場合 |
(2) avahi-daemonをrouter-1にインストール
1 |
sudo apt install avahi-daemon |
(3) 作業1で取得したサービス情報をrouter-1のbonjourサービスに追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?xml version="1.0" ?> <!DOCTYPE service-group SYSTEM 'avahi-service.dtd'> <service-group> <name replace-wildcards="yes">Canon_xxxxx_series CUPS+Gutenprint</name> <service> <type>_ipp._tcp</type> <subtype>_universal._sub._ipp._tcp</subtype> <host-name>server1.local</host-name> <port>631</port> <txt-record>printer-type=0x9xxx</txt-record> <txt-record>printer-state=3</txt-record> <txt-record>Duplex=T</txt-record> <txt-record>Color=T</txt-record> <txt-record>TLS=1.2</txt-record> <txt-record>UUID=e7xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxa8</txt-record> <txt-record>URF=DM3</txt-record> <txt-record>pdl=application/octet-stream,application/pdf,application/postscript,image/jpeg,image/png,image/pwg-raster,image/urf</txt-record> <txt-record>product=(Canon xxxxx series)</txt-record> <txt-record>priority=0</txt-record> <txt-record>adminurl=https://server1.local.:631/printers/xxxxx_GutenPrint</txt-record> <txt-record>ty=Canon xxxxx series - CUPS+Gutenprint v5.3.1</txt-record> <txt-record>rp=printers/xxxxx_GutenPrint</txt-record> <txt-record>qtotal=1</txt-record> <txt-record>txtvers=1</txt-record> </service> </service-group> |
(4) Server1のIPとホスト名をavahi-daemonのhostsに追加
1 2 |
2001:db8:0:2::1 server1.local #192.168.33.1 server1.local # IPv4であれば |
(5) router-1のavahi-daemonをリスタート
1 |
sudo service avahi-daemon restart |
(6) router-2、Server1のnetfilterでiPhone1側からのIPP(631)が通過できるようにする
1 2 3 |
ip6tables -A INPUT -s 2001:db8:0:2::/64 -d 2001:db8:0:2::1/128 -i eth0 -p tcp -m tcp --dport 631 -j ACCEPT # IPv4であれば #iptables -A INPUT -s 192.168.55.0/24 -d 192.168.33.1/32 -i eth0 -p tcp -m tcp --dport 631 -j ACCEPT |
結果
無事にiPhone1でプリンタを認識できました