ฉันจะบันทึกปริมาณการใช้งานเครือข่ายของกระบวนการเดียวได้อย่างไร


93

ฉันต้องการตรวจสอบการรับส่งข้อมูลเครือข่ายที่จัดการโดยกระบวนการเดียว แต่การจับเครือข่ายอย่างง่ายจะไม่ทำงานเนื่องจากฉันกำลังจัดการกับระบบที่ยุ่งเช่นนี้ (การรับส่งข้อมูลอื่น ๆ จำนวนมากเกิดขึ้นในเวลาเดียวกัน) มีวิธีในการแยกtcpdumpหรือwiresharkจับภาพไปยังทราฟฟิกเครือข่ายของกระบวนการที่เฉพาะเจาะจงหรือไม่? (การใช้netstatไม่เพียงพอ)

คำตอบ:


21

มีวิธีใช้ตัวกรองWiresharkแน่นอน แต่คุณไม่สามารถกรองโดยตรงด้วยชื่อกระบวนการหรือ PID (เพราะไม่ใช่ปริมาณเครือข่าย)

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

จากนั้นใช้ Wireshark เพื่อกรองพอร์ตขาเข้า (หรือขาออก) ด้วยพอร์ตที่คุณเพิ่งดึงมา ซึ่งควรแยกทราฟฟิกขาเข้าและขาออกของกระบวนการของคุณ


6
สำหรับการเชื่อมต่อแบบเรียบง่ายสิ่งนี้เป็นไปได้ แต่ฉันต้องติดตาม DNS, HTTP และอื่น ๆ ที่ผ่านมาอย่างรวดเร็วดังนั้นจึงไม่มีวิธีง่ายๆในการใช้netstatและตัวกรองการจับภาพเครือข่ายอย่างง่ายบนเครื่องไม่ว่าง
Kees Cook

แอปพลิเคชั่นจำนวนมากใช้พอร์ตสาธารณะ HTTP และ DNS สาธารณะ แต่พอร์ตส่วนตัวที่เกี่ยวข้องนั้นไม่ซ้ำกัน เหตุใดคุณจึงไม่ลองกรองโดยพอร์ตส่วนตัว
OpenNingia

