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          
#

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


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  

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.


-1

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

netstat -lp -i wlan0

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.