Công tắc an toàn pf trên macOS cho OpenVPN: những quy tắc đóng lại
Một bộ quy tắc pf chặn lưu lượng trực tiếp khi đường hầm đang xuống. Giữ đường đi của máy khách tới máy chủ của nó, rồi chứng minh việc chặn khi đường hầm tắt.
Trên macOS, một công tắc an toàn chỉ tốt bằng chính sách lọc gói phía sau nó, và pf là phần thực thi chính sách đó. Chính sách phải làm hai việc trái ngược cùng lúc: để máy khách tới được máy chủ của nó hầu có một đường hầm, và ngăn mọi thứ khác đi ra trực tiếp. Hầu hết các bộ quy tắc được công bố làm được vế thứ hai và quên vế thứ nhất, nên máy mất kết nối thay vì có thêm bảo vệ. Phiên bản hoạt động nêu tên điểm cuối, bộ phân giải và đường hầm, và không gì hơn.
Bộ lọc gói quyết định được gì và không quyết định được gì
pf nhìn vào giao diện, địa chỉ, số giao thức và cổng, và dừng ở đó. Nó không bao giờ biết tiến trình nào đã mở ổ cắm, nên một quyền viết cho một chương trình trở thành quyền cho mọi chương trình có thể tới cùng cổng đó. Đó là cách một ngoại lệ UDP rộng rãi biến công tắc an toàn trở lại thành mạng thông thường. Việc chặn có ý thức về ứng dụng thuộc về máy khách hoặc một phần mở rộng hệ thống, không thuộc tệp này.
Bộ lọc cũng không tạo tuyến. Khi máy khách sụp, tuyến mặc định có thể vẫn trỏ tới một đường hầm chết, và pf biến điều đó thành các gói bị chặn thay vì âm thầm quay lại Wi-Fi. Việc chặn là kết quả có chủ đích, không phải sự cố cần đi vòng.
Thứ tự quyết định kết quả thường xuyên hơn phần văn bản của quy tắc. Không có quick, pf tiếp tục đánh giá sau khi khớp và quy tắc khớp cuối cùng thắng, nên một lượt cho qua rộng ở dưới ghi đè các ngoại lệ cẩn thận ở trên. Đánh dấu các lượt cho qua bằng quick làm lần khớp đầu tiên thành chung thẩm, và đó thường là điều tác giả chính sách muốn nói.
Hãy đọc trước các dữ kiện về giao diện và điểm cuối
Các giao diện không dây không được đánh số giống nhau trên mọi Mac, và thiết bị đường hầm nhận một số có thể thay đổi giữa các lần khởi động. Một quy tắc nêu tên thiết bị không tồn tại sẽ thất bại khi phân tích, điều này ồn ào và dễ bắt, trong khi quy tắc nêu tên thiết bị có thật nhưng sai lại phân tích sạch sẽ và cho phép lưu lượng mà bạn muốn dừng.
Thu thập dữ kiện khi máy khách đang kết nối, vì thiết bị đường hầm chỉ tồn tại lúc đó. Bạn cần giao diện giữ tuyến mặc định, thiết bị do máy khách tạo ra, và địa chỉ cùng cổng của máy chủ mà nó gọi. Chính giá trị cuối cùng đó là thứ hầu hết các bộ quy tắc bỏ sót, và bỏ sót nó là lý do một bộ quy tắc sao chép lại chặn chính đường hầm của mình.
route -n get default
ifconfig -l
scutil --nc list
Lệnh đầu tiên nêu giao diện đang thắng, lệnh thứ hai liệt kê mọi thiết bị mà nhân biết, và lệnh thứ ba hiển thị các cấu hình VPN mà hệ thống có thể khởi động. Hãy ghi lại các câu trả lời đó, rồi đọc địa chỉ và cổng máy chủ từ cấu hình của chính máy khách.
Viết bộ quy tắc quanh đường đi của đường hầm
Tệp bên dưới từ chối theo mặc định và cho phép lại năm thứ: loopback, thiết bị đường hầm, đường đi của máy khách tới máy chủ của nó, bộ phân giải được dùng trước khi có đường hầm, và hai trao đổi giữ cho một liên kết không dây dùng được. Tên giao diện và địa chỉ máy chủ đến từ máy của bạn, nên hãy thay bằng các giá trị bạn đã xác nhận. Số đường hầm cũng sẽ không khớp với số của bạn.
set skip on lo0
block all
pass out quick on utun0
# maintain this line when the server address changes
pass out quick on en1 inet proto udp to 203.0.113.10 port 1194
# only the resolver the client uses before the tunnel exists
pass out quick on en1 inet proto udp to 192.0.2.53 port 53
pass out quick on en1 inet proto udp from any port 68 to any port 67
pass out quick on en1 inet proto udp to 224.0.0.251 port 5353
Dòng DHCP tồn tại vì một Mac xin địa chỉ trước khi có địa chỉ, nên yêu cầu đi ra từ cổng 68 về phía cổng 67 mà không có địa chỉ nguồn dùng được. Dòng multicast cho hệ thống đánh giá liên kết không dây có đáng dùng hay không, và bỏ nó đi tạo ra một máy báo không có kết nối trên một mạng đang hoạt động. Dòng điểm cuối là thứ cho phép OpenVPN tới được máy chủ của nó; không có nó, block all bỏ rơi cú bắt tay bên ngoài và đường hầm không bao giờ dựng lên. Dòng bộ phân giải hẹp hơn một quyền DNS chung, vì nó nêu một địa chỉ và một cổng thay vì mọi truy vấn máy thực hiện.
Các ngoại lệ điểm cuối và bộ phân giải đó là hai thứ phải tồn tại; mọi thứ khác vẫn bị chặn. Nếu máy khách gọi một địa chỉ nguyên văn, hãy bỏ dòng bộ phân giải và giữ dòng điểm cuối. Nếu địa chỉ máy chủ thay đổi, hãy cập nhật dòng đó trước lần kết nối tiếp theo, hoặc điền một bảng pf từ móc của chính máy khách và khớp bảng thay vào đó.
Hạ đường hầm xuống, rồi khởi động lại
Phân tích trước khi nạp, vì lỗi cú pháp rẻ trong một lần chạy khô và đắt trong một phiên từ xa. Sau đó nạp tệp, bật bộ lọc nếu nó đang tắt, và đọc lại xem điều gì thực sự có hiệu lực. Đọc lại không phải nghi lễ: một neo khác có thể thêm các quy tắc bạn không viết, nên hãy so bộ đã in với tệp của bạn.
sudo pfctl -n -v -f /etc/pf.conf
sudo pfctl -f /etc/pf.conf
sudo pfctl -e
sudo pfctl -s rules
sudo pfctl -s Anchors
sudo pfctl -a <anchor> -s rules
sudo pfctl -s info
Khi quy tắc đã nạp, hạ đường hầm xuống và thử nạp một trang. Lưu lượng thông thường phải dừng, và phải vẫn dừng sau khi máy ngủ và thức, vì chính ở bước chuyển đó trạng thái cũ quay lại. Kết nối lại và xác nhận lưu lượng tiếp tục mà không chạm vào bộ quy tắc. Nếu trình duyệt vẫn chạy khi đường hầm xuống, một quy tắc nào đó rộng hơn bạn tưởng, và việc đọc lại thường nêu ra nó.
Khởi động lại là phần người ta bỏ qua. macOS đọc /etc/pf.conf khi khởi động, nhưng đọc tệp không giống như bật bộ lọc, nên một bộ quy tắc đang chạy có thể không hoạt động sau khi khởi động lại. Sau đó chạy sudo pfctl -s info và xác nhận dòng trạng thái báo bộ lọc đã bật.
Giữ lối ra và đường khởi động lại trung thực
Một bộ quy tắc chặn mọi thứ cũng có thể khóa bạn ra khỏi một máy bạn quản trị từ xa. Hãy sửa từ một phiên cục bộ khi có thể, giữ tệp trước bên cạnh tệp mới, và biết cách trả lại trước khi bạn cần. Các lệnh bên dưới tắt bộ lọc và nạp lại bản sao bạn đã giữ, và đó là trình tự để chạy từ bảng điều khiển chứ không phải qua đường hầm bạn vừa cắt. Một lần trả lại trong năm giây thắng một quy tắc khôn khéo mỗi lần.
sudo pfctl -d
sudo pfctl -f /etc/pf.conf.previous
sudo pfctl -s rules
Tính bền vững cần một launch daemon chạy pfctl -e và nạp tệp của bạn khi khởi động. Hãy đối xử với nó như mọi công việc đặc quyền khác: đường dẫn tuyệt đối, nhật ký có thể đọc sau, và một bài thử trên máy bạn có thể tới được về mặt vật lý. Một daemon thất bại âm thầm để lại máy không được bảo vệ và trông bình thường.
Ghi lại các lỗ hổng, bắt đầu với một máy khách VPN thứ hai tự tạo thiết bị đường hầm riêng. Các quy tắc của bạn nêu một giao diện đường hầm, nên cái thứ hai vẫn bị chặn hoặc bị một quy tắc rộng thêm sau đó bắt. Các giao diện tethering và hotspot chỉ xuất hiện đôi khi và đáng được cùng một ghi chú. Không lỗ hổng nào trong số đó là lý do bỏ qua chính sách; chúng là những điều kiện mà chính sách vẫn đúng.