ตรวจสอบ TCP Traffic บนพอร์ตเฉพาะ


49

ฉันค้นหาสิ่งนี้อย่างกว้างขวาง แต่ดูเหมือนจะไม่สามารถเกิดขึ้นกับตัวอย่างการทำงานได้

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

ฉันหมดแล้ว netstat, nmap และ tcptrack แต่ไม่มีการประทับเวลาสนับสนุน

ฉันคิดว่าสคริปต์ linux shell อาจใช้งานได้หากฉันตรวจสอบพอร์ตเฉพาะและเขียนข้อความไปยังไฟล์เมื่อทำการเชื่อมต่อจากนั้นเพียงเชื่อมต่อวันที่ในแต่ละบรรทัด

ฉันกำลังเล่นกับสิ่งนี้:

netstat -ano|grep 443|grep ESTABLISHED

เช่นนี้:

tcptrack -i eth0 port 443

แต่ไม่เหมาะกับความต้องการของฉันเพราะฉันต้องการเวลาที่การเชื่อมต่อเข้ามาที่

หากคุณมีข้อเสนอแนะใด ๆ หรือสามารถชี้ฉันในทิศทางที่ถูกต้องมันจะได้รับการชื่นชมอย่างมาก

ขอบคุณ :)

linux  bash 

ฮ่า ๆ อพยพมาจาก stackoverflow แต่ต้องโยกย้ายไปที่ยูนิกซ์ / ลินุกซ์
Kolob Canyon

คำตอบ:


70

แก้ไข : ฉันยังได้รับการโหวตในอีกหลายปีต่อมา โปรดอย่าตอบคำถามนี้คำตอบที่ใช้ในiptablesที่นี้ดีกว่าความคิดของฉัน


tcpdump port 443 and '(tcp-syn|tcp-ack)!=0'

หรือเท่านั้นtcp-synหรือเท่านั้นtcp-ack(ฉันเดาว่าจะเป็นอย่างนั้น) ขึ้นอยู่กับสิ่งที่คุณต้องการ


แทนที่จะแสดงชื่อโฮสต์สำหรับแต่ละการเชื่อมต่อจะมีวิธีแทนที่ด้วย IP หรือไม่

ใช่เพิ่ม-nหลังจาก tcpdump (man tcpdump: -n อย่าแปลงที่อยู่ (เช่นที่อยู่โฮสต์หมายเลขพอร์ต ฯลฯ ) เป็นชื่อ )
Wrikken

5
ฉันขอยืนยันว่าการส่งสแปมบันทึกของเคอร์เนลนั้นไม่ได้เหนือกว่าจริงๆ ;)
Daniel B

1
Ah แต่ผมจะให้หนึ่งต้องกำหนดค่าที่บันทึกซึ่งควรจะไปแน่นอน: P แต่เดี๋ยวก่อนคำตอบนี้ยังอยู่ที่นี่ถ้าที่ฝ่าฝืนข้อตกลง :)
Wrikken

