ฉันจะตรวจสอบคำขอ / การเชื่อมต่อขาออกทั้งหมดจากเครื่องของฉันได้อย่างไร


71

เครื่องของฉันเป็นเซิร์ฟเวอร์ดังนั้นฉันจึงต้องการละเว้นการเชื่อมต่อกับเซิร์ฟเวอร์ของฉัน (เช่นเมื่อมีคนเยี่ยมชมเว็บไซต์ของฉัน) ฉันต้องการเห็นเฉพาะการเชื่อมต่อ / คำขอที่เซิร์ฟเวอร์ของฉันทำกับสถานที่อื่น

ฉันจะเห็นเฉพาะการเชื่อมต่อขาออกเหล่านั้นได้อย่างไร

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

คำตอบ:


77

netstatใช้ ตัวอย่างเช่น

$ netstat -nputw
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
[...]
tcp        0      0 192.168.25.222:22       192.168.0.134:42903     ESTABLISHED 32663/sshd: gert [p

แสดงรายการการเชื่อมต่อขาออกUDP ( u), TCP ( t) และ RAW ( w) ทั้งหมด (ไม่ได้ใช้lหรือa) ในรูปแบบตัวเลข ( nป้องกันการสอบถาม DNS ที่ใช้งานได้นาน) และรวมถึงโปรแกรม ( p) ที่เชื่อมโยงกับสิ่งนั้น

พิจารณาการเพิ่มcตัวเลือกเพื่อให้ได้ผลลัพธ์ที่ได้รับการปรับปรุงอย่างต่อเนื่อง


ขอบคุณ นั่นเป็นข้อมูลที่ดี คุณช่วยลองดูคำถามที่อัปเดตของฉันได้ไหม
trusktr

1
จี้ไม่เหมาะสมอย่างสมบูรณ์ (ยกเว้นว่าคำตอบนี้ googled ดี): คำตอบนี้ใช้ได้กับ Windows เช่นกัน เพื่อใช้netstatใน "โหมดต่อเนื่อง" ที่นั่น-cไม่ทำงาน คุณใช้ตัวเลขแทนต้องการnetstat -na 1 | find "[Scan_Host_IP_Addr]"ให้อัปเดตทุก ๆ1วินาที (ในตัวอย่างนี้) ( แหล่งที่มา )
ruffin

4
โพลนี้จึงไม่จับการเชื่อมต่อทั้งหมด
reinierpost

มีวิธีในการแสดงข้อมูลที่เป็นมิตรกับผู้ใช้เช่นชื่อโดเมนข้อมูลเกี่ยวกับ IP หรือไม่ บางทีใช้สคริปต์ที่กำหนดเอง
awm

@awm ดีที่จะทำได้straceในการกรองการค้นหาเนมเซิร์ฟเวอร์ (ไม่มีรายละเอียดนี่ไม่ใช่คำตอบที่สมบูรณ์) อีกวิธีหนึ่งคุณสามารถแสดง DNS ย้อนกลับของ IP ที่อยู่ในรายการnetstatโดยไม่nรวมตัวเลือกในคำตอบของฉัน
gertvdijk

11

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

หากคุณต้องการข้อมูลเพิ่มเติมเช่นระยะเวลาของการเชื่อมต่อและปริมาณข้อมูลที่แลกเปลี่ยนในทั้งสองทิศทางดังนั้นconntrackd(บน Linux) น่าจะเป็นตัวเลือกที่ดีที่สุด

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

สำหรับการแก้ปัญหาทั่วไปมากขึ้นคุณสามารถดูได้ที่สิ่งที่ต้องการargus, bro-ids, sancpหรือntopว่าเข้าสู่ระบบทุกประเภทของข้อมูลจากการเข้าชมพวกเขาสูดอากาศบนอินเตอร์เฟซ


8

ฉันได้พยายามพวงของเครื่องมือรวมทั้งiftop, ntop, iptrafและแน่นอนในตัวที่มีประโยชน์มากnetstat -tupln(ตัวเลือกการสนับสนุนเป็น OS ขึ้นอยู่) แต่ในทางปฏิบัติมากที่สุดสำหรับกรณีการใช้งานของฉันเปิดออกมาเป็นnethogs- มันมวลรวมการเชื่อมต่อโดยมีต้นกำเนิด แอพและมีเสียงรบกวนน้อยที่สุด

ติดตั้งผ่าน:

sudo apt-get install nethogs

เรียกใช้เป็นราก:

sudo nethogs

หากเป้าหมายของคุณคือเห็นการเชื่อมต่อ TCP ทั้งหมดที่เริ่มต้นโดยแอปใด ๆ คุณสามารถใช้:

sudo tcpdump -i lo -A | grep Host:

6

สิ่งที่ฉันคิดว่าคุณต้องการทำคือรับรายการฟังพอร์ตจากนั้นลบพอร์ตเหล่านั้นออกจากการเชื่อมต่อ TCP อื่น ๆ จากนั้นจะเป็นการเชื่อมต่อขาออกทั้งหมด คำสั่ง ss (สถานะซ็อกเก็ต) แสดงผลคอลัมน์ "Local Address: Port" และ "Peer Address: Port" เราจำเป็นต้องลบพอร์ตฟังจากคอลัมน์ "Local Address: Port" และไม่ใช่คอลัมน์ "Peer Address: Port" มิฉะนั้นคุณอาจพลาดการเชื่อมต่อขาออก ดังนั้นเพื่อให้บรรลุว่าฉันใช้\s{2}+หลังสตริง ": $ port" ใน grep เพื่อจับคู่กับช่องว่างที่มีอยู่หลังคอลัมน์ "Local Address: Port"; คอลัมน์นั้นมีช่องว่างสีขาวสองช่องขึ้นไปด้านหลังโดยที่ "ที่อยู่เพียร์: พอร์ต" มีช่องว่างหนึ่งช่องและจากนั้นขึ้นบรรทัดใหม่ (grrr ... ควรมีบรรทัดใหม่ IMO\s+\s{2}+.) ปกติผมอาจพยายามที่จะใช้ฟังก์ชั่นการกรองของ SS, ss -tn state established '(sport != :<port1> and sport !=:<port2>)' src <ip address>เช่นเดียวกับ แต่ปรากฏว่ามีข้อ จำกัด เกี่ยวกับความยาวของสตริงที่สามารถระเบิดมันออกมาในระบบที่ฉันมีพอร์ตการฟังจำนวนมาก ดังนั้นฉันจึงพยายามทำสิ่งเดียวกันกับ grep ฉันเชื่อว่าสิ่งต่อไปนี้จะได้ผล:

FILTER=$(ss -tn state listening | gawk 'NR > 1 {n=split($3,A,":"); B[NR-1]=A[n]} END {for (i=1; i<length(B); i++) printf ":%s\\s{2}+|", B[i]; printf ":%s\\s{2}+", B[i]}')

ss -tn state established dst :* | grep -P -v "$FILTER"

หมายเหตุสิ่งนี้ขึ้นอยู่กับรุ่นของเอสเอสที่คุณใช้รุ่นเก่า (เช่น: ยูทิลิตี้เอสเอส iproute2-ss111117) มีรูปแบบเอาต์พุตที่แตกต่างกันดังนั้นคุณอาจต้องใช้ $ 3 แทน $ 4 ใน awk หมายเหตุss -tlnและss -tn state listeningให้ผลลัพธ์ที่แตกต่างซึ่งเป็นเรื่องง่ายสำหรับฉัน YMMV

ฉันพบโซลูชันที่สวยงามกว่าเล็กน้อยซึ่งไม่ต้องการรู้ว่าโฮสต์ IP ss -tn state established dst :*ทำงานได้ดีฉันปรับเปลี่ยนบรรทัดคำสั่งด้านบน


คุณช่วยเพิ่มคำอธิบายเกี่ยวกับการทำงานของมันได้ไหม ( แก้ไขคำตอบไม่โพสต์ข้อมูลที่อธิบายอย่างชัดเจนในความคิดเห็น) ฉันคิดว่าฉันได้หาคำตอบบางส่วนแล้ว ดูเหมือนว่ามันอาจต้องใช้งานเพิ่มอีกนิด ฉันวิ่งss -tn state listeningบนโฮสต์ที่รันเซิร์ฟเวอร์ FTP และโดยธรรมชาติคำสั่งแสดงให้เห็นว่าเครื่องกำลังฟังพอร์ต 21 ดังนั้นไม่ได้หมายความว่าegrep -vจะกรองโฮสต์ระยะไกลใด ๆ ที่มีที่อยู่ IP รวมถึง "21" (รวมถึง "210" "," 211 "," 212 ", ... )? นอกจากนี้ยังเป็นasortสิ่งจำเป็นจริงๆหรือเพียงแค่ตกแต่งหน้าต่าง?
G-Man

ฉันต้องแก้ไขสิ่งทั้งหมดให้สวยมากสคริปต์ที่แก้ไขอยู่ด้านบน
Dale

ในที่สุดมันจะดีกว่ามากถ้าเอสเอสหรือเน็ตสแตทเพิ่งรวมฟังก์ชั่นนี้ไว้ ทำss --outเพื่อรับรายการการเชื่อมต่อขาออก
Dale

ดีฉันชอบคำตอบนี้ ฉันจะลองใช้เมื่อฉันกลับไปปรับปรุงความปลอดภัยบนเซิร์ฟเวอร์ของฉัน : D
trusktr

ดูเหมือนว่าสิ่งนี้สามารถใช้กับ UDP ได้เช่นกัน แต่คุณต้องใช้ค่าสถานะและสถานะที่แตกต่างกันแน่นอน
Dale

4

tcpdumpช่วยให้คุณเห็นการรับส่งข้อมูล IP ทั้งหมดที่ไหลเข้า / ออกจากอินเทอร์เฟซเฉพาะพร้อมความสามารถในการกรองตามเกณฑ์ที่กำหนด tcpdumpโดยทั่วไปแล้วจะติดตั้งบนระบบ * nix ส่วนใหญ่โดยปกติแล้วหากไม่มีพอร์ตที่จะใช้สำหรับ distro เฉพาะของคุณ


2

netstat เป็นตัวเลือกที่ดีใช้พารามิเตอร์ตามต้องการ (ดู man page) ตัวอย่างเช่น

netstat -antup

ที่นี่สามารถตรวจสอบกระบวนการทั้งหมด (a) การฟังตัวเลข (n) tcp (t) และกระบวนการ udp (u) (p)

คุณยังสามารถลองssคำสั่ง สำหรับใช้อ้างอิง:

ข้อมูลเครือข่ายและซ็อกเก็ต SS Linux TCP / UDP


1

หากคุณเรียกใช้ Solaris หรืออนุพันธ์ลองดูที่conntrack


Nice นั่นยังมีอยู่ใน Arch Linux: archlinux.org/packages/community/i686/conntrack-tools - คุณช่วยให้ตัวอย่างของวิธีที่คุณใช้ conntrack เพื่อดูเฉพาะการเชื่อมต่อที่เริ่มต้นจากท้องถิ่น แต่ไม่ใช่การเชื่อมต่อที่เริ่มต้นจากที่อื่น?
trusktr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.