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

26

Ex .: um sshd é configurado para escutar somente em wlan0. Assim. Além de verificar o sshd_config como posso verificar se um daemon está escutando em que inerface? netstat pode fazer isso? como? (OS: openwrt ou scientific linux ou openbsd)

ATUALIZAÇÃO:

Eu pensei que o sshd poderia ser limitado a uma interface ... mas não ... (192.168.1.5 está em 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          
#
    
por gasko peter 06.11.2012 / 09:32

4 respostas

35

(você pode ter que instalar o pacote ip no openwrt (v12 / ajuste de atitude)

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

ss -nlput | grep sshd

para mostrar os soquetes TCP / UDP nos quais um programa em execução contendo a string sshd está escutando

  • -n
    nenhuma porta para a resolução de nomes
  • -l - apenas soquetes de escuta
  • -p
    mostra processos ouvindo
  • -u
    mostra soquetes udp
  • -t
    mostra tcp sotckets

Então você precisa de 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
    ouça 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 por RFC 6540 )
  3. 127.0.0.1:6010
    ouça no endereço IPv4 127.0.0.1 (localhost / loopback) e na porta 6010
  4. ::1:6010
    ouça 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ê quer 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 exibidos)

Você também pode dar uma olhada na saída e pesquisar por exemplo 127.0.0.1 ou 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 inet e inet6 mostram que esses IPs estão ligados 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")

    
por 21.01.2013 / 09:03
19

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)

iproute2 ss pode fazer isso também (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  
    
por 06.11.2012 / 09:43
9

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

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

No linux, que usa um modelo de host fraco, todo aplicativo escuta em todas as interfaces por padrão, mesmo quando liga um soquete a um endereço IP. A única exceção é ao ligar a 127.0.0.1, o que garante que o aplicativo só escute na interface lo .

Você ouviu direito: se você tiver duas interfaces (digamos eth0 e eth1 ) com dois endereços IP diferentes (diga 192.0.2.1 para eth0 e 198.51.100.1 para eth1 ) e informe um aplicativo para ligar no 192.0.2.1, o aplicativo continuará escutando em ambas as interfaces, mas só responderá se o IP de destino for 192.0.2.1. Portanto, alguém na interface eth1 , se sua tabela de roteamento estiver adequadamente definida, pode acessar seu aplicativo acessando-o através do endereço 192.0.2.1 (mas não via 198.51.100.1) na interface eth1 .

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

    
por 21.01.2013 / 09:42
0

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

netstat -lp -i wlan0
    
por 16.01.2013 / 19:14