IPv6 qua đường hầm OpenVPN: một vòng qua router tại nhà
IPv6 chết hoặc rò rỉ khi đường hầm cấp một tiền tố mà router không thể định tuyến. Lần lượt xem máy khách, pool, chuyển tiếp, proxy NDP và đường về.
Máy tính xách tay có địa chỉ IPv6, đường hầm đã dựng trên IPv4, vậy mà mọi bài kiểm tra IPv6 đều thất bại. Hoặc tệ hơn: bài kiểm tra thành công và lưu lượng đã đi ra theo đường của nhà cung cấp mà chưa từng vào đường hầm. Cả hai kết quả đều quy về một quyết định còn thiếu: không ai trao cho router một tiền tố mà nó có thể định tuyến về phía máy khách. Đi dọc con đường từ máy khách ra ngoài sẽ tìm ra mảnh nào còn thiếu.
Bắt đầu từ chỗ máy khách
Xem máy khách trước khi chạm vào máy chủ. ip -6 addr phải hiển thị một địa chỉ đường hầm từ pool, và ip -6 route phải hiển thị tiền tố được đẩy xuống trỏ tới thiết bị đường hầm. Khi có địa chỉ mà không có tuyến, nghĩa là thiếu lần đẩy hoặc máy khách đã bỏ qua nó. Khi không có cả hai, máy chủ chưa cấp phát gì cả.
Sau đó xem máy khách nghĩ gì về thế giới bên ngoài. Tuyến mặc định qua đường hầm đòi toàn bộ lưu lượng IPv6, trong khi tuyến cho 2000::/3 chỉ đòi unicast toàn cầu. Cả hai đều có thể đúng, và chúng trả lời những câu hỏi khác nhau về rò rỉ.
Máy khách không có tuyến mặc định IPv6 nào sẽ thất bại mọi bài kiểm tra công cộng dù bản thân đường hầm hoàn toàn khỏe mạnh. Đó là lỗ hổng chính sách, không phải đường hầm hỏng.
Kiểm tra pool mà máy chủ thực sự định tuyến được
Máy chủ chỉ có thể cấp phát từ một tiền tố mà nó thực sự kiểm soát. Nếu nhà cung cấp ủy quyền một /56, hãy giữ một /64 cho đường hầm và để phần còn lại cho LAN. Ở nơi nhà cung cấp chỉ giao một /64 trên WAN và không định tuyến thêm gì, hãy để tiền tố LAN yên và cho đường hầm một dải cục bộ riêng, chấp nhận rằng máy khách sẽ không có lối ra toàn cầu.
Pool và lần đẩy đi cùng nhau. server-ipv6 2001:db8:80:10::/64 cấp địa chỉ, và push "route-ipv6 2000::/3" bảo máy khách gửi gì vào đường hầm. Đẩy 2000::/3 bao phủ unicast toàn cầu và để các dải link-local và multicast ở ngoài đường hầm.
Ghi tiền tố đã chọn vào hồ sơ triển khai. Người thay đổi việc bàn giao của nhà cung cấp lần sau cần biết đường hầm đã chiếm /64 nào.
Bật chuyển tiếp cho họ giao thức thứ hai
Chuyển tiếp IPv4 không có nghĩa là chuyển tiếp IPv6. Đặt net.ipv6.conf.all.forwarding=1 và phản chiếu mọi thứ mà chính sách FORWARD của IPv4 đã cho phép. Trên một router có chuỗi FORWARD mặc định loại bỏ, một bộ quy tắc thiếu trông giống hệt một đường hầm chết.
Bắt tay thành công, máy khách nhận địa chỉ, và không có gì quay lại. Thêm quy tắc cho cả hai chiều và cho nhánh WAN, vì đường hầm tới được LAN mà không tới internet sẽ hỏng ở bài kiểm tra thứ ba. Sau một lần thử thất bại, hãy xem bộ đếm của chuỗi, vì quy tắc chưa từng khớp là vấn đề khác với quy tắc đã khớp rồi loại bỏ.
ip6tables -A FORWARD -i br0 -o tun0 -j ACCEPT
ip6tables -A FORWARD -i tun0 -o br0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
ip6tables -A FORWARD -i tun0 -o wan0 -j ACCEPT
Một tác dụng phụ bắt đúng những người cuối cùng đổ lỗi cho đường hầm. Bật chuyển tiếp khiến nhân bỏ qua cấu hình địa chỉ qua Router Advertisement trừ khi được nói khác, và tuyến mặc định học được theo cách đó cũng biến mất theo. Hoặc ghim một tuyến mặc định rõ ràng trên giao diện WAN, hoặc cố ý đặt accept_ra bằng 2 ở đó. Sau bất kỳ thay đổi nào, hãy xác nhận router vẫn còn đường ra IPv6 dùng được trước khi kiểm tra lại máy khách.
Trả lời khám phá láng giềng khi phía trên không định tuyến
Thiết bị phía trên đôi khi coi /64 được ủy quyền là thuộc liên kết của chính nó và từ chối định tuyến bất kỳ tiền tố con nào tới hộp VPN. Khi điều đó xảy ra, phải có thứ gì đó trả lời riêng từng yêu cầu láng giềng cho mỗi địa chỉ máy khách.
OpenVPN đưa địa chỉ được cấp cho một hook client-connect, nhờ đó các mục có thể bám theo pool thật thay vì một danh sách bảo trì bằng tay. Hook thêm ip -6 neigh add proxy $ifconfig_pool_remote_ip6 dev eth0, và hook client-disconnect tương ứng gỡ nó ra. Không gỡ thì bảng proxy sẽ cũ đi và một máy khách sau này có thể thừa hưởng mục cho địa chỉ mà nó chưa từng nhận. Xác nhận trạng thái bằng ip -6 neigh show proxy.
Coi proxy là giải pháp lách. Một tuyến tĩnh cho /64 của đường hầm trỏ về router sẽ sống sót qua việc thay máy khách và không cần bất kỳ hook shell đặc quyền nào.
Đi theo con đường ra ngoài, từng bước nhảy
Kiểm tra ra ngoài theo ba bước: trước hết là địa chỉ đường hầm của router, sau đó một máy chủ trong LAN, và thứ ba là một đích công cộng qua traceroute6. Bước đầu chứng minh pool, bước hai chứng minh chuyển tiếp và tường lửa LAN, bước ba chứng minh đường về qua phía trên. Mỗi thất bại thu hẹp tìm kiếm vào một thiết bị thay vì mở lại toàn bộ thiết kế.
Để ý MTU của đường hầm, vì các router IPv6 trên đường đi sẽ không phân mảnh hộ bạn. MTU quá lớn hiện ra thành lỗi packet-too-big và TLS bị treo thay vì một thất bại gọn gàng. Hãy đặt nó một cách rõ ràng và kiểm tra với tải gần giới hạn.