サーバのカーネルを更新したので、iSCSI Enterprise Targetをリビルドしたら動かなくなった。原因が分かったので、誰かがはまらないようにメモっておこう。
正確には、サーバ側の問題ではなかったけれど、トラブルシュートの流れを書いておこう。
以下の手順でglobalSANを設定すると、TargetAddressにローカルIPアドレスがだだ漏れになっていることに気づいた。もちろん、iSCSIイニシエータもこのアドレスにつなごうとするので、TCP/IPのエラーが出るわけだ。
Portalを追加する。ホスト名のみ。
Portalを追加すると、Targetが見える。
Log On…もしくはconnectedチェックボックスをクリックすると、TargetAddressがローカルIPアドレスになって、接続出来ない。
てっきり、このローカルIPアドレスはMacの設定ファイルやキャッシュじゃないかと思って、しばらくMacのディスク上で色々探すが見つからず。
そもそも自宅とは全く違うセグメントにいるので、Mac側に正引きのキャッシュが残っていたら、まずかんべ、と思い直し、スニッファで見てみる。
あちゃー、ローカル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…ボタンがある。
Targetsではなく、ここでCHAPの設定が出来る。こいつかな?
Portalsに表示される。
Targetsに表示されない。
Targetを手動で追加する。
Targetに接続。これできちんと接続できた。
iSCSI Enterprise Targetの問題というか仕様というか、TargetAddressを設定出来ないのはちょっと問題があるかも。ietd.confで設定出来るのかと思ったけれどダメっぽいし、そもそもコードでgetnameinfo()をコールしちゃってるので、ダメなはずだよね。ん〜。