Bagaimana cara memeriksa apakah daemon mendengarkan pada antarmuka apa?


28

Mis .: sshd dikonfigurasi untuk hanya mendengarkan di wlan0. Begitu. Selain memeriksa sshd_config, bagaimana saya bisa mengecek bahwa daemon sedang mendengarkan inerface apa? netstat dapat melakukannya? bagaimana? (OS: openwrt atau linux ilmiah atau openbsd)

MEMPERBARUI:

Saya pikir sshd bisa terbatas pada antarmuka ... tapi tidak ... (192.168.1.5 ada di 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          
#

Jawaban:


37

(Anda mungkin harus menginstal paket ippada openwrt (penyesuaian v12 / sikap)

ifconfig / netstat dll. dianggap usang , jadi Anda harus menggunakan (sebagai root)

ss -nlput | grep sshd

untuk menunjukkan soket TCP / UDP yang sshddidengarkan program yang berisi string

  • -n
    tidak ada port ke resolusi nama
  • -l
    hanya mendengarkan soket
  • -p
    perlihatkan proses mendengarkan
  • -u
    tunjukkan soket udp
  • -t
    tampilkan soket tcp

Maka Anda dapat daftar seperti ini:

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

yang menarik adalah kolom ke-5 yang menunjukkan kombinasi alamat IP dan port:

  1. *:22
    dengarkan pada port 22 pada setiap alamat IPv4 yang tersedia
  2. :::22
    dengarkan pada port 22 pada setiap alamat IP yang tersedia (saya tidak menulis IPv6, karena IP adalah IPv6 per RFC 6540 )
  3. 127.0.0.1:6010
    dengarkan alamat IPv4 127.0.0.1 (localhost / loopback) dan port 6010
  4. ::1:6010
    dengarkan alamat IP :: 1 (0: 0: 0: 0: 0: 0: 0: 0: 0: 1 dalam notasi penuh, juga localhost / loopback) dan port 6010

Anda kemudian ingin tahu antarmuka mana yang memiliki alamat IPv4 (untuk menutup 1.)

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

atau alamat IP (untuk menutup 2.)

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

(jika Anda tidak menambahkan opsi untuk IP ( -6) atau IPv4 ( -4) keduanya ditampilkan)

Anda juga dapat melihat output dan mencari misalnya 127.0.0.1atau alamat IP / IPv4 lainnya

# 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

Baris yang dimulai dengan inetdan inet6menunjukkan bahwa IP ini terikat ke antarmuka ini, Anda mungkin memiliki banyak baris ini per antarmuka:

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

dan dalam naskah:

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

(ganti "127.0.0.1")


Maksud Anda tidak ada cara yang tepat untuk menentukan bahwa daemon mendengarkan pada antarmuka apa, karena hanya dapat ditentukan oleh alamat IP?
gasko peter

ya benar. Anda (atau saya) dapat memperpanjang skrip yang saya posting bahwa itu akan melakukan langkah-langkah sebelum ...
Oluf Lorenzen

1
Bagaimana dengan SO_BINDTODEVICE?
Pavel Ĺ imerda

20

Menggunakan lsof(sebagai 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 ssdapat melakukan hal ini, juga (sebagai 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))

... dan akhirnya, netstat(sebagai 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
Secara khusus, *:sshatau 0.0.0.0:22berarti mendengarkan pada antarmuka wildcard (yaitu, semuanya). Sesuatu seperti host-eth1:sshatau 10.0.0.4:22berarti sedang mendengarkan pada antarmuka spesifik itu
berguna

tunggu sebentar .. Saya pikir ini adalah jawaban yang bagus: D tapi tidak, tidak ada antarmuka di dalamnya .. Bagaimana saya mengetahui bahwa suatu program hanya mendengarkan pada antarmuka yang diberikan? atau tidak ada solusi untuk pertanyaan ini? : O
gasko peter

@ gaskopeter Anda dapat melihat antarmuka dari alamat ip yang ditampilkan ( 192.168.1.5atau a.landalam pertanyaan Anda). Jika ada *di tempat ini, maka ia mendengarkan semua antarmuka ( *:sshdalam jawaban sr_).
Philipp Wendler

@Useless: Ini hanya berlaku pada sistem BSD.
BatchyX

@ BatchyX Bagaimana? Saya bisa melihat apa yang dikatakan Useless pada setidaknya Arch Linux dan Debian.
x-yuri

9

Sejauh yang saya tahu, Anda tidak bisa (kecuali pada sistem BSD, di mana solusi Finkregh berfungsi dengan baik). Mungkin saja tetapi Anda tidak peduli, karena sebagian besar aplikasi mendengarkan di setiap antarmuka, bahkan ketika terikat ke alamat IP.

Di linux (dan openwrt), satu-satunya cara aplikasi mendengarkan hanya pada antarmuka tertentu adalah SO_BINDTODEVICEopsi soket. Hanya sedikit aplikasi yang benar-benar mendukung ini, karena spesifik untuk OS. Itu, atau mereka menggunakan soket paket, tapi itu untuk protokol tingkat rendah (seperti server dhcp).

Di linux, yang menggunakan model host yang lemah, setiap aplikasi mendengarkan pada setiap antarmuka secara default, bahkan ketika mengikat soket ke alamat IP. Satu-satunya pengecualian adalah ketika mengikat ke 127.0.0.1, yang memastikan bahwa aplikasi hanya mendengarkan pada loantarmuka.

Anda mendengarnya dengan benar: Jika Anda memiliki dua antarmuka (katakan eth0dan eth1) dengan dua alamat IP yang berbeda, (katakanlah 192.0.2.1 untuk eth0dan 198.51.100.1 untuk eth1) dan Anda memberi tahu aplikasi untuk mengikat 192.0.2.1, aplikasi akan tetap mendengarkan di kedua antarmuka, tetapi hanya akan merespons jika IP tujuan 192.0.2.1. Jadi seseorang di eth1antarmuka, jika tabel peruteannya ditentukan dengan tepat, dapat mengakses aplikasi Anda dengan mengaksesnya melalui alamat 192.0.2.1 (tetapi tidak melalui 198.51.100.1) pada eth1antarmuka.

Dengan asumsi bahwa pengikatan ke alamat IP sama dengan pengikatan ke antarmuka jaringan sama sekali salah di Linux. Jika itu mengganggu Anda, gunakan perutean kebijakan dan / atau iptables.


-1

Juga dengan netstat tetapi argumen spesifiknya adalah:

netstat -lp -i wlan0

1
dapatkah Anda menjelaskan output dari perintah ini sedikit lebih lama? : D
gasko peter

Jujur, saya tidak tahu. Saya harus man netstat. Perbedaan yang saya sarankan adalah dalam mengubah "kueri" yang Anda jalankan untuk secara eksplisit menentukan antarmuka yang ingin Anda periksa.
frogstarr78

"netstat -lp -i wlan0" dan "netstat -i" memberikan respons yang sama pada sistem Ubuntu saya
Bruce Barnett

1
netstat -iakan mencantumkan antarmuka, bukan port mendengarkan, -1 untuk jawaban yang tidak mencerminkan kenyataan
Mikko Rantalainen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.