Como verificar se um daemon está escutando em qual interface?

28

Ex .: um sshd está configurado para ouvir apenas em wlan0. Tão. Além de verificar o sshd_config, como posso verificar se um daemon está ouvindo o que inerface? netstat pode fazer isso? quão? (SO: openwrt ou científico linux ou openbsd)

ATUALIZAR:

Eu pensei que o sshd poderia ser limitado a uma interface ... mas não ... (192.168.1.5 está no wlan0 ...)

# grep ^ListenAddress /etc/ssh/sshd_config 
ListenAddress 192.168.1.5:22
# 
# lsof -i -n -P
COMMAND     PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd      23952 root    3u  IPv4 1718551      0t0  TCP 192.168.1.5:22 (LISTEN)
#
# ss -lp | grep -i ssh
0      128              192.168.1.5:ssh                           *:*        users:(("sshd",23952,3))
# 
# netstat -lp | grep -i ssh
tcp        0      0 a.lan:ssh                   *:*                         LISTEN      23952/sshd          
#
gasko peter
fonte

Respostas:

37

(pode ser necessário instalar o pacote ipno openwrt (v12 / ajuste de atitude)

ifconfig / netstat etc. são considerados obsoletos , portanto você deve usar (como root)

ss -nlput | grep sshd

para mostrar os soquetes TCP / UDP nos quais um programa em execução que contém a sequência sshdestá ouvindo

  • -n
    nenhuma porta para resolução de nomes
  • -l
    apenas tomadas de escuta
  • -p
    mostrar processos ouvindo
  • -u
    mostre soquetes do udp
  • -t
    mostre os soquetes do tcp

Então você cria uma lista como esta:

tcp    LISTEN     0      128                    *:22                    *:*      users:(("sshd",3907,4))
tcp    LISTEN     0      128                   :::22                   :::*      users:(("sshd",3907,3))
tcp    LISTEN     0      128            127.0.0.1:6010                  *:*      users:(("sshd",4818,9))
tcp    LISTEN     0      128                  ::1:6010                 :::*      users:(("sshd",4818,8))

o interessante é a quinta coluna, que mostra uma combinação de endereço IP e porta:

  1. *:22
    escute na porta 22 em todos os endereços IPv4 disponíveis
  2. :::22
    ouça na porta 22 em todos os endereços IP disponíveis (não escrevo IPv6, pois o IP é IPv6 de acordo com a RFC 6540 )
  3. 127.0.0.1:6010
    escute no endereço IPv4 127.0.0.1 (localhost / loopback) e na porta 6010
  4. ::1:6010
    escute no endereço IP :: 1 (0: 0: 0: 0: 0: 0: 0: 1 em notação completa, também localhost / loopback) e porta 6010

Você deseja saber quais interfaces têm um endereço IPv4 (para cobrir 1.)

ip -4 a
# or "ip -4 address"
# or "ip -4 address show"

ou um endereço IP (para cobrir 2.)

ip -6 a
# or "ip -6 address
# or "ip -6 address show

(se você não adicionar a opção para IP ( -6) ou IPv4 ( -4), ambos serão mostrados)

Você também pode dar uma olhada na saída e procurar, por exemplo, 127.0.0.1ou qualquer outro endereço IP / IPv4

# here a demo where i show all addresses of the device "lo" (loopback)
ip a show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever

As linhas que começam com inete inet6mostram que esses IPs estão vinculados a essa interface, você pode ter muitas dessas linhas por interface:

he-ipv6: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN
    link/sit 192.0.2.1 peer 192.0.2.3
    inet6 2001:db8:12::1/64 scope global
       valid_lft forever preferred_lft forever
    inet6 2001:db8::2/64 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::1111:1111/128 scope link
       valid_lft forever preferred_lft forever

e em um script:

address="127.0.0.1"
for i in $(grep ':' /proc/net/dev | cut -d ':' -f 1 | tr -d ' ') ; do
        if $(ip address show dev $i | grep -q "${address}") ; then
                echo "${address} found on interface ${i}"
        fi
done

(substitua "127.0.0.1")

Oluf Lorenzen
fonte
você quer dizer que não há uma maneira exata de determinar se um daemon está escutando em qual interface, porque ele pode ser determinado apenas pelo endereço IP?
Gasko peter
sim, correto. você (ou eu) poderia estender o script eu postei que faria as etapas antes de ...
Oluf Lorenzen
11
E quanto a SO_BINDTODEVICE?
Pavel Šimerda
20

Usando lsof(como root):

# lsof -i -n -P
COMMAND    PID        USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      3028        root    3u  IPv4   7072      0t0  TCP *:22 (LISTEN)
sshd      3028        root    4u  IPv6   7074      0t0  TCP *:22 (LISTEN)

iproute2também sspode fazer isso (como root):

# ss -lp
State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port   
LISTEN     0      128                    :::ssh                     :::*        users:(("sshd",3028,4))
LISTEN     0      128                     *:ssh                      *:*        users:(("sshd",3028,3))

... e finalmente netstat(como root):

# netstat -lp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 *:ssh                   *:*                     LISTEN      3028/sshd  
sr_
fonte
3
Especificamente, *:sshou 0.0.0.0:22significa que está ouvindo na interface curinga (ou seja, todas elas). Algo como host-eth1:sshou 10.0.0.4:22dizer que está ouvindo em que a interface específica
Useless
espere um minuto .. Eu pensei que esta é a boa resposta: D, mas não, não há interface nele .. Como eu descobri que um programa está apenas ouvindo em uma determinada interface? ou não há solução para esta pergunta? : O
gasko peter
@gaskopeter Você pode ver a interface no endereço IP que é mostrado ( 192.168.1.5ou a.lanna sua pergunta). Se houver um *nesse local, ele *:sshouvirá em todas as interfaces ( na resposta do sr_).
Philipp Wendler
@ Useless: Isso é verdade apenas em sistemas BSD.
BatchyX
@BatchyX Como assim? Eu posso ver o que o Useless diz sobre pelo menos o Arch Linux e o Debian.
X-yuri
9

Tanto quanto eu sei, você não pode (exceto nos sistemas BSD, onde a solução da Finkregh funciona bem). Pode ser possível, mas você não se importa, porque a maioria dos aplicativos escuta em todas as interfaces, mesmo quando vinculadas a um endereço IP.

No linux (e openwrt), a única maneira de um aplicativo ouvir apenas em uma determinada interface é a SO_BINDTODEVICEopção socket. Poucos aplicativos realmente suportam isso, pois são específicos do sistema operacional. Isso, ou eles usam soquete de pacote, mas isso é para protocolos de baixo nível (como servidores dhcp).

No linux, que usa um modelo de host fraco, todos os aplicativos ouvem todas as interfaces por padrão, mesmo quando vinculam um soquete a um endereço IP. A única exceção é a ligação ao 127.0.0.1, que garante que o aplicativo ouça apenas na lointerface.

Você ouviu direito: se você tiver duas interfaces (digamos eth0e eth1) com dois endereços IP diferentes (digamos 192.0.2.1 para eth0e 198.51.100.1 para eth1) e você disser a um aplicativo que ligue 192.0.2.1, o aplicativo ainda escutará ambas as interfaces, mas responderão apenas se o IP de destino for 192.0.2.1. Portanto, alguém na eth1interface, se sua tabela de roteamento estiver definida adequadamente, poderá acessar seu aplicativo acessando-o através do endereço 192.0.2.1 (mas não através de 198.51.100.1) na eth1interface.

Supondo que a ligação a um endereço IP seja a mesma que a ligação a uma interface de rede é totalmente falsa no Linux. Se isso lhe incomoda, use o roteamento de políticas e / ou iptables.

BatchyX
fonte
-1

Também com netstat, mas os argumentos específicos são:

netstat -lp -i wlan0
frogstarr78
fonte
11
você pode explicar a saída desse comando um pouco mais? : D
gasko peter
Honestamente, eu não sei. Eu precisaria man netstat. A diferença que estou sugerindo está na alteração da "consulta" que você está executando para especificar explicitamente a interface que está interessada em verificar.
precisa saber é o seguinte
"netstat -lp -i wlan0" e "netstat -i" dar a mesma resposta no meu sistema Ubuntu
Bruce Barnett
11
netstat -iirá listar interfaces, não ouvir portas, -1 para resposta, que não reflete a realidade
Mikko Rantalainen