Jak sprawdzić, czy demon nasłuchuje na jakim interfejsie?

28

Np .: sshd jest skonfigurowany do nasłuchiwania tylko na wlan0. Więc. Oprócz sprawdzenia sshd_config, w jaki sposób mogę sprawdzić, czy demon nasłuchuje na jakim interfejsie? netstat może to zrobić? w jaki sposób? (OS: openwrt lub Linux naukowy lub openbsd)

AKTUALIZACJA:

Myślałem, że sshd może być ograniczony do interfejsu ... ale nie ... (192.168.1.5 jest na 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
źródło

Odpowiedzi:

37

(być może będziesz musiał zainstalować pakiet ipna openwrt (v12 / dostosowanie postawy)

ifconfig / netstat itp. są uważane za przestarzałe , więc powinieneś użyć (jako root)

ss -nlput | grep sshd

aby pokazać gniazda TCP / UDP, na których sshdnasłuchuje uruchomiony program zawierający ciąg

  • -n
    brak portu do rozpoznawania nazw
  • -l
    tylko gniazda nasłuchowe
  • -p
    pokaż procesy słuchania
  • -u
    pokaż gniazda udp
  • -t
    pokaż gniazda TCP

Następnie twórz listę taką jak ta:

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

Interesującą rzeczą jest piąta kolumna, która pokazuje kombinację adresu IP i portu:

  1. *:22
    nasłuchuj na porcie 22 na każdym dostępnym adresie IPv4
  2. :::22
    nasłuchuj na porcie 22 na każdym dostępnym adresie IP (nie piszę IPv6, ponieważ IP to IPv6 zgodnie z RFC 6540 )
  3. 127.0.0.1:6010
    nasłuchuj na adresie IPv4 127.0.0.1 (localhost / loopback) i porcie 6010
  4. ::1:6010
    nasłuchuj na adresie IP :: 1 (0: 0: 0: 0: 0: 0: 0: 1 w pełnej notacji, również localhost / loopback) i port 6010

Następnie chcesz wiedzieć, które interfejsy mają adres IPv4 (do pokrycia 1.)

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

lub adres IP (do pokrycia 2.)

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

(jeśli nie dodasz opcji dla adresu IP (-6 ) lub IPv4 ( -4), oba zostaną wyświetlone)

Możesz także wyglądać tak, aby wyświetlać i wyszukiwać np. 127.0.0.1Dowolny inny adres 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

Linie zaczynające się od ineti inet6pokazują, że te adresy IP są powiązane z tym interfejsem, możesz mieć wiele z tych linii na interfejs:

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

i w skrypcie:

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

(zastąp „127.0.0.1”)

Oluf Lorenzen
źródło
masz na myśli, że nie ma dokładnego sposobu ustalenia, czy demon nasłuchuje na jakim interfejsie, ponieważ można go ustalić tylko na podstawie adresu IP?
gasko peter
tak, poprawne. ty (lub i) mógłbyś przedłużyć skrypt, który opublikowałem, że zrobiłby to kroki przed ...
Oluf Lorenzen,
1
Co z SO_BINDTODEVICE?
Pavel Šimerda
20

Używając lsof(jako 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)

iproute2też ssmoże to zrobić (jako 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))

... i wreszcie netstat(jako 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_
źródło
3
W szczególności, *:sshczy 0.0.0.0:22oznacza to, że słucha na interfejsie wieloznacznego (czyli wszystkie z nich). Coś w stylu host-eth1:sshlub 10.0.0.4:22oznacza, że ​​nasłuchuje na tym konkretnym interfejsie
Bezużyteczne
poczekaj chwilę .. Myślałem, że to dobra odpowiedź: D, ale nie, nie ma w nim interfejsu .. Jak dowiedziałem się, że program nasłuchuje tylko na danym interfejsie? czy nie ma rozwiązania dla tego pytania? : O
gasko peter
@gaskopeter Interfejs można zobaczyć z adresu IP, który jest pokazany ( 192.168.1.5lub a.lanw twoim pytaniu). Jeśli jest *w tym miejscu, nasłuchuje na wszystkich interfejsach ( *:sshw odpowiedzi sr_).
Philipp Wendler
@ Bez użycia: Dotyczy to tylko systemów BSD.
BatchyX
@BatchyX Jak to się dzieje? Widzę, co Bezużyteczne mówi co najmniej na Arch Linux i Debianie.
x-yuri
9

O ile wiem, nie możesz (z wyjątkiem systemów BSD, w których rozwiązanie Finkregha działa dobrze). Może to być możliwe, ale nie obchodzi cię to, ponieważ większość aplikacji nasłuchuje na każdym interfejsie, nawet jeśli jest powiązany z adresem IP.

W systemie Linux (i openwrt) jedynym sposobem, aby aplikacja nasłuchiwała tylko na określonym interfejsie, jest SO_BINDTODEVICEopcja gniazda. Niewiele aplikacji faktycznie to obsługuje, ponieważ jest to specyficzne dla systemu operacyjnego. To lub używają gniazda pakietowego, ale dotyczy to protokołów niskiego poziomu (takich jak serwery dhcp).

W systemie Linux, który korzysta ze słabego modelu hosta, każda aplikacja domyślnie nasłuchuje na każdym interfejsie, nawet po powiązaniu gniazda z adresem IP. Jedynym wyjątkiem jest powiązanie z 127.0.0.1, co zapewnia, że ​​aplikacja nasłuchuje tylko w siecilo interfejsie.

Dobrze słyszałeś: jeśli masz dwa interfejsy (powiedz eth0i eth1) z dwoma różnymi adresami IP (powiedzmy 192.0.2.1 dla eth0i 198.51.100.1 dla eth1) i powiesz aplikacji, aby powiązała 192.0.2.1, aplikacja będzie nadal nasłuchiwać oba interfejsy, ale odpowiedzą tylko, jeśli docelowy adres IP to 192.0.2.1. Tak więc ktoś w eth1interfejsie, jeśli jego tabela routingu jest odpowiednio zdefiniowana, może uzyskać dostęp do Twojej aplikacji, uzyskując do niej dostęp za pośrednictwem adresu 192.0.2.1 (ale nie poprzez 198.51.100.1) naeth1 interfejsie.

Zakładanie, że wiązanie z adresem IP jest takie samo, jak wiązanie z interfejsem sieciowym, jest całkowicie fałszywe w systemie Linux. Jeśli Ci to przeszkadza, użyj routingu zasad i / lub iptables.

BatchyX
źródło
-1

Także z netstat, ale konkretnymi argumentami są:

netstat -lp -i wlan0
frogstarr78
źródło
1
czy możesz wyjaśnić wyjście tego polecenia nieco dłużej? : D
gasko peter
Szczerze mówiąc nie wiem. Musiałbym man netstat. Sugeruję różnicę w zmianie „zapytania”, które uruchamiasz, aby jawnie określić interfejs, który chcesz sprawdzić.
frogstarr78
„netstat -lp -i wlan0” i „netstat -i” dają tę samą odpowiedź w moim systemie Ubuntu
Bruce Barnett
1
netstat -iwyświetli listę interfejsów, nie nasłuchujących portów, -1 za odpowiedź, która nie odzwierciedla rzeczywistości
Mikko Rantalainen,