เพราะการร้องขออย่างรวดเร็วขนาดเล็กจะไม่สามารถมองเห็นได้ด้วยnetstat; ฉันจะสามารถติดต่อกับคนรู้จักมานานเท่านั้น :(
Kees Cook

จะทำอย่างไรถ้ากระบวนการใช้พอร์ตแบบไดนามิกในเวลาทำงานดังนั้นคุณจะไม่สามารถใช้ตัวกรองพอร์ตแบบคงที่ได้
The Unix Janitor

ฉันคิดว่าคุณมาที่นี่เป็นคำตอบที่ดีที่สุด ... น่าเสียดายที่เครื่องมือดมกลิ่นเครือข่ายทำงานในระดับต่ำสุดของเน็ตสแต็กพยายามที่จะจับทุกอย่างมันไม่รู้กระบวนการที่ทำงานอยู่บน OS อย่างสมบูรณ์ มันยากมากที่จะค้นหาว่ามีอะไรเกิดขึ้นในการโทร แพ็คเก็ตดมกลิ่นสามารถคิดออกในที่สุด (ผ่านหมายเลขพอร์ต) กระบวนการ ID แต่ไม่สามารถคิดออกว่ากระบวนการใดทำการค้นหา DNS เนื่องจากเป็นอิสระอย่างสมบูรณ์ แต่ด้วยการกรองและหยุดกระบวนการอื่น ๆ คุณควรจะสามารถบรรลุเป้าหมายได้
Huygens

135

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

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

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

strace -p $PID -f -e trace=network -s 10000
  • -f มีไว้สำหรับ "ติดตามกระบวนการใหม่"
  • -e กำหนดตัวกรอง
  • -s ตั้งค่าขีด จำกัด ของสตริงเป็นมากกว่า 32
  • -p ใช้รหัสกระบวนการที่จะแนบไป

2
สิ่งนี้มีประโยชน์เพราะสามารถใช้งานได้โดยไม่ต้องมีการเข้าถึงรูทหรือการอนุญาตพิเศษ (บน Linux ลีนุกซ์บางตัวต่อไป - บน Ubuntu คุณอาจต้องใช้การอนุญาตพิเศษ)
Robin Green

1
สิ่งนี้ยังมีประโยชน์เพราะสามารถทำงานกับกระบวนการที่เปิดตัวไปแล้วและมีอยู่ในกล่อง Linux เกือบทุกชนิด
zakmck

53

ฉันรู้ว่ากระทู้นี้ค่อนข้างเก่า แต่ฉันคิดว่านี่อาจช่วยให้คุณ:

หากเคอร์เนลของคุณอนุญาตการจับภาพทราฟฟิกเครือข่ายของกระบวนการเดียวทำได้ง่ายมากโดยการเรียกใช้กระบวนการดังกล่าวในเนมสเปซเครือข่ายที่แยกได้และใช้ wireshark (หรือเครื่องมือเครือข่ายมาตรฐานอื่น ๆ ) ในเนมสเปซดังกล่าวเช่นกัน

การตั้งค่าอาจดูซับซ้อนเล็กน้อย แต่เมื่อคุณเข้าใจและคุ้นเคยกับมันแล้วมันจะทำให้งานของคุณง่ายขึ้นมาก

เพื่อทำเช่นนั้น:

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

    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 <your internet interface, e.g. eth0> -j SNAT --to-source <your ip address>
    

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

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

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

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


4
ความคิดที่ดี แต่ระวัง "ข้อ จำกัด " เนื่องจากนี่เป็นเนมสเปซที่แยกต่างหากคุณจึงไม่สามารถสื่อสารกับกระบวนการโลคัลในเนมสเปซเริ่มต้นโดยใช้ที่อยู่ลูปแบ็ค (es) หรือซ็อกเก็ตโดเมน UNIX หลังมีผลต่อการสื่อสารผ่าน D-Bus
Lekensteyn

@Lekensteyn คุณยังคงสามารถใช้ซ็อกเก็ตโดเมนยูนิกซ์ในเนมสเปซเครือข่าย afaik ระบบไฟล์ไม่ได้ถูกแยกโดยพวกเขา
randunel

1
@ Randunel ฉันควรจะแม่นยำกว่านี้ สิ่งที่ฉันหมายถึงคือซ็อกเก็ตโดเมน Unix ใน "abstract socket namespace" (ซึ่งไม่ได้ใช้ระบบไฟล์) ไม่สามารถเข้าถึงได้โดยตรงระหว่างเนมสเปซเครือข่าย เป็นวิธีแก้ปัญหาที่คุณสามารถใช้ proxy socatเช่น
Lekensteyn

คุณไม่อยู่อะไร IP ใช้กับ--to-sourceอาร์กิวเมนต์iptables? นี่คือที่อยู่ IP ของส่วนต่อประสานที่คุณส่งผ่านไปยัง-oตัวเลือกที่อยู่ IP ที่คุณสร้างขึ้นหรือ ฉันพยายามหลอกลวงรุ่นที่ไม่จำเป็นต้อง--to-source, ตามที่อธิบายไว้ที่นี่และที่ทำงาน!
ntc2

3
ทั้งหมดนี้ดูเหมือนจะต้องมีการเข้าถึงรูท
simplegamer

15
netstat -taucp | grep <pid or process name>

ที่จะแสดงการเชื่อมต่อที่แอปพลิเคชันกำลังทำอยู่รวมถึงพอร์ตที่ใช้งานอยู่


8
นี่จะแสดงการเชื่อมต่อที่มีอยู่ในทันทีนั้น แต่จะไม่ให้บันทึกการรับส่งข้อมูล
Kees Cook

1
ไม่แน่ใจเกี่ยวกับความคิดเห็น Kees Cook netstat ง่าย ๆ จะแสดงข้อมูลเกี่ยวกับการเชื่อมต่อในทันที แต่ด้วยแฟล็ก -c คุณจะได้ภาพรวมของสถานะนั้นทุกวินาที (ดู 'man netstat') บางทีมันอาจไม่มีทราฟฟิกทั้งหมด แต่ไม่ใช่สแนปชอตที่ไม่ซ้ำใครของการเชื่อมต่อ
มหึมา

3
ฉันแน่ใจ สิ่งนี้จะไม่จับภาพทราฟฟิกเครือข่ายทั้งหมดของกระบวนการ
Reinier โพสต์

สิ่งนี้มีประโยชน์สำหรับการค้นหาว่าหมายเลขพอร์ตใดที่ถูกบล็อกโดยไฟร์วอลล์ภายใน มันแสดงให้เห็น TCP SYNs (พร้อมกับที่อยู่ปลายทางและหมายเลขพอร์ต) ที่ถูกส่งโดยคำสั่งที่ฉันกำลังทำงานอยู่
Anthony Geoghegan

11

แค่ความคิด: มันเป็นไปได้ที่จะผูกใบสมัครของคุณไปยังที่อยู่ IP ที่แตกต่างกัน? ถ้าเป็นเช่นนั้นคุณสามารถใช้ผู้ต้องสงสัยตามปกติ ( tcpdumpฯลฯ )

เครื่องมือสำหรับแอปพลิเคชันที่ไม่สามารถผูกกับที่อยู่ IP อื่นได้:

http://freshmeat.net/projects/fixsrcip

fixsrcipเป็นเครื่องมือสำหรับการเชื่อมต่อซ็อกเก็ตไคลเอนต์ TCP และ UDP ( IPv4 ) ไปยังแหล่งที่อยู่ IP เฉพาะบนโฮสต์หลาย homed

http://freshmeat.net/projects/force_bind

force_bindช่วยให้คุณสามารถบังคับผูกพันกับ IP และ / หรือพอร์ตเฉพาะ จะทำงานร่วมกับทั้ง IPv4 และIPv6


แอปพลิเคชันส่วนใหญ่ไม่รองรับการระบุ IP ต้นทาง แต่จริงๆแล้วอาจเป็นไปได้โดยใช้คอนเทนเนอร์ที่มี CLONE_NEWNET แต่ไม่ใช่ CLONE_NEWNS
Kees Cook

หรือคุณสามารถสร้างเนมสเปซเครือข่ายและเรียกใช้แอปของคุณได้ภายใน www.evolware.org/?p=293
ฟลินท์

9

ฉันมาถึงปัญหาที่คล้ายกันและฉันสามารถเรียงลำดับตามคำตอบของ ioerrorโดยใช้ NFLOG ดังที่อธิบายไว้ที่นี่ :

# iptables -A OUTPUT -m owner --uid-owner 1000 -j CONNMARK --set-mark 1
# iptables -A INPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# iptables -A OUTPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# dumpcap -i nflog:30 -w uid-1000.pcap

จากนั้นคุณสามารถสร้างกระบวนการที่เป็นปัญหาจากบัญชีผู้ใช้ที่ไม่ได้ทำอะไรเลย - และ voila คุณได้แยกและรับปริมาณการใช้งานจากกระบวนการเดียว

แค่ต้องการโพสต์กลับในกรณีที่มันช่วยได้ทุกคน


6

ฉันเขียนแอปพลิเคชัน C ที่ทำสิ่งที่อธิบายไว้ในคำตอบที่ดีโดย felahdab!

ดูที่นี่: nsntrace gitub repo


ที่เย็น แต่ฉันคิดว่ามันจะดีที่จะมีรายละเอียดบางอย่างเพิ่มเติมสำหรับวิธีการที่จะได้รับและใช้งานได้ :)
Zanna

