Saturday, January 18, 2025

Các công cụ quản lý của IPTables trên Linux

-

1. Các công cụ quản lý tường lửa trên Linux.

Chain INPUT.

Được sử dụng để kiểm soát các gói dữ liệu đến (incoming packets) trên máy chủ.

Chain FORWARD.

Được sử dụng khi máy chủ đang hoạt động như một router và bạn muốn kiểm soát các gói dữ liệu được chuyển tiếp qua máy chủ.

Bạn có thể sử dụng chuỗi FORWARD trong iptables để thực hiện Network Address Translation (NAT).

NAT là quá trình chuyển đổi địa chỉ IP trong tiêu đề của các gói dữ liệu khi chúng đi qua một router hoặc firewall.

Trong iptables, bạn sẽ thường sử dụng chuỗi PREROUTING và POSTROUTING trong bảng nat để thực hiện NAT, nhưng chuỗi FORWARD trong bảng filter cũng đóng một vai trò quan trọng trong việc kiểm soát lưu lượng mạng được chuyển tiếp.

Ví dụ, bạn có thể sử dụng chuỗi FORWARD để chấp nhận hoặc từ chối các gói dữ liệu được chuyển tiếp dựa trên các tiêu chí nhất định, như địa chỉ IP nguồn, địa chỉ IP đích, cổng, v.v.

Chain OUTPUT.

Được sử dụng để kiểm soát các gói dữ liệu đi (outgoing packets) từ máy chủ.

Chain DOCKER.

Được tạo bởi Docker. Nó được sử dụng để kiểm soát các gói dữ liệu liên quan đến các container Docker.

Khi bạn cài đặt Docker và bắt đầu chạy các container, Docker sẽ tự động tạo và quản lý một số chuỗi iptables, bao gồm DOCKERDOCKER-ISOLATION-STAGE-1DOCKER-ISOLATION-STAGE-2 và DOCKER-USER.

Docker sử dụng hai chuỗi DOCKER-ISOLATION-STAGE-1 và DOCKER-ISOLATION-STAGE-2 để cung cấp chính sách mặc định cho việc cô lập mạng giữa các Docker network khác nhau.

  • DOCKER-ISOLATION-STAGE-1: Đối với mỗi gói dữ liệu, Docker kiểm tra xem nó có đến từ một Docker network và có đích đến một Docker network khác hay không. Nếu có, Docker sẽ chuyển gói dữ liệu đến DOCKER-ISOLATION-STAGE-2.
  • DOCKER-ISOLATION-STAGE-2: Docker kiểm tra xem gói dữ liệu có nên được chấp nhận (nếu nó đến từ và đến cùng một Docker network) hay nên bị từ chối (nếu nó đến từ và đến hai Docker network khác nhau).

Cách tiếp cận này cho phép Docker cung cấp chính sách mặc định cho việc cô lập mạng, trong khi vẫn cho phép người dùng tùy chỉnh chính sách cô lập mạng của riêng họ bằng cách thêm các quy tắc vào chuỗi DOCKER-USER.

Docker sử dụng các chuỗi này để kiểm soát lưu lượng mạng giữa và trong các container. Các chuỗi này giúp Docker cung cấp các tính năng mạng như cô lập mạng giữa các Docker network, chuyển tiếp cổng và hỗ trợ mạng nhiều host.

Lưu ý rằng, mặc dù Docker tự động quản lý các chuỗi này, bạn vẫn có thể thêm các quy tắc iptables tùy chỉnh của mình vào chuỗi DOCKER-USER để kiểm soát lưu lượng mạng của các container.

2. Liệt kê danh sách quy tắc Iptables.

Để xem các quy tắc của iptables, bạn có thể sử dụng lệnh sau trong terminal:

sudo iptables -L -n -v

Lệnh iptables -L -n -v được sử dụng để liệt kê tất cả các quy tắc trong tất cả các bảng trong iptables. Các option có ý nghĩa như sau:

  • -L: Tuỳ chọn này được sử dụng để liệt kê tất cả các quy tắc. Nếu không có bảng nào được chỉ định, nó sẽ liệt kê tất cả các quy tắc trong tất cả các bảng.
  • -n: Tuỳ chọn này ngăn chặn phân giải tên miền. Điều này có thể làm tăng tốc độ đáng kể khi bạn có nhiều quy tắc, bởi vì nó sẽ ngăn chặn việc phải tìm kiếm DNS cho mỗi địa chỉ IP.
  • -v: Tuỳ chọn này cung cấp đầu ra chi tiết hơn (verbose). Nó sẽ hiển thị thêm thông tin, bao gồm số lượng gói tin và byte đã được xử lý bởi mỗi quy tắc, cũng như các thông tin khác như các cờ TCP, tùy chọn, v.v.

Vì vậy, iptables -L -n -v sẽ liệt kê tất cả các quy tắc trong tất cả các bảng, không giải quyết tên miền, và hiển thị đầu ra chi tiết.

shell> sudo iptables -L -n -v
Chain INPUT (policy DROP 100K packets, 6010K bytes)
 pkts bytes target     prot opt in     out     source               destination         
 1569  155K ACCEPT     tcp  --  *      *       10.166.21.4          0.0.0.0/0            tcp dpt:16499
  29M 4033M ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
 170K   16M ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
  98G 1193T ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  *      *       10.10.28.2           0.0.0.0/0            tcp dpt:22
    0     0 ACCEPT     tcp  --  *      *       10.10.28.3           0.0.0.0/0            tcp dpt:22
23313 1399K ACCEPT     tcp  --  *      *       10.166.0.0/24        0.0.0.0/0            tcp dpt:873
29611 1777K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:6556
 544K   43M ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:161
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:123

