Thứ hai, 10/08/2015 | 00:00 GMT+7

Iptables Essentials: Các quy tắc và lệnh firewall chung

Iptables là phần mềm firewall có trong hầu hết các bản phân phối Linux theo mặc định. Hướng dẫn kiểu ghi chú này cung cấp một tra cứu nhanh đến các lệnh iptables sẽ tạo ra các luật firewall rất hữu ích trong các tình huống phổ biến hàng ngày. Điều này bao gồm các ví dụ iptables về việc cho phép và chặn các dịch vụ khác nhau theo cổng, network interface và địa chỉ IP nguồn.

Cách sử dụng Hướng dẫn này

  • Nếu bạn mới bắt đầu cấu hình firewall iptables của bạn , hãy xem phần giới thiệu của ta về iptables
  • Hầu hết các luật được mô tả ở đây đều giả định iptables của bạn được đặt thành DROP lưu lượng đến, thông qua policy nhập mặc định và bạn muốn cho phép có chọn lọc lưu lượng truy cập vào
  • Sử dụng bất kỳ phần nào tiếp theo có thể áp dụng cho những gì bạn đang cố gắng đạt được. Hầu hết các phần không được dự đoán trên bất kỳ phần nào khác, vì vậy bạn có thể sử dụng các ví dụ bên dưới một cách độc lập
  • Sử dụng menu Nội dung ở phía bên phải của trang này (ở độ rộng trang rộng) hoặc chức năng tìm kiếm của trình duyệt của bạn để tìm các phần bạn cần
  • Copy paste các ví dụ dòng lệnh đã cho, thay thế các giá trị màu đỏ bằng các giá trị của bạn

Lưu ý thứ tự các luật của bạn rất quan trọng. Tất cả các lệnh iptables này sử dụng tùy chọn -A để thêm luật mới vào cuối chuỗi. Nếu bạn muốn đặt nó ở một nơi khác trong chuỗi, bạn có thể sử dụng tùy chọn -I cho phép bạn chỉ định vị trí của luật mới (hoặc chỉ cần đặt nó ở đầu chuỗi bằng cách không chỉ định số luật ).

Lưu ý: Khi làm việc với firewall , hãy cẩn thận không tự khóa server của bạn bằng cách chặn lưu lượng SSH (cổng 22, theo mặc định). Nếu bạn mất quyền truy cập do cài đặt firewall , bạn có thể cần phải kết nối với nó qua console để sửa quyền truy cập của bạn . Sau khi kết nối qua console , bạn có thể thay đổi các luật firewall của bạn để cho phép truy cập SSH (hoặc cho phép tất cả lưu lượng truy cập). Nếu các luật firewall đã lưu của bạn cho phép truy cập SSH, một phương pháp khác là khởi động lại server của bạn.

Lưu ý bạn có thể kiểm tra bộ luật iptables hiện tại của bạn bằng sudo iptables -Ssudo iptables -L .

Hãy cùng xem các lệnh của iptables!

Luật lưu

Các luật Iptables là tạm thời, nghĩa là chúng cần được lưu theo cách thủ công để chúng tồn tại sau khi khởi động lại.

Ubuntu

Trên Ubuntu, cách dễ nhất để lưu các luật iptables, để chúng sẽ tồn tại sau khi khởi động lại, là sử dụng gói iptables-persistent . Cài đặt nó bằng apt-get như sau:

  • sudo apt-get install iptables-persistent

Trong khi cài đặt, bạn sẽ hỏi bạn có muốn lưu các luật firewall hiện tại của bạn hay không.

Nếu bạn cập nhật các luật firewall của bạn và muốn lưu các thay đổi, hãy chạy lệnh sau:

  • sudo netfilter-persistent save

Trên các version Ubuntu trước 16.04, hãy chạy lệnh này thay thế:

  • sudo invoke-rc.d iptables-persistent save

CentOS 6 trở lên

Trên CentOS 6 trở lên — CentOS 7 sử dụng FirewallD theo mặc định — bạn có thể sử dụng tập lệnh iptables init để lưu các luật iptables của bạn :

  • sudo service iptables save

Thao tác này sẽ lưu các luật iptables hiện tại của bạn vào file /etc/sysconfig/iptables .

Luật liệt kê và xóa

Nếu bạn muốn tìm hiểu cách liệt kê và xóa các luật iptables, hãy xem hướng dẫn này: Cách Liệt kê và Xóa Luật Tường lửa Iptables .

Các luật chung hữu ích

Phần này bao gồm nhiều lệnh iptables sẽ tạo ra các luật thường hữu ích trên hầu hết các server .

Cho phép kết nối lặp lại

