Quy tắc IPTables cho phép kết nối SSH đến


11

Mục đích của tập lệnh này là chỉ cho phép lưu lượng truy cập qua VPN, ngoại trừ localhost <-> localhost và lưu lượng SSH đến. Nhưng khi tôi chạy tập lệnh qua SSH, tôi bị ngắt kết nối và buộc phải khởi động lại vm. Có gì sai với kịch bản của tôi?

#!/bin/bash
iptables -F

#Allow over VPN
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT

#Localhost
iptables -A INPUT -s 127.0.0.1/8 -j ACCEPT
iptables -A OUTPUT -d 127.0.0.1/8 -j ACCEPT

#VPN
iptables -A INPUT -s 123.123.123.123 -j ACCEPT
iptables -A OUTPUT -d 123.123.123.123 -j ACCEPT

#SSH
iptables -A INPUT -p tcp --dport ssh -j ACCEPT

#Default Deny
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP

Câu trả lời:


10

Chuỗi đầu ra chịu trách nhiệm cho bất kỳ gói đi ra ngoài.

Tập lệnh của bạn chỉ cho phép các gói tin đi ra giao diện đường hầm, localhost và máy chủ từ xa tại 123.123.123.123.

Nếu bạn đang kết nối với máy chủ theo cách yêu cầu SSH daemon gửi các gói đến đích ngoài một trong những điều trên, lưu lượng sẽ không được phép đi ra ngoài.

Để cho phép các gói tin đi từ daemon SSH của bạn đến máy khách SSH, bạn cần thêm quy tắc sau:

iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

Bạn cũng có thể muốn thêm tiêu chí IP đích vào quy tắc trên, nếu bạn chỉ kết nối từ một vị trí. Quy tắc này cần phải đi trước quy tắc 'DROP bất cứ điều gì khác' cuối cùng cho chuỗi đầu ra.


+1 Điều này sẽ hoạt động và cụ thể hơn so với việc sử dụng quy tắc được thiết lập, có liên quan (làm cho nó trở nên hữu dụng hơn hoặc ít hơn tùy thuộc vào ngữ cảnh).
goldilocks

Cả hai câu trả lời tuyệt vời, tôi đã học được rất nhiều! Tôi đã kiểm tra câu trả lời @SkyDan và nó hoạt động tốt!
Steven

Nitpick: chuỗi đầu ra không chịu trách nhiệm cho các gói chuyển tiếp .
Bjorn Lindqvist

13

#SSHQuy tắc của bạn ngụ ý ssh là một hình thức giao tiếp một chiều, nhưng nó không phải là. Dữ liệu đang được gửi đi trở lại.

Cách thông thường để giải quyết vấn đề này, vì bạn không thể biết trước số cổng ở phía máy khách, là cho phép các kết nối được coi là "thiết lập" hoặc "liên quan" đến kết nối đã thiết lập. Để làm điều này bạn cần:

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Trước các DROPquy tắc của bạn (và tốt nhất là ở trên cùng, vì các quy tắc được xử lý theo thứ tự và hai quy tắc này sẽ áp dụng cho hầu hết các gói).

Có một lời giải thích về cách kết nối TCP được thành lập ở đây ; về cơ bản, việc máy chủ trả lời gói được cho phép theo #SSH INPUTquy tắc của bạn làm cho nó trở nên như vậy.


1
Điều này sẽ không hoạt động. Đã thiết lập nghĩa là các gói theo cả hai hướng cho một kết nối TCP nhất định đã được nhìn thấy. Nếu bạn chỉ thêm quy tắc này, gói gửi đi đầu tiên sẽ vẫn bị chặn.
hellodanylo

2
@SkyDan Đây là một tài liệu tham khảo cho điều đó . Lưu ý trên sơ đồ rằng khi máy chủ gửi syn / ack trở lại máy khách sau khi nhận được syn mở, kết nối được thiết lập có nghĩa là iptables sẽ cho phép gói trả lời đó thông qua: "Khi đã thấy một gói (SYN), nó sẽ xem xét kết nối là MỚI. Một khi nó thấy gói trả về (SYN / ACK), nó sẽ coi kết nối đó là THÀNH LẬP. " -> một lần nữa: iptables thấy gói trả về mà máy chủ muốn gửi, đặt kết nối là được thiết lập và cho phép trả lời thông qua.
goldilocks

1
Được rồi, tôi thấy lý do tại sao nó sẽ làm việc. Đó là một chút tối nghĩa, vì người đàn ông iptables chỉ nói về việc nhìn thấy các gói theo cả hai hướng, không phải là một từ về các gói bắt tay TCP là một ngoại lệ. Cảm ơn đã tham khảo!
hellodanylo

2
@SkyDan Trên thực tế, logic không chỉ áp dụng cho tcp - Tôi đã sai khi -p tcptạo ra bất kỳ sự khác biệt nào trong ý nghĩa này và xem xét giải thích tiếp theo cho UDP trên trang đó (nó giống nhau). Vấn đề là máy chủ trả lời mà không biết liệu iptables có cho phép hay không và khi iptables nhận được phản hồi đó từ máy chủ trên hệ thống cục bộ , giờ đây nó đã thấy lưu lượng theo cả hai hướng (mặc dù máy khách chưa có) kết nối được thiết lập và cho phép trả lời. "Tính kỹ thuật" ở đây xoay quanh tường lửa ở giữa hai bên.
goldilocks

1
Bạn đúng ở đó. Ai đó có lẽ nên đưa thông tin này vào người đàn ông iptables.
hellodanylo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.