25 quy tắc tường lửa IPtables cho Linux

Quản lý lưu lượng mạng là một trong những công việc khó khăn nhất mà một người quản trị hệ thống phải đối mặt. Anh ta phải cấu hình tường lửa sao cho nó đáp ứng đủ yêu cầu của hệ thống và người dùng cho cả kết nối đến và đi, mà không để hệ thống trở nên dễ bị tấn công.

25 IPtables Firewall Rules for Linux

Đây là nơi iptables tự nhiên trở nên hữu ích. Iptables là một tường lửa dòng lệnh Linux cho phép người quản trị hệ thống quản lý lưu lượng đến và đi thông qua một tập hợp các quy tắc cấu hình được.

Iptables sử dụng một tập hợp các bảng có các chuỗi chứa một tập hợp các quy tắc được tích hợp sẵn hoặc được người dùng xác định. Nhờ những bảng này, một người quản trị hệ thống có thể lọc đúng lưu lượng mạng của hệ thống của mình.

Theo tài liệu iptables, hiện có 3 loại bảng:

    1. FILTER – đây là bảng mặc định, chứa các chuỗi tích hợp sẵn cho:
      1. INPUT  – gói tin đến cho ổ cắm cục bộ
      2. FORWARD – gói tin định tuyến qua hệ thống
      3. OUTPUT – gói tin được tạo ra từ máy cục bộ
    2. NAT – một bảng được tham khảo khi một gói tin cố gắng tạo kết nối mới. Nó đi kèm với các thành phần tích hợp sẵn sau đây:
      1. PREROUTING – được sử dụng để thay đổi một gói tin ngay sau khi nó được nhận
      2. OUTPUT – được sử dụng để thay đổi các gói tin được tạo ra từ bên trong
      3. POSTROUTING – được sử dụng để thay đổi các gói tin khi chuẩn bị đi ra
    3. MANGLE – bảng này được sử dụng để thay đổi gói tin. Cho đến phiên bản kernel 2.4 thì bảng này chỉ có hai chuỗi, nhưng hiện nay chúng là 5:
      1. PREROUTING – cho việc thay đổi kết nối đến
      2. OUTPUT – cho việc thay đổi các gói tin được tạo ra từ bên trong
      3. INPUT – cho gói tin đến
      4. POSTROUTING – cho việc thay đổi các gói tin khi chuẩn bị đi ra
      5. FORWARD – cho gói định tuyến thông qua hộp

Trong bài viết này, bạn sẽ thấy một số lệnh hữu ích sẽ giúp bạn quản lý tường lửa hộp Linux của mình thông qua iptables. Vì mục đích của bài viết này, tôi sẽ bắt đầu với các lệnh đơn giản hơn và sau đó đi vào phức tạp hơn đến cuối.

1. Bắt đầu/Dừng/Khởi động lại Tường lửa Iptables

Trước tiên, bạn nên biết cách quản lý dịch vụ iptables trong các bản phân phối Linux khác nhau. Điều này khá dễ dàng:

Trên các bản phân phối Linux dựa trên SystemD

------------ On Cent/RHEL 7 and Fedora 22+ ------------
# systemctl start iptables
# systemctl stop iptables
# systemctl restart iptables

Trên các bản phân phối Linux dựa trên SysVinit

------------ On Cent/RHEL 6/5 and Fedora ------------
# /etc/init.d/iptables start 
# /etc/init.d/iptables stop
# /etc/init.d/iptables restart

2. Kiểm tra tất cả các quy tắc Tường lửa IPtables

Nếu bạn muốn kiểm tra các quy tắc hiện có của mình, hãy sử dụng lệnh sau:

# iptables -L -n -v

Điều này sẽ trả về đầu ra tương tự như dưới đây:

Chain INPUT (policy ACCEPT 1129K packets, 415M bytes)
 pkts bytes target prot opt in out source destination 
 0 0 ACCEPT tcp -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
 0 0 ACCEPT udp -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
 0 0 ACCEPT tcp -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
 0 0 ACCEPT udp -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination 
 0 0 ACCEPT all -- * lxcbr0 0.0.0.0/0 0.0.0.0/0 
 0 0 ACCEPT all -- lxcbr0 * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 354K packets, 185M bytes)
 pkts bytes target prot opt in out source destination

Nếu bạn muốn kiểm tra các quy tắc cho một bảng cụ thể, bạn có thể sử dụng tùy chọn -t theo sau là bảng mà bạn muốn kiểm tra. Ví dụ, để kiểm tra các quy tắc trong bảng NAT, bạn có thể sử dụng:

# iptables -t nat -L -v -n

