[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[palm-unix-j:00345] network hotsync with debian(J



$B3'MM$3$s$K$A$O!#(B

$B8=l9g$O(B LANSync $B$G!"(Bgateway PC $B$,(B
linux(debian) $B$N>l9g$O(B ModemSync $B$G!"$=$l$>$l(B server (linux/debian)
$B>e$N(B coldsync $B$K(B netowrk hotsync $B$5$;$k$3$H$,$G$-$^$7$?$N$G!"$7$g!<(B
$B$b$J$$5-O?$+$b$7$l$^$;$s$,!"(BML $B$KN.$7$F$*$-$^$9!#(B

linux $B$G(B ModemSync $B$KBP1~$5$;$k;~$N(B PPP $B$N@_Dj$,%_%=$G$7$?!#(B
FAQ $B$+$b$7$l$^$;$s$,!"(BWeb $B>e$G$O8+$D$+$i$J$+$C$?$N$G!"$I$J$?$+$N;29M(B
$B$K$J$l$P9,$$$G$9!#(B

hotplug $B$b$$$m$$$m;n9T:x8m$r7+$jJV$7$^$7$?$,!"$3$A$i$N:#$N4D6-$G$O(B
$B%$%^%$%A$H$$$&7kO@$G$9!#(B

$B$G$O$G$O!#(B

========
$B$J$,$7$^(B

概要:
  目的
    palm は普段持ち歩いてて、gateway PC も持ち歩いたり、別の端末だったり
    しても、サーバーは1箇所にして network hotsync したい、という企画。

    getway PC を好き勝手いじれる必要があるし、サーバーには global IP で
    アクセスできないといけないので、いつでもどこでもというわけにはいかな
    いが...

    また global IP に network hotsync 用のポートがあくわけで、セキュリティ
    上も好ましくないが、力尽きたので over ssh などは今後の課題ということで
    ごかんべんを。

  接続
    物理的な配線
       palm --<USB>- gateway PC --<LAN/WAN>-- server

    論理的な接続
       palm ------<LANSync>------ HotSync Manager(Windows) --<IP>-- coldsync
      または
       palm --<ModemSync/PPP>----        PPPD(linux)       --<IP>-- coldsync


  テスト環境
    サーバー   : debian/woody (kernel v.2.4.17)
    gateway PC : debian/sarge (kernel v.2.4.19) or windows98
    palm       : Clie T400


  gateway PC のカーネルの設定
    gateway PC の linux では
      ・ USB 周り(特にシリアルの visor)
      ・ PPP 周り
    のモジュールをコンパイルしておく。

  おまけ
    boot 後1回だけなら hotplug が使えるらしい。

  希望
    hotplug の設定で USB device が detach する前に poff するスクリプトを
    実行できれば...

    あるいは USB device が detach されても device オブジェクトは close
    されるまで detach しなくしてくれるとか...


設定:
  準備
    palm に割り当てる IP アドレスを決めておく。
    以下の設定は、gateway PC がぶら下がるサブネット内のアドレスから
    選ぶことを前提としている。


  サーバ側の設定。
    coldsync をインストール。
    man coldsync を見て、.coldsyncrc に listen net { } を追加。
    pda { } でパスなどを指定。シリアル番号、ユーザー名などは後で設定する。

    別に coldsync である必要はなく、pilot-link などでも構わんが、
    とにかく network hotsync を受けつけるように設定しておけばよい。


  palm 側の設定
    Hotsync のメニューから「プライマリパソコンの設定」を開き、
    「プライマリパソコンのアドレス」に IP アドレスを入力する。

    HotSync のメニューから 「LANSync の設定」のメニューを開き
    LANSync を選ぶ。(gateway PC が linux の場合不要)

    HotSync のメニューから「モデム HotSyncの設定」のメニューを開き
    「ネットワーク」を選択する。(gateway PC が windos の場合不要)

    HotSync のメイン画面で「モデム」を選択すると、中央のアイコン
    (ボタン?)のすぐ下に接続を表示する矩形領域があるのでそこをタップ
    して開き、「ユーザー名」「パスワード」ともに設定せずに「接続」を
    「クレードル/ケーブル」にする。一番下の「詳細...」をタップして
    「接続タイプ」を 「PPP」に、「切断までの時間:」を「3分」にし、
    「クエリー DNS」と「IP アドレス:自動」にチェックをする。
    (gateway PC が windos の場合不要)


  gateway PC (Windows) 側の設定
    hotsync manager のデバイスチェックリストでネットワークもチェックする。


  gateway PC (linux) 側の設定
    ppp (pppd) を用意しておく。
    /etc/ppp/peers 以下に palm という名前の ppp config ファイルを用意する。
    中身は以下の一行(何行かにわけてもかまわないが)でよい。
      /dev/ttyUSB1 <gateway PC>:<palm> local noauth proxyarp ktune

    ただし、<gateway PC>, <palm> には IP アドレスか IP アドレスが引ける
    ホスト名を与える。

    例えば DNS や /etc/hosts で
     192.168.0.10  mypc
     192.168.0.99  palm
    などと設定されている場合、
      /dev/ttyUSB1 mypc:palm local noauth proxyarp ktune
    とするとか、
      /dev/ttyUSB1 192.168.0.10:192.168.0.99 local noauth proxyarp ktune
    などとする。

    visor モジュールを組み込んでおく。
    /etc/modules に visor の一行を追加しておく。


接続
  1) サーバの起動
    最初の接続 (coldsync)
      coldsync をサーバーにする場合、最初にシリアル番号などを調べるための
      hotsync が必要になる。

      サーバー上で coldsync -mI とか coldsync -mI -f <coldsyncrc file name>
      とかやっておく。

      palm デバイスのシリアル番号、ユーザー名、ユーザー ID などが表示される
      ので、.coldsyncrc に反映させておく。

    二度目以降の接続 (coldsync)
      サーバー上で coldsync -ms とか coldsync -ms -f <coldsyncrc file name>
      とかやっておく。


  2) palm で HotSync 起動
    gateway に Windows を使う場合
      クレードルの Hotsync ボタンを押すか、Hotsync アプリの「ローカル」を
      選んで画面真中のアイコン(ボタン?)をタップする。

    gateway に linux を使う場合
      Hotsync アプリの「モデム」を選んで画面真中のアイコン(ボタン?)を
      タップする。palm には「ログオン」という文字が表示されて一時停止する。


  3) (gateway に linux を使う場合) PPP の起動
    gateway PC で pon palm を実行し、PPP セッションを開始する。

    palm の「ログオン」という画面が閉じて「ユーザーを認証中」と処理が
    先にすすむ。


  4) 終了
    HotSync が終了し、サーバーの coldsync も終了する。

    gateway PC に linux を使う場合、PPP を停止させるため、poff palm を
    実行する。

    gateway に Windows を使う場合、2ステップですむが、linux を使う場合
    4ステップかかってしまう。


hotplug で楽々 HotSync

    hotplug がきちんと動作すると、pon/poff が自動でなされ、linux でも
    windows 同様2ステップで作業が終了する。

    しかし、現状では USB serial と pppd の相性がよくなくて、自動で機能
    するのは最初の1回だけ。 (kernel: 2.4.19, pppd: 2.4.1) 

    visor を最初に組み込まないように、/etc/modules での記述を削除する。
    hotplug は USB デバイスを検出すると自動的にモジュールを組み込んで、
    初期化スクリプトを実行する機能なので、最初から組み込まれていては
    いけない。

    /etc/hotplug/usb 以下に visor という名前の shell script を用意しておく。
    中身は以下の13行でファイルに実行パーミッションを出しておく。
      #! /bin/sh
      
      sleep 1
      
      if [ "$DEVICE" = "" ]; then
        REMOVER=/var/run/usb/`echo "$INTERFACE/$PRODUCT/$TYPE" | sed -e 's;/;%;g'`
      else
        REMOVER=/var/run/usb/`echo $DEVICE | sed -e 's;/;%;g'`
      fi
      
      /bin/cp -f /etc/hotplug/usb/visor.detach $REMOVER
      
      /usr/bin/pon palm

    同様に /etc/hotplub/usb 以下に visor.detach を実行パーミッションを
    つけて用意する。以下の3行。
      #! /bin/sh
      sleep 3
      /usr/bin/poff palm

    以上で hotplug の設定は終了。

    ブート後初めて hotsync する時は、 visor モジュールの組み込み、ppp 
    セッションの開始、 hotsync の終了後 ppp セッションを閉じる、ところま
    ではうまくいくはず。sleep する時間の調整が必要かもしれない。

    本当はこのスクリプトの最後に /sbin/rmmod visor としたいところだが、
    pppd が /dev/ttyUSB1 を閉じる前に USB デバイス側が detach してしまい、
    プロセス(pppd)は /dev/ttyUSB1 をオープンしたままでデバイスがなくなっ
    てしまい、プロセスはデバイスを閉じることができなくなってしまう。

    で、プロセスがデバイスをオープンしたままデバイスを detach してしま
    うと、モジュールの使用カウントが変になってしまう。具体的には、poff
    して ppp セッションを終了し、pppd がいないのを ps で確認した後、
    lsmod すると
      Module       Size  Used by    Not tainted
      visor       10220   1
    と、visor を使っているカウントが 1 と残ってしまう。

    このため、poff して ppp セッションを閉じた後でも visor のモジュール
    を外すことができない。

    つまり、もう一度 HotSync しようとしても visor モジュールが組み込
    まれているため、hotplug 機能は省略され、pon/poff の自動実行も
    省略されてしまう。

    逆に、二度目以降は前述のように手動で pon/poff してやれば HotSync は
    問題なく機能する。

    visor モジュールの used by カウントがどんどん増えていくのが気にな
    るが...


セキュリティ対策
  サーバーサイドの WAN/LAN のゲートウェイには、いわゆるブロードバンド
  ルータを使用していて、palm に設定する server の IP アドレスもこのルー
  タの外向きの IP アドレスを使っている。

  このルータの IP forwarding の機能を使って、network hotsync 用のポー
  トを LAN 内の linux サーバの network hotsync 用ポートに接続している。

  linux サーバでは必要に応じて coldsync をユーザーモードで起動するよう
  にしているのが今のところの対策。

  coldsync に穴があって、攻撃を受けている最中に network hotsync をして
  しまう、とかいう不幸はしょうがないねぇ、というセキュリティポリシーな
  わけです。


考察:
  pppd
    シェルスクリプト /etc/hotplug/usb/visor で pppd を直接起動する場合は
    以下の二行にする。

    #! /bin/sh
    /usr/sbin/pppd /dev/ttyUSB1 <gateway IP>:<palm IP> local noauth proxyarp ktune

    proxyarp は palm の代わりに gateway PC が応答する(代返する)ための
    オプションで、ktune はカーネルの設定をいじっていいですよ、と明示
    するための設定。

    pppd が自動的に IP ルーティングを設定してくれて、サーバーは proxy 
    ARP の機能により、経路制御情報の設定を手でしなくても gateway PC に
    パケットを送りつけるようになる。

    (注) ktune, proxyarp のオプションは man を見て適当にやってみたら
    動いたのであって、特に ktune はなくても動くのかもしれない。
    試してみればいいだけの話だが、もう面倒で...


  PPP
    PPP でサーバーにつなぐ場合、palm に IP アドレスが割り当て
    られるため、サーバからパームデバイスに IP パケットが届くように
    ネットワークを構成しなくてはならない。

    つまり、サーバーは「 palm の IP アドレス宛のパケットは gateway PC 
    に送りつける」という経路制御を設定しておく必要がある。

    で、普通は gateway PC がつながるサブネットと gateway PC と Palm と
    の PPP ネットワークが異なるサブネットとしてしまいたいところだが、
    サーバの経路制御情報を明に設定するのは面倒だ。

    で、palm と gateway PC が同じサブネットにいるように見せかけるような
     機能が pppd にある (proxy arp と IP routing) ので、それを使うのが
    楽チンなようだ。

    ただし、pppd では palm に割り当てる IP アドレスを明に指定するため、
    固定アドレスを一つキープしておく必要がある。

    外で DHCP などで割当をもらう場合に困るだろうなぁ...

    この場合、正しくはやはり geteway PC と palm を新たなサブネットと
    して設定して、geteway PC で NAT(IP masquarade) 機能を使ってサーバー
    につなぐ、のが正解なんだろうなぁ...


  palm の hotsync の種類
    palm の hotsync の種類は4通り

    Local/Local   ... gateway PC の HotSync Manager に hotsync
    Local/LANSync ... gateway PC の HotSync Manager 経由で network 上の
                      サーバーに hotsync
    Modem/Local   ... gateway PC の PPP 経由で gateway 上の HotSync Manager
                      に hotsync (ウソかも)
    Modem/Network ... geteway PC の PPP 経由で  network 上のサーバーに
		      hotsync

    で、Local, Modem の切替えは HotSync アプリのメイン画面で切替え、
    Local, Modem それぞれでの切替えはメニューの「LANSync の設定」
   「モデム HotSync の設定」で行う。


  coldsync のデーモンモード
    coldsync には daemon mode と称するモードがあるが、中途半端。
    (ver.2.2.5)

    /etc/palms にエントリを登録しておくと、いろいろなユーザーに
    対応できそう。つまり一旦 root権限で設定してしまえば、
    HotSync のたびに root 権限を使う必要がないのがセキュリティ上
    嬉しいと思う。

    しかし、inetd からなぜか動かない。

    rc スクリプトから動かそうとも思うが、セッションが終了すると
    プログラムも終了するため、そのままではよくない。

    結局、無限ループで coldsync -md を繰り返す shell script を用意
    して、rc スクリプトからその shell スクリプトを daemon として起
    動する。


  より頑強なセキュリティにするために
    gateway PC とサーバーの間の接続を ssh 経由にしたいところだが、
    palm にはサーバーの IP アドレスを明に指定する必要があるので、
    gateway PC で IP forwarding と ssh の port forwarding を設定
    する必要がある。うう、面倒...



参考資料:
  network hotsync 関連のポート番号

    netsync-wakeup  14237/udp       # Palm network hotsync wakeup
    netsync         14238/tcp       # Palm network hotsync data

    出展は coldsync のソースの README.daemon.
    今回は inetd を使ってないので /etc/services の更新は必要なし。