1
@ Wrikken ปัญหาเกี่ยวกับการใช้เคอร์เนลบันทึกสิ่งนี้คือการใช้โซลูชันของคุณเมื่อคุณ ctrl + c จาก tcpdump ทุกอย่างยังคงเหมือนเดิม วิธีการแก้ปัญหา iptables หมายถึงการปล่อยให้ "แปลกใจ" ที่อยู่เบื้องหลังถ้าคุณไม่ได้ลบกฎด้วยตนเอง ความประหลาดใจนี้สามารถแปลว่ามีดิสก์รูตแบบเต็มในเวลาไม่นาน ขออภัยฉันกำลังอัปเดตสิ่งนี้ (:
John Blackberry

31

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

เพิ่มกฎ iptables ด้วยสิ่งต่อไปนี้:

sudo iptables -I INPUT -p tcp --dport 443 --syn -j LOG --log-prefix "HTTPS SYN: "

(ปรับ-I INPUTส่วนให้เหมาะกับรสนิยมของคุณ)

เมื่อกฎถูกทริกเกอร์รายการ syslog จะถูกปล่อยออกมาโดยเคอร์เนล ตัวอย่างเช่นด้วยกฎอินพุตรายการบันทึกอาจมีลักษณะดังนี้:

5 ธ.ค. 09:10:56 เคอร์เนลชื่อโฮสต์: [1023963.185332] HTTPS SYN: IN = ifX OUT = MAC = 80: 80: 80: 80: 80: 80: 80: 80: 80: 80: 80: 80: 08: 00 SRC = ABCD DST = WXYZ LEN = 52 TOS = 0x00 PREC = 0x20 TTL = 119 ID = 11901 DF PROTO = TCP SPT = 37287 DPT = 443 WINDOW = 8192 SYN = 0x00 SYN URGP = 0

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

โปรดทราบว่าLOGเป้าหมายนั้นเป็นเป้าหมายที่ไม่สิ้นสุดซึ่งหมายความว่ากฎใด ๆ ที่ตามมาจะยังคงได้รับการประเมินและแพ็คเก็ตจะไม่ถูกปฏิเสธหรือยอมรับโดยกฎ LOG เอง สิ่งนี้ทำให้LOGเป้าหมายมีประโยชน์สำหรับการดีบักกฎไฟร์วอลล์

เพื่อหลีกเลี่ยงการบันทึกของคุณท่วมขังให้พิจารณาใช้limitโมดูลร่วมกับสิ่งนี้ ดูหน้า iptables (8) man สำหรับรายละเอียด


เป็นไปได้หรือไม่ที่จะเรียกใช้งานสคริปต์ไพ ธ อน
Karl Zillner

อย่าลืมลบกฎตาราง IP เหล่านี้เมื่อคุณทำเสร็จมิฉะนั้นพวกเขาจะสแปมบันทึกค่อนข้างมากขึ้นอยู่กับกฎ digitalocean.com/community/tutorials/…
Mo Beigi

26

ความละเอียดระดับไมโครวินาที

ตามค่าเริ่มต้นยูทิลิตีtcpdumpจะรายงานเวลาด้วยความละเอียดไมโครวินาที ตัวอย่างเช่น:

$ sudo tcpdump -i any port 443

จะแสดงผลลัพธ์ที่คล้ายกับที่แสดงต่อไปนี้:

12: 08: 14.028945 IP localhost.33255> localhost.https: แฟล็ก [S], seq 1828376761, ชนะ 43690, ตัวเลือก [mss 65495, sackOK, TS val 108010971 ecr 0, nop, wscale 7], ความยาว 0
12:08: 14.028959 IP localhost.https> localhost.33255: Flags [R. ], seq 0, ack 1828376762, ชนะ 0, ความยาว 0

ดูที่ tcpdump (8) สำหรับรายการตัวเลือก tcpdump ทั้งหมดและ pcap-filter (7) สำหรับไวยากรณ์ทั้งหมดของตัวกรองที่คุณสามารถใช้ได้


5

443 เป็นการเข้ารหัสทราฟฟิก - ยากที่จะทำให้หัวหรือก้อยของทราฟฟิกบนพอร์ตนี้อย่างไรก็ตาม:

คุณทำได้

yum install ngrep หรือ apt-get install ngrep

จากนั้นเรียกใช้

ngrep -W byline -d any port 443 -q

2

คุณอาจต้องการสิ่งนี้เพื่อตรวจสอบแพ็คเก็ตขาเข้าและขาออกจากเครื่องอื่น ๆ

tcpflow -i eth0 -c port 7891

(ตัวเลือก-iสำหรับการกล่าวถึงเครือข่ายตัวเลือก-cในการพิมพ์แพ็คเก็ตในคอนโซล)


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


0

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

ตรวจสอบข้อมูลนี้เพิ่มเติมได้ที่: https://github.com/firehol/netdata/wiki/You-should-install-QoS-on-all-your-servers


ฉันจะบอกว่านี่เป็นเพียงการฆ่าเพียงเล็กน้อยสำหรับการเชื่อมต่อกับที่ซึ่ง iPTables + --log จะทำงาน
djsmiley2k - CoW

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