Wie überprüfe ich, ob ein Daemon auf welcher Schnittstelle empfangsbereit ist?

27

Bsp .: Ein sshd ist so konfiguriert, dass er nur auf wlan0 lauscht. So. Wie kann ich neben der Überprüfung von sshd_config überprüfen, ob ein Dämon auf welcher Schnittstelle lauscht? kann netstat das? Wie? (OS: openwrt oder wissenschaftliches Linux oder openbsd)

AKTUALISIEREN:

Ich dachte, sshd könnte auf eine Schnittstelle beschränkt sein ... aber nein ... (192.168.1.5 ist auf 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
quelle

Antworten:

37

(Möglicherweise müssen Sie das Paket ipauf openwrt installieren (v12 / Einstellungskorrektur)

ifconfig / netstat usw. gelten als veraltet , daher sollten Sie (als root)

ss -nlput | grep sshd

die TCP / UDP - Sockets , auf dem ein laufendes Programm zu zeigen , die die Zeichenfolge enthält sshdhört

  • -n
    Kein Port zur Namensauflösung
  • -l
    nur hörbuchsen
  • -p
    Show Prozesse hören
  • -u
    udp sockets anzeigen
  • -t
    TCP-Sockets anzeigen

Dann geht dir eine Liste wie diese:

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

Das Interessante ist die 5. Spalte, die eine Kombination aus IP-Adresse und Port anzeigt:

  1. *:22
    lauschen Sie an Port 22 auf jede verfügbare IPv4-Adresse
  2. :::22
    lauschen Sie auf Port 22 auf jede verfügbare IP-Adresse (ich schreibe kein IPv6, da IPv6 gemäß RFC 6540 ist )
  3. 127.0.0.1:6010
    Lauschen Sie der IPv4-Adresse 127.0.0.1 (localhost / loopback) und dem Port 6010
  4. ::1:6010
    empfange die IP-Adresse :: 1 (0: 0: 0: 0: 0: 0: 0: 1 in voller Notation, auch localhost / loopback) und Port 6010

Sie möchten dann wissen, welche Schnittstellen eine IPv4-Adresse haben (siehe 1.).

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

oder eine IP-Adresse (für 2.)

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

(Wenn Sie die Option für IP ( -6) oder IPv4 ( -4) nicht hinzufügen, werden beide angezeigt)

Sie können auch nach einer 127.0.0.1anderen IP / IPv4-Adresse suchen

# 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

Die Zeilen, die mit inetund beginnen, inet6zeigen, dass diese IPs an diese Schnittstelle gebunden sind. Pro Schnittstelle sind möglicherweise viele der folgenden Zeilen vorhanden:

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

und in einem Skript:

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

(ersetzen Sie "127.0.0.1")

Oluf Lorenzen
quelle
Sie meinen, dass es keine genaue Möglichkeit gibt, festzustellen, ob ein Dämon auf welcher Schnittstelle empfangsbereit ist, da dies nur anhand der IP-Adresse festgestellt werden kann?
Gasko Peter
Ja, richtig. Sie (oder ich) könnten das Skript, das ich gepostet habe, so erweitern, dass es die Schritte zuvor
ausführen
1
Was ist mit SO_BINDTODEVICE?
Pavel Šimerda
19

Verwenden lsof(als 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)

iproute2Das sskönnen wir auch (als 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))

... und zum Schluss netstat(als 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_
quelle
3
Insbesondere *:sshoder 0.0.0.0:22bedeutet, dass die Platzhalter-Schnittstelle abgehört wird (dh alle von ihnen). So etwas wie host-eth1:sshoder so etwas 10.0.0.4:22bedeutet, dass es auf dieser spezifischen Schnittstelle lauscht
Nutzlos
warte mal .. ich dachte das ist die gute antwort: D aber nein, da ist keine schnittstelle drin .. wie finde ich heraus, dass ein programm nur auf einer gegebenen schnittstelle lauscht? oder gibt es keine lösung für diese frage? : O
gasko peter
@gaskopeter Sie können die Benutzeroberfläche anhand der angezeigten IP-Adresse ( 192.168.1.5oder anhand a.lanIhrer Frage) sehen. Wenn es *an dieser Stelle eine gibt, lauscht sie auf allen Schnittstellen ( *:sshin der Antwort von sr_).
Philipp Wendler
@Useless: Dies gilt nur für BSD-Systeme.
BatchyX
@ BatchyX Wie so? Ich kann sehen, was Useless zu Arch Linux und Debian sagt.
X-Yuri
9

Soweit ich weiß, können Sie das nicht (außer auf BSD-Systemen, auf denen Finkreghs Lösung gut funktioniert). Es ist möglich, aber es ist Ihnen egal, da die meisten Anwendungen auf jeder Schnittstelle empfangsbereit sind, auch wenn sie an eine IP-Adresse gebunden sind.

Unter Linux (und openwrt) ist die einzige Möglichkeit für eine Anwendung, nur auf einer bestimmten Schnittstelle zu lauschen, die SO_BINDTODEVICESocket-Option. Nur wenige Anwendungen unterstützen dies tatsächlich, da es betriebssystemspezifisch ist. Das, oder sie verwenden Packet Socket, aber das ist für Low-Level-Protokolle (wie DHCP-Server).

Unter Linux, das ein schwaches Hostmodell verwendet, überwacht jede Anwendung standardmäßig alle Schnittstellen, auch wenn ein Socket an eine IP-Adresse gebunden wird. Die einzige Ausnahme besteht beim Binden an 127.0.0.1, wodurch sichergestellt wird, dass die Anwendung nur auf der loSchnittstelle lauscht .

Sie haben es richtig gehört: Wenn Sie zwei Schnittstellen (z. B. eth0und eth1) mit zwei verschiedenen IP-Adressen (z. B. 192.0.2.1 für eth0und 198.51.100.1 für eth1) haben und Sie einer Anwendung anweisen , 192.0.2.1 zu binden, hört die Anwendung weiterhin zu beide Schnittstellen, reagieren aber nur, wenn die Ziel-IP 192.0.2.1 lautet. eth1Wenn die Routing-Tabelle der Schnittstelle entsprechend definiert ist, kann eine andere Person auf Ihre Anwendung zugreifen, indem sie über die Adresse 192.0.2.1 (jedoch nicht über 198.51.100.1) auf der eth1Schnittstelle darauf zugreift .

Angenommen, die Bindung an eine IP-Adresse entspricht der Bindung an eine Netzwerkschnittstelle, ist dies unter Linux völlig falsch. Wenn Sie das stört, verwenden Sie Richtlinienrouting und / oder iptables.

BatchyX
quelle
-1

Auch bei netstat sind aber die konkreten Argumente:

netstat -lp -i wlan0
frogstarr78
quelle
1
Können Sie bitte die Ausgabe dieses Befehls etwas länger erklären? : D
Gasko Peter
Ehrlich gesagt, ich weiß es nicht. Ich müsste man netstat. Der Unterschied, den ich vorschlage, besteht darin, die "Abfrage", die Sie ausführen, zu ändern, um explizit die Schnittstelle anzugeben, die Sie überprüfen möchten.
Frogstarr78
"netstat -lp -i wlan0" und "netstat -i" geben die gleiche Antwort auf meinem Ubuntu-System
Bruce Barnett
1
netstat -ilistet Schnittstellen, nicht lauschende Ports, -1 für eine Antwort, die nicht die Realität widerspiegelt
Mikko Rantalainen