iSCSI Enterprise Target + globalSAN

サーバのカーネルを更新したので、iSCSI Enterprise Targetをリビルドしたら動かなくなった。原因が分かったので、誰かがはまらないようにメモっておこう。

正確には、サーバ側の問題ではなかったけれど、トラブルシュートの流れを書いておこう。

以下の手順でglobalSANを設定すると、TargetAddressにローカルIPアドレスがだだ漏れになっていることに気づいた。もちろん、iSCSIイニシエータもこのアドレスにつなごうとするので、TCP/IPのエラーが出るわけだ。
Portalを追加する。ホスト名のみ。
20080324_globalSAN001.png

Portalを追加すると、Targetが見える。
20080324_globalSAN002.png

Log On...もしくはconnectedチェックボックスをクリックすると、TargetAddressがローカルIPアドレスになって、接続出来ない。
20080324_globalSAN003.png

てっきり、このローカルIPアドレスはMacの設定ファイルやキャッシュじゃないかと思って、しばらくMacのディスク上で色々探すが見つからず。
そもそも自宅とは全く違うセグメントにいるので、Mac側に正引きのキャッシュが残っていたら、まずかんべ、と思い直し、スニッファで見てみる。
20080324_Traffic.png

あちゃー、ローカルIPアドレスが漏れとる...。何で?

ちょっとだけコードを覗いてみる。iscsitarget-0.4.12/usr/target.cで"TargetAddress"を設定している。引数はaddr。

19 void target_list_build(struct connection *conn, char *addr, char *name)
20 {
21         struct target *target;
22 
23         list_for_each_entry(target, & targets_list, tlist) {
24                 if (name && amp; strcmp(target->name, name))
25                         continue;
26                 if (cops->initiator_access(target->tid, conn->fd) < 0)
27                         continue;
28 
29                 text_key_add(conn, "TargetName", target->name);
30                 text_key_add(conn, "TargetAddress", addr);
31         }
32 }

target_list_build()をコールしているのは、iscsitarget-0.4.12/usr/iscsid.cのtext_scan_text()の624行。615行でgetnameinfo()をコールしている。なるほど、netstat -an | grep 3260と同じ結果が入っちゃうわけだ...。

615                         getnameinfo((struct sockaddr *) &ss, slen, p, blen,
616                                     NULL, 0, NI_NUMERICHOST);
617 
618                         p = buf + strlen(buf);
619 
620                         if (ss.ss_family == AF_INET6)
621                                  *p++ = ']';
622 
623                         sprintf(p, ":%d,1", server_port);
624                         target_list_build(conn, buf,
625                                           strcmp(value, "All") ? value : NULL);

確かに、iscsi targetからすればフォワードされている元のグローバルIPアドレスなんて知るよしも無いわけで。
そうなると、疑問が。今までどうやって接続できてたんだろう?と。getnameinfo()が変わったわけでも、サーバのネットワーク設定を変更したわけでも無い。となるとイニシエータ側だな。

Add PortalダイアログにはAdvanced...ボタンがある。
20080324_globalSAN004.png

Targetsではなく、ここでCHAPの設定が出来る。こいつかな?
20080324_globalSAN005.png

Portalsに表示される。
20080324_globalSAN006.png

Targetsに表示されない。
20080324_globalSAN007.png

Targetを手動で追加する。
20080324_globalSAN008.png

Targetに接続。これできちんと接続できた。
20080324_globalSAN009.png

iSCSI Enterprise Targetの問題というか仕様というか、TargetAddressを設定出来ないのはちょっと問題があるかも。ietd.confで設定出来るのかと思ったけれどダメっぽいし、そもそもコードでgetnameinfo()をコールしちゃってるので、ダメなはずだよね。ん〜。