ฉันมีระบบแบ็กเอนด์ที่ใช้กับอุปกรณ์ IOT ซึ่งใช้โปรโตคอล UDP ในการสื่อสาร และมี API ที่ใช้ TCP (HTTP2) บางตัวสำหรับแอปมือถือจากแบ็กเอนด์เดียวกัน
ฉันกำลังพยายามสร้างคุณลักษณะการอัปเดตแบบต่อเนื่องเพื่อเปิดใช้งานการแพตช์บริการแบ็กเอนด์ที่หยุดทำงานเป็น 0
การตั้งค่าของฉันเป็นแบบนี้
แทนที่จะเปิดเผยซ็อกเก็ตไปยังแอปโดยตรง ฉันกำลังพยายามใช้พร็อกซีแบบโปร่งใสกับกระบวนการของฉัน ฉันได้เปิดเผย 2 ซ็อกเก็ต (1 udp และ 1 tcp) กับอินเทอร์เน็ตสาธารณะโดยใช้ไฟร์วอลล์
เซิร์ฟเวอร์ที่ใช้งานจริงของฉันกำลังเปิดชุดพอร์ตที่แตกต่างกันสำหรับ udp และ tcp (ซึ่งสามารถเปลี่ยนแปลงได้ผ่านตัวแปรสภาพแวดล้อมโดยไม่ต้องเปลี่ยนไบนารีพื้นฐาน)
ขั้นตอนที่ 1:
ฉันกำลังพยายามสร้างพร็อกซีโปร่งใสในเครื่องเดียวกันจากพอร์ต udp 16002 ถึง 17002 สำหรับ udp เซิร์ฟเวอร์ของฉันจะเริ่มต้นการสื่อสารบางอย่างกับอุปกรณ์ในไวด์ด้วย เซิร์ฟเวอร์ควรเห็น IP/พอร์ตต้นทาง รวมทั้งสื่อสารกลับกับอุปกรณ์เหล่านี้ซึ่งอาจอยู่ภายใต้ NAT บางตัว (โดยทั่วไปคือเราเตอร์ WiFi) โดยเคารพนโยบายแหล่งกำเนิดเดียวกันของ NAT
และเช่นเดียวกันสำหรับ tcp จากพอร์ต 16012 ไปยังพอร์ต 17012
นี่คือการปรับใช้ทั่วไปโดยการทำพอร์ตจริงให้อยู่ภายนอก
ฉันไม่สามารถทำงานนี้ได้
ขั้นตอนที่ 2:
เมื่อใดก็ตามที่มีโค้ดใหม่ที่ต้องแพตช์ ฉันต้องการนำโค้ดใหม่มาแสดงบนพอร์ตสองชุดที่ต่างกันดังภาพด้านล่าง (P2 - กระบวนการที่ 2)
เมื่อกระบวนการที่ 2 เริ่มทำงาน ฉันจะเปลี่ยนการแมปที่อยู่ IP เป็นกระบวนการใหม่ (P2) หลังจากให้เวลา P1 เสร็จสิ้นการดำเนินการ IO ที่ค้างอยู่ เราจะนำกระบวนการ P1 ลงมา
สำหรับแพตช์ต่อไป เราจะนำเสนอ P1' และกระบวนการผกผัน
มีข้อบกพร่องในการออกแบบนี้หรือไม่? สิ่งนี้สามารถทำได้ในทางเทคนิคโดยใช้ iptables และ tproxy หรือเครื่องมือ linux อื่น ๆ หรือไม่
ฉันได้พิจารณาสร้างเราเตอร์ L7 และถ่ายทอดแพ็กเก็ตไปมาโดยกำหนดวัตถุระดับสูง แต่ฉันสงสัยว่าสามารถทำได้โดยใช้การกำหนดเส้นทางระดับต่ำ L3/L4 หรือไม่ เนื่องจากสามารถทดสอบประสิทธิภาพและการต่อสู้ได้ดีกว่า แน่นอนว่าเครื่องมือ nft, iptables เหล่านี้มีปัญหาด้านการใช้งานและใช้งานไม่ได้ง่ายนัก โดยเฉพาะ nft สำหรับนักพัฒนา