OpenVPN บน Synology handshake ล้มเหลว? ตรวจสอบการส่งต่อ LAN
บน NAS สองพอร์ต แพ็กเกจ VPN จะฟังอยู่บนอินเทอร์เฟซเดียว การส่งต่อไปยังอีกที่อยู่จะให้ข้อผิดพลาด TLS handshake ที่ไม่มีใบรับรองใดแก้ไขได้
แล็ปท็อปของคุณรายงานว่า TLS handshake ล้มเหลว จึงน่าจะลองสร้างใบรับรองใหม่ ก่อนอื่นให้ถามคำถามที่น่าเบื่อกว่า: Synology ฟังอยู่บนพอร์ต Ethernet ใดกันแน่? NAS ที่มีสองพอร์ต LAN มีสองที่อยู่ และแพ็กเกจ VPN Server ของ DSM ผูกตัวฟัง OpenVPN ไว้กับหนึ่งในนั้น เมื่อเราเตอร์ส่งต่อ 1194 ไปยังอีกที่อยู่ ก็ไม่มีแพ็กเก็ตใดไปถึงบริการได้ และไคลเอนต์ก็ไม่มีอะไรให้เจรจา
ข้อความแสดงข้อผิดพลาดทำให้เข้าใจผิด เพราะมันบรรยายสิ่งสุดท้ายที่ไคลเอนต์ลอง ไม่ใช่สิ่งแรกที่ผิดพลาด การใช้เวลาสองนาทีเทียบหน้าของแพ็กเกจกับกฎของเราเตอร์ก็จบเรื่อง
หาที่อยู่ที่ตัวฟังผูกอยู่
DSM เรียกพอร์ตของตนว่า LAN 1 และ LAN 2 แต่ละพอร์ตมีที่อยู่และซับเน็ตแยกกัน เปิด VPN Server อ่านอินเทอร์เฟซที่ระบุในแท็บ OpenVPN จากนั้นเปิด Control Panel และจดที่อยู่ IPv4 ที่ DSM มีบนอินเทอร์เฟซเดียวกัน ค่าสองค่านี้ ไม่ใช่ชื่อโฮสต์ของ NAS คือสิ่งที่การส่งต่อต้องระบุ
การเสียบสายที่สองไม่ได้สร้างตัวฟังที่สองลิงก์ทั้งสองอาจแสดงว่าเชื่อมต่ออยู่ ขณะที่มีเพียงที่อยู่เดียวรับทราฟฟิก และเมื่ออินเทอร์เฟซทั้งสองอยู่ในซับเน็ตเดียวกัน ที่อยู่ทั้งสองจะต่างกันเพียงหลักเดียวที่ไม่มีใครอ่านซ้ำก่อนบันทึกกฎ
ดูที่ซ็อกเก็ตเองผ่าน SSH เพราะนี่คือที่เดียวที่แสดงว่าดีมอนผูกกับอะไรจริง ๆ ไม่ใช่สิ่งที่หน้าตั้งค่าตั้งใจ
sudo netstat -anp | grep 1194
แก้ไขการส่งต่อที่มีอยู่แทนการเพิ่มอีกกฎ
กฎสองข้อสำหรับพอร์ตภายนอกหนึ่งพอร์ตทำให้เราเตอร์เลือกได้อย่างอิสระ และข้อที่มันเลือกอาจเปลี่ยนหลังอัปเดตเฟิร์มแวร์หรือรีบูต เปิดกฎที่มีอยู่แล้ว เปลี่ยนที่อยู่ภายใน บันทึก แล้วเปิดอีกครั้งเพื่ออ่านค่ากลับ การตั้งชื่อกฎตามบริการช่วยได้ เพราะรายการส่งต่อห้ารายการที่เหมือนกันคือทางที่ทำให้ข้อผิดพลาดอยู่รอด
external 1194/udp -> 192.0.2.20:1194/udp
ให้พอร์ตภายในเท่ากับพอร์ตที่ฟัง และให้โปรโตคอลสอดคล้องกัน UDP 1194 เป็นตัวฟังเริ่มต้น ส่วนโปรไฟล์ TCP ต้องมีตัวฟังของตัวเองทางฝั่งแพ็กเกจและการส่งต่อที่ตรงกันบนเราเตอร์ การส่งต่อ TCP ไปยังบริการที่ฟังเฉพาะ UDP ให้ความเงียบ ไม่ใช่ข้อผิดพลาด
หากที่อยู่ของ NAS มาจาก DHCP ให้จองไว้ก่อนบันทึกกฎ เมื่อสัญญาเช่าหมดอายุ ระบบจะกำหนดที่อยู่ใหม่ การส่งต่อยังชี้ไปที่ค่าเดิม และ handshake จะเริ่มล้มเหลวในวันที่ไม่มีใครแตะ NAS การตั้งค่าแบบคงที่ฝั่ง NAS แก้ปัญหาเดียวกันได้ หากที่อยู่อยู่นอกช่วง DHCP ของเราเตอร์
พิสูจน์ว่าแพ็กเก็ตมาถึงหรือไม่
เริ่มดักจับบน NAS ก่อน จากนั้นเชื่อมต่อจากไคลเอนต์ แล้วอ่านที่อยู่ต้นทางในผลลัพธ์ การดักจับที่เริ่มหลังเกิดความล้มเหลวไม่แสดงอะไรและไม่พิสูจน์อะไร
sudo tcpdump -i any -n udp port 1194
ความเงียบหมายถึงทราฟฟิกตายก่อนถึงบริการ: ที่อยู่ภายในผิด พอร์ตถูกปิดบนไฟร์วอลล์ของ DSM หรืออินเทอร์เฟซถูกปิดในระดับผู้ดูแล แพ็กเก็ตในผลลัพธ์หมายถึงการส่งต่อทำงาน และข้อบกพร่องที่เหลืออยู่เหนือชั้นเครือข่าย ซึ่งเป็นพื้นที่ค้นหาที่เล็กกว่ามาก
การดักจับยังระบุอินเทอร์เฟซที่แพ็กเก็ตเข้ามา และรายละเอียดเดียวนี้แยกกฎที่เล็งไปยังพอร์ตผิดออกจากกฎที่เล็งไปยังพอร์ตที่ไม่ได้เปิด ดูตัวนับของเราเตอร์เองระหว่างความพยายามเดียวกันหากมันแสดง ตัวนับที่ไม่ขยับขณะการดักจับยังว่างชี้ไปที่เราเตอร์ ส่วนตัวนับที่ขยับพร้อมการดักจับที่ว่างชี้ไปที่เส้นทางระหว่างอุปกรณ์สองตัว
เมื่อแพ็กเก็ตมาถึง เลิกโทษการส่งต่อ
โปรไฟล์คือผู้ต้องสงสัยรายถัดไป และเหตุผลปกติคืออายุ ไฟล์ .ovpn ที่ส่งออกมีผู้ออกและวัสดุ ณ เวลาที่ส่งออก ดังนั้นแพ็กเกจที่ใบรับรองถูกเปลี่ยนภายหลังจะปฏิเสธไคลเอนต์ที่ยังพกสำเนาเก่าอยู่
การขนส่งคือความไม่ตรงกันอีกอย่างที่ควรตรวจอย่างชัดเจน เพราะโปรไฟล์และแพ็กเกจถูกแก้ในที่ต่างกัน การเปลี่ยนโปรไฟล์จาก UDP เป็น TCP โดยไม่สลับแพ็กเกจทำให้ไคลเอนต์รอตัวฟังที่ไม่มีอยู่ และไคลเอนต์รายงานข้อความ handshake ทั่วไปแบบเดียวกับที่รายงานให้ทุกอย่างอื่น อ่านบรรทัด proto ในไฟล์ จากนั้นดูโปรโตคอลที่เลือกบนหน้าของเซิร์ฟเวอร์ และหลังจากนั้นจึงสรุปว่าตรงกัน การอ่านกฎไฟร์วอลล์ของ DSM คือการตรวจครั้งที่สาม: กฎที่อนุญาตพอร์ตจากซับเน็ตภายในแต่ไม่อนุญาตจากอินเทอร์เน็ตนั้นถูกลืมทิ้งไว้ได้ง่ายหลังทดสอบ และมันสร้างการเชื่อมต่อที่ทำงานได้จากในครัวแต่ล้มเหลวจากที่อื่นทั้งหมด
ทดสอบเส้นทางที่ผู้ใช้ระยะไกลใช้จริง
ไคลเอนต์ใน LAN เดียวกันเข้าถึง NAS ได้โดยไม่ต้องแตะการส่งต่อเลย จึงไม่ได้พิสูจน์อะไรเกี่ยวกับการเข้าถึงจากระยะไกล ใช้โทรศัพท์ที่ปิด Wi-Fi หรือถามคนที่อยู่นอกเครือข่าย และดูตัวนับของเราเตอร์ระหว่างความพยายามนั้น หากความพยายามจากระยะไกลล้มเหลวขณะที่ในวงแลนสำเร็จ การส่งต่อหรือไฟร์วอลล์ยังอยู่ในภาพ
บันทึกสถานะที่ทำงานได้ขณะที่มันทำงานอยู่: พอร์ตภายนอก ที่อยู่ภายใน โปรโตคอล อินเทอร์เฟซของแพ็กเกจ รวมถึงชื่อโปรไฟล์และวันที่ส่งออก เมื่อ handshake ล้มเหลวอีกครั้ง ความต่างระหว่างบันทึกนั้นกับการตั้งค่าปัจจุบันคือข้อบกพร่อง และไม่มีใครต้องค้นหาใหม่ว่าบริการใช้พอร์ตใดจากสองพอร์ต