Trong kịch bản iptables của tôi, tôi đã thử nghiệm viết các quy tắc chi tiết nhất có thể. Tôi giới hạn người dùng nào được phép sử dụng dịch vụ nào, một phần để bảo mật và một phần là bài tập học tập.
Sử dụng iptables v1.4.16.2 trên Debian 6.0.6 chạy kernel 3.6.2.
Tuy nhiên tôi đã gặp phải một vấn đề mà tôi chưa hiểu rõ lắm ..
cổng đi cho tất cả người dùng
Điều này hoạt động hoàn toàn tốt. Tôi không có bất kỳ quy tắc theo dõi nhà nước chung chung.
## Cổng đi 81 $ IPTABLES -A OUTPUT -p tcp --dport 81 -m conntrack --ctstate MỚI, THÀNH LẬP -j CHẤP NHẬN $ IPTABLES -A INPUT -p tcp --sport 81 -s $ MYIP -m conntrack --ctstate ESTABOUNDED -j CHẤP NHẬN
cổng đi với người dùng phù hợp
## cổng đi 80 cho tài khoản người dùng $ IPTABLES -A OUTPUT --match chủ sở hữu - người dùng chủ sở hữu tài khoản -p tcp --dport 80 -m conntrack --ctstate MỚI, THÀNH LẬP --sport 1024: 65535 -j CHẤP NHẬN $ IPTABLES -A INPUT -p tcp --sport 80 --dport 1024: 65535 -d $ MYIP -m conntrack --ctstate THÀNH LẬP -j CHẤP NHẬN
Điều này cho phép cổng 80 chỉ dành cho tài khoản "tài khoản người dùng", nhưng các quy tắc như thế này đối với lưu lượng TCP có vấn đề.
## Nhật ký gửi đi mặc định + quy tắc chặn $ IPTABLES -A OUTPUT -j LOG --log-prefix "BAD OUTGOING" --log-ip-Tùy chọn --log-tcp-Tùy chọn --log-uid $ IPTABLES -A ĐẦU RA -j DROP
Vấn đề
Các công việc trên, người dùng "tài khoản người dùng" có thể nhận được các tập tin hoàn toàn tốt. Không có người dùng nào khác trên hệ thống có thể thực hiện các kết nối gửi đến cổng 80.
useraccount @ host: $ wget http://cachefly.cachefly.net/10mb.test
Nhưng wget ở trên lá x7 đã bỏ các mục trong syslog của tôi:
Ngày 18 tháng 10 02:00:35 nhân xxxx SPT = 37792 DPT = 80 SEQ = 164520678 ACK = 3997126942 WINDOW = 979 RES = 0x00 ACK URGP = 0
Tôi không nhận được những giọt này cho các quy tắc tương tự với lưu lượng UDP. Tôi đã có các quy tắc giới hạn người dùng có thể thực hiện các yêu cầu DNS.
Các gói ACK bị loại bỏ dường như đến từ tài khoản gốc (URGP = 0) mà tôi không hiểu. Ngay cả khi tôi trao đổi useraccount cho root.
Tôi tin rằng các gói ACK được phân loại là mới vì conntrack bắt đầu theo dõi các kết nối sau bước thứ 3 của bắt tay 3 cách, nhưng tại sao lại bị loại bỏ?
Những giọt này có thể được bỏ qua một cách an toàn?
Biên tập
Vì vậy, tôi thường thấy các quy tắc như thế này, hoạt động tốt với tôi:
$ IPTABLES -A OUTPUT -s $ MYIP -p tcp -m tcp --dport 80 -m state --state MỚI, THÀNH LẬP -j CHẤP NHẬN $ IPTABLES -A INPUT -p tcp -m tcp --sport 80 -d $ MYIP -m state --state ESTABOUNDED -j CHẤP NHẬN
Tôi đã hoán đổi "-m state --state" cho "-m conntrack --ctstate" vì trạng thái khớp rõ ràng là lỗi thời.
Là thực hành tốt nhất để có quy tắc theo dõi nhà nước chung chung? Là các quy tắc trên không được coi là chính xác?
Để kiểm soát chặt chẽ các kết nối người dùng đi sẽ như thế này sẽ tốt hơn?
$ IPTABLES -A INPUT -m conntrack - được thành lập -j CHẤP NHẬN $ IPTABLES -A OUTPUT -m conntrack --ctstate THÀNH LẬP -j CHẤP NHẬN $ IPTABLES -A OUTPUT -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack --ctstate MỚI -m chủ sở hữu - người dùng chủ sở hữu tài khoản -j ACCEPT $ IPTABLES -A OUTPUT -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack --ctstate MỚI -m chủ sở hữu - chủ sở hữu otheraccount -j CHẤP NHẬN