カテゴリー別アーカイブ: iOS

iOSに関するメモ

AirPrint非対応のプリンタをUbuntuサーバ経由でAirPrint対応に

avahi-daemon (Apple Bonjour互換) を使ってプリンタ名を広告してやることによって、AirPrint非対応の旧世代プリンタをAirPrint対応にできるらしいので、実験してみた。

そのためには、Linux プリンタサーバ上に、iOS デバイスへプリンタ情報を教えるための avahi 設定が必要になる。

前の記事の内容で、既にUbuntu環境でプリンタの設定はできているものとする。

1. インストール

必要なパッケージをUbuntuデスクトップにインストールする。

desktop$ sudo apt-get install avahi-discover

2. 情報の取得

端末から、avahi-discover コマンドを実行する。標準出力にダンプされる情報を利用するので、ログファイルを取っておく。

desktop$ avahi-discover >log

表示された GUI ウインドウ上で、「Internet Printer」→「EPSON EP-802A @ myserver1」を選択する。その後、×ボタンで GUI を閉じる。

logファイルの内容を確認すると、末尾近くに以下のような行がある。

Host myserver1.local (192.168.100.240), port 631, TXT data: ['printer-type=0xB01E', 'printer-state=3', 'Duplex=T', 'Color=T', 'TLS=1.2', 'UUID=3ae710a1-2d56-928f-4a19-394a152d3eca', 'URF=DM3', 'pdl=application/octet-stream,application/pdf,application/postscript,image/jpeg,image/png,image/urf', 'product=(Epson EP-902A Series)', 'priority=0', 'note=Home', 'adminurl=https://myserver1.local:631/printers/EPSON-EP-802A', 'ty=Epson EP-802A Series - epson-inkjet-printer 1.0.0-1lsb3.2 (Seiko Epson Corporation LSB 3.2)', 'rp=printers/EPSON-EP-802A', 'qtotal=1', 'txtvers=1']

3. 情報ファイルの作成

上記の情報をもとに、avahi のサービス情報ファイルを作成する。

myserver1$ sudo vi /etc/avahi/services/AirPrint-EPSON-EP-802A.service
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">AirPrint EPSON-EP-802A @ %h</name>
<service>
 <type>_ipp._tcp</type>
 <subtype>_universal._sub._ipp._tcp</subtype>
 <port>631</port>
 <txt-record>txtvers=1</txt-record>
 <txt-record>qtotal=1</txt-record>
 <txt-record>rp=printers/EPSON-EP-802A</txt-record>
 <txt-record>ty=Epson EP-802A Series - epson-inkjet-printer 1.0.0-1lsb3.2 (Seiko Epson Corporation LSB 3.2)</txt-record>
 <txt-record>adminurl=https://myserver1.local:631/printers/EPSON-EP-802A</txt-record>
 <txt-record>note=Home</txt-record>
 <txt-record>priority=0</txt-record>
 <txt-record>product=(Epson EP-902A Series)</txt-record>
 <txt-record>pdl=application/octet-stream,application/pdf,application/postscript,image/jpeg,image/png,image/urf</txt-record>
 <txt-record>UUID=3ae710a1-2d56-928f-4a19-394a152d3eca</txt-record>
 <txt-record>TLS=1.2</txt-record>
 <txt-record>Color=T</txt-record>
 <txt-record>Duplex=T</txt-record>
 <txt-record>printer-state=3</txt-record>
 <txt-record>printer-type=0xB01E</txt-record>
 <txt-record>URF=none</txt-record>
</service>
</service-group>

ファイルができたら、サービスを再起動する。

myserver1$ sudo service avahi-daemon restart
myserver1$ sudo service cups restart

設定が終わったら、iOS デバイスのアプリケーション (例えばSafari) からテスト印刷する。「メニューボタン」→「プリント」を選択して、「プリンタ」に「EP-802A」が表示されたら選択して印刷してみる。自分の環境では、きちんと印刷できた。

参考URL: 今日はLinuxのCUPSプリントサーバをAirPrintサーバにして、iPhoneからAirPrintで印刷するとPDFファイルが生成されるようにしてみた

