OpenVPN trên cổng 443 vẫn bị chặn? Xem mạng kiểm tra điều gì
Cổng 443 thay đổi con số, không thay đổi hình dạng giao thức. Nếu đường đi kiểm tra hoặc kết thúc TLS, lớp bọc và tuyến đường máy chủ đúng là các phép thử tiếp theo.
Đường hầm kết nối từ một đường dây tại nhà rồi đứng lại trên mạng khách sạn hoặc văn phòng, và việc chuyển máy chủ sang cổng 443 không thay đổi gì. Kết quả đó phổ biến đến mức có hình dạng: cổng là phần dễ, còn lại của quyết định thuộc về mọi thứ nằm giữa máy khách và máy chủ. Hai câu hỏi giải quyết phần lớn trường hợp, và không câu nào nói về mật mã. Mạng có chấp nhận một lần bắt tay TLS tới địa chỉ đó không, và máy khách có giữ tuyến đường tới lớp bọc của chính nó khi đường hầm đang hoạt động không?
Bắt tay tiết lộ nhiều hơn con số
Trình lắng nghe VPN gốc trên TCP 443 nói giao thức riêng của nó ngay từ gói đầu tiên. Một ClientHello có trường phiên bản, một giá trị ngẫu nhiên và danh sách tiện ích mở rộng, và một thiết bị đọc vài trăm byte có thể nhận ra khác biệt mà không giải mã gì cả. Số cổng thì rẻ để đáp ứng, còn hình dạng giao thức mới là thứ bộ lọc thực sự kiểm tra. Các quy tắc thường cũng được viết theo từng giao thức, nên một chính sách kiểm tra TLS không nói gì về UDP.
Một proxy trong suốt đòi hỏi phiên TLS hợp lệ sẽ cắt kết nối trong lúc thiết lập, thường sau khi bắt tay TCP hoàn tất. Chi tiết đó quan trọng về sau, vì nó có nghĩa là nhật ký máy khách dừng lại sau khi ổ cắm được thiết lập.
Bọc dòng chảy tạo ra hai điểm hỏng
Một lớp bọc TLS như stunnel khôi phục hình dạng mong đợi: máy khách kết nối tới một trình lắng nghe cục bộ, lớp bọc mở một phiên TLS thật tới máy chủ trên 443, và lớp bọc thứ hai trên máy chủ chuyển các byte đã giải mã cho trình nền VPN. Phiên bên ngoài giờ trông giống bất kỳ kết nối HTTPS nào khác. Trình nền VPN trên máy chủ chỉ nên lắng nghe trên loopback, vì không gì bên ngoài lớp bọc cần chạm tới nó.
Ba thứ riêng biệt phải khớp nhau cho thiết kế đó. Hồ sơ máy khách trỏ tới trình lắng nghe cục bộ, chứng chỉ máy chủ khớp với tên mà máy khách xác minh, và việc chuyển tiếp phía máy chủ nhắm tới cổng mà trình nền thực sự dùng. Sai một trong số đó là kết nối chết trước khi chạm tới tầng VPN. Khi đó sự không khớp chứng chỉ hiện ra như lỗi của lớp bọc chứ không phải lỗi VPN, và vì thế đáng đọc cả hai nhật ký cạnh nhau.
Tuyến đường tới lớp bọc là cái bẫy
Ngay khi đường hầm lên, tuyến mặc định trỏ vào trong nó, và phiên TLS bên ngoài cần một đường không đi vào đường hầm mà nó đang chở. Một máy khách VPN thông thường bảo vệ địa chỉ nó gọi; máy khách được bọc gọi loopback của chính nó, nên địa chỉ đích của lớp bọc không hiện ra với sự bảo vệ đó.
sudo ip route add 198.51.100.20 via 192.168.0.1
sudo openvpn --config client.ovpn
sudo ip route del 198.51.100.20
Các địa chỉ chính xác do bạn điền, và tuyến đường phải tồn tại suốt vòng đời kết nối, không chỉ lúc khởi động. Một script bọc nhỏ thêm tuyến trước máy khách và gỡ nó sau đó đáng tin hơn một câu lệnh được ghi nhớ.
Trên Android, tương đương của ngoại lệ đó là một thiết lập cho từng ứng dụng: loại trừ ứng dụng bọc khỏi đường hầm để lưu lượng của chính nó đi ra qua kết nối di động. Không loại trừ thì lớp bọc bị định tuyến vào đúng đường hầm mà nó đang cố dựng, và vòng lặp kết nối lại trông như sự cố máy chủ.
Đọc thời gian trước khi thay đổi bất cứ điều gì
Một phiên chết sau cùng một khoảng thời gian mỗi lần là dấu hiệu của chính sách chứ không phải hỏng hóc mật mã, và các giới hạn luồng dài hạn tạo ra đúng kiểu mẫu đó. Một kết nối bị đặt lại ngay sau bắt tay gợi ý một proxy không thích chuỗi chứng chỉ.
So sánh nhà phát hành chứng chỉ của một trang HTTPS thông thường từ cả hai mạng. Nếu nhà phát hành khác trên mạng bị hạn chế, có gì đó đang kết thúc TLS ở giữa, và không lớp bọc nào sống sót qua việc chặn đó mà không thay đổi. Cùng phép so sánh cho bạn biết việc chặn nhắm vào tên máy chủ của bạn hay mọi phiên TLS tại địa chỉ đó.
Ghi lại hành vi quan sát được: phiên kéo dài bao lâu, ổ cắm có mở không, lớp bọc có ghi nhật ký bắt tay không. Mỗi điều đó thu hẹp phép thử tiếp theo.
Thử một biến mỗi lần
Kiểm tra UDP trước, vì một số mạng bỏ nó hoàn toàn và lỗi UDP không nói gì về 443. Sau đó thử TCP 443 không có lớp bọc, rồi lớp bọc trên 443. Đọc nhật ký máy khách ở từng bước và dừng ngay khi hành vi thay đổi.
Thay đổi một yếu tố mỗi lần thử. Một cổng mới, một lớp bọc mới và một mật mã mới trong cùng một lần chạy khiến bạn không thể nói yếu tố nào trong ba yếu tố là quan trọng.