Tại sao kết nối “Nỗ lực tối đa” là chưa đủ
Tôi đã dành sáu tháng qua để quản lý một gateway chạy Linux trong môi trường thực tế. Nếu có một điều tôi rút ra được, thì đó là VPN chỉ thực sự đáng tin cậy dựa trên cách nó xử lý khi gặp sự cố. WireGuard nhanh và hiện đại, nhưng các trục trặc mạng hoặc việc ISP làm mới DHCP cuối cùng sẽ khiến tunnel bị ngắt. Nếu không có cơ chế khóa ở cấp độ phần cứng, máy Linux của bạn sẽ mặc định quay lại định tuyến tiêu chuẩn. Điều này làm lộ IP thật và mọi truy vấn DNS của bạn với ISP chỉ trong chưa đầy 200 mili giây.
Thiết lập này đã duy trì 180 ngày hoạt động mà không để rò rỉ một gói tin nào. Mục tiêu của tôi không chỉ là “quyền riêng tư” — mà là xây dựng một “hầm trú ẩn” cho toàn bộ hệ thống. Không dữ liệu nào rời khỏi máy trừ khi nó đã được mã hóa và nằm trong WireGuard tunnel. Hướng dẫn này sẽ phân tích chi tiết logic tường lửa mà tôi sử dụng để đảm bảo không có gì lọt ra ngoài.
Khoảng cách: Logic của ứng dụng và Tường lửa
Hầu hết người dùng tin tưởng vào nút gạt ‘Kill Switch’ trong các ứng dụng có giao diện đồ họa (GUI). Chúng thường mang tính chất phản ứng. Hiểu được cách chúng thất bại là bước đầu tiên để bảo mật tốt hơn.
1. Kill Switch dựa trên phần mềm
Các VPN client thương mại thường theo dõi tiến trình VPN. Nếu daemon bị sập, ứng dụng sẽ cố gắng cập nhật bảng định tuyến. Vấn đề là gì? Luôn có một “cửa sổ rò rỉ”. Trong vài mili giây giữa lúc tunnel thất bại và phần mềm phản ứng, hệ điều hành của bạn có thể rò rỉ dữ liệu dạng văn bản thuần túy (plain-text). Đó là một tình trạng tranh chấp (race condition) mà bạn chắc chắn không muốn mình là kẻ thua cuộc.
2. Thực thi ở cấp nhân (iptables)
Tôi ưu tiên một cách tiếp cận chủ động. Thay vì chờ đợi sự cố, chúng ta thay đổi luật chơi của nhân Linux. Chúng ta đặt chính sách mặc định là DROP (hủy bỏ). Sau đó, chúng ta chỉ đưa vào danh sách trắng (whitelist) các lưu lượng mã hóa cụ thể cần thiết cho VPN. Nếu tunnel bị ngắt, lưu lượng sẽ va phải một bức tường. Không có thời gian phản ứng vì bức tường đó luôn hiện hữu.
Bài học sau 6 tháng vận hành thực tế
Việc thắt chặt bảo mật mạng theo cách này đi kèm with một vài sự đánh đổi. Dưới đây là những gì tôi nhận thấy trong giai đoạn thử nghiệm của mình.
- Lợi ích:
- Không có cửa sổ rò rỉ: Vì ‘DROP’ là mặc định, dữ liệu không thể “vô tình” tìm đường thoát ra ngoài trong quá trình kết nối lại.
- Bảo vệ âm thầm: Nó hoạt động ngầm mà không cần một ứng dụng GUI nặng nề chạy ở khay hệ thống.
- DNS bảo mật: Bằng cách ép toàn bộ lưu lượng cổng 53 đi qua tunnel, bạn sẽ chặn đứng việc ISP theo dõi.
- Trở ngại:
- Chi phí cấu hình: Bạn phải làm quen với dòng lệnh và kiến thức mạng cơ bản.
- Bị khóa SSH: Nếu bạn làm việc trên VPS từ xa, một lỗi đánh máy trong script sẽ ngay lập tức cắt đứt kết nối của bạn.
- Quy tắc tĩnh: Nếu nhà cung cấp VPN thay đổi IP máy chủ, bạn phải cập nhật lại script của mình.
Bản thiết kế: WireGuard + iptables
Cấu hình này sử dụng iptables vì đây là tiêu chuẩn công nghiệp cho các bản phân phối Linux như Ubuntu, Debian và Fedora. Chúng ta cũng sẽ loại bỏ hoàn toàn IPv6. Hầu hết các VPN vẫn để rò rỉ lưu lượng IPv6, khiến nó trở thành một “cửa sau” phổ biến để làm lộ danh tính trên các hệ thống Linux.
Logic tuân theo một thứ tự nghiêm ngặt:
- Chặn tất cả lưu lượng vào và ra theo mặc định.
- Cho phép local loopback cho các tiến trình nội bộ của hệ thống.
- Mở một “lỗ hổng” cụ thể cho quá trình bắt tay (handshake) mã hóa của VPN trên giao diện vật lý.
- Cho phép mọi thứ khác lưu thông tự do, nhưng chỉ thông qua giao diện
wg0.
Triển khai: Thắt chặt bảo mật từng bước
Bước 1: Loại bỏ rò rỉ IPv6
Đừng để IPv6 rò rỉ một cách ngẫu nhiên. Thêm các dòng sau vào /etc/sysctl.conf để vô hiệu hóa nó ở cấp độ nhân:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
Chạy sudo sysctl -p để áp dụng cấu hình.
Bước 2: Thu thập thông tin mạng
Kiểm tra cấu hình WireGuard của bạn (thường ở /etc/wireguard/wg0.conf) để lấy các giá trị sau:
- Endpoint IP: Địa chỉ từ xa của máy chủ VPN.
- Cổng VPN: Thường là 51820.
- Tên giao diện: Tìm card mạng đang hoạt động (ví dụ: eth0 hoặc wlan0) bằng lệnh
ip route show default.
Bước 3: Script Kill Switch
Tôi sử dụng một script để áp dụng các quy tắc này nhằm tránh lỗi thủ công. Tạo file vpn-killswitch.sh và điều chỉnh các biến:
#!/bin/bash
# Cấu hình
VPN_SERVER_IP="1.2.3.4"
VPN_PORT="51820"
PHYS_IF="eth0"
WG_IF="wg0"
# 1. Thiết lập lại mọi thứ
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -F
iptables -t mangle -F
iptables -F
iptables -X
# 2. Cho phép lưu lượng đã thiết lập (Quan trọng để không bị ngắt kết nối SSH)
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 3. Danh sách trắng cho Loopback và SSH
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
# 4. Thiết lập các chính sách khóa (Lockdown)
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# 5. "Lỗ hổng VPN": Cho phép tunnel mã hóa kết nối
iptables -A OUTPUT -p udp -d $VPN_SERVER_IP --dport $VPN_PORT -o $PHYS_IF -j ACCEPT
# 6. "Vùng xanh": Cho phép tất cả lưu lượng bên trong tunnel
iptables -A OUTPUT -o $WG_IF -j ACCEPT
iptables -A INPUT -i $WG_IF -j ACCEPT
Bước 4: Duy trì cấu hình
Các quy tắc iptables tiêu chuẩn sẽ biến mất sau khi khởi động lại. Sử dụng iptables-persistent để duy trì chúng vĩnh viễn:
sudo apt update && sudo apt install iptables-persistent
sudo netfilter-persistent save
Kiểm tra hệ thống phòng thủ
Xác minh là bước then chốt. Đầu tiên, hãy xác nhận bạn có quyền truy cập internet. Sau đó, ngắt kết nối tunnel:
sudo wg-quick down wg0
Thử lệnh ping google.com. Bạn sẽ thấy ngay thông báo lỗi “Operation not permitted”. Nếu lệnh ping bị treo hoặc vẫn phân giải được, các quy tắc của bạn chưa hoạt động. Để chắc chắn 100% về DNS, hãy chạy lệnh tcpdump này trong khi lướt web:
sudo tcpdump -i eth0 udp port 53
Nếu bạn thấy bất kỳ lưu lượng nào trên eth0, nghĩa là bạn bị rò rỉ. Với một thiết lập chuẩn, lệnh này sẽ hoàn toàn im lặng khi bạn duyệt web; tất cả các truy vấn đó sẽ vô hình, được bọc bên trong các gói tin UDP của WireGuard.
Kết luận cuối cùng
Mạng trên Linux mang lại lợi ích cho những ai kiểm soát nó một cách rõ ràng. Tự động hóa thì tiện lợi, nhưng iptables cung cấp một mức độ chắc chắn mà không một nút ‘Kill Switch’ đồ họa nào có thể sánh được. Thiết lập của tôi đã xử lý hàng chục lần mất mạng vi mô từ ISP mà không để rò rỉ một byte dữ liệu văn bản thuần túy nào. Chỉ mất 10 phút để cấu hình, nhưng sự an toàn mà nó mang lại là một sự nâng cấp vĩnh viễn cho quyền riêng tư kỹ thuật số của bạn.

