วิธีง่ายๆในการ "แก้ไข" การรับส่งข้อมูลที่มาจากโฮสต์ tcp (linux)


9

ฉันต้องทำการปรับเปลี่ยนเล็กน้อยเพื่อทราฟฟิกขาเข้าจากโฮสต์ tcp ที่รู้จัก: พอร์ตก่อนกระบวนการที่จัดการการเชื่อมต่อจะได้รับกระแสข้อมูล

ตัวอย่างเช่นให้ 192.168.1.88 เป็นรีโมตโฮสต์ที่รันเว็บเซิร์ฟเวอร์
ฉันต้องการสิ่งนั้นเมื่อกระบวนการในโลคัลโฮสต์ของฉันรับข้อมูลจาก 192.168.1.88:80 (เช่นเบราว์เซอร์) ข้อมูลจะถูกเปลี่ยนก่อนแทนที่text-Aด้วยtext-Bเช่นนี้

  • 127.0.0.1: ... เชื่อมต่อกับ 192.168.1.88:80
  • 127.0.0.1: ... ส่งไปที่ 192.168.1.88:80:

    GET /
    
  • 192.168.1.88:80 ส่งไปที่ 127.0.0.1: ... :

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-A, some other text
    
  • ข้อมูลนั้นถูกดักโดยระบบและส่งไปยังโปรแกรมที่มีเอาต์พุต:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-B, some other text
    
  • ระบบจะให้ข้อมูลที่เปลี่ยนแปลงดังนั้นกับการจัดการกระบวนการ 127.0.0.1: ... เช่นถ้ามันมาจาก 192.168.1.88:80

สมมติว่าฉันมีวิธีแบบสตรีมเพื่อทำการเปลี่ยนแปลงนี้ (โดยใช้sedตัวอย่าง) วิธีที่ง่ายที่สุดในการประมวลผลสตรีม tcp ที่เข้ามาล่วงหน้าคืออะไร

ฉันเดาว่าสิ่งนี้จะเกี่ยวข้องiptablesแต่ฉันไม่ค่อยเก่ง

โปรดทราบว่าแอปพลิเคชันควรรู้สึกถึงการจัดการกับโฮสต์เดิมดังนั้นการตั้งค่าพร็อกซีจึงไม่น่าเป็นทางออก


เป็นคำขอ HTTP เหล่านี้หรือไม่
พหุนาม

คำถามของคุณไม่ชัดเจนเพียงพอ คุณต้องให้รายละเอียดเพิ่มเติม
เลด

1
คุณไม่สามารถทำได้ในระดับแพ็กเก็ต หนึ่งแพ็คเก็ตอาจมี "text-" และถัดไปอาจมี "A" คุณจะต้องพัฒนาพร็อกซีที่มองไม่เห็นซึ่งเป็นไปตามโปรโตคอล (คุณต้องปฏิบัติตามโปรโตคอลเพราะถ้าคุณได้รับ "text-" และเป็นส่วนหนึ่งของ "text-A" ​​คุณต้องรออันต่อไปก่อนที่จะผ่านมันมิฉะนั้นตัวกรองของคุณจะไม่ทำงาน แต่ถ้ามันจบ จากข้อความเชิงตรรกะคุณไม่สามารถรอได้เพราะคุณจะรอตลอดไป) ฉันเชื่อว่าไม่มีวิธีง่ายๆในการทำเช่นนี้
David Schwartz

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

ฉันต้องการให้มันทำงานร่วมกับการตอบกลับ http เป็นหลัก แต่มันจะดีถ้ามันใช้ได้กับทุกเลเยอร์ของแอปพลิเคชัน
etuardu

คำตอบ:


21

ใช้การพร็อกซีแบบ netsed และ iptables

iptables -t nat -D PREROUTING -s yourhost -d desthost -p tcp --dport 80 -j REDIRECT --to 10101

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

netsed tcp 10101 desthost 80 s/text-A/text-B

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

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

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

  • กรณีใช้งานทั่วไปอื่น ๆ : การถ่ายโอนที่หลอกลวงการกรองเนื้อหาการแปลงโปรโตคอล - สิ่งที่เหมาะกับงานของคุณที่สุด


ง่ายและเจ๋งจริงๆ
mbrownnyc

ฉันไม่รู้netsedมันเหมาะอย่างยิ่งกับวัตถุประสงค์ของฉัน สิ่งเดียวที่ฉันไม่ได้รับคือวิธีการตั้งค่า "local transparent proxy" (ดูคำถาม) บางทีฉันควรตั้งค่าอินเทอร์เฟซเครือข่าย (เสมือน) อื่นเพื่อรับสิ่งนั้น โดยวิธีการสำหรับตอนนี้นี่คือคำตอบที่น่าพอใจที่สุด
etuardu

คุณใช้เคอร์เนลการกระจายทั่วไปหรือไม่? หากคุณเป็นผู้สนับสนุน iptables ก็อาจจะได้รับการคอมไพล์แล้วในการตั้งค่า proxy โปร่งใสคุณเพียงแค่กรอกรายละเอียดที่เหมาะสมสำหรับโฮสต์ / พอร์ตของคุณ ลองดูที่ readme และดูว่ามันเติมในรายละเอียดบางส่วนหรือไม่ silicone.homelinux.org/git/netsed.git/blob_plain/HEAD:/README
dfc

ฉันคิดว่ามุ้งจะทำงานได้ครั้งละหนึ่งแพ็คเก็ตเท่านั้น? ดังนั้นหากคำขอ http ถูกแบ่งข้ามสองแพ็กเก็ต regex สำหรับการทดแทนจะไม่ตรงกันและคำขอจะถูกส่งไปยังเซิร์ฟเวอร์ที่ไม่ได้แก้ไข
paulos

1
ตกลงตอนนี้เพียงในกรณีที่มีคนต้องการนี้หนึ่งวัน: ไม่ใช่ว่าผมเข้าใจมัน แต่จริง ๆ แล้วการปรับเปลี่ยนแพ็คเก็ตขาออก (ซึ่งเป็นสิ่งที่สหกรณ์ไม่ต้องการที่จะทำ) คุณจะมีการปรับเปลี่ยนไม่ได้OUTPUT PREROUTINGนอกจากนี้-Dตัวเลือกจะต้องมี-A สำหรับฉัน นอกจากนี้ยังมีสำหรับ-jตัวเลือกที่ผมต้องใช้หรือDNAT --to-destination (ip) REDIRECT --to-portในที่สุดฉันไม่สามารถแก้ไขข้อผิดพลาดการแบ่งส่วนของตาข่าย ดูเพิ่มเติมที่: ubuntuforums.org/showthread.php?t=2337389
phil294


3

iptables+ การใช้libnetfilter_quเป็นอีกตัวเลือกหนึ่งที่จะทำสิ่งที่คุณต้องการ:

"... [reinject] เปลี่ยนแพ็คเก็ตเป็นระบบย่อยเคอร์เนล nfnetlink_queue"

เป็นไปได้ว่าจะให้ความสามารถในการขยายที่มากที่สุดเนื่องจากขึ้นอยู่กับซอฟต์แวร์โค้ด

มีเสื้อคลุมหลามไว้ให้ด้วย


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