Giao diện loopback , còn gọi là lo , là những gì máy tính sử dụng để chuyển tiếp các kết nối mạng tới chính nó. Ví dụ: nếu bạn chạy ping localhost hoặc ping 127.0.0.1 , server của bạn sẽ tự ping bằng cách sử dụng loopback. Giao diện loopback cũng được sử dụng nếu bạn cấu hình server ứng dụng của bạn để kết nối với server database có địa chỉ “localhost”. Như vậy, bạn cần chắc chắn rằng firewall của bạn đang cho phép các kết nối này.

Để chấp nhận tất cả lưu lượng truy cập loopback của bạn, hãy chạy các lệnh sau:

  • sudo iptables -A INPUT -i lo -j ACCEPT
  • sudo iptables -A OUTPUT -o lo -j ACCEPT

Vì lưu lượng mạng nói chung cần phải có hai chiều — đến và đi — để hoạt động bình thường, nên điển hình là tạo luật firewall cho phép lưu lượng đến được cài đặt có liên quan , để server sẽ cho phép lưu lượng trở lại các kết nối đi do server khởi tạo chinh no. Lệnh này sẽ cho phép:

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

Cho phép các kết nối đi được cài đặt

Bạn có thể cần cho phép lưu lượng đi của tất cả các kết nối đã cài đặt , thường là phản hồi cho các kết nối đến hợp lệ . Lệnh này sẽ cho phép:

  • sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

Nội bộ đến Bên ngoài

Giả sử eth0 là mạng bên ngoài của bạn và eth1 là mạng nội bộ của bạn, điều này sẽ cho phép nội bộ của bạn truy cập vào bên ngoài:

  • sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Thả các gói không hợp lệ

Một số gói lưu lượng mạng được đánh dấu là không hợp lệ . Đôi khi có thể hữu ích khi ghi lại loại gói tin này nhưng thường thì việc loại bỏ chúng cũng không sao. Làm như vậy với lệnh này:

  • sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

Chặn địa chỉ IP

Để chặn các kết nối mạng bắt nguồn từ một địa chỉ IP cụ thể, ví dụ: 15.15.15.51 , hãy chạy lệnh này:

  • sudo iptables -A INPUT -s 15.15.15.51 -j DROP

Trong ví dụ này, -s 15.15.15.51 chỉ định địa chỉ IP nguồn là “15.15.15.51”. Địa chỉ IP nguồn có thể được chỉ định trong bất kỳ luật firewall nào, bao gồm cả luật cho phép .

Nếu bạn muốn từ chối kết nối, điều này sẽ phản hồi yêu cầu kết nối với lỗi “kết nối bị từ chối”, hãy thay thế “DROP” bằng “REJECT” như sau:

  • sudo iptables -A INPUT -s 15.15.15.51 -j REJECT

Chặn kết nối với network interface

Để chặn các kết nối từ một địa chỉ IP cụ thể, ví dụ: 15.15.15.51 , đến một network interface cụ thể, ví dụ: eth0 , hãy sử dụng lệnh này:

  • iptables -A INPUT -i eth0 -s 15.15.15.51 -j DROP

Điều này giống với ví dụ trước, với việc thêm -i eth0 . Network interface có thể được chỉ định trong bất kỳ luật firewall nào và là một cách tốt để giới hạn luật cho một mạng cụ thể.

Dịch vụ: SSH

Nếu bạn đang sử dụng server cloud , có thể bạn cần cho phép các kết nối SSH đến (cổng 22) để bạn có thể kết nối và quản lý server của bạn . Phần này trình bày cách cấu hình firewall của bạn với nhiều luật liên quan đến SSH.

Cho phép tất cả SSH đến

Để cho phép tất cả các kết nối SSH đến, hãy chạy các lệnh sau:

  • sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  • sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Lệnh thứ hai, cho phép lưu lượng đi của các kết nối SSH đã cài đặt , chỉ cần thiết nếu policy OUTPUT không được đặt thành ACCEPT .

Cho phép SSH đến từ địa chỉ IP cụ thể hoặc mạng con

Để cho phép các kết nối SSH đến từ một địa chỉ IP hoặc mạng con cụ thể, hãy chỉ định nguồn. Ví dụ: nếu bạn muốn cho phép toàn bộ mạng con 15.15.15.0/24 , hãy chạy các lệnh sau:

  • sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  • sudo iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Lệnh thứ hai, cho phép lưu lượng đi của các kết nối SSH đã cài đặt , chỉ cần thiết nếu policy OUTPUT không được đặt thành ACCEPT .

Cho phép SSH đi

Nếu policy OUTPUT của firewall của bạn không được đặt thành ACCEPT và bạn muốn cho phép các kết nối SSH đi — server của bạn bắt đầu kết nối SSH với server khác — bạn có thể chạy các lệnh sau:

  • sudo iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  • sudo iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Cho phép Rsync Đến từ Địa chỉ IP hoặc Mạng con Cụ thể