Chain FORWARD (policy ACCEPT 21 packets, 1056 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 617K   36M DOCKER-USER  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
 617K   36M DOCKER-ISOLATION-STAGE-1  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
  566 97643 ACCEPT     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
   50  2573 DOCKER     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0           
  565 1891K ACCEPT     all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  docker0 docker0  0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  *      br-cff4a41e0131  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED       
    0     0 ACCEPT     all  --  br-1697ab72c2be br-1697ab72c2be  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 64G packets, 3647G bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  !br-cff4a41e0131 br-cff4a41e0131  0.0.0.0/0            172.18.0.2           tcp dpt:9000
    0     0 ACCEPT     tcp  --  !br-cff4a41e0131 br-cff4a41e0131  0.0.0.0/0            172.18.0.3           tcp dpt:9000

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
 pkts bytes target     prot opt in     out     source               destination         
  565 1891K DOCKER-ISOLATION-STAGE-2  all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0           
 616K   34M DOCKER-ISOLATION-STAGE-2  all  --  br-cff4a41e0131 !br-cff4a41e0131  0.0.0.0/0            0.0.0.0/0           
 617K   36M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain DOCKER-ISOLATION-STAGE-2 (2 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all  --  *      docker0  0.0.0.0/0            0.0.0.0/0           
    0     0 DROP       all  --  *      br-cff4a41e0131  0.0.0.0/0            0.0.0.0/0           
 616K   36M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain DOCKER-USER (1 references)
 pkts bytes target     prot opt in     out     source               destination         
 617K   36M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

3. Chính sách mặc định.

Chính sách mặc định cho các chain INPUTOUTPUT và FORWARD trong iptables thường là ACCEPT hoặc DROP, tùy thuộc vào cấu hình bảo mật của hệ thống.

  • ACCEPT: Đây là chính sách mặc định thường thấy. Khi chính sách này được áp dụng, tất cả các gói dữ liệu đến (đối với chuỗi INPUT), đi (đối với chuỗi OUTPUT), hoặc được chuyển tiếp (đối với chuỗi FORWARD) sẽ được chấp nhận mặc định nếu không có quy tắc nào khác được áp dụng.
  • DROP: Đây là chính sách mặc định khác thường được sử dụng trong các hệ thống có yêu cầu bảo mật cao. Khi chính sách này được áp dụng, tất cả các gói dữ liệu đến (đối với chuỗi INPUT), đi (đối với chuỗi OUTPUT), hoặc được chuyển tiếp (đối với chuỗi FORWARD) sẽ bị từ chối mặc định nếu không có quy tắc nào khác được áp dụng.

Bạn có thể kiểm tra chính sách mặc định hiện tại cho mỗi chuỗi bằng cách sử dụng lệnh iptables -L hoặc có thể kiểm tra chính sách mặc định cho chuỗi INPUT bằng cách sử dụng lệnh iptables -L <chain>.

Ví dụ:

shell> iptables -L OUTPUT
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Ở két quả trên bạn không thấy bất kỳ quy tắc nào được liệt kê dưới chuỗi OUTPUT, điều đó có nghĩa là không có quy tắc nào được áp dụng cho các gói dữ liệu đi (outgoing packets) từ máy chủ của bạn.

Trong trường hợp này, chính sách mặc định cho chuỗi OUTPUT là ACCEPT, nghĩa là tất cả các gói dữ liệu đi sẽ được chấp nhận mặc định nếu không có quy tắc nào khác được áp dụng.

3. Cách thêm một quy tắc.

Để cho phép IP 10.166.21.4 kết nối đến cổng TCP 15672 và 16499, bạn có thể thêm các quy tắc iptables sau:

iptables -A INPUT -p tcp -s 10.166.21.4 --dport 15672 -j ACCEPT
iptables -A INPUT -p tcp -s 10.166.21.4 --dport 16499 -j ACCEPT

4. Thứ tự của các quy tắc.

Thứ tự của các quy tắc trong iptables rất quan trọng. Iptables xử lý các quy tắc theo thứ tự từ trên xuống dưới trong danh sách. Khi gói tin phù hợp với một quy tắc, nó sẽ thực hiện hành động tương ứng (như ACCEPT, DROP, REJECT,…) và không xem xét các quy tắc tiếp theo.

Vì vậy, nếu bạn có một quy tắc REJECT hoặc DROP ở trên các quy tắc ACCEPT của bạn, gói tin sẽ bị từ chối hoặc bị loại bỏ trước khi nó có cơ hội phù hợp với quy tắc ACCEPT.

Xem lại ví dụ trên, để đảm bảo rằng quy tắc mới của bạn không bị quy tắc nào khác chặn, bạn có thể thêm nó vào đầu danh sách bằng cách sử dụng -I thay vì -A:

iptables -I INPUT -p tcp -s 10.166.21.4 --dport 15672 -j ACCEPT
iptables -I INPUT -p tcp -s 10.166.21.4 --dport 16499 -j ACCEPT

Các quy tắc iptables bạn thêm vào sẽ được áp dụng ngay lập tức. Tuy nhiên, các quy tắc này sẽ không tồn tại sau khi bạn khởi động lại hệ thống, trừ khi bạn lưu chúng.

5. Lưu cấu hình.

Để lưu các quy tắc iptables trên hệ thống CentOS hoặc Red Hat, bạn có thể sử dụng lệnh sau:

service iptables save

Trên hệ thống Ubuntu, bạn có thể cần cài đặt gói iptables-persistent để lưu các quy tắc:

sudo apt-get install iptables-persistent

Sau khi cài đặt, bạn có thể lưu các quy tắc hiện tại với lệnh:

sudo netfilter-persistent save

Lưu ý: Bạn cần quyền root để thực hiện các lệnh này.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories