Nói chung:
Xem và sửa đổi cấu hình tường lửa yêu cầu đặc quyền của quản trị viên ( root
) cũng như mở các dịch vụ trong phạm vi số cổng bị hạn chế. Điều đó có nghĩa là bạn nên đăng nhập root
hoặc sử dụng sudo
để chạy lệnh với quyền root. Tôi sẽ cố gắng đánh dấu các lệnh như vậy với tùy chọn [sudo]
.
Nội dung:
- Vấn đề đặt hàng hoặc sự khác biệt giữa
-I
và-A
- Hiển thị cấu hình tường lửa hiện tại
- Giải thích sự xuất hiện của
iptables -L -v -n
- Biết môi trường của bạn
- Chuỗi INPUT và FORWARD
- Mô-đun hạt nhân
1. Vấn đề đặt hàng hoặc sự khác biệt giữa -I
và-A
Điều cần nhớ là các quy tắc tường lửa được kiểm tra theo thứ tự chúng được liệt kê. Nhân sẽ dừng xử lý chuỗi khi quy tắc được kích hoạt sẽ cho phép hoặc không cho phép gói hoặc kết nối.
Tôi nghĩ rằng lỗi phổ biến nhất đối với người quản trị tường lửa mới làm quen là họ tuân theo các hướng dẫn chính xác để mở một cổng mới, chẳng hạn như cổng dưới đây:
[sudo] iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
và sau đó khám phá ra rằng nó sẽ không có hiệu lực.
Lý do cho điều đó là -A
tùy chọn thêm quy tắc mới đó, sau tất cả các quy tắc hiện có
và vì thông thường quy tắc cuối cùng trong tường lửa hiện tại là một quy tắc chặn tất cả lưu lượng truy cập không được phép rõ ràng, dẫn đến
...
7 2515K 327M REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
8 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
Hoặc tương đương trong iptables-save:
...
iptables -A INPUT -j REJECT
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
và quy tắc mới mở cổng TCP 8080 sẽ không bao giờ đạt được. (bằng chứng là các bộ đếm vẫn ngoan cố ở mức 0 gói và 0 byte).
Bằng cách chèn quy tắc với quy tắc -I
mới sẽ là quy tắc đầu tiên trong chuỗi và sẽ hoạt động.
2. Hiển thị cấu hình tường lửa hiện tại
Đề nghị của tôi cho người quản trị tường lửa là xem xét cấu hình thực tế mà nhân Linux đang chạy, thay vì cố gắng chẩn đoán các sự cố tường lửa từ các công cụ thân thiện với người dùng. Thông thường một khi bạn hiểu các vấn đề tiềm ẩn, bạn có thể dễ dàng giải quyết chúng trong một vấn đề được hỗ trợ bởi các công cụ đó.
Lệnh [sudo] iptables -L -v -n
là bạn của bạn (mặc dù một số người thích iptables-save
tốt hơn). Thông thường khi thảo luận về cấu hình, rất hữu ích khi sử dụng --line-numbers
tùy chọn cũng như các dòng số. Tham khảo quy tắc #X làm cho việc thảo luận về chúng có phần dễ dàng hơn.
Lưu ý: Các quy tắc NAT được bao gồm trong iptables-save
đầu ra nhưng phải được liệt kê riêng bằng cách thêm -t nat
tùy chọn tức là [sudo] iptables -L -v -n -t nat --line-numbers
.
Chạy lệnh nhiều lần và kiểm tra các bộ đếm tăng có thể là một công cụ hữu ích để xem liệu một quy tắc mới có thực sự được kích hoạt hay không.
[root@host ~]# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 784K 65M fail2ban-SSH tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 2789K 866M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
3 15 1384 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
4 44295 2346K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 40120 2370K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
6 16409 688K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
7 2515K 327M REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 25 packets, 1634 bytes)
num pkts bytes target prot opt in out source destination
Chain fail2ban-SSH (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 117.239.37.150 0.0.0.0/0 reject-with icmp-port-unreachable
2 4 412 REJECT all -- * * 117.253.208.237 0.0.0.0/0 reject-with icmp-port-unreachable
Ngoài ra, đầu ra của iptables-save
đưa ra một tập lệnh có thể tạo lại cấu hình tường lửa ở trên:
[root@host ~]# iptables-save
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [441:59938]
:fail2ban-SSH - [0:0]
-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A fail2ban-SSH -s 117.239.37.150/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 117.253.208.237/32 -j REJECT --reject-with icmp-port-unreachable
COMMIT
Đó là vấn đề ưu tiên những gì bạn sẽ thấy dễ hiểu hơn.
3. Giải thích thông số của iptables -L -v -n
Các chính sách thiết lập hành động mặc định việc sử dụng chuỗi khi không có trận đấu quy tắc rõ ràng. Trong INPUT
chuỗi được đặt thành CHẤP NHẬN tất cả lưu lượng.
Quy tắc đầu tiên trong chuỗi INPUT ngay lập tức là một quy tắc thú vị, nó gửi tất cả lưu lượng truy cập (nguồn 0.0.0.0/0 và đích 0.0.0.0/0) dành cho cổng TCP 22 ( tcp dpt:22
) cổng mặc định cho SSH đến mục tiêu tùy chỉnh ( fail2ban-SSH
) . Như tên cho thấy quy tắc này được duy trì bởi fail2ban (một sản phẩm bảo mật trong số những thứ khác quét các tệp nhật ký hệ thống để có thể lạm dụng và chặn địa chỉ IP của kẻ lạm dụng).
Quy tắc đó đã được tạo bởi một dòng lệnh iptables tương tự iptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
hoặc được tìm thấy trong đầu ra của iptables-save as -A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
. Thường thì bạn sẽ tìm thấy một trong những ký hiệu đó trong tài liệu.
Các bộ đếm chỉ ra rằng quy tắc này đã khớp với 784'000 gói và 65 Megabyte dữ liệu.
Lưu lượng phù hợp với quy tắc đầu tiên này sau đó được xử lý bởi fail2ban-SSH
chuỗi, như một chuỗi không chuẩn, được liệt kê bên dưới chuỗi OUTPUT.
Chuỗi đó bao gồm hai quy tắc, một quy tắc cho mỗi kẻ lạm dụng (địa chỉ ip nguồn 117.253.221.166 hoặc 58.218.211.166) bị chặn (với a reject-with icm-port-unreachable
).
-A fail2ban-SSH -s 117.253.221.166/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 58.218.211.166/32 -j REJECT --reject-with icmp-port-unreachable
Các gói SSH không có trong các máy chủ bị chặn đó không được phép cũng như không được phép và bây giờ chuỗi tùy chỉnh đã hoàn thành sẽ được kiểm tra theo quy tắc thứ hai trong chuỗi INPUT.
Tất cả các gói không dành cho cổng 22 đã vượt qua quy tắc đầu tiên trong chuỗi INPUT và cũng sẽ được đánh giá theo quy tắc INPUT # 2.
Quy tắc INPUT số 2 làm cho điều này được dự định là một tường lửa đầy đủ , theo dõi các kết nối. Điều đó có một số lợi thế, chỉ các gói cho các kết nối mới cần được kiểm tra theo bộ quy tắc đầy đủ, nhưng một khi đã cho phép các gói bổ sung thuộc kết nối được thiết lập hoặc liên quan được chấp nhận mà không cần kiểm tra thêm.
Quy tắc đầu vào # 2 khớp với tất cả các kết nối và gói liên quan mở và phù hợp với quy tắc đó sẽ không cần phải đánh giá thêm.
Lưu ý: thay đổi quy tắc trong cấu hình của tường lửa trạng thái sẽ chỉ ảnh hưởng đến các kết nối mới, không được thiết lập kết nối.
Ngược lại, bộ lọc gói đơn giản kiểm tra mọi gói theo bộ quy tắc đầy đủ mà không theo dõi trạng thái kết nối. Trong một tường lửa như vậy, không có từ khóa nhà nước sẽ được sử dụng.
Quy tắc INPUT # 3 khá nhàm chán, tất cả lưu lượng truy cập kết nối với lo
giao diện loopback ( hoặc 127.0.0.1) đều được cho phép.
Các quy tắc INPUT 4, 5 và 6 được sử dụng để mở các cổng TCP 22, 80 và 443 (các cổng mặc định cho resp. SSH, HTTP và HTTPS) bằng cách cấp quyền truy cập vào các kết nối MỚI (các kết nối hiện có đã được cho phép theo quy tắc INPUT 2).
Trong tường lửa không trạng thái, các quy tắc đó sẽ xuất hiện mà không có các thuộc tính trạng thái:
4 44295 2346K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
5 40120 2370K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
6 16409 688K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
hoặc là
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
Quy tắc INPUT cuối cùng, # 7 là quy tắc chặn tất cả lưu lượng truy cập KHÔNG được cấp quyền truy cập trong quy tắc INPUT 1-7. Một quy ước khá phổ biến: mọi thứ không được phép đều bị từ chối. Về lý thuyết, quy tắc này có thể đã được bỏ qua bằng cách đặt CHÍNH SÁCH mặc định thành DỰ ÁN.
Luôn luôn điều tra toàn bộ chuỗi.
4. Biết môi trường của bạn
4.1. Các cài đặt trong tường lửa phần mềm sẽ không ảnh hưởng đến các cài đặt bảo mật được duy trì ở nơi khác trong mạng, tức là mặc dù mở dịch vụ mạng với iptables
danh sách kiểm soát truy cập chưa sửa đổi trên bộ định tuyến hoặc tường lửa khác trong mạng của bạn vẫn có thể chặn lưu lượng truy cập ...
4.2. Khi không có dịch vụ nào lắng nghe, bạn sẽ không thể kết nối và gặp lỗi từ chối kết nối , bất kể cài đặt tường lửa. Vì thế:
- Xác nhận rằng một dịch vụ đang lắng nghe (trên giao diện mạng / địa chỉ ip chính xác) và sử dụng số cổng bạn mong muốn
[sudo] netstat -plnut
hoặc sử dụng thay thế ss -tnlp
.
- Nếu các dịch vụ của bạn chưa được chạy, hãy mô phỏng một trình nghe đơn giản với netcat chẳng hạn:
[sudo] nc -l -p 123
hoặc openssl s_server -accept 1234 [options]
nếu bạn cần một trình nghe TLS / SSL (kiểm tra man s_server
các tùy chọn).
- Xác minh rằng bạn có thể kết nối từ chính máy chủ tức là
telnet <IP of Server> 123
hoặc echo "Hello" | nc <IP of Server> 123
khi kiểm tra dịch vụ bảo mật TLS / SSL openssl s_client -connect <IP of Server>:1234
, trước khi thử tương tự từ máy chủ từ xa.
4.3. Hiểu các giao thức được sử dụng bởi các dịch vụ của bạn. Bạn không thể bật / tắt các dịch vụ mà bạn không hiểu đầy đủ. Ví dụ:
- TCP hoặc UDP được sử dụng hay cả hai (như với DNS)?
- dịch vụ có sử dụng cổng mặc định cố định không (ví dụ như cổng TCP 80 cho máy chủ web)?
- cách khác là số cổng động được chọn có thể thay đổi (ví dụ: các dịch vụ RPC như NFS cổ điển đăng ký với Portmap)?
- FTP khét tiếng thậm chí sử dụng hai cổng , cả số cổng cố định và số động khi được định cấu hình để sử dụng chế độ thụ động ...
- các mô tả dịch vụ, cổng và giao thức
/etc/services
không nhất thiết phải khớp với dịch vụ thực tế sử dụng cổng.
4.4. Bộ lọc gói hạt nhân không phải là thứ duy nhất có thể hạn chế kết nối mạng:
- SELinux cũng có thể hạn chế các dịch vụ mạng.
getenforce
sẽ xác nhận nếu SELinux đang chạy.
- Mặc dù việc trở thành TCP Wrappers hơi khó hiểu vẫn là một công cụ mạnh mẽ để thực thi bảo mật mạng. Kiểm tra với
ldd /path/to/service |grep libwrap
và các /hosts.[allow|deny]
tập tin kiểm soát.
5. INPUT
hoặc FORWARD
Chuỗi
Khái niệm về chuỗi được giải thích kỹ hơn ở đây nhưng ngắn gọn là:
Các INPUT
chuỗi là nơi bạn mở và / hoặc cổng mạng gần cho các dịch vụ đang chạy tại địa phương, trên máy chủ, nơi bạn phát hành các lệnh iptables.
Các FORWARD
chuỗi là nơi bạn áp dụng quy tắc cho giao thông bộ lọc đó được chuyển tiếp bởi hạt nhân với các hệ thống khác, các hệ thống thực tế mà còn container Docker và Virtual Servers khách máy chủ khi máy Linux của bạn là hành động như một cầu nối, router, hypervisor và / hoặc làm địa chỉ mạng dịch thuật và chuyển tiếp cổng.
Một quan niệm sai lầm phổ biến là vì một container docker hoặc KVM khách chạy cục bộ, các quy tắc bộ lọc được áp dụng phải nằm trong chuỗi INPUT, nhưng đó thường không phải là trường hợp.
6. Mô-đun hạt nhân
Vì bộ lọc gói chạy trong nhân Linux, nó cũng có thể được biên dịch thành mô-đun động, nhiều mô-đun thực sự. Hầu hết các bản phân phối bao gồm bộ lọc mạng như các mô-đun và các mô-đun bộ lọc mạng cần thiết sẽ được tải vào kernel khi cần, nhưng đối với một số mô-đun, quản trị viên tường lửa sẽ cần đảm bảo chúng được tải theo cách thủ công. Điều này chủ yếu liên quan đến các mô-đun theo dõi kết nối, chẳng hạn như nf_conntrack_ftp
có thể được tải với insmod
.
Các mô-đun hiện được tải vào kernel đang chạy có thể được hiển thị với lsmod
.
Phương pháp để đảm bảo các mô-đun được tải liên tục trong các lần khởi động lại phụ thuộc vào bản phân phối Linux.