3. Chặn Địa chỉ IP Cụ thể trong Tường lửa IPtables

Nếu bạn phát hiện hoạt động không bình thường hoặc lạm dụng từ một địa chỉ IP, bạn có thể chặn địa chỉ IP đó với quy tắc sau:

# iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP

Ở đây, bạn cần thay đổi "xxx.xxx.xxx.xxx" bằng địa chỉ IP thực sự. Hãy cẩn thận khi chạy lệnh này vì bạn có thể vô tình chặn địa chỉ IP của chính mình. Tùy chọn -A sẽ thêm quy tắc vào cuối chuỗi được chọn.

Trong trường hợp bạn chỉ muốn chặn giao thông TCP từ địa chỉ IP đó, bạn có thể sử dụng tùy chọn -p mô tả giao thức. Lúc đó, lệnh sẽ trông như sau:

# iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx -j DROP

4. Bỏ chặn Địa chỉ IP trong Tường lửa IPtables

Nếu bạn đã quyết định bạn không còn muốn chặn yêu cầu từ địa chỉ IP cụ thể, bạn có thể xóa quy tắc chặn bằng lệnh sau:

# iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP

Tùy chọn -D sẽ xóa một hoặc nhiều quy tắc từ chuỗi đã chọn. Nếu bạn muốn sử dụng tùy chọn dài hơn, bạn có thể sử dụng --delete.

5. Chặn Cổng Cụ thể trong Tường lửa IPtables

Đôi khi bạn có thể muốn chặn kết nối đến hoặc đi từ một cổng cụ thể. Đây là một biện pháp bảo mật tốt và bạn nên cân nhắc điều đó khi thiết lập tường lửa của mình.

Để chặn kết nối đi từ cổng cụ thể, hãy sử dụng:

# iptables -A OUTPUT -p tcp --dport xxx -j DROP

Để cho phép kết nối đến, hãy sử dụng:

# iptables -A INPUT -p tcp --dport xxx -j ACCEPT

Trong cả hai ví dụ trên, bạn hãy thay đổi "xxx" thành cổng thực sự mà bạn muốn cho phép. Nếu bạn muốn chặn lưu lượng UDP thay vì TCP, hãy đơn giản thay đổi "tcp" bằng "udp" trong quy tắc iptables trên.

6. Cho phép Nhiều Cổng trong IPtables bằng cách Sử dụng Multiport

Bạn có thể cho phép nhiều cổng cùng một lúc bằng cách sử dụng multiport, dưới đây bạn có thể tìm thấy một quy tắc như vậy cho cả kết nối đến và đi:

# iptables -A INPUT  -p tcp -m multiport --dports 22,80,443 -j ACCEPT
# iptables -A OUTPUT -p tcp -m multiport --sports 22,80,443 -j ACCEPT

7. Cho phép Dải Mạng Cụ thể trên Cổng Cụ thể trên IPtables

Bạn có thể hạn chế một số kết nối trên cổng cụ thể cho một mạng nhất định. Hãy xem xét bạn muốn cho phép kết nối đi ra trên cổng 22 đến mạng 192.168.100.0/24.

Bạn có thể làm điều này bằng lệnh sau:

# iptables -A OUTPUT -p tcp -d 192.168.100.0/24 --dport 22 -j ACCEPT

8. Chặn Truy cập vào Facebook trên Tường lửa IPtables

Một số nhà tuyển dụng thích chặn truy cập vào Facebook của nhân viên của họ. Dưới đây là một ví dụ về cách chặn giao thông đến Facebook.

Lưu ý: Nếu bạn là một người quản trị hệ thống và cần áp dụng các quy tắc này, hãy nhớ rằng đồng nghiệp của bạn có thể ngừng nói chuyện với bạn :)

Đầu tiên, tìm các địa chỉ IP được sử dụng bởi Facebook:

# host facebook.com 
facebook.com has address 66.220.156.68
# whois 66.220.156.68 | grep CIDR
CIDR: 66.220.144.0/20

Bạn sau đó có thể chặn mạng Facebook đó với:

# iptables -A OUTPUT -p tcp -d 66.220.144.0/20 -j DROP

Hãy nhớ rằng dải địa chỉ IP được sử dụng bởi Facebook có thể thay đổi ở quốc gia của bạn.

9. Cài đặt Chuyển tiếp Cổng trong IPtables

Đôi khi bạn có thể muốn chuyển tiếp lưu lượng dịch vụ này tới cổng khác. Bạn có thể làm điều này với lệnh sau:

# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j REDIRECT --to-port 2525

