¿Cómo verificar que un demonio está escuchando en qué interfaz?


28

Ej .: un sshd está configurado para escuchar solo en wlan0. Asi que. Además de verificar sshd_config, ¿cómo puedo verificar que un demonio esté escuchando en qué interfaz? netstat puede hacerlo? ¿cómo? (SO: openwrt o linux científico o openbsd)

ACTUALIZAR:

Pensé que sshd podría limitarse a una interfaz ... pero no ... (192.168.1.5 está en 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          
#

Respuestas:


37

(puede que tenga que instalar el paquete ipen openwrt (v12 / ajuste de actitud)

ifconfig / netstat, etc. se consideran obsoletos , por lo que debe usar (como root)

ss -nlput | grep sshd

para mostrar los sockets TCP / UDP en los que sshdescucha un programa en ejecución que contiene la cadena

  • -n
    sin puerto a nombre de resolución
  • -l
    solo enchufes de escucha
  • -p
    mostrar procesos de escucha
  • -u
    mostrar tomas de udp
  • -t
    muestre los enchufes del tcp

Luego obtienes una 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))

Lo interesante es la quinta columna que muestra una combinación de dirección IP y puerto:

  1. *:22
    escuche en el puerto 22 en cada dirección IPv4 disponible
  2. :::22
    escuche en el puerto 22 en cada dirección IP disponible (no escribo IPv6, ya que IP es IPv6 según RFC 6540 )
  3. 127.0.0.1:6010
    escuche en la dirección IPv4 127.0.0.1 (localhost / loopback) y el puerto 6010
  4. ::1:6010
    escuche en la dirección IP :: 1 (0: 0: 0: 0: 0: 0: 0: 1 en notación completa, también localhost / loopback) y puerto 6010

Luego desea saber qué interfaces tienen una dirección IPv4 (para cubrir 1.)

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

o una dirección IP (para cubrir 2.)

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

(si no agrega la opción para IP ( -6) o IPv4 ( -4), se muestran ambas)

También puede echar un vistazo a esa salida y buscar, por ejemplo, 127.0.0.1o cualquier otra dirección 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

Las líneas que comienzan con inety inet6muestran que estas IP están vinculadas a esta interfaz, puede tener muchas de estas líneas por interfaz:

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

y en un guión:

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

(reemplazar "127.0.0.1")


¿Quiere decir que no hay una forma exacta de determinar que un demonio está escuchando en qué interfaz, porque solo podría determinarse por la dirección IP?
Gasko Peter

Sí, correcto. usted (o yo) podría extender el guión que publiqué que haría los pasos antes ...
Oluf Lorenzen

1
¿Qué pasa con 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)

iproute2's sspuede hacer esto también (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))

... y 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  

3
Específicamente, *:ssho 0.0.0.0:22significa que está escuchando en la interfaz comodín (es decir, todos ellos). Algo como host-eth1:ssho 10.0.0.4:22significa que está escuchando en esa interfaz específica
inútil el

espere un minuto ... pensé que esta es la buena respuesta: D pero no, no hay una interfaz en ella ... ¿Cómo descubrí que un programa solo está escuchando en una interfaz determinada? o no hay ninguna solución para esta pregunta? : O
Gasko Peter el

@gaskopeter Puede ver la interfaz desde la dirección IP que se muestra ( 192.168.1.5o a.lanen su pregunta). Si hay un *en este lugar, entonces escucha en todas las interfaces ( *:sshen la respuesta de sr_).
Philipp Wendler

@ Inútil: esto solo es cierto en los sistemas BSD.
BatchyX

@BatchyX ¿Cómo es eso? Puedo ver lo que Useless dice al menos en Arch Linux y Debian.
x-yuri

9

Hasta donde sé, no puedes (excepto en los sistemas BSD, donde la solución de Finkregh funciona bien). Puede ser posible, pero no le importa, porque la mayoría de las aplicaciones escuchan en todas las interfaces, incluso cuando están vinculadas a una dirección IP.

En linux (y openwrt), la única forma de que una aplicación escuche solo en una determinada interfaz es la SO_BINDTODEVICEopción de socket. Pocas aplicaciones realmente admiten esto, ya que es específico del sistema operativo. Eso, o usan paquetes de socket, pero eso es para protocolos de bajo nivel (como servidores dhcp).

En Linux, que utiliza un modelo de host débil, cada aplicación escucha en todas las interfaces de forma predeterminada, incluso cuando vincula un socket a una dirección IP. La única excepción es cuando se vincula a 127.0.0.1, lo que garantiza que la aplicación solo escuche en la lointerfaz.

Lo escuchó bien: si tiene dos interfaces (digamos eth0y eth1) con dos direcciones IP diferentes (digamos 192.0.2.1 para eth0y 198.51.100.1 para eth1) y le dice a una aplicación que se una a 192.0.2.1, la aplicación seguirá escuchando ambas interfaces, pero solo responderán si la IP de destino es 192.0.2.1. Entonces, alguien en la eth1interfaz, si su tabla de enrutamiento está adecuadamente definida, puede acceder a su aplicación accediendo a ella a través de la dirección 192.0.2.1 (pero no a través de 198.51.100.1) en la eth1interfaz.

Asumir que vincular a una dirección IP es lo mismo que vincular a una interfaz de red es completamente falso en Linux. Si eso le molesta, use la política de enrutamiento y / o iptables.


-1

También con netstat pero los argumentos específicos son:

netstat -lp -i wlan0

1
¿puede explicar un poco más la salida de este comando? : D
gasko peter

Honestamente, no lo se. Tendría que man netstat. La diferencia que sugiero es cambiar la "consulta" que está ejecutando para especificar explícitamente la interfaz que le interesa verificar.
frogstarr78

"netstat -lp -i wlan0" y "netstat -i" dan la misma respuesta en mi sistema Ubuntu
Bruce Barnett

1
netstat -ienumerará interfaces, no puertos de escucha, -1 para respuestas que no reflejan la realidad
Mikko Rantalainen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.