Bir servetin hangi arayüzde dinlendiğini nasıl kontrol edebilirim?


28

Ör .: bir sshd sadece wlan0'ta dinlenecek şekilde ayarlanmış. Yani. Sshd_config'i kontrol etmenin yanı sıra, hangi daemonun hangi inerface'i dinlediğini nasıl kontrol edebilirim? netstat yapabilir? Nasıl? (OS: openwrt veya bilimsel linux veya openbsd)

GÜNCELLEŞTİRME:

Sshd'nin bir arayüzle sınırlı olabileceğini düşünmüştüm ... ama hayır ...

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

Yanıtlar:


37

(paketi ipopenwrt üzerine kurmanız gerekebilir (v12 / tutum ayarı)

ifconfig / netstat vb. kullanımdan kaldırılmış olarak kabul edilir , bu nedenle kullanmalısınız (root olarak)

ss -nlput | grep sshd

Dize içeren çalışan bir programın sshddinlediği TCP / UDP soketlerini göstermek

  • -n
    ad çözümlemesi için bağlantı noktası yok
  • -l
    sadece dinleme soketleri
  • -p
    dinleme süreçlerini göster
  • -u
    udp soketlerini göster
  • -t
    tcp soketlerini göster

Sonra böyle bir liste alırsınız:

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

ilginç olan, IP adres ve port kombinasyonunu gösteren 5. sütundur:

  1. *:22
    mevcut her IPv4 adresinde 22 numaralı bağlantı noktasını dinleyin
  2. :::22
    mevcut her IP adresinde 22 numaralı bağlantı noktasını dinleyin (IP RFC 6540 başına IPv6 olduğundan IPv6'yı yazmam )
  3. 127.0.0.1:6010
    IPv4 adresini 127.0.0.1 (localhost / loopback) ve 6010 numaralı bağlantı noktasında dinleyin
  4. ::1:6010
    IP adresini dinle :: 1 (0: 0: 0: 0: 0: 0: 0: 1 tam gösterimde, ayrıca localhost / loopback) ve 6010 numaralı bağlantı noktasında

Daha sonra hangi arabirimlerin bir IPv4 adresi olduğunu bilmek istersiniz (1'i kapsar).

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

veya bir IP adresi (2'yi kapsayacak şekilde)

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

(IP ( -6) veya IPv4 ( -4) için seçenek eklemiyorsanız her ikisi de gösterilir)

Çıktı ve örneğin 127.0.0.1veya başka bir IP / IPv4-adresi için arama bir görünüm de olabilir

# 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

İle başlayan inetve inet6bu IP'lerin bu arabirime bağlı olduğunu gösterir, arabirim başına bu çizgilerin çoğuna sahip olabilirsiniz:

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

ve bir komut dosyasında:

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

("127.0.0.1" yerine)


Bir daemonun hangi arayüzü dinleyeceğini belirlemenin kesin bir yolu olmadığını, yani sadece IP adresi ile belirlenebileceğini mi kastediyorsunuz?
gasko peter

evet, doğru. sen (ya da ben) daha önce adımları izleyeceğimi söylediğim senaryoyu genişletebilirsin ...
Oluf Lorenzen

1
Peki ya SO_BINDTODEVICE?
Pavel Šimerda

20

Kullanımı lsof(root olarak):

# 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'nin ssde (root olarak), bunu yapabilirsiniz:

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

... ve son olarak, netstat(root olarak):

# 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
Özellikle, *:sshveya 0.0.0.0:22joker karakter arabirimini (yani hepsini) dinliyor demektir. Gibi bir şey host-eth1:sshya da 10.0.0.4:22o belirli bir arayüzü dinliyor demek
Useless

bekle bir dakika .. Bunun iyi bir cevap olduğunu düşündüm: D ama hayır, içinde arayüz yok .. Bir programın sadece verilen arayüzü dinlediğini nasıl öğrendim? ya da bu soru için herhangi bir çözüm yok mu? : O
gasko peter 19:12

@gaskopeter Arabirimi gösterilen ip adresinden ( 192.168.1.5veya a.lansorunuza) görebilirsiniz. *Bu yerde bir varsa , tüm arayüzleri dinler ( *:sshsr_'nin cevabında).
Philipp Wendler,

@ Kullanılmaz: Bu sadece BSD sistemlerinde geçerlidir.
BatchyX

@BatchyX Nasıl yani? Yararsız'ın en azından Arch Linux ve Debian ile ilgili söylediklerini görebiliyorum.
x-yuri

9

Bildiğim kadarıyla yapamazsınız (Finkregh'in çözümünün iyi çalıştığı BSD sistemleri hariç). Bu mümkün olabilir ancak umursamıyorsunuz çünkü çoğu uygulama bir IP adresine bağlı olsa bile her arabirimde dinliyor.

Linux'ta (ve openwrt), bir uygulamanın yalnızca belirli bir arabirimde dinlemesinin tek yolu SO_BINDTODEVICEsoket seçeneğidir. Pek çok uygulama aslında işletim sistemine özel olduğu için bunu desteklemektedir. Bu ya da paket soketi kullanıyorlar, ancak düşük seviyeli protokoller için (dhcp sunucuları gibi).

Zayıf bir ana bilgisayar modeli kullanan linux'da, bir soketi bir IP adresine bağlarken bile her uygulama varsayılan olarak her arabirimde dinler. Bunun tek istisnası, uygulamanın yalnızca loarabirimde dinlemesini sağlayan 127.0.0.1'e bağlanmadır .

Doğru duydunuz: İki farklı IP adresli iki arayüze sahipseniz (söyleyin eth0ve söyleyin eth1), ( eth0192.0.2.1 ve 198.51.100.1 için eth1söyleyin) ve 192.0.2.1'de bağlanacak bir uygulamaya söyleyin, uygulama hala dinleyecektir. Her iki arayüz de sadece hedef IP 192.0.2.1 ise cevap verecektir. Böylece, eth1arayüzdeki birisi , eğer yönlendirme tablosu uygun şekilde tanımlanmışsa, eth1arayüzünüzdeki 192.0.2.1 adresinden (ancak 198.51.100.1 üzerinden değil) erişerek uygulamanıza erişebilir .

Bir IP adresine bağlanmanın bir ağ arayüzüne bağlanmayla aynı olduğunu varsayarak Linux'ta tamamen yanlıştır. Bu sizi rahatsız ediyorsa, politika yönlendirme ve / veya kullanın iptables.


-1

Ayrıca netstat ile ancak belirli argümanlar:

netstat -lp -i wlan0

1
Lütfen bu komutun çıktısını biraz daha açıklayabilir misiniz? : D
gasko peter

Açıkçası, bilmiyorum. Yapmalıydım man netstat. Önerdiğim fark, kontrol etmek istediğiniz arayüzü açıkça belirtmek için çalıştırmakta olduğunuz "sorguyu" değiştirmektir.
frogstarr78

"netstat -lp -i wlan0" ve "netstat -i" Ubuntu sistemimde aynı cevabı veriyor
Bruce Barnett

1
netstat -iarabirimleri listeleyecek, bağlantı noktalarını dinlemeyecek, -1 ise gerçeği yansıtmayan cevap için
Mikko Rantalainen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.