Công tắc an toàn của UFW đang chặn VPN của bạn? Hãy cho phép đối tác
Quy tắc từ chối lưu lượng đi ra của bạn đang làm rớt bắt tay của đường hầm. Một ngoại lệ dành cho đối tác, thêm trước ufw enable, chính là thứ biến chính sách thành công tắc an toàn.
Bạn đã làm theo danh sách kiểm tra: từ chối lưu lượng đi ra, cho phép đường hầm, bật ufw. Rồi máy khách chờ ở bắt tay và không bao giờ kết nối, hoặc kết nối được mà không trang nào tải. Cả hai lỗi đều đến từ cùng một khoảng trống. Thiếu quy tắc cho phép đường hầm tồn tại, vì đường hầm không phải giao diện mà gói tin của bạn đi ra.
Vì sao một quy tắc cho phép trên tun0 ban đầu không khớp với gì cả
tun0 do máy khách tạo sau khi có phiên. Các datagram tạo nên phiên đó là gói UDP thông thường gửi tới nhà cung cấp ở cổng 1194, và chúng đi ra qua wlan0 hoặc eth0 với địa chỉ nguồn vật lý. allow out on tun0 chỉ khớp với lưu lượng có giao diện đi ra là tun0, nên trong lúc bắt tay nó không khớp với gì cả.
Đặt default deny outgoing lên trên và các gói bên ngoài bị bỏ trước khi giao diện xuất hiện. Máy khách thử lại, hết thời gian chờ và báo lỗi TLS hoặc bắt tay, khiến người ta lục lọi chứng chỉ và MTU trong khi tường lửa lặng lẽ ăn mất kết nối. Quy tắc lẽ ra phải giữ lưu lượng của bạn lại đang ngăn chính lưu lượng đó bị giữ lại.
Cách sửa theo phản xạ khiến rò rỉ thành vĩnh viễn. sudo ufw allow out on wlan0, hoặc đưa mặc định trở lại cho phép, dựng đường hầm lên và để máy không có công tắc an toàn: lần tới khi đường hầm sập, mọi thứ tiếp tục qua card mạng vật lý. Tôi mất một buổi chiều đúng vì cặp chỉnh sửa đó trước khi hiểu ra mình đang lọc gói nào.
Hai bộ gói tin cần gì
Lưu lượng của bạn đi qua tường lửa hai lần, dưới hai dạng. Gói bên trong đi từ địa chỉ đường hầm ra ngoài qua tun0. Gói bên ngoài đi từ địa chỉ vật lý đến đối tác, và đó là thứ duy nhất nhìn thấy trên dây. Một quy tắc cho mỗi dạng:
sudo ufw allow out on tun0
sudo ufw allow out to 203.0.113.10 port 1194 proto udp
sudo ufw allow out to 203.0.113.10 port 443 proto tcp comment 'tcp fallback'
Thay địa chỉ và cổng bằng giá trị trong hồ sơ của bạn. Các đối tác WireGuard thường trả lời trên 51820/udp; hồ sơ OpenVPN chạy qua TCP 443 cần cổng đó thay vào. Chi tiết khác, dạng thì không: cả hai quy tắc đều hẹp, và cùng nhau chúng xác định những đích duy nhất mà máy có thể tới khi đường hầm đang tắt.
Thứ tự là huyền thoại thứ hai. Với iptables thô, bạn đọc chuỗi từ trên xuống và lý luận quy tắc nào thắng. ufw không phải lớp bọc mỏng quanh danh sách bạn gõ; nó biên dịch quy tắc của bạn thành các chuỗi riêng và chọn điểm chèn. ufw status in chúng theo thứ tự của ufw, không phải của bạn. Khi một quy tắc có vẻ bị bỏ qua, hãy so sánh ufw show added với tập đã biên dịch từ iptables -S | grep ufw trước khi viết lại bất cứ điều gì.
Ngoại lệ phải giữ độ rộng đúng một địa chỉ
Quy tắc đối tác chỉ đúng khi nó nêu đúng địa chỉ mà máy khách gọi. Nhà cung cấp xoay điểm cuối, và hồ sơ phân giải tên máy chủ sẽ đi theo thay đổi DNS sang địa chỉ mới trong khi quy tắc vẫn trỏ vào địa chỉ cũ. Khi một đường hầm chạy hàng tháng không lên được nữa, hãy so địa chỉ trong quy tắc với địa chỉ máy khách đang tìm trước khi mở rộng bất cứ điều gì.
Mở rộng ra cả một mạng con, hoặc ra mọi đích trên cổng 1194, biến chính sách trở lại thành tường lửa có lỗ. Ngoại lệ chính là công tắc an toàn; một khi nó rộng, không còn gì để ngắt. Giữ nó ở một địa chỉ duy nhất và để lại chú thích nêu hồ sơ và nhà cung cấp mà nó thuộc về, vì sáu tháng nữa địa chỉ sẽ trông tùy tiện.
Phân giải tên đáng có dòng riêng. Việc tra cứu diễn ra trước khi đường hầm tồn tại, qua giao diện vật lý, nên chính sách từ chối đi ra nghiêm ngặt có thể khiến máy khách không tìm được máy chủ của chính nó. Cho phép cổng 53 tới địa chỉ bộ phân giải của bạn, hoặc phân giải một lần rồi ghim địa chỉ vào hồ sơ. Cho phép DNS trên mọi giao diện là một quyết định, không phải mặc định.
Xây chính sách trước khi cần đến đường hầm
ufw enable áp dụng toàn bộ chính sách cùng lúc và nạp lại các chuỗi của nó, và thay đổi chính sách mặc định trên tường lửa đang chạy cũng nạp lại chúng. hướng dẫn ufw cảnh báo rằng điều này có thể làm rớt các kết nối đang có như SSH. Vì vậy các lệnh đi theo thứ tự này, với quy tắc SSH trước khi bật và một phiên console để mở:
sudo ufw default deny incoming
sudo ufw default deny outgoing
sudo ufw allow out on tun0
sudo ufw allow out to 203.0.113.10 port 1194 proto udp
sudo ufw allow 22/tcp
sudo ufw enable
sudo ufw status verbose
ufw reset được cố ý để ngoài khối đó. Nó xóa mọi quy tắc và tắt tường lửa, và trên máy chủ từ xa, lần bật tiếp theo chính là thứ làm rớt phiên của bạn. Nếu vẫn đặt lại, hãy thêm quy tắc SSH và xác nhận một đường quay lại thứ hai qua console trước khi đi tiếp.
Thứ tự không phải chuyện hình thức. Các quy tắc thêm vào khi ufw đang chạy không xả gì, nhưng đúng lúc bạn lật chính sách mặc định thì các chuỗi được nạp lại, và phiên mà chính sách cũ cho phép cũng đi theo. Hãy làm mặc định, các quy tắc cho phép và việc bật trong một lượt, khi bạn vẫn còn đường vào không phụ thuộc vào cái máy.
Kiểm tra trạng thái bị chặn, và giữ lại cách hoàn tác
Một công tắc an toàn chưa được kiểm tra là phỏng đoán. Cố ý ngắt máy khách và thử tải một trang: nó phải thất bại. Kết nối lại và nó phải hồi phục mà không chạm vào quy tắc nào. sudo ufw status verbose xác nhận các mặc định và trạng thái ghi log, còn ufw status numbered cho biết quy tắc thử nào cần xóa khi nó sống quá mục đích.
Giữ script ngược bên cạnh script xuôi. Máy bị từ chối đi ra và có đường hầm chết không thể tự tải bản sửa của nó, nên cách hoàn tác phải nằm trên đĩa và đọc được từ console:
sudo ufw reset
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw enable
Chạy nó khi đường hầm đã sập và các quy tắc phải gỡ, không phải như một bước thường lệ. Trước khi đóng terminal, bốn điều phải đúng: quy tắc đối tác nêu đúng một địa chỉ, DNS có ngoại lệ được nêu tên, việc bật đến sau các quy tắc cho phép, và rút đường hầm giết lưu lượng thường mà không giết máy khách vĩnh viễn.