iptables: chỉ cho máy khách VPN đến một máy chủ duy nhất
Quy tắc bạn cần nằm ở FORWARD, không phải INPUT. Cho phép một điểm đến cho nhóm VPN, từ chối phần còn lại, rồi chứng minh bằng bộ đếm và lệnh hoàn tác.
Hai phiếu hỗ trợ trông không liên quan hoá ra lại có chung một nguyên nhân. Ở phiếu thứ nhất, quản trị viên muốn máy chủ chỉ chấp nhận kết nối từ đường hầm; ở phiếu thứ hai, người dùng VPN phải đến được một máy chủ nội bộ duy nhất và không gì hơn. Cả hai chính sách đều thuộc FORWARD, và cả hai thường được thử trong INPUT. Kết quả trông như tường lửa nhưng lại hành xử như một chỗ giữ chỗ.
Chuỗi nào trả lời câu hỏi của bạn
Các gói mà máy khách VPN gửi tới một máy chủ trong LAN, hoặc xa hơn ra internet, được nhân hệ điều hành chuyển tiếp và đánh giá trong FORWARD. INPUT và OUTPUT chỉ thấy lưu lượng kết thúc tại chính máy chủ hoặc bắt nguồn từ đó. Vì vậy, việc từ chối mọi thứ không đến qua tun0 bảo vệ chính các trình lắng nghe của máy chủ, và cũng sẽ kết thúc phiên SSH của bạn trừ khi các luồng đã thiết lập được cho phép trước. Điều đó không thay đổi gì về nơi máy khách được phép đi.
Đặt tên cho câu hỏi trước: ai được đến máy chủ, hoặc máy khách được đi đâu. Hầu hết mạng cần cả hai câu trả lời, ở các chuỗi khác nhau.
Trước hết là trạng thái, rồi đến sự cho phép, rồi đến sự từ chối
Danh sách cho phép chỉ hoạt động nếu quyền cụ thể nằm trên sự từ chối chung và nếu lưu lượng trả về được cho phép trên cả hai. Chèn quy tắc ở vị trí rõ ràng, rồi đổ chuỗi bằng iptables -S FORWARD để thứ tự hiện ra thay vì bị giả định.
POOL=10.99.0.0/24
iptables -I FORWARD 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -I FORWARD 2 -s "$POOL" -d 172.31.20.15 -p tcp -m multiport --dports 443,3389 -j ACCEPT
iptables -I FORWARD 3 -s "$POOL" -j REJECTHai chi tiết quyết định liệu điều này có trụ được khi tiếp xúc với lưu lượng thật. Không có quy tắc trạng thái, các phản hồi cho những kết nối bạn vừa cho phép sẽ tự bị đánh giá theo sự từ chối và bị bỏ. Một quy tắc LOG không giới hạn có thể lấp đầy một phân vùng nhỏ ngay lần quét đầu tiên, nên hãy thêm -m limit --limit 10/min trước khi tiếp tục ghi nhật ký. REJECT trả lỗi ngay lập tức, điều này thân thiện hơn khi bạn tinh chỉnh danh sách; DROP bỏ đi lặng lẽ, nên mọi sai sót đều hiện ra như hết thời gian chờ. Hãy chọn một cách có chủ đích và ghi lựa chọn vào biên bản thay đổi.
Chuyển tiếp và NAT phải hoạt động sẵn
Lọc không thể chứng minh rằng có một đường đi. Trước tiên hãy xác nhận nhân có chuyển tiếp hay không, và biến thiết lập đó thành cố định thay vì một lệnh một lần trong shell. Bộ lọc là lớp cuối cùng, không phải lớp đầu tiên.
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s "$POOL" -o eth0 -j MASQUERADENơi đặt masquerade phụ thuộc vào nơi máy khách đi ra. Nếu chúng đi qua đường hầm tới một mạng từ xa, quy tắc NAT được đặt trên giao diện đó chứ không phải giao diện WAN. Sau đó xem bộ đếm: nếu bộ đếm POSTROUTING không bao giờ nhúc nhích trong khi số lần chấp nhận ở FORWARD tăng, đường về bị hỏng còn bộ lọc thì ổn. Cách đọc đó tiết kiệm một buổi chiều viết lại những quy tắc chưa bao giờ là vấn đề.
Khối thư thuộc chuỗi bên cạnh
Chặn cổng 25 trong INPUT chỉ dừng thư gửi tới máy chủ VPN. Một máy khách bị xâm nhập gửi thư qua đường hầm sẽ được chuyển tiếp, nên khối phải nằm trong FORWARD cạnh 465 và 587. Nếu một ứng dụng chuyển tiếp thư một cách hợp pháp, hãy đặt điểm đến và cổng của nó lên trên quy tắc đó.
iptables -I FORWARD 2 -s "$POOL" -p tcp -m multiport --dports 25,465,587 -j REJECTĐể bộ đếm từ chối chạy một tuần trước khi siết bất cứ thứ gì khác. Con số ngừng tăng chính là luồng hợp pháp mà bạn vừa làm hỏng.
Đọc lại và sau đó chứng minh từ một máy khách
Đọc bộ quy tắc theo cách nhân báo cáo, không phải theo cách script của bạn đã viết. Bắt đầu với iptables -S FORWARD, rồi bảng NAT bằng iptables -t nat -L POSTROUTING -n -v, rồi mục conntrack cho luồng bạn đang kiểm tra. Giữ sẵn một lệnh hoàn tác hoặc một lần xóa theo lịch trong suốt thời gian làm việc. Mỗi lần gọi cần -w, nếu không hai quản trị viên sẽ đụng nhau ở khoá xtables. Không điều nào trong số đó là tuỳ chọn trong cửa sổ thay đổi.
Kết thúc bằng việc thử từ một máy khách bên trong nhóm và từ một máy bên ngoài. Một quy tắc chỉ chạy từ máy bạn đã gõ nó không phải là chính sách.