Rsync, chạy trên cổng 873, được dùng để truyền file từ máy tính này sang máy tính khác.

Để cho phép các kết nối rsync đến từ một địa chỉ IP hoặc mạng con cụ thể, hãy chỉ định địa chỉ IP nguồn và cổng đích. Ví dụ: nếu bạn muốn cho phép toàn bộ mạng con 15.15.15.0/24 có thể rsync với server của bạn, hãy chạy các lệnh sau:

  • sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  • sudo iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Lệnh thứ hai, cho phép lưu lượng đi của các kết nối rsync đã cài đặt , chỉ cần thiết nếu policy OUTPUT không được đặt thành ACCEPT .

Dịch vụ: Server Web

Các web server , chẳng hạn như Apache và Nginx, thường lắng nghe các yêu cầu trên cổng 80 và 443 cho các kết nối HTTP và HTTPS tương ứng. Nếu policy mặc định của bạn cho lưu lượng truy cập được đặt thành giảm hoặc từ chối, bạn cần tạo các luật cho phép server của bạn phản hồi các yêu cầu đó.

Cho phép tất cả HTTP đến

Để cho phép tất cả các kết nối HTTP (cổng 80) đến, hãy chạy các lệnh sau:

  • sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  • sudo iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Lệnh thứ hai, cho phép lưu lượng đi của các kết nối HTTP đã cài đặt , chỉ cần thiết nếu policy OUTPUT không được đặt thành ACCEPT .

Cho phép tất cả HTTPS đến

Để cho phép tất cả các kết nối HTTPS (cổng 443) đến, hãy chạy các lệnh sau:

  • sudo iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  • sudo iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Lệnh thứ hai, cho phép lưu lượng đi của các kết nối HTTP đã cài đặt , chỉ cần thiết nếu policy OUTPUT không được đặt thành ACCEPT .

Cho phép tất cả HTTP và HTTPS đến

Nếu bạn muốn cho phép cả truy cập HTTP và HTTPS, bạn có thể sử dụng module đa cổng để tạo luật cho phép cả hai cổng. Để cho phép tất cả các kết nối HTTP và HTTPS (cổng 443) đến, hãy chạy các lệnh sau:

  • sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  • sudo iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Lệnh thứ hai, cho phép lưu lượng đi của các kết nối HTTP và HTTPS đã cài đặt , chỉ cần thiết nếu policy OUTPUT không được đặt thành ACCEPT .

Dịch vụ: MySQL

MySQL lắng nghe các kết nối client trên cổng 3306. Nếu server database MySQL của bạn đang được client sử dụng trên server từ xa, bạn cần đảm bảo cho phép lưu lượng đó.

Cho phép MySQL từ Địa chỉ IP hoặc Mạng con Cụ thể

Để cho phép các kết nối MySQL đến từ một địa chỉ IP hoặc mạng con cụ thể, hãy chỉ định nguồn. Ví dụ: nếu bạn muốn cho phép toàn bộ mạng con 15.15.15.0/24 , hãy chạy các lệnh sau:

  • sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  • sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Lệnh thứ hai, cho phép lưu lượng đi của các kết nối MySQL đã cài đặt , chỉ cần thiết nếu policy OUTPUT không được đặt thành ACCEPT .

Cho phép MySQL với network interface cụ thể

Để cho phép các kết nối MySQL với một network interface cụ thể — ví dụ: giả sử bạn có network interface riêng eth1 — hãy sử dụng các lệnh sau:

  • sudo iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  • sudo iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Lệnh thứ hai, cho phép lưu lượng đi của các kết nối MySQL đã cài đặt , chỉ cần thiết nếu policy OUTPUT không được đặt thành ACCEPT .

Dịch vụ: PostgreSQL

PostgreSQL lắng nghe các kết nối client trên cổng 5432. Nếu server database PostgreSQL của bạn đang được client sử dụng trên server từ xa, bạn cần đảm bảo cho phép lưu lượng đó.

PostgreSQL từ Địa chỉ IP hoặc Mạng con Cụ thể

Để cho phép các kết nối PostgreSQL đến từ một địa chỉ IP hoặc mạng con cụ thể, hãy chỉ định nguồn. Ví dụ: nếu bạn muốn cho phép toàn bộ mạng con 15.15.15.0/24 , hãy chạy các lệnh sau:

  • sudo iptables -A INPUT -p tcp -s 15.15.15.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  • sudo iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Lệnh thứ hai, cho phép lưu lượng đi của các kết nối PostgreSQL đã cài đặt , chỉ cần thiết nếu policy OUTPUT không được đặt thành ACCEPT .

