あるサーバ A でxdmが起動している。別のマシンでXサーバを上げて -query A で繋ぐと、うまく開いてくれないときがある。複数のネットワーク インタフェースがある場合、Xサーバが適当なIPアドレス(さいしょに見付かるイ ンタフェースのIPアドレスかな?)を埋め込んでxdmホストに送ってしまうので、 たいてい実際のディスプレイを開こうとするときにXクライアントが迷子になる。
+--- host C ---+ +--- host A ---+ 192.168.0.1 [ge0] [ge3] 172.16.1.1 | | | | | | xdm | 192.168.1.1 [ge1] | [LAN] | | | | +--172.16.2.2[fxp0] | 172.16.0.1 [ge2] | +--------------+ | | +--------------+
host C のLANに繋がっているのは ge3 の 172.16.1.1 で、 default route もそのLANのルータに向かっている。
でおもむろに、Cのほうからたとえば、
Xnest -query 172.16.2.2
しても、xdmのgreeterが出てこない。Aのほうで、xdm -debug 255 とかして 待機させれば分かるが、
: DisplayManager.192_168_0_1_201.chooser/DisplayManager.MIT-unspecified.Chooser value /usr/X11R6/lib/X11/xdm/chooser Before XOpenDisplay(192.168.0.1:201)
こんなかんじで、C側のXサーバはディスプレイ名として192.168.0.1:201 なんてのをつけちゃってるので、host A からXクライアントを送り込めなく なる。上記の例では別サブネットでの例を示しているが同一サブネットでも 同じこと。また、たいていの場合xdmcpを走らすのに安全なよう AとCの間でVPNを張ったりするだろうが、それでもやはりこの問題は発生する。
色々な解決策が考えられるが、host A から192.168.0.1がルーティング できればいいので、IP4-in-IP4トンネルが簡単かな。 Solaris(host C)とNetBSD(host A)としてやってみる。
host C側:
ifconfig ip.tun0 plumb ifconfig ip.tun0 10.2.2.1 10.2.2.2 tsrc 172.16.1.1 tdst 172.16.2.2 up
host A側:
ifconfig gif0 create ifconfig gif0 10.2.2.2 netmask 0xffffffff tunnel 172.16.2.2 172.16.1.1 up route add 192.168.0.1 -ifp gif0 localhost
はいおめでとう。
もしかしたら新しいXサーバでは -from オプションがあって、ソースアドレスを 指定できるかもしれないが(未確認)、実はコレXvncなんかを使いたいので そうはうまく行かなかったのだ。