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 DOCKER
, DOCKER-ISOLATION-STAGE-1
, DOCKER-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 đếnDOCKER-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 INPUT
, OUTPUT
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ỗiINPUT
), đi (đối với chuỗiOUTPUT
), hoặc được chuyển tiếp (đối với chuỗiFORWARD
) 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ỗiINPUT
), đi (đối với chuỗiOUTPUT
), hoặc được chuyển tiếp (đối với chuỗiFORWARD
) 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.