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

ตัดสินใจว่าคำนำหน้ามีไว้เพื่ออะไร

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

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

อย่าสมมติว่าทุกการติดตั้งต้องใช้ /48 RFC 6177ได้ถอยห่างจากขนาดเดียวที่บังคับสำหรับไซต์ปลายทาง และขนาดที่เหมาะสมขึ้นอยู่กับจำนวนเครือข่ายที่คุณจะดำเนินการ สร้าง ULA ด้วยขั้นตอน RFC 4193 แทนการประดิษฐ์คำนำหน้าที่องค์กรอื่นอาจใช้ด้วย เขียนผลลัพธ์ลงในแผนที่อยู่ก่อนกำหนดค่าอุปกรณ์ใด ๆ เพราะคำนำหน้าที่ไม่มีใครบันทึกคือคำนำหน้าที่มีคนจะนำกลับมาใช้ซ้ำ

แบ่งคำนำหน้าออกเป็นบทบาท

ตัวอย่างด้านล่างใช้ fd7c:2e91:4a00::/48 และตารางจัดเรียงตามตำแหน่งที่แต่ละบล็อกถูกเขียน ไม่ใช่ตามไซต์ มองค่าเป็นตัวอย่างและสร้างของคุณเองก่อนปรับใช้สิ่งใด

Where it is writtenWhat appears thereBlock usedWhat it establishes
Hub wg0.conf, interface addressA single host address on the tunnelfd7c:2e91:4a00:ff00::1/128The hub's own tunnel identity
Hub wg0.conf, Site A peerTwo ranges in one AllowedIPs line::2/128 and :10::/64That A owns its tunnel address and its LAN
Hub wg0.conf, Site B peerTwo ranges in one AllowedIPs line::3/128 and :20::/64That B owns its tunnel address and its LAN
Site A wg0.conf, interface addressA single host address on the tunnelfd7c:2e91:4a00:ff00::2/128A's identity as the hub sees it
Site B wg0.conf, interface addressA single host address on the tunnelfd7c:2e91:4a00:ff00::3/128B's identity as the hub sees it

บล็อก LAN เป็น /64 เพราะ SLAAC ทั่วไปคาดหวังตัวระบุอินเทอร์เฟซ 64 บิต การแบ่ง LAN เป็นบล็อกเล็กลงจะทำให้สมมติฐานนั้นพังบนโฮสต์ส่วนใหญ่ และต้นทุนการดำเนินงานไม่คุ้มกับการประหยัดที่อยู่ในแผนส่วนตัว บล็อก LAN ทั้งสองมาจากกลางของ /48 ทำให้ช่วงต่ำว่างสำหรับไซต์ภายหลัง

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

ให้เราเตอร์แต่ละตัวมีที่อยู่ของอุโมงค์หนึ่งรายการ

จัดสรร /128 หนึ่งรายการต่อเราเตอร์ และเก็บคีย์กับปลายทางที่มีอยู่ของฮับที่ทำงานอยู่ สามค่าด้านล่างต่างกันเฉพาะส่วนโฮสต์

Hub:    Address = fd7c:2e91:4a00:ff00::1/128
Site A: Address = fd7c:2e91:4a00:ff00::2/128
Site B: Address = fd7c:2e91:4a00:ff00::3/128

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

เราเตอร์ของแต่ละไซต์ยังต้องมีที่อยู่ในบล็อก LAN ของตนและวิธีกระจายที่อยู่นั้น มักเป็นการประกาศเราเตอร์สำหรับ SLAAC WireGuard ไม่ได้ส่งประกาศเหล่านั้นแทนคุณ และไม่ได้เชื่อมสอง LAN เข้าด้วยกัน เราเตอร์ของไซต์เป็นเราเตอร์ทั้งสองทิศทาง

ใส่ความเป็นเจ้าของซับเน็ตใน AllowedIPs

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

AllowedIPs = fd7c:2e91:4a00:ff00::2/128, fd7c:2e91:4a00:10::/64

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

AllowedIPs = fd7c:2e91:4a00:ff00::3/128, fd7c:2e91:4a00:20::/64

นี่คือสองส่วนเพียร์แยกกัน ไม่ใช่สองรายการที่แย่งเพียร์เดียว WireGuard ใช้ AllowedIPs ทั้งสองทิศทาง: เลือกเพียร์สำหรับปลายทางขาออก และปฏิเสธแพ็กเก็ตขาเข้าที่ต้นทางไม่ตรงกับช่วงที่จัดสรรให้เพียร์ซึ่งถอดรหัสแพ็กเก็ตนั้น การให้ /48 ทั้งหมดกับทั้งสองเพียร์จะปิดการตรวจสอบที่สองและทำให้ไม่ชัดว่าไซต์ใดเป็นเจ้าของบล็อกใด ความแตกต่างนั้นเองที่ทำให้ที่อยู่ต้นทางที่ผิดมองเห็นได้แทนที่จะถูกยอมรับอย่างเงียบ ๆ

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

ด้วย wg-quick ช่วงเหล่านี้ยังสร้างเส้นทางด้วย ด้วย systemd-networkd หรือการตั้งค่าด้วยมือ ให้เพิ่มเส้นทางที่เทียบเท่าด้วยตัวเอง มิฉะนั้นอุโมงค์จะบรรทุกแพ็กเก็ตที่เคอร์เนลไม่เคยส่งเข้าไป

ทำการส่งต่อให้เสร็จและทดสอบทั้งสองทิศทาง

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

sysctl net.ipv6.conf.all.forwarding
ip -6 route
ping -6 -c 3 fd7c:2e91:4a00:20::1

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

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

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