Lệnh trên chuyển tiếp tất cả lưu lượng đến trên giao diện mạng eth0, từ cổng 25 tới cổng 2525. Bạn có thể thay đổi các cổng bằng cách sử dụng những cổng bạn cần.

10. Chặn Lũ Lưu lượng Mạng trên Cổng Apache với IPtables

Đôi khi địa chỉ IP có thể yêu cầu quá nhiều kết nối với các cổng web trên trang web của bạn. Điều này có thể gây ra nhiều vấn đề và để ngăn chặn những vấn đề như vậy, bạn có thể sử dụng quy tắc sau:

# iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/minute --limit-burst 200 -j ACCEPT

Lệnh trên giới hạn số lượng kết nối đến từng phút là 100 và đặt số lượng tối đa cho phép là 200. Bạn có thể chỉnh sửa giới hạn và số lượng tối đa cho phù hợp với yêu cầu cụ thể của bạn.

11. Chặn Yêu cầu Ping Đến trong IPtables

Một số quản trị viên hệ thống thích chặn các yêu cầu ping đến vì lý do bảo mật. Mặc dù mối đe dọa không lớn, nhưng tốt nhất là biết cách chặn yêu cầu như vậy:

# iptables -A INPUT -p icmp -i eth0 -j DROP

12. Cho phép Truy cập Loopback

Truy cập Loopback (truy cập từ 127.0.0.1) rất quan trọng và bạn nên luôn bật nó:

# iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT

13. Ghi nhật ký các Gói tin Mạng Bị từ chối trong IPtables

Nếu bạn muốn ghi nhật ký các gói tin bị từ chối trên giao diện mạng eth0, bạn có thể sử dụng lệnh sau:

# iptables -A INPUT -i eth0 -j LOG --log-prefix "IPtables dropped packets:"

Bạn có thể thay đổi giá trị sau "--log-prefix" bằng cái gì theo lựa chọn của bạn. Các tin nhắn được ghi lại trong /var/log/messages và bạn có thể tìm kiếm chúng bằng lệnh sau:

# grep "IPtables dropped packets:" /var/log/messages

14. Chặn Truy cập vào địa chỉ MAC Cụ thể trên IPtables

Bạn có thể chặn truy cập từ địa chỉ MAC cụ thể trên hệ thống của mình bằng cách sử dụng:

# iptables -A INPUT -m mac --mac-source 00:00:00:00:00:00 -j DROP

Tất nhiên, bạn cần thay đổi "00:00:00:00:00:00" bằng địa chỉ MAC thực tế mà bạn muốn chặn.

15. Giới hạn Số Kết nối đồng thời cho mỗi Địa chỉ IP

Nếu bạn không muốn có quá nhiều kết nối đồng thời từ cùng một địa chỉ IP tới cùng một cổng cụ thể, bạn có thể sử dụng lệnh sau:

# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT

Lệnh trên cho phép không quá 3 kết nối cho mỗi khách hàng. Tất nhiên, bạn có thể thay đổi số cổng thành các dịch vụ khác nhau. Cũng như --connlimit-above nên được thay đổi để phù hợp với yêu cầu cụ thể của bạn.

16. Tìm kiếm trong Quy tắc IPtables

Sau khi đã xác định các quy tắc iptables của mình, bạn sẽ muốn tìm kiếm đôi khi và có thể cần sửa đổi chúng. Một cách dễ dàng để tìm kiếm trong các quy tắc của bạn là sử dụng:

# iptables -L $table -v -n | grep $string

Trong ví dụ trên, bạn cần thay đổi $table bằng bảng thực tế mà bạn muốn tìm kiếm và $string bằng chuỗi thực tế bạn đang tìm kiếm.

Dưới đây là một ví dụ:

# iptables -L INPUT -v -n | grep 192.168.0.100

17. Xác định Chuỗi IPTables Mới

Với iptables, bạn có thể xác định chuỗi riêng của bạn và lưu trữ các quy tắc tùy chỉnh trong đó. Để xác định một chuỗi, hãy sử dụng:

# iptables -N custom-filter

Bây giờ bạn có thể kiểm tra xem bộ lọc của bạn có ở đó không:

# iptables -L
Đầu ra Mẫu
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain custom-filter (0 references)
target prot opt source destination

18. Xóa Thanh Chắn hoặc Quy Tắc Tường - lư trên IPTables

Nếu bạn muốn xóa các chuỗi tường lửa của mình, bạn có thể sử dụng:

# iptables -F

Bạn có thể xóa chuỗi từ bảng cụ thể bằng:

# iptables -t nat -F

Bạn có thể thay đổi "nat" bằng bảng cụ thể mà bạn muốn xóa chuỗi từ.