ขอบคุณ! ฉันให้ลิงค์ไปยัง repo Github ซึ่งเก็บไฟล์ README.md ซึ่งมีการใช้งานและตัวอย่างและคำแนะนำในการดาวน์โหลด!
Jonas Danielsson

5

นี่คือแฮ็คที่สกปรก แต่ฉันขอแนะนำให้เปลี่ยนเส้นทางหรือเป้าหมายบันทึกด้วย iptables สำหรับ UID ที่กำหนด เช่น:

iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner $USER -m tcp -j LOG 
iptables -t nat -A OUTPUT -p udp -m owner --uid-owner $USER -m udp -j LOG 

อาจเป็นสิ่งที่ควรพิจารณาเช่น '--log-tcp-sequence', '--log-tcp-options', '--log-ip-options', '--log-uid' สำหรับเป้าหมายบันทึกนั้น . แม้ว่าฉันสงสัยว่าจะช่วยให้คุณโพสต์กระบวนการ pcap ที่มีข้อมูลอื่น ๆ อีกมากมาย

เป้าหมาย NFLOG อาจมีประโยชน์หากคุณต้องการตั้งค่าสถานะแพ็กเก็ตแล้วแพ็คเก็ตที่ติดแท็กจะถูกส่งผ่านซ็อกเก็ต netlink ไปยังกระบวนการที่คุณเลือก ฉันสงสัยว่ามันจะมีประโยชน์สำหรับการแฮ็กข้อมูลด้วย wireshark และแอปพลิเคชันเฉพาะของคุณที่ทำงานในฐานะผู้ใช้เฉพาะหรือไม่?