Cho phép PostgreSQL với network interface cụ thể

Để cho phép các kết nối PostgreSQL với một network interface cụ thể — ví dụ: giả sử bạn có network interface riêng eth1 — hãy sử dụng các lệnh sau:

  • sudo iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  • sudo iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Lệnh thứ hai, cho phép lưu lượng đi của các kết nối PostgreSQL đã cài đặt , chỉ cần thiết nếu policy OUTPUT không được đặt thành ACCEPT .

Dịch vụ: Thư

Server thư, chẳng hạn như Sendmail và Postfix, lắng nghe trên nhiều cổng khác nhau tùy thuộc vào giao thức được sử dụng để gửi thư. Nếu bạn đang chạy một server thư, hãy xác định bạn đang sử dụng giao thức nào và cho phép các loại lưu lượng thích hợp. Ta cũng sẽ hướng dẫn bạn cách tạo luật để chặn thư SMTP gửi đi.

Chặn thư SMTP đi

Nếu server của bạn không được gửi thư đi, bạn có thể cần chặn loại lưu lượng đó. Để chặn thư SMTP đi, sử dụng cổng 25, hãy chạy lệnh sau:

  • sudo iptables -A OUTPUT -p tcp --dport 25 -j REJECT

Điều này cấu hình iptables để từ chối tất cả lưu lượng gửi đi trên cổng 25. Nếu bạn cần từ chối một dịch vụ khác theo số cổng của nó, thay vì cổng 25, chỉ cần thay thế nó.

Cho phép tất cả SMTP đến

Để cho phép server của bạn phản hồi với các kết nối SMTP, cổng 25, hãy chạy các lệnh sau:

  • sudo iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  • sudo iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Lệnh thứ hai, cho phép lưu lượng đi của các kết nối SMTP đã cài đặt , chỉ cần thiết nếu policy OUTPUT không được đặt thành ACCEPT .

Lưu ý: Thông thường các server SMTP sử dụng cổng 587 cho thư đi.

Cho phép tất cả IMAP đến

Để cho phép server của bạn phản hồi với các kết nối IMAP, cổng 143, hãy chạy các lệnh sau:

  • sudo iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  • sudo iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Lệnh thứ hai, cho phép lưu lượng đi của các kết nối IMAP đã cài đặt , chỉ cần thiết nếu policy OUTPUT không được đặt thành ACCEPT .

Cho phép tất cả IMAPS đến

Để cho phép server của bạn phản hồi với các kết nối IMAPS, cổng 993, hãy chạy các lệnh sau:

  • sudo iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  • sudo iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Lệnh thứ hai, cho phép lưu lượng đi của các kết nối IMAPS đã cài đặt , chỉ cần thiết nếu policy OUTPUT không được đặt thành ACCEPT .

Cho phép tất cả POP3 đến

Để cho phép server của bạn phản hồi với các kết nối POP3, cổng 110, hãy chạy các lệnh sau:

  • sudo iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  • sudo iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Lệnh thứ hai, cho phép lưu lượng đi của các kết nối POP3 đã cài đặt , chỉ cần thiết nếu policy OUTPUT không được đặt thành ACCEPT .

Cho phép tất cả POP3S đến

Để cho phép server của bạn phản hồi với các kết nối POP3S, cổng 995, hãy chạy các lệnh sau:

  • sudo iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  • sudo iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Lệnh thứ hai, cho phép lưu lượng đi của các kết nối POP3S đã cài đặt , chỉ cần thiết nếu policy OUTPUT không được đặt thành ACCEPT .

Kết luận

Điều đó sẽ bao gồm nhiều lệnh thường được sử dụng khi cấu hình firewall iptables. Tất nhiên, iptables là một công cụ rất linh hoạt, vì vậy hãy thoải mái trộn và kết hợp các lệnh với các tùy chọn khác nhau để phù hợp với nhu cầu cụ thể của bạn nếu chúng không được đề cập ở đây.

Nếu bạn đang tìm kiếm trợ giúp để xác định cách cài đặt firewall của bạn , hãy xem hướng dẫn này: Cách Chọn Chính sách Tường lửa Hiệu quả để Bảo mật Server của bạn .

Chúc may mắn!


Tags:

Các tin liên quan

Cách cô lập server trong mạng riêng bằng Iptables
2014-06-04
Cách thiết lập firewall bằng Iptables trên Ubuntu 14.04
2014-05-06
Cách thức hoạt động của firewall Iptables
2014-05-02
Cách thiết lập firewall Iptables cơ bản trên Centos 6
2013-04-16
Cách thiết lập firewall Iptables cơ bản trên Centos 6
2013-04-16