Iptables và những câu lệnh đơn giản cho người mới

Tác giả: 13/01/2023

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!

Trả lời