Iptables và những câu lệnh đơn giản cho người mới
Hầu hết các bản phân phối của Linux đều bao gồm 1 loại tường lửa dựa trên máy chủ (host-based) được gọi là Netfilter (Iptables). Bộ lọc mạng là 1 tập những “hook” bên trong kernel của Linux, chúng cho phép kernel tạo ra những hàm callback đối với tầng Network. 1 hàm callback sẽ được gọi mỗi khi có gói tin đi qua hook tương ứng bên trong tầng mạng.
Nói 1 cách đơn giản, “hook” là những quy tắc, Iptables sẽ phân loại và xử lý các gói tin vào/ra dựa theo các quy tắc được thiết lập từ trước.
Một vài câu lệnh Iptables Netfilter Firewall cơ bản
Lưu ý: bài viết này không phải hướng dẫn cài đặt iptables mà sẽ nói về các câu lệnh thường sử dụng với nó
1. Hiển thị trạng thái của Iptables
Thực hiện câu lệnh sau với quyền root:
iptables -L -n -v
Output của câu lệnh này sẽ có dạng như sau:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Như trên biểu thị Iptables đang không hoạt động. Ví dụ dưới đây là 1 iptables đang hoạt động:
Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID 394 43586 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 93 17292 ACCEPT all -- br0 * 0.0.0.0/0 0.0.0.0/0 1 142 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- br0 br0 0.0.0.0/0 0.0.0.0/0 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID 0 0 TCPMSS tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x06/0x02 TCPMSS clamp to PMTU 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 wanin all -- vlan2 * 0.0.0.0/0 0.0.0.0/0 0 0 wanout all -- * vlan2 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- br0 * 0.0.0.0/0 0.0.0.0/0 Chain OUTPUT (policy ACCEPT 425 packets, 113K bytes) pkts bytes target prot opt in out source destination Chain wanin (1 references) pkts bytes target prot opt in out source destination Chain wanout (1 references) pkts bytes target prot opt in out source destination
Trong đó:
- -L : danh sách các rule
- -v : hiển thị thông tin chi tiết
- -n : hiển thị địa chỉ IP và port với định dạng số. Option này cũng khiến iptables không dùng DNS để phân giải tên miền, giúp tăng tốc độ liệt kê
2. Start / stop / restart Iptables
Đối với các hệ điều hành CentOS / RHEL / Fedora Linux, sử dụng:
service iptables start
service iptables stop
service iptables restart
Bạn cũng có thể sử dụng lệnh iptables để stop service hay xóa các rule:
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
Trong đó:
- -F : xóa tất cả các rule
- -X : xóa chain
- -t table_name : chỉ định table để xóa rule hay chain
- -P : thiết lập chính sách mặc định (như DROP, REJECT, hay ACCEPT)
3. Xóa rule
Để hiển thị số thứ tự của dòng và các thông tin khác của rule đang có, sử dụng:
iptables -L INPUT -n --line-numbers
iptables -L OUTPUT -n --line-numbers
iptables -L OUTPUT -n --line-numbers | less
iptables -L OUTPUT -n --line-numbers | grep 103.28.120.1
Sau khi biết được, dòng cần xóa số bao nhiêu, ví dụ như dòng 5, ta sử dụng lệnh sau:
iptables -D INPUT 4
Hoặc xóa theo source IP thì dùng lệnh sau:
iptables -D INPUT -s 103.28.120.1 -j DROP
Trong đó: -D là tùy chọn cho phép xóa rule từ chain được chỉ định
4. Thêm rule
Đầu tiên, ta tiếp tục sử dụng lệnh kiểm tra thông tin số dòng bằng lệnh như bên trên. Ví dụ output đưa ra như sau:
Chain INPUT (policy DROP) num target prot opt source destination 1 DROP all -- 103.28.120.1 0.0.0.0/0 2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state NEW,ESTABLISHED
Để thêm rule vào giữa dòng 1 và 2, sử dụng lệnh sau:
iptables -I INPUT 2 -s 103.28.120.1 -j DROP
Để xem rule vừa cập nhật, ta lại tiếp tục sử dụng lệnh:
iptables -L INPUT -n --line-numbers
Output sẽ có dạng:
Chain INPUT (policy DROP) num target prot opt source destination 1 DROP all -- 202.54.1.1 0.0.0.0/0 2 DROP all -- 202.54.1.2 0.0.0.0/0 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state NEW,ESTABLISHED
5. Lưu rule
Sau khi thay đổi rule, hãy lưu chúng lại, trên CentOS / RHEL / Fedora Linux sử dụng lệnh:
service iptables save
Đối với các bản phân phối khác, hãy sử dụng lệnh iptables-save:
iptables-save > /root/my.active.firewall.rules
6. Khôi phục rule
Để khôi phục rule từ file đã save, trên CentOS / RHEL / Fedora Linux ta dùng:
service iptables restart
Và với các bản phân phối khác, lệnh sau sẽ giúp khôi phục rule:
iptables-restore < /root/my.active.firewall.rules
7. Thiết lập chính sách tường lửa mặc định
Để loại bỏ toàn bộ lưu lượng, ta có thể làm như sau:
iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -L -v -n
Nếu bạn muốn mở traffic nào thì chỉ cần thay “DROP” bằng “ACCEPT”
8. Loại bỏ địa chỉ mạng nội bộ ở giao diện mạng công khai
Cách tốt nhất để chống giả mạo IP (IP spoofing) là chặn các dải địa chỉ IP private ở card mạng public. Ta có thể sử dụng cú pháp sau:
iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Ngoài ra, các dải sau cũng là những dải địa chỉ IP có thể dùng để spoof:
- 10.0.0.0/8 (lớp A)
- 172.16.0.0/12 (lớp B)
- 192.168.0.0/16 (lớp C)
- 224.0.0.0/4 (multicast lớp D)
- 240.0.0.0/5 (lớp E)
- 127.0.0.0/8 (dải loopback)
9. Chặn 1 địa chỉ IP
Để chặn 1 địa chỉ hay 1 dải địa chỉ IP ta sử dụng lệnh sau:
iptables -A INPUT -s 1.2.3.4 -j DROP iptables -A INPUT -s 192.168.0.0/24 -j DROP
10. Chặn port
Ví dụ ta muốn chặn request đến/đi ở port 80, ta có thể sử dụng:
iptables -A INPUT -p tcp --dport 80 -j DROP iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP iptables -A OUTPUT -p tcp -d 1.2.3.4 --dport 80 -j DROP
11. Chặn domain
Ví dụ ta muốn chặn Google.com, sử dụng lệnh như sau:
iptables -A OUTPUT -p tcp -d www.google.com -j DROP
12. Ghi lại log loại bỏ gói
Lệnh sau giúp ta ghi lại log và loại bỏ gói tin IP giả mạo trên giao diện mạng public eth1:
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: " iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Log này sẽ được ghi vào file /var/log/messages
13. Giới hạn việc ghi lại log
Tùy chọn -limit có thể giới hạn số dòng log được ghi trong 1 khoảng thời gian, việc này có thể ngăn chặn file log bị tràn thông tin gây khó khăn khi phân tích. Ví dụ dưới đây giới hạn 7 dòng log mỗi 5 phút:
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: " iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
14. Loại bỏ hoặc cho phép lưu lượng theo địa chỉ MAC
Sử dụng tùy chọn –mac-source như ví dụ sau:
iptables -A INPUT -m mac --mac-source 00:01:02:03:04:AB -j DROP iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:01:02:03:04:AB -j ACCEPT
15. Chặn hoặc cho phép gói Ping ICMP
Cú pháp sau giúp chặn ICMP ping:
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP
Ta cũng có thể giới hạn chỉ phản hồi ping với những dải IP hoặc IP nhất định:
iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT
Gói ICMP cũng có nhiều loại, ta có thể tận dụng để cấu hình sao cho phù hợp với nhu cầu:
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
16. Mở 1 dải port
Cú pháp:
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT
17. Mở 1 dải IP
Cú pháp:
iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT #Đối với NAT iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.20-192.168.1.25
18. Thiết lập kết nối và restart iptables
Khi ta restart iptables, mặc định các kết nối đã thiết lập sẽ bị hủy khi các module sẽ bị gỡ khỏi hệ thống. Để tránh điều này ta có thể chỉnh sửa file /etc/sysconfig/iptables-config và đặt trường IPTABLES_MODULES_UNLOAD thành no:
IPTABLES_MODULES_UNLOAD = no
19. Giới hạn số lượng kết nối cùng thời điểm tới máy chủ theo client IP
Sử dụng connlimit module như ví dụ sau:
iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP
Trong đó:
- –connlimit-above: áp dụng luật nếu số kết nối vượt quá con số chỉ định
- –connlimit-mask: nhóm các máy khách theo độ dài tiền tố (prefix), giá trị có thể từ 0 đến 32 đối với IPv4
20. Liệt kê các rule NAT
Cú pháp:
iptables -t nat -L -n -v
Output sẽ có dạng:
Chain PREROUTING (policy ACCEPT 496K packets, 29M bytes)
pkts bytes target prot opt in out source destination
43557 2613K DNAT tcp -- * * 0.0.0.0/0 192.168.184.8 tcp dpt:443 to:10.105.28.42:443
68700 4122K DNAT tcp -- * * 0.0.0.0/0 192.168.184.8 tcp dpt:80 to:10.105.28.42:80
15855 951K DNAT tcp -- * * 0.0.0.0/0 192.168.184.8 tcp dpt:444 to:10.105.28.45:444
16009 961K DNAT tcp -- * * 0.0.0.0/0 192.168.184.8 tcp dpt:81 to:10.105.28.45:81
63495 3810K DNAT tcp -- * * 0.0.0.0/0 192.168.184.8 tcp dpt:445 to:10.105.28.44:445
19615 1177K DNAT tcp -- * * 0.0.0.0/0 192.168.184.8 tcp dpt:82 to:10.105.28.44:82
Chain INPUT (policy ACCEPT 488K packets, 29M bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 3280 packets, 207K bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 231K packets, 14M bytes)
pkts bytes target prot opt in out source destination
3832 230K MASQUERADE all -- * * 10.105.28.0/24 !10.105.28.0/24
21. Xóa rule NAT
Cú pháp chung:
iptables -t nat -v -L -n --line-number iptables -t nat -v -L PREROUTING -n --line-number iptables -t nat -v -L POSTROUTING -n --line-number
22. Chuyển hướng port A sang port B
Cú pháp chung:
iptables -t nat -A PREROUTING -i $interfaceName -p tcp --dport $srcPortNumber -j REDIRECT --to-port $dstPortNumber
23. Reset bộ đếm gói tin
Cú pháp:
iptables -Z
Tổng kết
Qua bài viết này, Nhân Hòa đã giới thiệu đến bạn đọc về các câu lệnh hay sử dụng với Iptables. Mặc dù chưa phải là tất cả nhưng những câu lệnh từ đơn giản đến nâng cao đều được liệt kê trong danh sách.
Để hiểu rõ hơn về Iptables, đừng ngần ngại ghé qua man page để sử dụng Iptables like a pro nhé!
Chúc các bạn luôn may mắn và thành công trong công việc!