19. Lưu Quy Tắc IPtables vào Tệp

Nếu bạn muốn lưu lại các quy tắc tường lửa của bạn, bạn có thể sử dụng lệnh iptables-save. Bạn có thể sử dụng lệnh sau để lưu và lưu trữ các quy tắc của bạn trong một tệp:

# iptables-save > ~/iptables.rules

Điều này phụ thuộc vào bạn lưu trữ tệp ở đâu và cách bạn đặt tên cho nó.

20. Khôi phục lại các Quy tắc IPtables từ Tệp

Nếu bạn muốn khôi phục các quy tắc iptables từ một tệp, bạn có thể sử dụng iptables-restore. Lệnh sẽ nhìn như sau:

# iptables-restore < ~/iptables.rules

Tất nhiên, đường dẫn đến tệp quy tắc của bạn có thể khác.

21. Thiết lập các Quy tắc IPtables cho Tuân thủ PC

Một số quản trị viên hệ thống có thể yêu cầu cấu hình máy chủ của họ để tuân thủ PC. Có nhiều yêu cầu từ các nhà cung cấp tuân thủ PCI khác nhau, nhưng cũng có một số yêu cầu chung.

Trong nhiều trường hợp, bạn sẽ cần có nhiều hơn một địa chỉ IP. Bạn sẽ cần áp dụng các quy tắc sau cho địa chỉ IP của trang web. Hãy cực kỳ cẩn thận khi sử dụng các quy tắc sau và chỉ sử dụng chúng nếu bạn chắc chắn bạn đang làm gì:

# iptables -I INPUT -d SITE -p tcp -m multiport --dports 21,25,110,143,465,587,993,995 -j DROP

Nếu bạn sử dụng cPanel hoặc bảng điều khiển tương tự, bạn có thể cần chặn các cổng của chúng nữa. Dưới đây là một ví dụ:

# iptables -I in_sg -d DEDI_IP -p tcp -m multiport --dports  2082,2083,2095,2096,2525,2086,2087 -j DROP

Lưu ý: Để đảm bảo bạn đáp ứng các yêu cầu của nhà cung cấp PCI của mình, hãy kiểm tra báo cáo của họ cẩn thận và áp dụng các quy tắc yêu cầu. Trong một số trường hợp, bạn có thể cần chặn lưu lượng UDP trên một số cổng cụ thể.

22. Cho phép Kết nối đã thành lập và Kết nối Liên quan

Do lưu lượng mạng được tách riêng nhau đến và đi, bạn sẽ muốn cho phép kết nối đã thiết lập và kết nối liên quan đến đến. Đối với các kết nối đến, hãy sử dụng:

# iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Đối với lưu lượng đi ra, hãy sử dụng:

# iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

23. Loại Bỏ Các gói tin Không hợp lệ trong IPtables

Có thể có một số gói tin mạng được đánh dấu là không hợp lệ. Một số người có thể thích ghi lại các gói tin đó trong nhật ký, nhưng người khác lại thích từ chối chúng. Để từ chối các gói tin không hợp lệ, bạn có thể sử dụng:

# iptables -A INPUT -m conntrack --ctstate INVALID -j DROP 

24. Chặn Kết nối vào trên Giao diện Mạng

Một số hệ thống có thể có nhiều hơn một giao diện mạng. Bạn có thể giới hạn truy cập đến giao diện mạng đó hoặc chặn kết nối từ một địa chỉ IP cụ thể.

Ví dụ:

# iptables -A INPUT -i eth0 -s xxx.xxx.xxx.xxx -j DROP

Hãy thay đổi “xxx.xxx.xxx.xxx” bằng địa chỉ IP (hoặc mạng) thực tế mà bạn muốn chặn.

25. Vô hiệu hóa Gửi thư ra ngoài thông qua IPTables

Nếu hệ thống của bạn không nên gửi email, bạn có thể chặn cổng gửi đi trên các cổng SMTP. Ví dụ, bạn có thể sử dụng điều này:

# iptables -A OUTPUT -p tcp --dports 25,465,587 -j REJECT

Kết luận

Iptables là một tường lửa mạnh mẽ mà bạn có thể dễ dàng tận dụng. Điều quan trọng đối với mỗi người quản trị hệ thống là học ít nhất cơ bản về iptables. Nếu bạn muốn tìm thông tin cụ thể hơn về iptables và các tùy chọn của nó, rất khuyến nghị đọc tài liệu của nó:

# man iptables

Nếu bạn nghĩ rằng chúng tôi nên thêm các lệnh khác vào danh sách này, hãy chia sẻ chúng với chúng tôi bằng cách gửi chúng trong phần bình luận dưới đây.