Pesquisas de PTR DNS reversas que ocorrem em cada conexão

1

Estou rodando um VPS baseado no Debian (Linux vps 2.6.32-042stab092.3 # 1 SMP Sun Jul 20 13:27:24 MSK 2014 x86_64 GNU / Linux) que está se comportando um pouco estranho. Sempre que uma nova conexão é estabelecida, ela realiza uma pesquisa de PTR.

Estou executando alguns testes de desempenho na porta 80, onde um script Python em uma máquina remota busca continuamente uma página no VPS. Para cada solicitação de página, uma nova pesquisa de PTR está sendo feita, o que resulta em milhares de solicitações de DNS ativas.

Eu estava monitorando isso com tcpdump -n port not 22 and host not MY_REMOTE_IP . Então -n é para evitar pesquisas.

Eu também estou monitorando com ntop , onde -n também é usado.

Se eu parar ntop e olhar para tcpdump , obtenho as pesquisas. Se eu parar tcpdump e iniciar ntop , eu também os obtenho. Portanto, pode ser justo supor que nenhum deles está causando a pesquisa.

Há também xinetd em execução no plano de fundo, que aparentemente também usa pesquisas de PTR. Mas se eu parar esse serviço, as pesquisas ainda ocorrerão.

Depois, há /usr/sbin/rsyslogd -c5 , que, ao ser morto, também não muda a situação.

O mesmo vale para rabbitmq-server e erlangs epmd . authbind também não parece ser responsável, e screen também e parar openvpn , que normalmente é executado como servidor, também não faz diferença.

Wuaht na terra poderia estar causando isso?

Aqui está a árvore de processos.

init
'- SCREEN -AmdS py-http authbind python server.py ---scr:py-http
|  '- python server.py ---scr:py-http
'- /sbin/getty 38400 tty2
'- /sbin/getty 38400 console
'- /bin/sh /usr/sbin/rabbitmq-server
|  '- /usr/lib/erlang/erts-5.9.1/bin/beam.smp -W w -K true -A30 -P 1048576 -- -root /usr/lib/erlang -progname erl -- -home /var/lib/rabbitmq -- -pa /us
t start_sasl -config /etc/rabbitmq/rabbitmq -kernel inet_default_connect_o
|     '- inet_gethost 4
|     |  '- inet_gethost 4
'- /usr/lib/erlang/erts-5.9.1/bin/epmd -daemon
'- /usr/sbin/ntop -d -L -u ntop -P /var/lib/ntop --access-log-file /var/log/ntop/access.log -i venet0:0 -p /etc/ntop/protocol.list -O /var/log/ntop
'- /usr/bin/mongod --config /etc/mongod.conf
'- /usr/sbin/cron
'- /usr/sbin/xinetd -pidfile /var/run/xinetd.pid -stayalive -inetd_compat -inetd_ipv6
'- /usr/sbin/sshd
|  '- sshd: user [priv]
|     '- sshd: user@pts/0
|        '- -bash
|           '- htop
'- sendmail: MTA: accepting connections
'- /usr/sbin/openvpn --writepid /var/run/openvpn.server.pid --daemon ovpn-server --cd /etc/openvpn --config /etc/openvpn/server.conf
'- /usr/sbin/saslauthd -a pam -c -m /var/run/saslauthd -n 2
|  '- /usr/sbin/saslauthd -a pam -c -m /var/run/saslauthd -n 2
'- /usr/sbin/rsyslogd -c5
'- upstart-socket-bridge --daemon
'- /sbin/udevd --daemon
|  '- /sbin/udevd --daemon
|  '- /sbin/udevd --daemon
'- upstart-udev-bridge --daemon

Atualizar

Essa pesquisa ocorre em todas as novas conexões, seja na porta 80 ou 22, em qualquer porta, não importa qual delas.

Resultado de Strace para uma solicitação HTTP

sendto(10, "C~
Oct 24 06:06:11 vps kernel: [6547020.638594] DNS Traffic match:IN= OUT=venet0 SRC=VPS_IP_ADDRESS DST=8.8.8.8 LEN=99 TOS=0x00 PREC=0x00 TTL=64 ID=56490 DF PROTO=UDP SPT=50366 DPT=53 LEN=79 UID=0 GID=0
Oct 24 06:06:53 vps kernel: [6547062.417763] DNS Traffic match:IN= OUT=venet0 SRC=VPS_IP_ADDRESS DST=8.8.8.8 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=32702 DF PROTO=UDP SPT=59091 DPT=53 LEN=51 UID=1000 GID=1000
ESTAB      0      0            VPS_IP_ADDRESS:42414         8888:53     users:(("python",2375,10))
init
'- SCREEN -AmdS py-http authbind python server.py ---scr:py-http
|  '- python server.py ---scr:py-http
'- /sbin/getty 38400 tty2
'- /sbin/getty 38400 console
'- /bin/sh /usr/sbin/rabbitmq-server
|  '- /usr/lib/erlang/erts-5.9.1/bin/beam.smp -W w -K true -A30 -P 1048576 -- -root /usr/lib/erlang -progname erl -- -home /var/lib/rabbitmq -- -pa /us
t start_sasl -config /etc/rabbitmq/rabbitmq -kernel inet_default_connect_o
|     '- inet_gethost 4
|     |  '- inet_gethost 4
'- /usr/lib/erlang/erts-5.9.1/bin/epmd -daemon
'- /usr/sbin/ntop -d -L -u ntop -P /var/lib/ntop --access-log-file /var/log/ntop/access.log -i venet0:0 -p /etc/ntop/protocol.list -O /var/log/ntop
'- /usr/bin/mongod --config /etc/mongod.conf
'- /usr/sbin/cron
'- /usr/sbin/xinetd -pidfile /var/run/xinetd.pid -stayalive -inetd_compat -inetd_ipv6
'- /usr/sbin/sshd
|  '- sshd: user [priv]
|     '- sshd: user@pts/0
|        '- -bash
|           '- htop
'- sendmail: MTA: accepting connections
'- /usr/sbin/openvpn --writepid /var/run/openvpn.server.pid --daemon ovpn-server --cd /etc/openvpn --config /etc/openvpn/server.conf
'- /usr/sbin/saslauthd -a pam -c -m /var/run/saslauthd -n 2
|  '- /usr/sbin/saslauthd -a pam -c -m /var/run/saslauthd -n 2
'- /usr/sbin/rsyslogd -c5
'- upstart-socket-bridge --daemon
'- /sbin/udevd --daemon
|  '- /sbin/udevd --daemon
|  '- /sbin/udevd --daemon
'- upstart-udev-bridge --daemon
sendto(10, "C~
Oct 24 06:06:11 vps kernel: [6547020.638594] DNS Traffic match:IN= OUT=venet0 SRC=VPS_IP_ADDRESS DST=8.8.8.8 LEN=99 TOS=0x00 PREC=0x00 TTL=64 ID=56490 DF PROTO=UDP SPT=50366 DPT=53 LEN=79 UID=0 GID=0
Oct 24 06:06:53 vps kernel: [6547062.417763] DNS Traffic match:IN= OUT=venet0 SRC=VPS_IP_ADDRESS DST=8.8.8.8 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=32702 DF PROTO=UDP SPT=59091 DPT=53 LEN=51 UID=1000 GID=1000
ESTAB      0      0            VPS_IP_ADDRESS:42414         8888:53     users:(("python",2375,10))
%pre%%pre%%pre%%pre%%pre%%pre%16%pre%270%pre%3168%pre%3192in-add"..., 43, MSG_NOSIGNAL, NULL, 0) = 43 print statement in server.py -> request #5 from client 192.168.70.6 sendto(10, "2%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%16%pre%270%pre%3168%pre%3192in-add"..., 43, MSG_NOSIGNAL, NULL, 0) = 43 sendto(9, "HTTP/1.1 200 OK\r\nDate: Fri, 24 O"..., 146, 0, NULL, 0) = 146
%pre%%pre%%pre%%pre%16%pre%270%pre%3168%pre%3192in-add"..., 43, MSG_NOSIGNAL, NULL, 0) = 43 print statement in server.py -> request #5 from client 192.168.70.6 sendto(10, "2%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%16%pre%270%pre%3168%pre%3192in-add"..., 43, MSG_NOSIGNAL, NULL, 0) = 43 sendto(9, "HTTP/1.1 200 OK\r\nDate: Fri, 24 O"..., 146, 0, NULL, 0) = 146

Sysdig não pode ser usado, pois não é possível instalá-lo no VPS

O registro em log do

iptables resulta nas seguintes entradas: Para novas conexões ssh:

%pre%

Para novas conexões http:

%pre%

ss resulta em

%pre%     
por Daniel F 23.10.2014 / 22:31

1 resposta

3

Primeiro, observarei que a invocação de ntop na árvore de processos compartilhada não parece ter o sinalizador -n :

/usr/sbin/ntop -d -L -u ntop -P /var/lib/ntop --access-log-file /var/log/ntop/access.log -i venet0:0 -p /etc/ntop/protocol.list -O /var/log/ntop

mas presumo que, dadas as suas declarações sobre as consultas continuando mesmo com ntop morto, que não é o problema. Além disso, para esclarecer, estou assumindo que a máquina que faz as pesquisas é a mesma máquina que manipula as solicitações na porta 80.

Considerando que, a seguir, algumas ideias de depuração:

ss

Se o programa em questão está mantendo o socket por um tempo, você pode usar ss (ou netstat) com o -p flag para encontrar o dono da porta de origem que você deveria estar vendo em seus tcpdumps .

Strace

O primeiro suspeito deve ser o aplicativo que manipula as solicitações. Estou assumindo que o seguinte processo python em execução na tela é o aplicativo que você está testando?

 '- SCREEN -AmdS py-http authbind python server.py ---scr:py-http
|  '- python server.py ---scr:py-http

Você pode considerar a execução desse processo sob strace e verificar se está gerando o tráfego DNS. Por exemplo, algo como:

strace -e trace=sendmsg,sendto -f YOUR_PROGRAM_HERE

e, em seguida, analisando cuidadosamente a saída de mensagens que parecem ter sido enviadas para a porta 53:

[pid  3367] sendmsg(20, {msg_name(16)={sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.1.254")}, msg_iov(1)=[{"2
while true; do ss -p -n -u | tail -n +2; done
sudo sysdig evt.type=sendmsg or evt.type=sendto | grep ':53'
47852 01:15:33.454946732 4 nslookup (3349) > sendmsg fd=20(<4>) size=38 tuple=0.0.0.0:49847->192.168.1.254:53
iptables -N LOGGING
iptables -A OUTPUT -p udp --dport 53 -j LOGGING
iptables -A LOGGING -j LOG --log-prefix="DNS Traffic match:" --log-uid
Oct 24 01:09:53 localhost.localdomain kernel: DNS Traffic match:IN= OUT=enp0s3 SRC=10.0.2.15 DST=192.168.1.254 LEN=66 TOS=0x00 PREC=0x00 TTL=64 ID=35264 PROTO=UDP SPT=51767 DPT=53 LEN=46 UID=1000 GID=1000
/usr/sbin/ntop -d -L -u ntop -P /var/lib/ntop --access-log-file /var/log/ntop/access.log -i venet0:0 -p /etc/ntop/protocol.list -O /var/log/ntop
 '- SCREEN -AmdS py-http authbind python server.py ---scr:py-http
|  '- python server.py ---scr:py-http
strace -e trace=sendmsg,sendto -f YOUR_PROGRAM_HERE
[pid  3367] sendmsg(20, {msg_name(16)={sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.1.254")}, msg_iov(1)=[{"2
while true; do ss -p -n -u | tail -n +2; done
sudo sysdig evt.type=sendmsg or evt.type=sendto | grep ':53'
47852 01:15:33.454946732 4 nslookup (3349) > sendmsg fd=20(<4>) size=38 tuple=0.0.0.0:49847->192.168.1.254:53
iptables -N LOGGING
iptables -A OUTPUT -p udp --dport 53 -j LOGGING
iptables -A LOGGING -j LOG --log-prefix="DNS Traffic match:" --log-uid
Oct 24 01:09:53 localhost.localdomain kernel: DNS Traffic match:IN= OUT=enp0s3 SRC=10.0.2.15 DST=192.168.1.254 LEN=66 TOS=0x00 PREC=0x00 TTL=64 ID=35264 PROTO=UDP SPT=51767 DPT=53 LEN=46 UID=1000 GID=1000
%pre%%pre%%pre%%pre%14%pre%14%pre%18%pre%18in-addrarp"..., 38}], msg_controllen=0, msg_flags=0}, 0) = 38
14%pre%14%pre%18%pre%18in-addrarp"..., 38}], msg_controllen=0, msg_flags=0}, 0) = 38

ss em um loop

Se o programa em questão estiver fechando rapidamente seu soquete, pode ser difícil obter informações sobre ele a partir do ss ou do netstat.

No entanto, uma possibilidade é escrever um script que pesquisa o comando ss repetidamente. Você estaria apostando em ter a sorte de pegar uma das pesquisas:

%pre%

Você pode adicionar um filtro ao comando ss para reduzi-lo se vir muitos outros tráfego UDP nessa máquina. Se isso funciona ou não depende de você ter sorte.

Sysdig

Você pode usar o utilitário sysdig relativamente novo para ver todas as chamadas sendmsg ou sendto:

%pre%

E a saída terá o nome do processo (neste caso, nslookup):

%pre%

iptables

iptables permite que você registre o userid do processo que gerou o pacote. Se a maioria de seus serviços estiver sendo executada como o mesmo usuário, isso não será muito útil, mas poderá ser feito se você tiver usuários específicos do serviço. Um conjunto de regras de iptable da seguinte forma:

%pre%

registraria todo o tráfego de dns de saída com o UID associado. Dependendo da sua configuração de registro, você pode encontrá-lo via kmesg ou nas mensagens do seu syslog e a saída será algo como:

%pre%

A partir dessa saída, posso ver que o processo em questão tinha um UID de 1000, que pelo menos restringe minha pesquisa.

    
por 24.10.2014 / 02:24