Comment vérifier qu'un démon écoute sur quelle interface?

28

Ex.: Un sshd est configuré pour écouter uniquement sur wlan0. Alors. Outre la vérification de sshd_config, comment puis-je vérifier qu'un démon écoute sur quelle interface? netstat peut le faire? Comment? (OS: openwrt ou Linux scientifique ou openbsd)

MISE À JOUR:

Je pensais que sshd pouvait être limité à une interface ... mais non ... (192.168.1.5 est sur 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
la source

Réponses:

37

(vous devrez peut-être installer le package ipsur openwrt (v12 / ajustement d'attitude)

ifconfig / netstat etc. sont considérés comme obsolètes , vous devez donc utiliser (en tant que root)

ss -nlput | grep sshd

pour afficher les sockets TCP / UDP sur lesquels un programme en cours d'exécution qui contient la chaîne sshdécoute

  • -n
    pas de port pour nommer la résolution
  • -l
    prises d'écoute uniquement
  • -p
    montrer l'écoute des processus
  • -u
    afficher les sockets udp
  • -t
    afficher les sockets tcp

Ensuite, vous avez créé une liste comme celle-ci:

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 chose intéressante est la 5ème colonne qui montre une combinaison d'adresse IP et de port:

  1. *:22
    écouter sur le port 22 sur chaque adresse IPv4 disponible
  2. :::22
    écouter sur le port 22 sur chaque adresse IP disponible (je n'écris pas IPv6, car IP est IPv6 selon RFC 6540 )
  3. 127.0.0.1:6010
    écouter sur l'adresse IPv4 127.0.0.1 (localhost / loopback) et le port 6010
  4. ::1:6010
    écouter sur l'adresse IP :: 1 (0: 0: 0: 0: 0: 0: 0: 1 en notation complète, également localhost / loopback) et le port 6010

Vous voulez ensuite savoir quelles interfaces ont une adresse IPv4 (pour couvrir 1.)

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

ou une adresse IP (pour couvrir 2.)

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

(si vous n'ajoutez pas l'option pour IP ( -6) ou IPv4 ( -4), les deux sont affichés)

Vous pouvez également avoir un look qui affiche et recherche par exemple 127.0.0.1ou toute autre adresse 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

Les lignes commençant par inetet inet6montrant que ces IP sont liées à cette interface, vous pouvez avoir plusieurs de ces lignes par 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

et dans un 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

(remplacer "127.0.0.1")

Oluf Lorenzen
la source
vous voulez dire qu'il n'y a aucun moyen exact de déterminer qu'un démon écoute sur quelle interface, car il ne peut être déterminé que par l'adresse IP?
gasko peter
oui, correct. vous (ou moi) pourriez étendre le script que j'ai posté pour qu'il fasse les étapes avant ...
Oluf Lorenzen
1
Qu'en est-il de SO_BINDTODEVICE?
Pavel Šimerda
20

Utilisation lsof(en tant que 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 sspeuvent faire cela aussi ( en tant que 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))

... et enfin, netstat(en tant que 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_
la source
3
Plus précisément, *:sshou 0.0.0.0:22signifie qu'il écoute sur l'interface générique (c'est-à-dire tous). Quelque chose comme host-eth1:sshou 10.0.0.4:22signifie qu'il écoute sur cette interface spécifique
Inutile
attendez une minute .. Je pensais que c'était la bonne réponse: D mais non, il n'y a pas d'interface .. Comment puis-je savoir qu'un programme n'écoute que sur une interface donnée? ou il n'y a pas de solution à cette question? : O
gasko peter
@gaskopeter Vous pouvez voir l'interface à partir de l'adresse IP qui s'affiche ( 192.168.1.5ou a.landans votre question). S'il y en a un *à cet endroit, alors il écoute sur toutes les interfaces ( *:sshdans la réponse de sr_).
Philipp Wendler
@Useless: Cela n'est vrai que sur les systèmes BSD.
BatchyX
@BatchyX Comment cela? Je peux voir ce que dit Useless sur au moins Arch Linux et Debian.
x-yuri
9

Pour autant que je sache, vous ne pouvez pas (sauf sur les systèmes BSD, où la solution de Finkregh fonctionne bien). Cela peut être possible, mais peu vous importe, car la plupart des applications écoutent sur chaque interface, même lorsqu'elles sont liées à une adresse IP.

Sous linux (et openwrt), la seule façon pour une application d'écouter uniquement sur une certaine interface est l' SO_BINDTODEVICEoption socket. Peu d'applications le prennent en charge, car il est spécifique au système d'exploitation. Cela, ou ils utilisent un socket de paquet, mais c'est pour les protocoles de bas niveau (comme les serveurs DHCP).

Sous Linux, qui utilise un modèle d'hôte faible, chaque application écoute par défaut sur toutes les interfaces, même lors de la liaison d'un socket à une adresse IP. La seule exception est lors de la liaison à 127.0.0.1, ce qui garantit que l'application écoute uniquement sur l' lointerface.

Vous l'avez bien entendu: si vous avez deux interfaces (disons eth0et eth1) avec deux adresses IP différentes, (disons 192.0.2.1 pour eth0et 198.51.100.1 pour eth1) et que vous dites à une application de se lier sur 192.0.2.1, l'application continuera à écouter les deux interfaces, mais ne répondra que si l'adresse IP de destination est 192.0.2.1. Ainsi, quelqu'un sur l' eth1interface, si sa table de routage est correctement définie, peut accéder à votre application en y accédant via l'adresse 192.0.2.1 (mais pas via 198.51.100.1) sur l' eth1interface.

Supposer que la liaison à une adresse IP est identique à la liaison à une interface réseau est totalement faux sous Linux. Si cela vous dérange, utilisez le routage de stratégie et / ou iptables.

BatchyX
la source
-1

Aussi avec netstat mais les arguments spécifiques sont:

netstat -lp -i wlan0
frogstarr78
la source
1
pouvez-vous expliquer la sortie de cette commande un peu plus longtemps? : D
gasko peter
Honnêtement, je ne sais pas. Je devrais le faire man netstat. La différence que je suggère est de changer la "requête" que vous exécutez pour spécifier explicitement l'interface que vous souhaitez vérifier.
frogstarr78
"netstat -lp -i wlan0" et "netstat -i" donnent la même réponse sur mon système Ubuntu
Bruce Barnett
1
netstat -ilistera les interfaces, pas les ports d'écoute, -1 pour une réponse qui ne reflète pas la réalité
Mikko Rantalainen