Come verificare che un demone sia in ascolto su quale interfaccia?


28

Es .: un sshd è configurato per l'ascolto solo su wlan0. Così. Oltre a controllare sshd_config come posso verificare se un demone sta ascoltando su inerface? netstat può farlo? Come? (Sistema operativo: openwrt o linux scientifico o openbsd)

AGGIORNARE:

Pensavo che sshd potesse essere limitato a un'interfaccia ... ma no ... (192.168.1.5 è su 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          
#

Risposte:


37

(potrebbe essere necessario installare il pacchetto ipsu openwrt (regolazione v12 / attitude)

ifconfig / netstat ecc. sono considerati obsoleti , quindi dovresti usare (come root)

ss -nlput | grep sshd

per mostrare i socket TCP / UDP su cui sshdè in ascolto un programma in esecuzione che contiene la stringa

  • -n
    nessuna porta per la risoluzione dei nomi
  • -l
    solo prese d'ascolto
  • -p
    mostra l'ascolto dei processi
  • -u
    mostra prese udp
  • -t
    mostra socket tcp

Quindi geht un elenco come questo:

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))

la cosa interessante è la quinta colonna che mostra una combinazione di indirizzo IP e porta:

  1. *:22
    ascolta sulla porta 22 su ogni indirizzo IPv4 disponibile
  2. :::22
    ascolto sulla porta 22 su ogni indirizzo IP disponibile (non scrivo IPv6, poiché IP è IPv6 per RFC 6540 )
  3. 127.0.0.1:6010
    ascoltare l'indirizzo IPv4 127.0.0.1 (localhost / loopback) e la porta 6010
  4. ::1:6010
    ascolta su indirizzo IP :: 1 (0: 0: 0: 0: 0: 0: 0: 1 in notazione completa, anche localhost / loopback) e porta 6010

Volete quindi sapere quali interfacce hanno un indirizzo IPv4 (per coprire 1.)

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

o un indirizzo IP (per coprire 2.)

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

(se non si aggiunge l'opzione per IP ( -6) o IPv4 ( -4) vengono visualizzati entrambi)

Puoi anche dare un'occhiata all'output e cercare, ad esempio, 127.0.0.1o qualsiasi altro indirizzo 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

Le linee che iniziano con inete inet6mostrano che questi IP sono associati a questa interfaccia, potresti avere molte di queste linee per interfaccia:

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 in una sceneggiatura:

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

(sostituire "127.0.0.1")


vuoi dire che non esiste un modo esatto per determinare se un demone è in ascolto su quale interfaccia, perché potrebbe essere determinato solo dall'indirizzo IP?
Gasko Peter,

sì, corretto. tu (o i) potresti estendere la sceneggiatura che ho pubblicato che avrebbe fatto i passi prima ...
Oluf Lorenzen,

1
Che dire di SO_BINDTODEVICE?
Pavel Šimerda,

20

Utilizzando lsof(come 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 sspuò fare anche questo (come 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 infine, netstat(come 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
In particolare, *:ssho 0.0.0.0:22significa che è in ascolto sull'interfaccia jolly (cioè, tutti loro). Qualcosa di simile host-eth1:ssho 10.0.0.4:22medio sta ascoltando su quella specifica interfaccia
Inutile

aspetta un minuto .. Ho pensato che questa fosse la buona risposta: D ma no, non c'è un'interfaccia in esso. Come ho scoperto che un programma sta ascoltando solo su una data interfaccia? o non c'è alcuna soluzione per questa domanda? : O
gasko peter,

@gaskopeter Puoi vedere l'interfaccia dall'indirizzo IP che viene mostrato ( 192.168.1.5o a.lannella tua domanda). Se c'è un *in questo posto, allora è in ascolto su tutte le interfacce ( *:sshnella risposta di sr_).
Philipp Wendler,

@Useless: questo è vero solo sui sistemi BSD.
BatchyX,

@BatchyX In che modo? Posso vedere cosa dice Inutile almeno su Arch Linux e Debian.
x-yuri,

9

Per quanto ne so, non puoi (tranne che sui sistemi BSD, dove la soluzione di Finkregh funziona bene). Potrebbe essere possibile ma non ti interessa, poiché la maggior parte delle applicazioni è in ascolto su ogni interfaccia, anche se associata a un indirizzo IP.

Su Linux (e Openwrt), l'unico modo per un'applicazione di ascoltare solo su una determinata interfaccia è l' SO_BINDTODEVICEopzione socket. Poche applicazioni lo supportano, poiché è specifico del sistema operativo. Quello, o usano socket di pacchetti, ma è per protocolli di basso livello (come i server dhcp).

Su Linux, che utilizza un modello host debole, ogni applicazione è in ascolto su tutte le interfacce per impostazione predefinita, anche quando si collega un socket a un indirizzo IP. L'unica eccezione è quando si associa a 127.0.0.1, che garantisce che l'applicazione sia in ascolto solo losull'interfaccia.

Hai sentito bene: se hai due interfacce (dire eth0e eth1) con due diversi indirizzi IP, (dire 192.0.2.1 per eth0e 198.51.100.1 per eth1) e dici a un'applicazione di legare su 192.0.2.1, l'applicazione continuerà ad ascoltare entrambe le interfacce, ma risponderanno solo se l'IP di destinazione è 192.0.2.1. Quindi qualcuno eth1sull'interfaccia, se la sua tabella di routing è definita in modo appropriato, può accedere all'applicazione accedendo tramite l'indirizzo 192.0.2.1 (ma non tramite 198.51.100.1) eth1sull'interfaccia.

Supponendo che l'associazione a un indirizzo IP sia uguale all'associazione a un'interfaccia di rete è assolutamente falso su Linux. Se questo ti dà fastidio, usa il routing delle politiche e / o iptables.


-1

Anche con netstat ma gli argomenti specifici sono:

netstat -lp -i wlan0

1
puoi per favore spiegare un po 'più a lungo l'output di questo comando? : D
Gasko Peter

Onestamente, non lo so. Dovrei man netstat. La differenza che sto suggerendo è nel cambiare la "query" che stai eseguendo per specificare esplicitamente l'interfaccia che ti interessa verificare.
frogstarr78,

"netstat -lp -i wlan0" e "netstat -i" danno la stessa risposta sul mio sistema Ubuntu
Bruce Barnett

1
netstat -ielencherà le interfacce, non le porte di ascolto, -1 per una risposta che non riflette la realtà
Mikko Rantalainen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.