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