Hai thiết kế hứa cùng một điều: khi đường hầm sụp, không có gì thoát ra ngoài ở dạng rõ. Một bên chạy script lúc tháo dỡ và cắt giao diện. Bên kia để một quy tắc tường lửa có hiệu lực và không yêu cầu gì từ ứng dụng VPN. Chúng khác nhau ở chỗ ai có quyền hành động, điều gì xảy ra trong khoảng trống và cách máy trở lại trực tuyến sau đó. So sánh chúng trên ba điểm ấy hữu ích hơn là tranh cãi cái nào nghiêm ngặt hơn.

Cùng một việc bằng hai cơ chế

Ứng dụng có thể chạy móc khi đường hầm lên và khi bị tháo dỡ, miễn là hồ sơ cho phép thực thi script. Móc đó chạy bên trong vòng đời của ứng dụng, đúng lúc kết nối đóng lại. Ngược lại, một quy tắc tường lửa thuộc về hệ thống và không quan tâm ứng dụng đang chạy, đã sụp hay bị giết.

PropertyTeardown scriptFirewall unit
Runs when the client is killedNoYes
Needs privilege at teardown timeUsually yesConfigured once, at boot
Acts on the whole machineOften, including recovery pathsOnly on the flows it matches

Bảng đó là toàn bộ lập luận. Một script chỉ chạy khi đóng đúng cách chỉ bao phủ trường hợp bạn ít lo nhất; trường hợp quan trọng là sụp đổ hoặc mạng biến mất, và cả hai đều không cho một lần tháo dỡ sạch sẽ.

Móc tháo dỡ làm được gì và không làm được gì

Mẫu được ghi lại đi qua các giao diện mạng và hạ mọi thứ trừ loopback. Khi thiết bị vật lý đã xuống, không gì có thể thoát ra ngoài đường hầm, và đó chính là ý định.

#!/bin/sh
for dev in /sys/class/net/*; do
  name=$(basename "$dev")
  [ "$name" = lo ] || ip link set dev "$name" down
done

Nó cũng hạ mạng cục bộ, mọi dịch vụ máy đang lưu trữ và con đường bạn sẽ dùng để sửa sự cố. Trên máy tính xách tay, thiết bị không dây đôi khi cần bật lại bằng tay sau đó, nên một gián đoạn ngắn thành một buổi sửa chữa. Tệ hơn, móc có thể không được phép làm bất cứ điều gì trong số đó: khi ứng dụng từ bỏ quyền, script tháo dỡ chạy dưới tài khoản không có quyền, và mọi thay đổi giao diện đều thất bại với lỗi quyền được ghi đúng vào lúc không ai đọc nhật ký.

Hãy kiểm tra cách ứng dụng được khởi động trước khi tin vào móc. Một script chạy được khi bạn chạy tay bằng root không chứng minh gì về dịch vụ khởi động cùng hệ thống.

Quy tắc tường lửa làm khác đi điều gì

Một quy tắc chỉ cho phép lưu lượng đường hầm vẫn hoạt động khi tiến trình ứng dụng đã biến mất, vì nhân không phụ thuộc vào tiến trình đó. Quy tắc cũng hẹp hơn: nó chặn đúng những luồng khớp và để yên loopback, mạng con cục bộ và đường khôi phục, nhờ vậy nó không bỏ mặc máy.

Cái giá là quy tắc phải do người sở hữu tường lửa của máy chủ viết và duy trì, và nó phải gọi tên thiết bị đường hầm mà ứng dụng thực sự tạo ra. Điều đó nghĩa là quy tắc và hồ sơ phải được duy trì cùng nhau; một giao diện bị đổi tên để lại một tường lửa chặn tất cả và không giải thích gì.

Không cơ chế nào làm cơ chế kia thành thừa. Một quy tắc tường lửa không bao giờ được nạp lại sau khi sửa cũng hư cấu như một script không bao giờ chạy.

persist-tun quyết định có khoảng trống hay không

Khi thiết bị đường hầm sống sót qua lần ngắt, các tuyến trỏ vào nó cũng sống sót. Lưu lượng khi đó bị bỏ thay vì được chuyển hướng, nên tuyến mặc định không rơi trở lại cổng vật lý. Chính hành vi này khiến rò rỉ khó xảy ra ngay cả trước khi bất kỳ quy tắc tường lửa nào tham gia.

Không có thiết lập đó, thiết bị bị gỡ bỏ cùng các tuyến, và tuyến mặc định có thể lại trỏ về cổng vật lý. Có làm vậy hay không tùy nền tảng và ứng dụng, và chính vì thế trạng thái phải được quan sát chứ không phải giả định. Hãy coi thiết lập là một phần của kill switch, không phải một tùy chọn hiệu năng.

Giữ con đường kết nối lại còn sống, rồi thử bốn trạng thái

Một chặn cứng cũng có thể khiến ứng dụng không kết nối lại được, vì ứng dụng vẫn cần tuyến tới máy chủ qua cổng vật lý trong khi mọi thứ khác bị từ chối. Hãy cài một tuyến máy chủ cho đúng địa chỉ đó trước khi đường hầm lên, và phân giải tên trước, vì DNS có thể đã bị chặn vào lúc bạn cần.

ip route add 198.51.100.20/32 via 192.168.0.1 dev wlan0

Sau đó hãy xác minh trạng thái chứ không phải nhãn. Chủ động trải qua bốn thời điểm: khởi động nguội không có đường hầm, một phiên khỏe mạnh, một cú rơi không ai yêu cầu và phiên sau khi hồi phục. Ở mỗi thời điểm, đọc tuyến mặc định và gửi một yêu cầu mà địa chỉ ra của nó nhìn thấy được. Một ứng dụng bỏ cuộc khi đường hầm xuống không nói gì về ứng dụng thư hay trình cập nhật, nên hãy lặp lại lần kiểm tra cuối với một ứng dụng chạy nền. Ghi lại quy tắc, tên giao diện và các bước khôi phục, vì một kill switch không ai kiểm chứng được chỉ là tin đồn.

Bài viết liên quan