Qual sistema operacional é o próprio servidor de banco de dados em execução? Se é Linux, você pode adicionar uma regra de registro à configuração do firewall local com impacto mínimo no servidor. Algo ao longo das linhas de:
iptables -A INPUT -m state --state NEW -p tcp --dport <yourdbport> -j LOG --log-prefix "[database] "
Você pode adicionar -m limit --limit 4/s
para limitar essa regra ao registro apenas 4 vezes / segundo (etc.), o que, se a taxa de conexão for alta, evitará que ele oculte todos os pedidos de veiculação. Isto irá registrar as linhas no syslog que se parecem com:
[database] IN=eth0 OUT= MAC=00:16:3c:21:7c:f1:00:d0:00:6f:8c:00:08:00 SRC=a.b.c.d
DST=w.x.y.z LEN=48 TOS=0x00 PREC=0x00 TTL=114 ID=16448 DF PROTO=TCP SPT=59871
DPT=5900 WINDOW=8192 RES=0x00 SYN URGP=0
A informação que você deseja é o campo SRC=
.
Se você configurar um sistema Linux (ou FreeBSD) separado para receber tráfego de uma porta espelho, poderá usar tcpdump
para gravar os endereços IP. Algo como:
tcpdump -w record_of_connections -i eth0 \
dst port <yourdbport> and 'tcp[tcpflags] & tcp-syn != 0'
Isso corresponderá a todos os pacotes para portar yourdbport que tenham o sinalizador SYN definido (por exemplo, eles são uma nova tentativa de conexão). Depois de executar isso para um arquivo, você pode extrair endereços IP assim:
tcpdump -r record_of_connections -n
Que produzirá linhas como esta:
15:07:40.808035 IP 10.243.16.190.53967 > 10.243.18.22.http: Flags [S],
seq 1235802021, win 5840, options [mss 1380,sackOK,TS val 3739192250
ecr 0,nop,wscale 7], length 0
Onde os campos são:
<time> <protocol> <src_addr>.<src_port> > <dest_addr>.<dest_port>: ...
O que significa que você pode obter apenas o endereço IP de origem assim:
tcpdump -r record_of_connections -n |
awk '{print $3}' |
sed 's/\.[^.]*$//' |
sort -u
O sort -u
fornece uma lista exclusiva de endereços.