iOS/Android 端末からの L2TP/IPsec 接続 (strongswan+xl2tpd)

iOSやAndroid端末、あるいは Windows PC などからもリモートアクセスできるよう、VPS マシンに VPN 接続を設定しておく。

PPTPについては既に脆弱性が発見されており、OSによってはサポート対象外になっているため、VPN プロトコルとしては L2TP/IPsec を使う。

前提:
対象サーバはVPSのUbuntu 14.04。

IPsec 実装としては strongswan、L2TP 実装としては xl2tpd を利用する。

ネットワーク図は以下の通り。
05

1. インストール

myvps1:~$ sudo apt-get install strongswan xl2tpd

カーネルパラメータをパケット転送できるよう設定する。

myvps1:~$ sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1  #28行目のコメントを外す
# 以下、追記する
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.eth0.accept_redirects=0
net.ipv4.conf.eth0.send_redirects=0
net.ipv4.conf.lo.accept_redirects=0
net.ipv4.conf.lo.send_redirects=0
net.ipv6.conf.eth0.accept_redirects=0
net.ipv6.conf.lo.accept_redirects=0
myvps1:~$ sudo sysctl -p /etc/sysctl.conf

ファイアウォール(ufw)を閉じている場合は、ESP、UDP 500・4500 を空けておくこと。

2. ipsec.confの設定

myvps1:~$ sudo vi /etc/ipsec.conf

以下の内容を追記する。

conn L2TP-PSK
        authby=secret
        auto=add
        closeaction=clear
        dpdaction=clear
        type=transport
        rekey=no
        left=203.0.113.180
        leftprotoport=17/1701
        right=%any
        rightprotoport=17/%any

IPsec はトランスポートモードを使用する。ペイロードに L2TP を通すので、ルーティングはそちらに任せる。

再接続等はクライアント側に任せたいため、こちらからは何もしない設定である。接続が切れた場合はセッションをクリアする。

3. IPsecの事前共有鍵の設定

myvps1:~$ sudo vi /etc/ipsec.secrets

事前共有鍵を平文で記述する。

: PSK "mypresharedkey"

4. xl2tpd.conf の設定

myvps1:~$ sudo vi /etc/xl2tpd/xl2tpd.conf

以下の設定を追記する。

[global]
port = 1701

[lns default]
ip range = 172.16.1.11-172.16.1.30
local ip = 172.16.1.254
length bit = yes
require chap = yes
refuse pap = yes
require authentication = yes
name = myvps1.vpsnet.example.jp
ppp debug = no
pppoptfile = /etc/ppp/xl2tpd-options

接続クライアント側には、172.16.1.11 から 30 の間でアドレスが割り振られる。

5. xl2tpd-options の設定

myvps1:~$ sudo vi /etc/ppp/xl2tpd-options

L2TPの設定を記述する。

ipcp-accept-local
ipcp-accept-remote
ms-dns 172.16.1.254  (myvps1:172.16.1.254にキャッシュDNSサーバが立っている前提)
noccp
auth
crtscts
idle 1800
mtu 1300
mru 1300
nodefaultroute
lock
connect-delay 5000
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2

6. chap-secrets の設定

myvps1:~$ sudo vi /etc/ppp/chap-secrets
username	*	"l2tppassworddesu"	*

一般ユーザで読めない権限にしておく。

7. デーモンの起動

myvps1:~$ sudo service strongswan restart
myvps1:~$ sudo service xl2tpd restart

この状態で、iPhoneなどから接続してみる。
iPhoneであれば「設定」→「VPN」→「VPN構成を追加…」で「L2TP」を選択して設定を追加する。
サーバ欄にはVPSのホスト名(IPアドレス)、アカウントにはL2TPユーザ名、パスワードにはL2TPパスワード、シークレットにはIPsec事前共有鍵を設定する。

クライアント機器が、公衆無線LANなどのプライベートネットワーク中に居る状態も想定しなければならない。その場合は NAT-Traversal を使うことになるが、Ubuntu 14.04 の strongswan は標準でNAT-Traversal を自動検出してくれるようなので、特別な設定をしなくても接続できる (ただし、UDP 4500番ポートについてファイアウォールが空いている必要はある)。