Một máy khách cần truy cập dịch vụ SSH của máy khách khác, và phần còn lại của bể phải giữ mức cô lập như hiện nay. Công tắc hấp dẫn là client-to-client, thứ bật quyền truy cập giữa các máy ngang hàng cho tất cả cùng lúc và giao quyết định cho OpenVPN thay vì nhân. Một câu trả lời hẹp hơn giữ công tắc đó tắt và để định tuyến cùng tường lửa của chính máy chủ gánh đúng một luồng.

Cơ chế quan trọng hơn nội dung quy tắc, vì hai cách đặt gói tin ở những chỗ khác nhau. Biết mình đã chọn cách nào sẽ giải thích cả quy tắc trông như không làm gì lẫn máy ngang hàng kết nối được mà không cần nó.

client-to-client di chuyển gói tin đi đâu

Khi client-to-client được bật, máy chủ chuyển tiếp gói tin của máy ngang hàng ở bên trong thay vì gửi ngược ra qua thiết bị đường hầm, nên gói tin không bao giờ tới đường chuyển tiếp của nhân. Điều đó tiện lợi và cũng có nghĩa tường lửa của bạn không bao giờ thấy luồng mà nó đáng lẽ phải giám sát. Để tùy chọn tắt và máy chủ định tuyến gói tin ngược ra qua cùng giao diện, đặt nó trước netfilter. Cùng giao diện vào, cùng giao diện ra, và chuỗi FORWARD có tiếng nói.

Sự đánh đổi rõ ràng: bạn được thêm một điểm chính sách và nhận lấy công việc định tuyến và chuyển tiếp mà lối tắt từng làm hộ. Công việc đó nhỏ với một luồng và lớn dần theo từng ngoại lệ bạn thêm vào. Hãy đếm các ngoại lệ ngay, vì tập quy tắc chính là nơi chính sách giữa các máy ngang hàng thực sự sống.

Con đường gói tin ngang hàng thực sự đi

Giả sử dịch vụ Linux Community OpenVPN 2.6, xử lý TUN trong không gian người dùng thay vì DCO, topo mạng con, tun0 và một bể 10.44.0.0/24 với máy khách A ở 10.44.0.21 và máy khách B ở 10.44.0.37. Với topo mạng con, địa chỉ và mặt nạ mà A nhận đã bao trùm bể, nên A gửi gói tin tới thiết bị đường hầm mà không cần thêm tuyến bị đẩy xuống. Hãy kiểm tra tuyến hiệu lực trên A thay vì giả định một tuyến.

Trên máy chủ, gói tin đến được gán cho B, mà B không phải địa chỉ cục bộ, nên gói tin được chuyển tiếp. Chuyển tiếp IPv4 phải được bật để việc đó xảy ra, và tra cứu tuyến phải gửi gói tin ngược ra qua tun0. Vì thế tường lửa thấy một luồng được chuyển tiếp với cùng giao diện ở hai phía, và đó là chi tiết mà hầu hết tập quy tắc bỏ sót. Ở đây không cần dịch địa chỉ nguồn, và việc giữ nguyên địa chỉ của A chính là thứ cho phép B áp quy tắc dựa trên nguồn của mình.

Hai quy tắc trên máy chủ, theo thứ tự này

Ba quy tắc gánh toàn bộ việc cấp quyền: chuyển tiếp, ngoại lệ cho cặp và một lệnh bỏ mặc định cho cặp đường hầm. Quy tắc chấp nhận nêu tên cặp và dịch vụ, nên việc cấp quyền vẫn đúng khi bể lớn dần. Đặt nó trước mọi lệnh từ chối toàn bộ lưu lượng đường hầm-tới-đường hầm, vì kết quả khớp đầu tiên thắng:

sysctl -w net.ipv4.ip_forward=1
iptables -A FORWARD -i tun0 -o tun0 -s 10.44.0.21 -d 10.44.0.37 -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -i tun0 -o tun0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i tun0 -o tun0 -j DROP

Những lệnh đó chỉ mang tính minh họa và thuộc về cơ chế mà máy chủ của bạn dùng để lưu quy tắc; một chèn lúc chạy sẽ biến mất ở lần khởi động sau. Chính quy tắc có trạng thái cho phép các phản hồi của B và bắt tay TCP quay về mà không cần một lần chấp nhận thứ hai đối xứng.

Hãy kiểm tra bộ đếm sau đó thay vì danh sách quy tắc, vì một quy tắc không bao giờ khớp trông giống hệt một quy tắc hoạt động. Nếu bộ đếm vẫn bằng không, gói tin không đi theo con đường bạn nghĩ.

B vẫn phải cho phép những gì

B chạy dịch vụ SSH, nên B quyết định có gì lắng nghe trên địa chỉ đường hầm và tường lửa của chính máy chủ B có chấp nhận nguồn hay không. Một cấp quyền mạng trên máy chủ không phải là quyền cho bất kỳ tài khoản nào trên B, và việc xác minh khóa máy chủ cùng xác thực người dùng vẫn áp dụng như từ bất cứ đâu.

Hãy thử trường hợp thuận trước: một kết nối SSH mới từ A tới địa chỉ đường hầm của B, được chấp nhận với khóa máy chủ mong đợi. Sau đó thử một máy ngang hàng khác hoặc một cổng khác và xác nhận nó bị từ chối, vì một cấp quyền lặng lẽ cho phép mọi thứ thì không thể phân biệt với cái đang hoạt động cho tới khi nó thực sự quan trọng. Cả hai nửa của phép thử đó đều cần thiết, và nửa thứ hai là nửa người ta bỏ qua.

Ghi lại các địa chỉ được cấp, các tuyến hiệu lực trên cả hai máy khách và các quy tắc chính xác trên máy chủ và trên B. Một ping thành công tới cổng mạng hay một cổng mở trên máy chủ không chứng minh được gì trong số này, vì cả hai đều có thể đúng trong khi chuyển tiếp giữa các máy ngang hàng vẫn bị chặn. Hãy viết những con số đó khi đường hầm còn bật, vì địa chỉ mà máy khách nhận được sau khi kết nối lại có thể là địa chỉ khác.

Bài viết liên quan