REMOTE_ADDR ของ PHP บอกอะไรคุณจริง ๆ เมื่ออยู่หลัง VPN
นี่คือค่าที่เว็บเซิร์ฟเวอร์ของคุณให้มา ไม่ใช่การสอบถามเข้าไปในอุโมงค์ ไล่เส้นทางของคำขอ ตรวจสอบว่าใครเขียนทับได้ และเก็บตัวตนไว้ในแอป
มีคนถามว่าทำไมผู้ใช้ VPN ถึงปรากฏในบันทึกของแอปด้วยที่อยู่ที่เป็นของเกตเวย์ หรือด้วยที่อยู่ที่เปลี่ยนไปหลังมื้อเที่ยง คำตอบเริ่มจากสิ่งนี้คืออะไร: รายการที่เว็บเซิร์ฟเวอร์ใส่ไว้ในสภาพแวดล้อมของคำขอ มันไม่ใช่การสอบถามเข้าไปในอุโมงค์ ไม่ใช่ตัวตนของใบรับรอง และไม่ใช่คำสัญญาว่าเลขนี้เป็นของคนคนเดียว การอ่านมันเป็นหนึ่งในสามอย่างนั้นจะให้คำตอบที่มั่นใจแต่ผิดในแบบต่าง ๆ
ค่ามาจากเซิร์ฟเวอร์ ไม่ใช่จากอุโมงค์
PHP ได้รับสภาพแวดล้อมของคำขอจากสิ่งที่รันสคริปต์ เอกสารอ้างอิงตัวแปรเซิร์ฟเวอร์ของ PHP อธิบายรายการเหล่านี้ว่าถูกสร้างโดยเว็บเซิร์ฟเวอร์ และความพร้อมใช้งานขึ้นอยู่กับว่าคำขอเข้ามาอย่างไร
สคริปต์ที่รันเป็นฮุกบรรทัดคำสั่งของ VPN เป็นบริบทการทำงานที่ต่างออกไปโดยสิ้นเชิง มันไม่มีคำขอเว็บ ไม่มีซ็อกเก็ตไคลเอนต์ และไม่มี REMOTE_ADDR นั่นคือเหตุผลที่โค้ดเว็บที่คัดลอกไปไว้ในฮุกให้ค่า ว่างแทนที่จะให้ค่าที่ผิด ฮุกมีสภาพแวดล้อมของตัวเองที่เดมอนเติมให้ และมีเอกสารแยกต่างหาก การเอื้อมไปหา REMOTE_ADDR ที่นั่นคือการเอื้อมไปหาตัวแปรที่ไม่เคยถูกกำหนด
จำความต่างนี้ไว้ก่อนจะเทียบบันทึกสองฉบับ คุณอาจกำลังเทียบคำขอหน้าเว็บกับฮุก ซึ่งไม่ใช่การเปรียบเทียบเลย ตรวจบริบทการทำงานก่อน แล้วจึงตรวจที่อยู่
ไล่เส้นทางของคำขอก่อนจะเชื่อตัวเลข
ที่อยู่ที่รายงานคือคู่สัญญาของการเชื่อมต่อที่เว็บเซิร์ฟเวอร์มองเห็น แทรกอะไรก็ตามระหว่างไคลเอนต์กับเซิร์ฟเวอร์นั้น แล้วคู่สัญญาจะเปลี่ยน การแปลที่อยู่ การสิ้นสุดการเชื่อมต่อ และการกระจายโหลด ต่างก็เลื่อนการสังเกตให้ห่างจากผู้ใช้ไปอีกหนึ่งช่วง
เส้นทางทั่วไปสี่แบบให้การสังเกตที่แตกต่างกันสี่แบบ
| Path to the listener | What can be reported |
|---|---|
| Client routed straight to the private listener, no translation | The client's tunnel address |
| Gateway translates the source before forwarding | The gateway's translated address |
| Reverse proxy terminates the client and opens its own backend connection | The proxy's backend address |
| Load balancer in front of two proxies | Whichever hop the server treats as its peer |
จดเส้นทางพร้อมชื่อปลายทาง ตระกูลที่อยู่ และทุกจุดที่มีการแปลที่อยู่ หากไม่มีแผนที่นั้น ค่าที่ถูกและค่าที่ผิดจะดูเหมือนกันบนบรรทัดบันทึก บรรทัดแผนภาพสองบรรทัดช่วยประหยัดการถกเถียงครึ่งวัน
การแทนที่จะเกิดขึ้นเฉพาะที่ที่มีการกำหนดค่าไว้
เซิร์ฟเวอร์หรือเฟรมเวิร์กอาจแทนที่ที่อยู่ของไคลเอนต์โดยเจตนา โมดูล remote-IP ของ Apache และโมดูล real-IP ของ NGINX ทำเช่นนี้ทั้งคู่ และค่าที่ PHP ได้รับขึ้นอยู่กับการกำหนดค่านั้นรวมถึงพารามิเตอร์ที่ส่งให้ตัวจัดการสคริปต์
ดังนั้น REMOTE_ADDR จึงไม่ใช่คู่สัญญา TCP ที่ไม่ถูกแตะต้องเสมอไป มันคือคู่สัญญาตามที่เซิร์ฟเวอร์เลือกจะรายงานหลังใช้นโยบายของตัวเอง ความต่างนี้ตัดสินว่าค่าเป็นหลักฐานหรือเป็นเพียงเครื่องประดับ
ถามเจ้าของเซิร์ฟเวอร์ว่าฟิลด์ใดเป็นทางการในการติดตั้งนี้ และคู่สัญญาต้นทางถูกเก็บไว้อย่างไรเมื่อมีการแทนที่ หากไม่มีใครตอบได้ บันทึกก็ยังไม่ได้พิสูจน์อะไร
อย่าอ่านส่วนหัวการส่งต่อด้วยความไว้ใจ
ผู้เรียกสามารถส่งส่วนหัวการส่งต่อมาเองได้ การถือรายการแรกที่คั่นด้วยจุลภาคเป็นที่อยู่ผู้ใช้ที่ผ่านการตรวจสอบ คือการตัดสินใจเชื่อใครก็ตามที่เชื่อมต่อ ซึ่งตรงกันข้ามกับจุดประสงค์ของส่วนหัว ส่วนหัวอธิบายห่วงโซ่ และมีเพียงชั้นที่เชื่อถือได้เท่านั้นที่รับรองห่วงโซ่นั้นได้
ใช้การสนับสนุนพร็อกซีที่เชื่อถือได้ของเซิร์ฟเวอร์หรือเฟรมเวิร์กโดยกำหนดห่วงโซ่พร็อกซีจริงไว้ และให้มันทิ้งค่าที่มาจากแหล่งนอกห่วงโซ่นั้น การแยกวิเคราะห์ที่เขียนเองคือที่ที่ความล้มเหลวน่าสนใจส่วนใหญ่อาศัยอยู่
ที่อยู่ที่พร็อกซีรายงานก็ไม่เปลี่ยนแหล่งที่มาของแพ็กเก็ตที่ไฟร์วอลล์ชั้นบนมองเห็น เก็บเมทาดาทา HTTP และการกรองเครือข่ายเป็นสองการสังเกตแยกกัน เพราะมันตอบคำถามคนละข้อ
ใช้ตัวตนของแอปในการตัดสินใจ
สำหรับการเข้าถึงบันทึกของผู้ใช้ ให้พึ่งพาตัวตนที่ผ่านการรับรองและกฎการอนุญาตของแอป ที่อยู่ภายในสามารถจัดสรรใหม่ได้ และที่อยู่ที่แปลแล้วหนึ่งรายการอาจแทนผู้ใช้พร้อมกันหลายร้อยคน ไม่มีคุณสมบัติใดในสองข้อนี้ที่การตรวจที่อยู่จะแก้ไขได้
หากฝ่ายปฏิบัติการต้องผูกคำขอเข้ากับเซสชัน VPN ให้เชื่อมที่อยู่ที่สังเกตได้และตราเวลากับบันทึกเซสชันที่เป็นทางการตามแบบจำลองการแปลที่คุณจัดทำเอกสารไว้ การทำเช่นนั้นให้ความเชื่อมโยงที่คุณปกป้องได้ ส่วนที่อยู่เพียงอย่างเดียวทำไม่ได้
สำหรับการวินิจฉัย ให้บันทึกเฉพาะไม่กี่ฟิลด์ที่จำเป็นแทนอาร์เรย์เซิร์ฟเวอร์ทั้งหมด ซึ่งอาจพกส่วนหัวและวัสดุยืนยันตัวตนไปด้วย ข้อสรุปที่มีประโยชน์บอกว่าค่านี้หมายถึงอะไรในการติดตั้งนี้ ไม่ใช่ว่าค่าใดดูเหมือนไคลเอนต์ที่สุด