แสดงการเชื่อมต่อเครือข่ายของกระบวนการ


25

มีวิธีแสดงการเชื่อมต่อของกระบวนการหรือไม่ อะไรแบบนั้น:

show PID

ซึ่งshowเป็นคำสั่งให้ทำเช่นนี้และPIDเป็น pid ของกระบวนการ ผลลัพธ์ที่ฉันต้องการประกอบด้วยการเชื่อมต่อของกระบวนการทั้งหมด (แบบเรียลไทม์) ตัวอย่างเช่นถ้ากระบวนการพยายามที่จะเชื่อมต่อกับ173.194.112.151173.194.112.151ออกเป็น

ตัวอย่างที่เฉพาะเจาะจงมากขึ้นกับ Firefox:

show `pidof firefox`

และกับ Firefox ผมไปครั้งแรกบนgoogle.comแล้วในunix.stackexchange.comและในที่สุดก็192.30.252.129 ผลลัพธ์เมื่อฉันปิดเบราว์เซอร์จะต้อง:

google.com
stackexchange.com
192.30.252.129

(เห็นได้ชัดกับเบราว์เซอร์เอาต์พุตนี้ไม่เหมือนจริงเนื่องจากมีการเชื่อมต่ออื่น ๆ ที่เกี่ยวข้องจำนวนมาก แต่นี่เป็นเพียงตัวอย่างเท่านั้น)


ภายใต้ตัวแปร Unix ใด? ส่วนใหญ่มีเครื่องมือในการทำเช่นนี้ แต่ต่างกัน
Gilles 'หยุดชั่วร้าย'

ดังนั้นคุณต้องการบันทึกการเชื่อมต่อทั้งหมดหรือไม่?
Sergiy Kolodyazhnyy

ฉันคิดว่า tcpdump หรือ Wireshark ควรทำงานได้
Sergiy Kolodyazhnyy

วิธีที่เป็นไปได้ในการทำเช่นนี้: askubuntu.com/questions/11709/…
Mark Plotnick

@Gilles Ubuntu 14.04.3 LTS
ᴇʀsᴇʀ

คำตอบ:


23

คุณกำลังมองหาstrace! ฉันพบคำตอบนี้ใน Askubuntuแต่มันใช้ได้สำหรับ Unix:

ในการเริ่มและตรวจสอบกระบวนการใหม่:

strace -f -e trace=network -s 10000 PROCESS ARGUMENTS

ในการตรวจสอบกระบวนการที่มีอยู่ด้วย PID ที่รู้จัก:

strace -p $PID -f -e trace=network -s 10000

มิฉะนั้น แต่เฉพาะ Linux คุณสามารถเรียกใช้กระบวนการในเนมสเปซเครือข่ายแยกและใช้ wireshark เพื่อตรวจสอบปริมาณการใช้งาน นี่อาจจะสะดวกกว่าการอ่านstraceบันทึก:

  • สร้างเนมสเปซเครือข่ายทดสอบ:

    ip netns add test
    
  • สร้างอินเตอร์เฟสเครือข่ายเสมือนคู่หนึ่ง (veth-a และ veth-b):

    ip link add veth-a type veth peer name veth-b
    
  • เปลี่ยนเนมสเปซที่ใช้งานของอินเตอร์เฟส veth-a:

    ip link set veth-a netns test
    
  • กำหนดค่าที่อยู่ IP ของอินเตอร์เฟสเสมือน:

    ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0
    ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0
    
  • กำหนดค่าการกำหนดเส้นทางในทดสอบเนมสเปซ:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • เปิดใช้งาน ip_forward และสร้างกฎ NAT เพื่อส่งต่อปริมาณข้อมูลที่เข้ามาจากเนมสเปซที่คุณสร้างขึ้น (คุณต้องปรับเน็ตเวิร์กอินเตอร์เฟสและที่อยู่ IP ของ SNAT):

    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o YOURNETWORKINTERFACE -j SNAT --to-source YOURIPADDRESS
    

    (คุณสามารถใช้กฎ MASQUERADE ได้หากต้องการ)

  • ในที่สุดคุณสามารถเรียกใช้กระบวนการที่คุณต้องการวิเคราะห์ในเนมสเปซใหม่และ wireshark ด้วย:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    คุณจะต้องตรวจสอบอินเตอร์เฟสของ veth-a


2
straceมีความเฉพาะเจาะจงกับเคอร์เนล Linux ดังนั้นจึงไม่สามารถใช้ได้กับระบบปฏิบัติการ Unix ที่คล้ายกันทั้งหมด อย่างที่ฉันเข้าใจระบบที่คล้าย BSD มีระบบสาธารณูปโภคที่คล้ายคลึงกัน (DTrace และ truss) อย่างไรก็ตามคำตอบที่ดี (upvoted มาก) ยินดีต้อนรับสู่ Stack Exchange
Anthony G - ความยุติธรรมสำหรับโมนิก้า

