
Я экспериментировал с DTrace на Mac OS X и нашел следующий скрипт, который выводит информацию об устанавливаемых соединениях:
$ cat скрипт.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");
}
Я запускаю его в одном окне:
$ 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
Думаю, я разобрался: это скрипт dtrace, который я взял с сайта Solarius, его нужно изменить для BSD.
решение2
Попробуйте сделать traceroute к этому адресу и посмотреть, где он находится. Если он всего в паре переходов, то, вероятно, это брандмауэр или коммутатор.
решение3
Это IP-адрес Vodaphone в Италии. Вы подключены к интернет-провайдеру в Европе/Италии? Если нет, то лучше начать беспокоиться.
решение4
Что говорит grep 'sshd.*from' secure.log
? Если кто-то кроме вас вошел через SSH, то у вас проблема. Если нет, то, скорее всего,неудачная попытка грубой силы. Вы используете DenyHosts или Fail2Ban?
Я не могу найти документацию по syscall::connect, но похоже, что он выводит оба конца сокета. Что происходит, когда вы запускаете скрипт и подключаетесь по ssh с другой машины?