Hướng dẫn cách chặn PING (chặn giao thức ICMP) trên Linux
Chặn PING luôn được xem là cách khá hữu ích trong trường hợp máy chủ của bạn bị kiểu tấn công DDOS sử dụng tính năng PING (Flood ICMP). Trong bài viết này, hãy cùng theo dõi cách chặn PING trên Linux.
PING (Packet InterNet Gopher) là một tiện ích quản trị máy tính được sử dụng để kiểm tra khả năng kết nối của máy chủ trên giao thức Internet (IP) và dùng để đo thời gian gói tin được gửi từ máy chủ đến máy đích và quay trở về.
Trên Linux có rất nhiều dịch vụ firewall như shorewall, csf, firewalld,... nhưng nhìn chung sẽ tương tác qua ‘iptables’ -> core module kernel ‘netfilter’. Vì thế mà ta sẽ sử dụng công cụ chính là ‘iptables’ để cấu hình trực tiếp các rule chặn giao thức ICMP (hoạt động PING) trên Linux.
Những option iptables hỗ trợ
Do chúng ta sẽ cần sử dụng chương trình firewall ‘iptables’ để thiết lập các rule tường lửa. Vì thế, bạn cần lưu ý cơ bản một số option sau của nó.
-A: Thêm Rule vào phía dưới bảng rule iptables.
-D: Xóa rule ra
-p: Chỉ định giao thức (ở đây mình sẽ sử dụng giao thức “icmp”)
-icmp-type: Loại chỉ định của giao thức ICMP
-J: Chỉ định đến mục tiêu
Chặn PING đến máy chủ của bạn với một thông báo lỗi
Bạn có thể chặn PING đến máy chủ Linux của bạn với một thông báo lỗi “Destination Port Unreachable”.
# iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT
Kiểm tra:
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh REJECT icmp -- anywhere anywhere icmp echo-request reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Kết quả ping thử:
[c:\~]$ ping 192.168.1.69 Pinging 192.168.1.69 with 32 bytes of data: Reply from 192.168.1.69: Destination port unreachable. Reply from 192.168.1.69: Destination port unreachable. Reply from 192.168.1.69: Destination port unreachable. Reply from 192.168.1.69: Destination port unreachable. Ping statistics for 192.168.1.69: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Để chặn PING mà không cần thông báo lỗi nào
Bạn sử dụng DROP là option cho hành động xử lý packet ‘Jump To Target’.
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP # iptables -A OUTPUT -p icmp --icmp-type echo-reply -j DROP
Kiểm tra:
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP icmp -- anywhere anywhere icmp echo-request Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination DROP icmp -- anywhere anywhere icmp echo-reply
Kết quả ping thử:
[c:\~]$ ping 192.168.1.69 Pinging 192.168.1.69 with 32 bytes of data: Request timed out. Request timed out. Request timed out. Request timed out. Ping statistics for 192.168.1.69: Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
Cho phép PING từ OUTSIDE đến INSIDE
# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
Chặn PING từ chính máy chủ của bạn
# iptables -A OUTPUT -p icmp --icmp-type echo-request -j DROP
Kết quả ping thử:
# ping google.com PING google.com (172.217.161.142) 56(84) bytes of data. ping: sendmsg: Operation not permitted ping: sendmsg: Operation not permitted ping: sendmsg: Operation not permitted ping: sendmsg: Operation not permitted ping: sendmsg: Operation not permitted ^C --- google.com ping statistics --- 5 packets transmitted, 0 received, 100% packet loss, time 4855ms
Cho phép PING từ INSIDE đến OUTSIDE
# iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT # iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
Chặn PING từ cấu hình kernel
Ngoài cách Allow/Deny PING bằng iptables ra, các bạn cũng có thể chặn PING bằng cách cấu hình tinh chỉnh Kernel như sau:
-
Deny PING:
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
Ngược lại Allow PING:
# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all