Vì sao AWS Client VPN bỏ rơi lưu lượng khi không có tuyến khớp
Điểm cuối chỉ chuyển tiếp gói tin khi bảng tuyến của nó bao phủ đích. Hãy đọc các tuyến, khai báo tiền tố bằng for_each, kiểm tra đường quay về.
Client VPN cấp cho máy khách một địa chỉ, bắt tay hoàn tất, và kết nối vẫn không đi đến đâu. Trước khi chạm vào chứng chỉ hay phiên bản máy khách, hãy nhìn vào bảng tuyến của chính điểm cuối. Một điểm cuối AWS Client VPN chỉ chuyển tiếp gói tin khi một trong các tuyến của nó bao phủ tiền tố đích; nếu không có gì khớp, gói tin bị bỏ tại điểm cuối và máy chủ đích không bao giờ thấy SYN.
Đây là quyết định chuyển tiếp, không phải quyết định xác thực. Nó xảy ra sau khi đường hầm được dựng và sau khi các quy tắc ủy quyền được đánh giá, vì thế một chứng chỉ hợp lệ và một nhóm hợp lệ vẫn có thể tạo ra kết nối chết.
Điểm cuối chỉ chuyển tiếp những gì bảng tuyến của nó bao phủ
Mỗi tuyến là một CIDR đích cộng với mạng con sẽ nhận lưu lượng. Điểm cuối so sánh đích của máy khách với danh sách đó, chọn mục khớp và gửi gói tin vào mạng con liên kết. Không có mục nghĩa là không có bước nhảy tiếp theo.
Hãy để ý tuyến không phải là gì. Nó không phải mục trong bảng tuyến của VPC, và nó không ủy quyền cho bất cứ điều gì. Quy tắc ủy quyền quyết định một nhóm có được tới đích hay không; tuyến quyết định điểm cuối có nơi để gửi gói tin hay không. Cả hai phải đồng ý với nhau, và chúng hỏng với triệu chứng khác nhau, nên đoán cái nào hỏng sẽ tốn cả buổi chiều.
Sự lệch pha kinh điển là một VPC đã peer. Ai đó thêm tuyến cho 10.20.0.0/24 trong khi máy chủ nằm ở 10.20.4.0/24, nên địa chỉ rơi ngoài mọi mục. Bản bắt gói phía máy khách cho thấy các SYN lặp lại không có trả lời, và nhật ký của đích không hiển thị gì cả.
Đọc danh sách tuyến trước chứng chỉ
Các tuyến của điểm cuối là đối tượng riêng, nên hãy hỏi trực tiếp thay vì đọc bảng của VPC:
aws ec2 describe-client-vpn-routes --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdef0 --query 'Routes[].{Dest:DestinationCidr,Target:TargetSubnet,Origin:Origin}'Lấy địa chỉ chính xác và độ dài tiền tố từ máy khách đang hỏng, rồi kiểm tra độ phủ theo từng ký tự. Quy tắc khớp tiền tố dài nhất được áp dụng, nên tuyến rộng hơn không cứu bạn khi tuyến hẹp hơn trỏ đi nơi khác.
Một tài nguyên cho mỗi đích với for_each
Các khối tuyến viết tay sẽ lệch ngay khi ai đó thêm tiền tố trong bảng điều khiển. Giữ các đích trong một bản đồ và tạo một tài nguyên cho mỗi khóa, để mỗi lần thêm hay bớt vẫn tách biệt.
variable "client_vpn_routes" {
type = map(string)
default = {
"10.20.0.0/16" = "subnet-0aa11bb22cc33dd44"
"172.31.0.0/20" = "subnet-0aa11bb22cc33dd44"
}
}
resource "aws_ec2_client_vpn_route" "this" {
for_each = var.client_vpn_routes
client_vpn_endpoint_id = var.client_vpn_endpoint_id
destination_cidr_block = each.key
target_vpc_subnet_id = each.value
depends_on = [aws_ec2_client_vpn_network_association.this]
}Giữ phụ thuộc vào liên kết mạng. Một tuyến cần mạng con đã liên kết, nên apply tạo cả hai phải xếp liên kết trước, và không có tham chiếu đó Terraform được tự do thử tuyến trước. Sau đó đọc kế hoạch: số tuyến thêm vào phải khớp với các tiền tố bạn đã thêm. Nếu kế hoạch còn thay thế điểm cuối, tài nguyên điểm cuối bị viết sai, và áp dụng nó sẽ ngắt mọi máy khách đang kết nối.
Tiếp nhận một điểm cuối do người khác tạo
Phần lớn đội ngũ thừa hưởng một điểm cuối được dựng trong bảng điều khiển, vì thế không có mã tuyến. Đừng dựng điểm cuối thứ hai chỉ để đưa tuyến vào Terraform.
Thay vào đó hãy import, hoặc truyền id dưới dạng biến và để các đối tượng thừa hưởng không được quản lý. Import cần định dạng định danh mà nhà cung cấp ghi trong tài liệu cho từng loại tài nguyên; định dạng đó mã hóa điểm cuối, tiền tố đích và mạng con đích. Hãy sao chép chuỗi đó từ tài liệu tài nguyên thay vì ghép từ trí nhớ, chạy kế hoạch, và chờ không có thay đổi trước khi thêm điều gì mới.
Lần theo gói tin đúng thứ tự nó di chuyển
Khi tuyến đã có mà kết nối vẫn hỏng, hãy đi dọc đường theo thứ tự thay vì đoán ở tầng trên cùng.
- Tuyến: một tiền tố bao phủ đích và trỏ tới mạng con liên kết với điểm cuối.
- Ủy quyền: một quy tắc ủy quyền cho phép đích đó với nhóm của người dùng. Chỉ riêng tuyến không bao giờ cấp quyền truy cập.
- Đường quay về: bảng tuyến của mạng con đích gửi trả lời ngược về điểm cuối, và nhóm bảo mật cho phép cổng từ bể địa chỉ của máy khách.
- Ứng dụng: mở một kết nối TCP thật từ máy khách, rồi xác nhận nhật ký của đích hiển thị địa chỉ nguồn mong đợi từ bể địa chỉ.
Đổi một tiền tố mỗi lần apply, sau đó đọc lại danh sách tuyến, và ghi lại cùng nhau đích, quy tắc ủy quyền và đường quay về. Người tiếp theo gỡ lỗi một kết nối bị từ chối nên bắt đầu từ bản kiểm kê đó, không phải từ lý thuyết về chứng chỉ.