การคัดลอกแพ็คเก็ตจากอินเทอร์เฟซไปยังอีก


9

ฉันมีระบบลีนุกซ์ (ปล่อยให้เป็น A) ด้วยการ์ดอีเธอร์เน็ต 2 ใบคือ eth0 และ eth1 ซึ่งเชื่อมต่อกับ LAN ที่ไม่เกี่ยวข้องทั้งหมดสองตัว

โดยทั่วไปจะใช้ eth0 สำหรับแอปพลิเคชันปริมาณการใช้งานปกติและ eth1 จะใช้สำหรับการดีบักเท่านั้น การดีบักหมายความว่า eth1 เชื่อมโยงโดยใช้สายเคเบิลข้ามไปยังกล่อง linux อื่น (ปล่อยให้มันเป็น B) ซึ่งรัน Wireshark ฉันต้องการให้ Wireshark สามารถประมวลผลแพ็คเก็ตแอปพลิเคชั่นที่เดินทางบน eth0 ของ A

โดยทั่วไปฉันต้องการคัดลอกแพ็กเก็ตเดินทางจากอินเตอร์เฟส eth0 ไปยังอินเตอร์เฟส eth1 เพื่อให้ Wireshark บนกล่อง B สามารถดมกลิ่นได้ (ด้วยเหตุผลบางอย่างที่ฉันไม่สามารถเข้าถึง LAN eth0 ได้จริง) ฉันยังต้องระบุแพ็คเก็ตที่จะคัดลอกจาก eth0 ไปยัง eth1 ตามกฎบางอย่าง (ขึ้นอยู่กับเขตข้อมูล TCP / IP โดยวิธี)

โปรดทราบด้วยว่า eth0 ของ A ไม่จำเป็นต้องอยู่ในโหมด promiscuous เนื่องจากฉันต้องการคัดลอกชุดย่อยของแพ็กเก็ตที่มี A เป็นปลายทางเท่านั้น

มีวิธีการใช้ iptables เพียงอย่างเดียวหรือไม่ หรือฉันต้องเขียนแอปพลิเคชันเพื่อใช้งานนี้หรือไม่? ฉันควรทำอย่างไรเพื่อ "คัดลอก" แพ็คเก็ต?

คำตอบ:



4

คุณสามารถใช้ tc mirred action ตัวอย่างเช่น: สำหรับการรับส่งข้อมูลขาเข้า:

tc qdisc add dev eth0 ingress
tc filter add dev eth0 parent ffff: \
   protocol all prio 2 u32 \
   match u32 0 0 flowid 1:1 \
   action mirred egress mirror dev eth1

สำหรับการรับส่งข้อมูลขาออก:

tc qdisc replace dev eth0 parent root handle 10: prio
tc filter add dev eth0 parent 10: \
   protocol all prio 2 u32 \
   match u32 0 0 flowid 10:1 \
   action mirred egress mirror dev eth1

3

ค้นหา net สำหรับ tcpbridge ซึ่งเป็นสิ่งที่ Job ต้องการ มันสามารถใช้เพื่อพูดคุยกับเครื่องเสมือนเช่นกัน


1

บางอย่างเช่นrinetd อาจใช้งานได้ (ตัวเปลี่ยนเส้นทาง / เซิร์ฟเวอร์สำหรับ TCP เท่านั้นฉันเชื่อว่าไม่มี ARP, Layer 2, ฯลฯ ) แต่ด้วยความซื่อสัตย์สุจริตทั้งหมดการได้รับสวิตช์ที่จัดการบางตัวที่มีความสามารถในการมิเรอร์พอร์ตหรือถ้าใช้กล่องนี้ คุณสามารถเพิ่ม NIC อีกอันเชื่อมระหว่างสองอินเตอร์เฟสวางไว้หน้าเครื่องของ eth0 และมีเครื่องดมกลิ่นโดยเฉพาะ


1

อุปกรณ์ที่คัดลอกเฟรมอีเธอร์เน็ตจากอินเตอร์เฟซหนึ่งไปยังอีกคือบริดจ์ คุณสามารถกำหนดค่าระบบ Linux เพื่อทำหน้าที่เป็นบริดจ์ เอกสารบางอย่างสามารถพบได้ที่นี่:

คุณสามารถนำกฎการกรองไปใช้กับบริดจ์ทราฟฟิกโดยใช้ebtablesซึ่งเป็นแบบอนาล็อกของทราฟiptablesฟิกเลเยอร์ 2


0

