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

ค่ามาจากเซิร์ฟเวอร์ ไม่ใช่จากอุโมงค์

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

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

จำความต่างนี้ไว้ก่อนจะเทียบบันทึกสองฉบับ คุณอาจกำลังเทียบคำขอหน้าเว็บกับฮุก ซึ่งไม่ใช่การเปรียบเทียบเลย ตรวจบริบทการทำงานก่อน แล้วจึงตรวจที่อยู่

ไล่เส้นทางของคำขอก่อนจะเชื่อตัวเลข

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

เส้นทางทั่วไปสี่แบบให้การสังเกตที่แตกต่างกันสี่แบบ

Path to the listenerWhat can be reported
Client routed straight to the private listener, no translationThe client's tunnel address
Gateway translates the source before forwardingThe gateway's translated address
Reverse proxy terminates the client and opens its own backend connectionThe proxy's backend address
Load balancer in front of two proxiesWhichever hop the server treats as its peer

จดเส้นทางพร้อมชื่อปลายทาง ตระกูลที่อยู่ และทุกจุดที่มีการแปลที่อยู่ หากไม่มีแผนที่นั้น ค่าที่ถูกและค่าที่ผิดจะดูเหมือนกันบนบรรทัดบันทึก บรรทัดแผนภาพสองบรรทัดช่วยประหยัดการถกเถียงครึ่งวัน

การแทนที่จะเกิดขึ้นเฉพาะที่ที่มีการกำหนดค่าไว้

เซิร์ฟเวอร์หรือเฟรมเวิร์กอาจแทนที่ที่อยู่ของไคลเอนต์โดยเจตนา โมดูล remote-IP ของ Apache และโมดูล real-IP ของ NGINX ทำเช่นนี้ทั้งคู่ และค่าที่ PHP ได้รับขึ้นอยู่กับการกำหนดค่านั้นรวมถึงพารามิเตอร์ที่ส่งให้ตัวจัดการสคริปต์

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

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

อย่าอ่านส่วนหัวการส่งต่อด้วยความไว้ใจ

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

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

ที่อยู่ที่พร็อกซีรายงานก็ไม่เปลี่ยนแหล่งที่มาของแพ็กเก็ตที่ไฟร์วอลล์ชั้นบนมองเห็น เก็บเมทาดาทา HTTP และการกรองเครือข่ายเป็นสองการสังเกตแยกกัน เพราะมันตอบคำถามคนละข้อ

ใช้ตัวตนของแอปในการตัดสินใจ

สำหรับการเข้าถึงบันทึกของผู้ใช้ ให้พึ่งพาตัวตนที่ผ่านการรับรองและกฎการอนุญาตของแอป ที่อยู่ภายในสามารถจัดสรรใหม่ได้ และที่อยู่ที่แปลแล้วหนึ่งรายการอาจแทนผู้ใช้พร้อมกันหลายร้อยคน ไม่มีคุณสมบัติใดในสองข้อนี้ที่การตรวจที่อยู่จะแก้ไขได้

หากฝ่ายปฏิบัติการต้องผูกคำขอเข้ากับเซสชัน VPN ให้เชื่อมที่อยู่ที่สังเกตได้และตราเวลากับบันทึกเซสชันที่เป็นทางการตามแบบจำลองการแปลที่คุณจัดทำเอกสารไว้ การทำเช่นนั้นให้ความเชื่อมโยงที่คุณปกป้องได้ ส่วนที่อยู่เพียงอย่างเดียวทำไม่ได้

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

บทความที่เกี่ยวข้อง