ทำไม Plex รีโมทแอ็กเซสจึงล้มเหลวหลัง VPN และจะแก้ไขอย่างไร
Plex รีโมทแอ็กเซสหลัง VPN ต้องอาศัยสามข้อต่อ: การส่งต่อพอร์ตที่ผู้ให้บริการ การเปลี่ยนเส้นทาง pf ในเครื่อง และพอร์ตภายนอกเดียวกันที่พิมพ์ใน Plex
รีโมทแอ็กเซสจะเปลี่ยนเป็นใช้ไม่ได้ทันทีที่ VPN เข้าควบคุมเส้นทางเริ่มต้น ขณะที่เซิร์ฟเวอร์เดียวกันยังสตรีมไปยัง LAN ได้ตามปกติ ไม่มีสิ่งใดในบันทึกของ Plex อธิบายการเปลี่ยนแปลงนี้ เพราะ Plex ไม่ใช่ส่วนที่เสีย: มันเพียงประกาศที่อยู่ที่ทราฟฟิกไปไม่ถึงอีกต่อไป ผู้ให้บริการที่แบ่งที่อยู่สาธารณะหนึ่งรายการให้ลูกค้าหลายรายจะส่งต่อพอร์ตหนึ่งไปยังที่อยู่ tunnel ของคุณ และมีบางอย่างในเครื่องของคุณเองที่ยังต้องย้ายพอร์ตนั้นไปยังตัวรับฟังของ Plex ทั้งสามข้อต่อต้องตรงกันที่พอร์ตภายนอกเดียว ก่อนที่การทดสอบการเข้าถึงจะเปลี่ยนเป็นสีเขียว
ห่วงโซ่นี้มีสามข้อต่อ และ Plex เห็นเพียงข้อต่อสุดท้าย
ผู้ให้บริการเป็นเจ้าของที่อยู่สาธารณะและแมปพอร์ตหนึ่งของตนไปยังที่อยู่ tunnel ของคุณ เครื่องของคุณรับทุกอย่างที่มาถึงพอร์ตนั้นแล้วเปลี่ยนเส้นทางไปยังตัวรับฟังของ Plex ซึ่งปกติอยู่ที่พอร์ตลูปแบ็ก 32400 จากนั้น Plex จะได้รับหมายเลขพอร์ตภายนอก เพื่อให้การตรวจสอบของมันตรงกับสิ่งที่โลกภายนอกหมุนหา
ทำให้ข้อต่อใดข้อต่อหนึ่งขาด แล้วอินเทอร์เฟซเว็บจะรายงานว่ารีโมทแอ็กเซสใช้ไม่ได้ โดยไม่บอกใบ้ว่าข้อต่อใดล้มเหลว ความเงียบนี้คือเหตุผลที่ผู้คนรีสตาร์ตเซิร์ฟเวอร์ ติดตั้งแอปใหม่ และสลับการตั้งค่าซ้ำแล้วซ้ำเล่าโดยที่เข็มไม่ขยับ ทั้งสามข้อต่อล้มเหลวแยกจากกัน: การส่งต่อที่เล็งไปยังที่อยู่ tunnel เก่า การเปลี่ยนเส้นทางที่ครอบคลุมเฉพาะอินเทอร์เฟซ Ethernet และช่อง Plex ที่ยังคง 32400 ไว้ ทั้งหมดให้ข้อความสีแดงเหมือนกัน ทำงานจากตัวรับฟังออกไปด้านนอกแทนการเดา แล้วข้อต่อที่เสียมักจะบอกชื่อตัวเองภายในหนึ่งนาที
ข้อต่อแรก: ส่งต่อพอร์ตที่ผู้ให้บริการ VPN
เปิดหน้าส่งต่อพอร์ตของผู้ให้บริการและเพิ่มการแมป ผู้ให้บริการส่วนใหญ่ให้พอร์ตภายนอกแบบสุ่มและให้คุณเลือกพอร์ตภายใน ดังนั้นยอมรับการกำหนดและชี้ไปยังที่อยู่ tunnel ที่ไคลเอนต์ของคุณถืออยู่ตอนนี้ จดหมายเลขนั้นไว้ เพราะทุกขั้นตอนถัดไปจะทำซ้ำอย่างแม่นยำ
ผู้ให้บริการที่หมุนการแมปเมื่อเชื่อมต่อใหม่คือสาเหตุปกติที่การตั้งค่านี้อยู่ได้คืนเดียวแล้วตายไป บางรายให้คุณขอพอร์ตที่เสถียร บางรายกำหนดใหม่ทุกครั้งที่จับมือ ดังนั้นอ่านหน้าการแมปปัจจุบันก่อนแตะสิ่งอื่น
ข้อต่อที่สอง: เปลี่ยนเส้นทางพอร์ตด้วย pf anchor
บน macOS การเปลี่ยนเส้นทางอยู่ใน pf anchor หนึ่งกฎต่ออินเทอร์เฟซที่สามารถพาแพ็กเก็ตได้ เขียนกฎ tunnel ก่อนและกฎ Ethernet ตามหลัง โดยใช้พอร์ตภายนอกเดียวกันทั้งสอง มิฉะนั้นทราฟฟิกที่มาทาง Wi-Fi ระหว่างการสลับสำรองจะไม่ลงเอยที่ใดเลย
# /etc/pf.anchors/plex.forward
rdr pass on tun0 inet proto tcp from any to any port 41893 -> 127.0.0.1 port 32400
rdr pass on en0 inet proto tcp from any to any port 41893 -> 127.0.0.1 port 32400
ไฟล์ anchor เพียงอย่างเดียวไม่ทำอะไร การกำหนดค่าหลักต้องอ้างอิงและโหลดมัน ใส่สองบรรทัดนี้ใน /etc/pf.conf ก่อนกฎการเปลี่ยนเส้นทางที่มีอยู่ทั้งหมด จากนั้นโหลดใหม่และอ่านกลับว่าสิ่งที่เคอร์เนลยอมรับจริงคืออะไร
rdr-anchor "plex"
load anchor "plex" from "/etc/pf.anchors/plex.forward"
sudo pfctl -vnf /etc/pf.anchors/plex.forward
sudo pfctl -f /etc/pf.conf
sudo pfctl -s nat
ข้อร้องเรียนเรื่องไวยากรณ์เกี่ยวกับพอร์ตที่ไม่รู้จักหมายความว่ามีตัวยึดตำแหน่งรอดจากการแก้ไขของคุณ ตาราง nat ว่างหมายความว่า anchor ไม่เคยถูกโหลด และเนื่องจาก pf ไม่ได้เปิดใช้ตามค่าเริ่มต้นบน macOS ปัจจุบัน sudo pfctl -E จึงเป็นส่วนหนึ่งของการแก้ไข ไม่ใช่ส่วนเสริมที่เลือกได้ โหลด anchor ใหม่หลังทุกการรีบูตและหลังทุกการเปลี่ยนแปลงการแมป เก็บไฟล์ anchor ไว้ในระบบควบคุมเวอร์ชัน เพื่อให้การเปลี่ยนพอร์ตของผู้ให้บริการกลายเป็นการแก้ไขบรรทัดเดียว ไม่ใช่การค้นพบใหม่
ข้อต่อที่สาม: ปักหมุดพอร์ตเดียวกันภายใน Plex
ใน Plex เปิดการตั้งค่า จากนั้นเซิร์ฟเวอร์ จากนั้นรีโมทแอ็กเซส และทำเครื่องหมายในช่องที่ให้คุณระบุพอร์ตด้วยมือ ใส่พอร์ตภายนอกของผู้ให้บริการแทน 32400 จากนั้นปล่อยให้การทดสอบการเข้าถึงทำงาน เวอร์ชันใหม่ย้ายตัวควบคุมนี้ออกจากหน้า Connect แบบเก่า ดังนั้นดูใต้รีโมทแอ็กเซสหากช่องนี้ไม่อยู่ในที่ที่คู่มืออ้าง
การทดสอบจาก LAN ไม่พิสูจน์อะไรเลย แล็ปท็อปบน Wi-Fi เดียวกันเข้าถึงเซิร์ฟเวอร์ได้โดยตรง ดังนั้นการตรวจสอบจึงสำเร็จแม้ในขณะที่เส้นทางสาธารณะตายไปแล้ว ใช้โทรศัพท์ที่ใช้ข้อมูลเซลลูลาร์ หรือโฮสต์ใดก็ได้นอกเครือข่ายของคุณ แล้วหมุนที่อยู่สาธารณะและพอร์ตภายนอกจากที่นั่น
ยืนยันแต่ละข้อต่อก่อนโทษ Plex
เริ่มจากตัวรับฟังและทำงานออกไปด้านนอก หาก Plex ผูกกับที่อยู่ LAN เท่านั้น มันจะเพิกเฉยต่อการเปลี่ยนเส้นทางที่เล็งไปยังลูปแบ็ก ดังนั้นคำสั่งแรกคือคำสั่งที่พิสูจน์ว่ามันรับฟังที่ใด
sudo lsof -nP -iTCP:32400 -sTCP:LISTEN
จากนั้นพิสูจน์ว่าการเปลี่ยนเส้นทางมีอยู่และตรงกับพอร์ตที่คุณให้ผู้ให้บริการ ตาราง nat ควรแสดงพอร์ตภายนอกเดียวกันบนอินเทอร์เฟซทั้งสอง
sudo pfctl -s nat | grep 41893
nc -vz 203.0.113.42 41893
เรียกใช้คำสั่งสุดท้ายนั้นจากนอกเครือข่าย ไม่ใช่จาก Mac หากการเชื่อมต่อ TCP สำเร็จจากข้อมูลเซลลูลาร์ในขณะที่ Plex ยังแสดงว่าใช้ไม่ได้ แสดงว่าพอร์ตไปถึงตัวรับฟังแล้ว และผู้ต้องสงสัยที่เหลือคือหมายเลขที่พิมพ์ในช่อง Plex หากไม่มีอะไรตอบเลย การขาดหายอยู่ต้นน้ำ: การแมปของผู้ให้บริการ ที่อยู่ tunnel หรือ pf ที่ไม่ได้เปิดใช้