
Mac OS X で DTrace をいじっていたところ、確立されている接続に関する情報を出力する次のスクリプトを見つけました。
$ 猫スクリプト.d
syscall::connect:entry
{
printf("execname: %s\n", execname);
printf("pid: %d\n", pid);
printf("sockfd: %d\n",arg0);
socks = (struct sockaddr*)copyin(arg1, arg2);
hport = (uint_t)socks->sa_data[0];
lport = (uint_t)socks->sa_data[1];
hport <<= 8;
port = hport + lport;
printf("Port number: %d\n", port); printf("IP address: %d.%d.%d.%d\n",
socks->sa_data[2],
socks->sa_data[3],
socks->sa_data[4],
socks->sa_data[5]);
printf("======\n");
}
1つのウィンドウで実行します:
$ sudo dtrace -s ./script.d
次に、別のウィンドウから別のマシンに ssh します。dtrace ウィンドウから次の出力が表示されます。
CPU ID FUNCTION:NAME
0 18696 connect:entry execname: ssh
pid: 5446
sockfd: 3
Port number: 22
IP address: 192.168.0.207
======
0 18696 connect:entry execname: ssh
pid: 5446
sockfd: 5
Port number: 12148
IP address: 109.112.47.108
======
^C
私が説明できる最初のIPアドレス(192.168.0.207)は、私が接続しているマシンです。しかし、109.112.47.108マシンはどうなっているのでしょうか?tcpdumpにもnetstat -anにも表示されません。
私の dtrace コードまたは connect システム コールの動作に関する私の理解に何か問題があるのでしょうか?
答え1
原因が分かったと思います。これは、Solarius サイトから取得した dtrace スクリプトであり、BSD 用に変更する必要があります。
答え2
そのアドレスへのトレースルートを実行して、その場所を確認してください。数ホップしか離れていない場合は、おそらくファイアウォールまたはスイッチです。
答え3
これはイタリアの Vodaphone IP アドレスです。ヨーロッパ/イタリアの ISP に接続していますか? そうでない場合は、心配したほうがよいでしょう。
答え4
何とgrep 'sshd.*from' secure.log
言っているのでしょうか?あなた以外の誰かがSSH経由でログインしている場合は問題があります。ログインしていない場合は、失敗した力ずくの試みDenyHosts または Fail2Ban を実行していますか?
syscall::connect に関するドキュメントが見つかりませんが、ソケットの両端を出力しているようです。スクリプトを実行して別のマシンから SSH で接続するとどうなるでしょうか?