แต่วิธีนี้ใช้ได้เฉพาะสำหรับการโทรออกเท่านั้น
resultsway

5

คุณสามารถลองใช้ tracedump - http://mutrics.iitis.pl/tracedump

มันทำสิ่งที่คุณต้องการอย่างแท้จริงคุณสามารถให้รหัสกระบวนการหรือโปรแกรมที่จะเรียกใช้


1
โครงการที่ดี แต่ ... "Tracedump ปัจจุบันทำงานบนโฮสต์ Linux แบบ 32 บิตเท่านั้น" ฆ่ามันสำหรับฉันโชคไม่ดี
gertvdijk

4

ลองใช้กระบวนการที่คุณสนใจภายใต้strace :

strace ping www.askubuntu.com

มันจะให้ข้อมูลโดยละเอียดเกี่ยวกับกระบวนการของคุณ เนื่องจากกระบวนการสามารถเปิดพอร์ตใดก็ได้ที่ต้องการไปทุกที่โดยใช้ตัวกรองที่กำหนดไว้ล่วงหน้าคุณอาจพลาดบางสิ่ง

อีกวิธีหนึ่งคือการใช้เครื่องเสมือนแบบถอดลงหรือเครื่องทดสอบบนเครือข่ายของคุณและวางกระบวนการของคุณไว้บนเครื่องโดยแยกออกจากกัน จากนั้นคุณสามารถใช้Wiresharkเพื่อตรวจจับทั้งหมดจากเครื่องนั้น คุณค่อนข้างมั่นใจว่าการเข้าชมที่คุณถ่ายจะเกี่ยวข้อง


การเพิ่มใน "-e trace = network" ตัดทอนบางส่วนของเอาต์พุตโดยเสียค่าใช้จ่ายในการสูญเสียข้อมูลที่เขียนไปยังเครือข่ายจริง หากคุณสนใจเฉพาะ "จำนวนซ็อกเก็ตที่เปิด" หรือคล้ายกันสิ่งนี้จะทำให้ง่ายขึ้น
dannysauer

3

การสร้างคำตอบโดย ioerrorฉันสงสัยว่าคุณสามารถใช้iptables --uid-ownerเพื่อกำหนดเครื่องหมายบนการจราจรและจากนั้นคุณสามารถขอ wireshark ที่จะจับการจราจรเฉพาะกับเครื่องหมายนั้น คุณอาจจะสามารถใช้ DSCP (marker services ที่แตกต่างกัน), flow id หรือ qos marker

หรือแน่นอนคุณสามารถใช้สิ่งนี้เพื่อส่งแพ็กเก็ตเหล่านั้นออกไปยังอินเทอร์เฟซอื่นแล้วจับภาพเฉพาะบนอินเทอร์เฟซนั้น



-1

อาจ iptables และ ulog สามารถทำงานได้? ไม่ใช่ว่าฉันมีสูตรที่แน่นอน แต่ฉันคิดว่า iptables สามารถจับคู่กระบวนการเมื่อจับคู่คุณสามารถใช้ ulog ได้


3
น่าเสียดายที่iptables -m owner --pid-owner $PIDถูกลบใน Linux 2.6.14: ftp.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.14
Kees Cook

-1

ฉันคิดว่าคุณสามารถสร้างเชลล์สคริปต์เพื่อวนลูปผ่านการดำเนินการ netstat และเข้าสู่ระบบไฟล์ข้อความ สิ่งที่ชอบ (ขั้นตอนที่หยาบมาก):

echo "press q to quit"
while [ <q is not pressed>]
do
    `netstat -taucp | grep <pid or process name> 1>>logfile.txt`
done

ฉันไม่ใช่โปรแกรมเมอร์ดังนั้นฉันจึงไม่สามารถปรับแก้สิ่งนี้ได้ แต่บางคนที่นี่สามารถเริ่มจากจุดที่ฉันค้างไว้และสร้างสคริปต์ทำงานให้คุณ


ไม่ดีพอ. คำถามคือการจับภาพการรับส่งข้อมูลเครือข่ายทั้งหมดไม่ใช่เฉพาะสิ่งที่เกิดขึ้นในขณะที่คุณทำการตรวจสอบ
Reinier โพสต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.