ในทราฟฟิกการตั้งค่ามัลติคาสต์ TX ของฉันถูกทำเครื่องหมายด้วย iptables แต่การกำหนดเส้นทางนโยบายโดยใช้ตารางเส้นทางใหม่ไม่ทำงาน แม้ว่าจะใช้งานได้กับ unicast TX packets (การเปลี่ยนเส้นทางแพ็กเก็ตต้นทางจาก eth0 เป็น eth5) การใช้ tc ฉันสามารถรับทราฟฟิก eth0 mcast เป็น eth5 src mac และที่อยู่ ip ของ src ได้เปลี่ยนไปแล้วที่ eth5 ดังนั้นจะไม่มีปัญหาในการเรียนรู้ของสวิตช์ การสนับสนุนเคอร์เนลทั้งหมดสำหรับการกำหนดเวลาแพ็คเก็ตเคอร์เนล CONFIG_NET_SCHED ต้องเปิดใช้งาน

ทำงานด้านล่างสำหรับการรับส่งข้อมูลแบบหลายผู้รับและแบบหลายผู้รับที่เปลี่ยนเส้นทางจาก eth0 เป็น eth5

Netfilter สามารถใช้เพื่อโต้ตอบโดยตรงกับโครงสร้างที่แสดงถึงแพ็กเก็ตในเคอร์เนล โครงสร้างนี้ sk_buff ประกอบด้วยเขตข้อมูลที่เรียกว่า“ __u32 nfmark” ที่เรากำลังจะแก้ไข TC จะอ่านค่านั้นเพื่อเลือกคลาสปลายทางของแพ็กเก็ต

IP_ADDR_ETH0 = ifconfig eth0 | grep 'inet addr'| cut -d ':' -f 2 | cut -d ' ' -f 1 | tr -d '\n' iptables -t mangle -A เอาท์พุท -s $ {IP_ADDR_ETH0} -p udp - จับคู่หลายพอร์ต - กีฬา 329,330 -o eth0 -j มาร์ค - ชุดเครื่องหมาย 2

จะสร้างแผนภูมิที่แสดงถึงนโยบายการจัดตารางเวลาของเราและใช้ PRIO qdisc (ตัวจัดตารางเวลาแพ็คเก็ต) (สามารถลองใช้รายการอื่นที่มีอยู่) qdiscs ติดที่รากของอุปกรณ์

tc qdisc เพิ่ม dev eth0 root handle 15: prio

ตอนนี้มีนโยบายการจัดทำทราฟฟิกด้านหนึ่งและอีกด้านหนึ่งที่ทำเครื่องหมายแพ็คเก็ต ในการเชื่อมต่อทั้งสองเราจำเป็นต้องมีตัวกรอง

อ้างอิง man tc-mirred (8): การกระทำที่อนุญาตให้ทำมิเรอร์แพ็กเก็ต (คัดลอก) หรือเปลี่ยนเส้นทาง (ขโมย) แพ็กเก็ตที่ได้รับ การทำมิเรอร์เป็นสิ่งที่บางครั้งเรียกว่า Switch Port Analyzer (SPAN) และมักใช้ในการวิเคราะห์และ / หรือกระแสการดีบัก

อ้างอิง man tc-fw (8): fw - fwmark กรองการควบคุมการจราจรตัวกรอง fw ช่วยให้การจำแนกแพ็คเก็ตขึ้นอยู่กับการตั้งค่า fwmark ก่อนหน้านี้โดย iptables หากเหมือนกันกับ 'จุดจับ' ของตัวกรองตัวกรองจะจับคู่ iptables อนุญาตให้ทำเครื่องหมายแพ็คเก็ตเดียวกับเป้าหมายของ MARK หรือการเชื่อมต่อทั้งหมดโดยใช้ CONNMARK

MAC_ADDR_ETH1 = cat /sys/class/net/eth1/address IP_ADDR_ETH1 = ifconfig eth1 | grep 'inet addr'| cut -d ':' -f 2 | cut -d ' ' -f 1 | tr -d '\n' ตัวกรอง tc เพิ่ม dev eth0 parent 15: 0 โปรโตคอล ip prio 1 จัดการการเปลี่ยนเส้นทาง 0x2 fw การกระทำที่ผิดพลาด dev eth1

แสดงกฎที่ตั้งไว้ด้านบน: tc qdisc แสดง dev eth0 tc filter แสดง dev eth0

ลบ / unset เหนือกฎชุด: tc qdisc del dev eth0 root

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