วิธีตรวจสอบว่า daemon กำลังฟังบนอินเตอร์เฟสใด


28

เช่น: sshd ถูกกำหนดค่าให้ฟังใน wlan0 เท่านั้น ดังนั้น. นอกจากการตรวจสอบ sshd_config ฉันจะตรวจสอบได้อย่างไรว่า daemon กำลังรับฟัง inerface ใด netstat สามารถทำได้หรือไม่ อย่างไร (OS: openwrt หรือวิทยาศาสตร์ linux หรือ openbsd)

UPDATE:

ฉันคิดว่า sshd อาจถูก จำกัด ให้ใช้อินเทอร์เฟซ ... แต่ไม่ ... (192.168.1.5 อยู่บน 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          
#

คำตอบ:


37

(คุณอาจต้องติดตั้งแพ็กเกจipบน openwrt (v12 / การปรับทัศนคติ)

ifconfig / netstat เป็นต้นถูกพิจารณาว่าเลิกใช้ดังนั้นคุณควรใช้ (เป็น root)

ss -nlput | grep sshd

เพื่อแสดงซ็อกเก็ต TCP / UDP ที่โปรแกรมกำลังทำงานซึ่งมีสตริงsshdกำลังฟังอยู่

  • -n
    ไม่มีพอร์ตสำหรับการจำแนกชื่อ
  • -l
    ฟังเฉพาะซ็อกเก็ต
  • -p
    แสดงกระบวนการฟัง
  • -u
    แสดง udp sockets
  • -t
    แสดงซ็อกเก็ต tcp

จากนั้นคุณได้กำหนดรายการเช่นนี้:

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

สิ่งที่น่าสนใจคือคอลัมน์ที่ 5 ซึ่งแสดงการรวมกันของที่อยู่ IP และพอร์ต:

  1. *:22
    ฟังที่พอร์ต 22 ในที่อยู่ IPv4 ที่มีอยู่ทั้งหมด
  2. :::22
    ฟังพอร์ต 22 ทุกที่อยู่ IP ที่มีอยู่ (ฉันไม่ได้เขียน IPv6 เนื่องจาก IP คือ IPv6 ต่อRFC 6540 )
  3. 127.0.0.1:6010
    ฟังที่อยู่ IPv4 127.0.0.1 (localhost / loopback) และพอร์ต 6010
  4. ::1:6010
    ฟังที่อยู่ IP :: 1 (0: 0: 0: 0: 0: 0: 0: 1 ในรูปแบบเต็ม, ยังใช้ localhost / loopback) และพอร์ต 6010

จากนั้นคุณต้องการทราบว่าอินเทอร์เฟซใดมีที่อยู่ IPv4 (ครอบคลุม 1)

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

หรือที่อยู่ IP (เพื่อครอบคลุม 2)

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

(ถ้าคุณไม่เพิ่มตัวเลือกสำหรับ IP ( -6) หรือ IPv4 ( -4) ทั้งคู่แสดงขึ้น)

นอกจากนี้คุณยังสามารถดูผลลัพธ์และค้นหาเช่น127.0.0.1หรือที่อยู่ 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

บรรทัดที่ขึ้นต้นด้วยinetและinet6แสดงว่า IP เหล่านี้เชื่อมโยงกับอินเตอร์เฟสนี้คุณอาจมีหลายบรรทัดต่ออินเตอร์เฟส:

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

และในสคริปต์:

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


คุณหมายถึงว่าไม่มีวิธีที่แน่นอนในการพิจารณาว่า daemon กำลังรับฟังอินเตอร์เฟสใดเพราะสามารถกำหนดได้เฉพาะที่อยู่ IP เท่านั้น
gasko peter

ใช่ถูกต้อง คุณ (หรือฉัน) สามารถขยายสคริปต์ที่ฉันโพสต์ว่ามันจะทำตามขั้นตอนก่อน ...
Oluf Lorenzen

1
แล้ว SO_BINDTODEVICE ล่ะ
Pavel Šimerda

20

การใช้lsof(เป็น 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ก็ssสามารถทำได้เช่นกัน (เหมือนรูท):

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

... และในที่สุดnetstat(เป็น 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
โดยเฉพาะ*:sshหรือ0.0.0.0:22หมายถึงการฟังบนอินเทอร์เฟซตัวแทน (นั่นคือทั้งหมด) สิ่งที่ชอบhost-eth1:sshหรือ10.0.0.4:22หมายความว่ากำลังฟังบนอินเทอร์เฟซเฉพาะนั้น
ไร้ประโยชน์

รอสักครู่ .. ฉันคิดว่านี่เป็นคำตอบที่ดี: D แต่ไม่ไม่มีอินเทอร์เฟซในนั้น .. ฉันจะรู้ได้อย่างไรว่าโปรแกรมกำลังฟังบนอินเทอร์เฟซที่กำหนดเท่านั้น หรือไม่มีวิธีแก้ปัญหาสำหรับคำถามนี้ : O
gasko peter

@gaskopeter คุณสามารถเห็นส่วนต่อประสานจากที่อยู่ IP ซึ่งปรากฏขึ้น ( 192.168.1.5หรือa.lanในคำถามของคุณ) หากมีอยู่*ในสถานที่นี้ก็จะฟังในอินเทอร์เฟซทั้งหมด ( *:sshในคำตอบของ sr_)
Philipp Wendler

@ ไม่มีประโยชน์: สิ่งนี้เป็นจริงในระบบ BSD เท่านั้น
BatchyX

@BatchyX เป็นอย่างไร ฉันสามารถเห็นสิ่งที่ไร้ประโยชน์พูดอย่างน้อย Arch Linux และ Debian
x-yuri

9

เท่าที่ฉันรู้คุณไม่สามารถ (ยกเว้นในระบบ BSD ซึ่งโซลูชันของ Finkregh ทำงานได้ดี) อาจเป็นไปได้ แต่คุณไม่สนใจเพราะแอปพลิเคชั่นส่วนใหญ่รับฟังทุกอินเตอร์เฟสแม้ว่าจะเชื่อมโยงกับที่อยู่ IP ก็ตาม

บน linux (และ openwrt) วิธีเดียวที่แอปพลิเคชั่นจะฟังเฉพาะในส่วนต่อประสานที่แน่นอนคือSO_BINDTODEVICEตัวเลือกซ็อกเก็ต มีแอปพลิเคชั่นบางตัวที่รองรับการทำงานนี้ได้ หรือพวกเขาใช้ซ็อกเก็ตแพ็คเก็ต แต่สำหรับโปรโตคอลระดับต่ำ (เช่นเซิร์ฟเวอร์ DHCP)

บน linux ซึ่งใช้โมเดลโฮสต์ที่อ่อนแอแอปพลิเคชันทุกตัวจะรับฟังทุกอินเทอร์เฟซโดยค่าเริ่มต้นแม้ว่าจะเชื่อมต่อซ็อกเก็ตกับที่อยู่ IP ข้อยกเว้นเพียงอย่างเดียวคือเมื่อมีผลผูกพันกับ 127.0.0.1 ซึ่งทำให้มั่นใจได้ว่าแอปพลิเคชันฟังเฉพาะในloส่วนต่อประสาน

คุณได้ยินถูกต้อง: หากคุณมีสองอินเตอร์เฟส (พูดeth0และeth1) ที่มีที่อยู่ IP ที่แตกต่างกันสองรายการ (พูด 192.0.2.1 สำหรับeth0และ 198.51.100.1 สำหรับeth1) และคุณบอกให้แอปพลิเคชันผูกกับ 192.0.2.1 แอปพลิเคชันจะยังคงฟัง อินเทอร์เฟซทั้งสอง แต่จะตอบกลับเฉพาะถ้า IP ปลายทางคือ 192.0.2.1 ดังนั้นใครบางคนบนeth1อินเทอร์เฟซหากตารางเส้นทางของมันถูกกำหนดไว้อย่างเหมาะสมสามารถเข้าถึงแอปพลิเคชันของคุณโดยการเข้าถึงผ่านทางที่อยู่ 192.0.2.1 (แต่ไม่ใช่ผ่าน 198.51.100.1) บนeth1อินเทอร์เฟซ

สมมติว่าการเชื่อมโยงกับที่อยู่ IP นั้นเหมือนกับการเชื่อมต่อกับเครือข่ายอินเตอร์เฟสนั้นเป็นเท็จอย่างสมบูรณ์บน Linux iptablesถ้ารบกวนจิตใจว่าคุณนโยบายการใช้เส้นทางและ / หรือ


-1

ด้วย netstat แต่อาร์กิวเมนต์เฉพาะคือ:

netstat -lp -i wlan0

1
คุณช่วยอธิบายผลลัพธ์ของคำสั่งนี้อีกหน่อยได้ไหม? : D
gasko peter

สุจริตฉันไม่รู้ man netstatฉันต้อง ความแตกต่างที่ฉันแนะนำคือการเปลี่ยน "คิวรี" ที่คุณกำลังเรียกใช้เพื่อระบุอินเทอร์เฟซที่คุณสนใจตรวจสอบอย่างชัดเจน
frogstarr78

"netstat -lp -i wlan0" และ "netstat -i" ให้การตอบสนองแบบเดียวกันกับระบบ Ubuntu ของฉัน
Bruce Barnett

1
netstat -iจะแสดงรายการอินเตอร์เฟสไม่ใช่ฟังพอร์ต -1 สำหรับคำตอบที่ไม่สะท้อนความเป็นจริง
Mikko Rantalainen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.