คำตอบที่ดูเหมือนว่าจะจุดลงไปในทิศทางที่ถูกต้อง แต่ผมมีปัญหาการตีความการส่งออกในขณะที่การตรวจสอบ ฉันคาดหวังว่าจะเห็น URL บางประเภทที่รวมอยู่ในผลลัพธ์เช่นเดียวกับที่ร้องขอโดย OP ใครช่วยได้บ้างstracegit fetch
andreee

14

ลอง

lsof -i -a -p `pidof firefox`

มันใช้งานได้บางส่วน: มันพิมพ์การเชื่อมต่อปัจจุบันของกระบวนการ แต่ก็ปิดโดยอัตโนมัติ สำหรับบางโปรแกรมเอาต์พุตเป็นเพียงคำเตือนนี้:lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /home/user/.gvfs Output information may be incomplete.
ᴇʀsᴇʀ

คุณสามารถเพิ่มตัวเลือก-r1ในการแสดงผลซ้ำทุกวินาทีและ-wระงับคำเตือน
alxrem

2
นี่แสดงให้เห็นการเชื่อมต่อ ณ จุดหนึ่งเท่านั้นมันไม่ได้แสดงรายการการเชื่อมต่อทั้งหมดที่กระบวนการทำตลอดอายุการใช้งาน แม้ว่าคุณจะใส่คำสั่งนี้ในการวนซ้ำ แต่ก็จะพลาดการเชื่อมต่อระยะสั้น
Gilles 'หยุดชั่วร้าย'

ผู้ถามไม่ขอให้ดูการเชื่อมต่อตลอดช่วงชีวิต หนึ่งอาจตีความเป็น(in real-time) from the point in time of tracking and forward
llua

8

นี่เป็นวิธีการอื่น:

ss -nap | grep $(pidof firefox)

ตัวอย่างผลลัพธ์:

tcp    ESTAB      0      0          192.168.0.222:49050    216.58.218.164:443    users:(("firefox",3280,69))
tcp    ESTAB      0      0          192.168.0.222:48630    198.252.206.25:443    users:(("firefox",3280,106))
tcp    ESTAB      0      0          192.168.0.222:44220     216.58.217.38:443    users:(("firefox",3280,140))
tcp    ESTAB      0      0          192.168.0.222:52690    54.240.170.181:80     users:(("firefox",3280,107))
tcp    ESTAB      0      0          192.168.0.222:48744    198.252.206.25:443    users:(("firefox",3280,87))
tcp    ESTAB      0      0          192.168.0.222:48811    198.252.206.25:443    users:(("firefox",3280,73))

1
นี่แสดงให้เห็นการเชื่อมต่อ ณ จุดหนึ่งเท่านั้นมันไม่ได้แสดงรายการการเชื่อมต่อทั้งหมดที่กระบวนการทำตลอดอายุการใช้งาน แม้ว่าคุณจะใส่คำสั่งนี้ในการวนซ้ำ แต่ก็จะพลาดการเชื่อมต่อระยะสั้น
Gilles 'หยุดชั่วร้าย'

5

คุณสามารถลองด้วย netstat -pคุณสามารถลองยังมีจากหน้าคน:

netstat - พิมพ์การเชื่อมต่อเครือข่าย, ตารางการเราต์, สถิติอินเตอร์เฟส, การเชื่อมต่อปลอมแปลงและการเป็นสมาชิกแบบหลายผู้รับ

เพื่อแสดงเฉพาะการเชื่อมต่อเครือข่ายที่ใช้ netstat -tupเพื่อแสดงเฉพาะการเชื่อมต่อเครือข่ายใช้โปรดสังเกตว่าหากต้องการดูกระบวนการ PID คุณอาจต้องเป็นรูท

หากคุณไม่มีnetstatในระบบของคุณคุณอาจมีssซึ่งมีเกือบแน่นอนไวยากรณ์ คุณสามารถใช้ss -tup(เป็นรูท)


1
นี่แสดงให้เห็นการเชื่อมต่อ ณ จุดหนึ่งเท่านั้นมันไม่ได้แสดงรายการการเชื่อมต่อทั้งหมดที่กระบวนการทำตลอดอายุการใช้งาน แม้ว่าคุณจะใส่คำสั่งนี้ในการวนซ้ำ แต่ก็จะพลาดการเชื่อมต่อระยะสั้น
Gilles 'หยุดชั่วร้าย'

1
netstat -p | grep firefox | grep tcp
Philip Kirkbride

@Gilles ซึ่งหมายความว่ามันเป็นคำตอบที่ดีสำหรับทุกคนที่ต้องการเห็นการเชื่อมต่อในเวลา เป็นกรณีของฉันเมื่อเร็ว ๆ นี้
Jose Antonio Reinstate Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.