Cách Cài Đặt Tường Lửa Sử Dụng Iptables Trên Ubuntu 14.04

Iptables Trên Ubuntu 14.04

Cài đặt một tường lửa hiệu quả là bước quan trọng để bảo mật bất kỳ hệ điều hành hiện đại nào. Hầu hết các bản phân phối Linux đi kèm với một vài công cụ tường lửa mà chúng ta có thể sử dụng để cấu hình hệ thống tường lửa của mình. Trong hướng dẫn này, chúng ta sẽ tập trung vào tường lửa iptables.

Iptables là một tường lửa tiêu chuẩn được tích hợp sẵn trong hầu hết các bản phân phối Linux theo mặc định (một biến thể hiện đại gọi là nftables sẽ dần thay thế). Nó thực chất là một giao diện phía trên các “netfilter hooks” của kernel, cho phép thao tác với ngăn xếp mạng của Linux. Iptables hoạt động bằng cách đối chiếu từng gói tin đi qua giao diện mạng với một tập hợp các quy tắc để quyết định xử lý.

Trong hướng dẫn trước, chúng ta đã tìm hiểu cách các quy tắc iptables hoạt động để chặn lưu lượng không mong muốn. Trong hướng dẫn này, chúng ta sẽ chuyển sang một ví dụ thực tế để minh họa cách tạo một bộ quy tắc cơ bản cho một máy chủ Ubuntu 14.04. Tường lửa được tạo ra sẽ cho phép lưu lượng SSH và HTTP.

Lưu ý: Hướng dẫn này chỉ đề cập đến bảo mật IPv4. Trên Linux, bảo mật IPv6 được duy trì riêng biệt với IPv4. Ví dụ, “iptables” chỉ quản lý các quy tắc tường lửa cho địa chỉ IPv4, trong khi đối với IPv6, có một công cụ tương đương gọi là “ip6tables” để quản lý các quy tắc cho địa chỉ IPv6.

Nếu VPS của bạn được cấu hình cho IPv6, hãy nhớ bảo mật cả giao diện mạng IPv4 và IPv6 với các công cụ thích hợp. Để biết thêm thông tin về các công cụ IPv6, hãy tham khảo hướng dẫn: Cách Cấu Hình Các Công Cụ Sử Dụng IPv6 Trên VPS Linux

Yêu Cầu

Trước khi bắt đầu với hướng dẫn này, bạn cần phải có một tài khoản superuser không phải root riêng biệt – một người dùng có quyền sudo – được thiết lập trên máy chủ của bạn. Nếu bạn cần cài đặt tài khoản này, hãy tham khảo hướng dẫn: Thiết Lập Máy Chủ Ban Đầu Với Ubuntu 14.04.

Các Lệnh Cơ Bản Của Iptables

Bây giờ, khi bạn đã nắm được các khái niệm cơ bản của iptables, chúng ta hãy cùng điểm qua những lệnh cơ bản sẽ được sử dụng để tạo thành bộ quy tắc phức tạp và quản lý giao diện iptables nói chung.

Trước tiên, bạn cần lưu ý rằng các lệnh iptables phải được thực thi với quyền root. Điều này có nghĩa là bạn cần đăng nhập với tư cách root, sử dụng su hoặc sudo -i để có được shell root, hoặc thêm sudo vào trước các lệnh. Trong hướng dẫn này, chúng ta sẽ sử dụng sudo vì đó là phương pháp được ưu tiên trên hệ thống Ubuntu.

Một điểm khởi đầu tốt là liệt kê các quy tắc hiện tại đã được cấu hình cho iptables. Bạn có thể thực hiện việc đó với tham số -L:

sudo iptables -L

Output:

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

Như bạn thấy, chúng ta có ba chain mặc định (INPUT, OUTPUT và FORWARD). Chúng ta cũng có thể thấy chính sách mặc định của từng chain (ở đây, mỗi chain có chính sách mặc định là ACCEPT). Bạn cũng thấy các tiêu đề cột, nhưng chưa có quy tắc cụ thể nào được liệt kê. Điều này là do Ubuntu không cài sẵn một bộ quy tắc mặc định.

Để hiển thị đầu ra ở dạng phản ánh các lệnh cần thiết để kích hoạt từng quy tắc và chính sách, bạn có thể dùng tham số -S:

sudo iptables -S

Output:

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

Để tái tạo cấu hình, chỉ cần gõ sudo iptables theo sau là từng dòng lệnh trong output. (Tùy vào cấu hình, có thể phức tạp hơn nếu bạn đang kết nối từ xa và không thiết lập chính sách DROP mặc định trước khi các quy tắc được thiết lập để bảo đảm kết nối hiện tại của bạn được phép thông qua.)

Nếu bạn đã có các quy tắc và muốn xóa chúng để bắt đầu lại, bạn có thể xóa sạch các quy tắc hiện tại bằng lệnh:

sudo iptables -F

Một lần nữa, chính sách mặc định rất quan trọng ở đây, vì mặc dù tất cả các quy tắc trong chain sẽ bị xóa, nhưng chính sách mặc định sẽ không thay đổi khi dùng lệnh này. Điều này có nghĩa là nếu bạn đang kết nối từ xa, hãy đảm bảo rằng chính sách mặc định của các chain INPUT và OUTPUT được đặt thành ACCEPT trước khi xóa các quy tắc. Bạn có thể thực hiện điều đó bằng cách:

sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F

Bạn có thể thay đổi chính sách DROP mặc định sau khi đã thiết lập các quy tắc cho phép kết nối của bạn. Chúng ta sẽ xem cách làm điều đó ngay sau.

Tạo Quy Tắc Đầu Tiên

Chúng ta sẽ bắt đầu xây dựng các chính sách tường lửa. Như đã đề cập ở trên, chúng ta sẽ làm việc với chain INPUT vì đây là “cửa ống” mà lưu lượng đến sẽ đi qua. Chúng ta sẽ bắt đầu với quy tắc đã được đề cập ở trên: quy tắc cho phép kết nối SSH hiện tại của bạn.

Quy tắc đầy đủ bạn cần là:

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

Quy tắc này có vẻ phức tạp, nhưng hầu hết các thành phần sẽ trở nên rõ ràng khi chúng ta đi qua các phần sau:

  • -A INPUT: Tham số -A (append) thêm một quy tắc vào cuối chain. Phần này của lệnh báo cho iptables rằng chúng ta muốn thêm một quy tắc mới vào cuối chain, và chain mà chúng ta muốn thao tác là INPUT.
  • -m conntrack: Iptables có một bộ chức năng cốt lõi, đồng thời có một số module mở rộng cung cấp thêm khả năng. Phần này của lệnh cho biết chúng ta muốn sử dụng chức năng do module conntrack cung cấp. Module này cho phép chúng ta đưa ra các quyết định dựa trên mối quan hệ của gói tin với các kết nối trước đó.
  • –ctstate: Đây là một trong những tham số được cung cấp bởi module conntrack. Tham số này cho phép chúng ta đối chiếu gói tin dựa trên cách chúng liên kết với các gói tin đã thấy trước đó. Chúng ta truyền giá trị ESTABLISHED để cho phép các gói tin thuộc về một kết nối đã được thiết lập, và giá trị RELATED để cho phép các gói tin liên quan đến một kết nối đã được thiết lập. Đây là phần của quy tắc giúp nhận diện phiên SSH hiện tại của bạn.
  • -j ACCEPT: Tham số -j chỉ định “target” của các gói tin khớp. Ở đây, chúng ta báo cho iptables rằng các gói tin khớp với các điều kiện trên sẽ được chấp nhận và cho phép đi qua.

Chúng ta đặt quy tắc này lên đầu chain để đảm bảo các kết nối hiện tại được nhận diện, chấp nhận và loại bỏ khỏi chain trước khi gặp bất kỳ quy tắc DROP nào.

Để kiểm tra sự thay đổi, ta liệt kê các quy tắc:

sudo iptables -L

Output:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Cho Phép Các Kết Nối Cần Thiết Khác

Chúng ta đã bảo iptables giữ mở các kết nối hiện có và cho phép các kết nối mới liên quan đến chúng. Tuy nhiên, chúng ta cần tạo thêm các quy tắc để xác định khi nào cho phép các kết nối mới không thuộc các tiêu chí trên.

Chúng ta muốn mở hai cổng cụ thể: cổng SSH (mặc định là 22; nếu bạn đã thay đổi, hãy điều chỉnh giá trị này cho phù hợp) và cổng HTTP (mặc định là 80, giả sử máy chủ của bạn đang chạy web server). Nếu không, bạn có thể bỏ qua quy tắc cho cổng HTTP.

Hai dòng lệnh để thêm các quy tắc này như sau:

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Như bạn thấy, chúng tương tự với quy tắc đầu tiên, nhưng có một số tùy chọn mới:

  • -p tcp: Tham số này đối chiếu các gói tin nếu giao thức sử dụng là TCP – một giao thức dựa trên kết nối được sử dụng phổ biến cho hầu hết các ứng dụng do khả năng giao tiếp tin cậy.
  • –dport: Tham số này chỉ khả dụng khi đã sử dụng -p tcp. Nó đưa ra yêu cầu đối chiếu cổng đích của gói tin. Quy tắc đầu tiên đối chiếu các gói tin TCP dành cho cổng 22, trong khi quy tắc thứ hai đối chiếu các gói tin TCP cho cổng 80.

Ngoài ra, chúng ta cần một quy tắc nữa để đảm bảo máy chủ của bạn hoạt động đúng cách. Thường thì các dịch vụ trên máy tính giao tiếp với nhau bằng cách gửi gói tin qua giao diện mạng ảo gọi là thiết bị loopback, chuyển lưu lượng về chính nó thay vì gửi đến máy tính khác.
Nếu một dịch vụ muốn giao tiếp với dịch vụ khác đang lắng nghe trên cổng 4555, nó có thể gửi gói tin đến cổng 4555 của thiết bị loopback. Chúng ta muốn loại lưu lượng này được phép, vì nó cần thiết cho hoạt động chính xác của nhiều chương trình.

Quy tắc cần thêm là:

sudo iptables -I INPUT 1 -i lo -j ACCEPT

Giải thích:

  • -I INPUT 1: Tham số -I (insert) cho iptables biết rằng chúng ta muốn chèn một quy tắc. Khác với tham số -A (append) thêm quy tắc vào cuối chain, -I cho phép chỉ định vị trí trong chain nơi bạn muốn chèn quy tắc mới. Ở đây, chúng ta chèn quy tắc này vào vị trí đầu tiên của chain INPUT, đẩy các quy tắc còn lại xuống dưới. Điều này quan trọng vì quy tắc này cơ bản và cần được áp dụng trước các quy tắc khác.
  • -i lo: Phần này của quy tắc đối chiếu nếu giao diện mà gói tin sử dụng là “lo” – tên khác của thiết bị loopback. Điều này có nghĩa là bất kỳ gói tin nào sử dụng giao diện này (được tạo ra bởi máy chủ và dành cho máy chủ) sẽ được chấp nhận.

Để xem các quy tắc hiện tại kèm theo thông tin chi tiết (ví dụ như giao diện của quy tắc), sử dụng tham số -S:

sudo iptables -S

Output:

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Triển Khai Quy Tắc DROP

Chúng ta hiện có bốn quy tắc riêng biệt để chấp nhận các gói tin dựa trên một số tiêu chí nhất định. Tuy nhiên, tường lửa của chúng ta hiện tại vẫn chưa chặn bất cứ gói tin nào.

Nếu một gói tin đi vào chuỗi INPUT mà không khớp với bất kỳ quy tắc nào, nó sẽ được xử lý theo chính sách mặc định, vốn đang cho phép tất cả các gói tin đi qua. Chúng ta cần thay đổi điều này.

Hai cách để chặn các gói tin không mong muốn

Cách 1: Thay đổi chính sách mặc định thành DROP

sudo iptables -P INPUT DROP

Lệnh này sẽ đảm bảo rằng mọi gói tin không phù hợp với bất kỳ quy tắc nào trong INPUT sẽ bị loại bỏ. Đây được gọi là chính sách mặc định loại bỏ (default drop policy).

Ưu điểm:

  • Cải thiện bảo mật, vì ngay cả khi các quy tắc bị xóa, máy chủ vẫn không mở cửa cho tất cả lưu lượng truy cập.

Nhược điểm:

  • Nếu bạn không có cách khác để truy cập máy chủ, bạn có thể tự khóa chính mình khỏi hệ thống.

Với DigitalOcean hoặc các nhà cung cấp dịch vụ đám mây khác, bạn có thể sử dụng bảng điều khiển web (web console) để đăng nhập và khắc phục sự cố trong trường hợp bị khóa.

Cách 2: Giữ chính sách mặc định là ACCEPT và thêm quy tắc DROP vào cuối chuỗi

Thay vì thay đổi chính sách mặc định, bạn có thể chỉ cần thêm một quy tắc để loại bỏ tất cả các gói tin không khớp với bất kỳ quy tắc nào khác:

Đặt lại chính sách mặc định thành ACCEPT:

sudo iptables -P INPUT ACCEPT

 Thêm một quy tắc ở cuối chuỗi để loại bỏ các gói tin không mong muốn:

sudo iptables -A INPUT -j DROP

Quy tắc này hoạt động bằng cách khớp với mọi gói tin còn lại và ngăn chúng đi xa hơn để đến chính sách mặc định.

Ưu điểm:

  • Nếu các quy tắc iptables bị xóa, bạn vẫn có thể truy cập máy chủ.

Nhược điểm:

  • Bạn phải đảm bảo rằng mọi quy tắc mới đều được chèn trước quy tắc DROP.

Quản lý quy tắc iptables hiệu quả

Xóa quy tắc DROP tạm thời để thêm quy tắc mới

sudo iptables -D INPUT -j DROP
sudo iptables -A INPUT new_rule_here
sudo iptables -A INPUT -j DROP

Chèn quy tắc tại một vị trí cụ thể (Ví dụ: chèn tại dòng số 4)

sudo iptables -I INPUT 4 new_rule_here

Xem danh sách các quy tắc hiện có cùng số thứ tự

sudo iptables -L --line-numbers

Ví dụ về đầu ra của lệnh trên

Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    ACCEPT     all  --  anywhere             anywhere            
2    ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
3    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
4    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

Thông tin này giúp bạn xác định vị trí chính xác để chèn quy tắc mới.

Liệt Kê và Xóa Các Quy Tắc Iptables

Nếu bạn muốn tìm hiểu chi tiết về việc liệt kê và xóa các quy tắc iptables, hãy xem hướng dẫn: Cách Liệt Kê và Xóa Các Quy Tắc Tường Lửa Iptables.

Lưu Cấu Hình Iptables

Mặc định, các quy tắc bạn thêm vào iptables chỉ mang tính tạm thời. Điều này có nghĩa là khi bạn khởi động lại máy chủ, các quy tắc iptables sẽ bị xóa.

Điều này thực ra là một tính năng đối với một số người dùng, vì nó tạo cơ hội để quay lại nếu bạn vô tình khóa chính mình ra khỏi máy chủ. Tuy nhiên, hầu hết người dùng sẽ muốn có cách lưu các quy tắc mà bạn đã tạo và tự động tải chúng khi máy chủ khởi động.

Có một vài cách để làm điều này, nhưng cách đơn giản nhất là sử dụng gói iptables-persistent. Bạn có thể tải gói này từ kho mặc định của Ubuntu:

sudo apt-get update
sudo apt-get install iptables-persistent

Trong quá trình cài đặt, bạn sẽ được hỏi liệu có muốn lưu các quy tắc hiện tại để tự động tải chúng hay không. Nếu bạn hài lòng với cấu hình hiện tại (và đã kiểm tra khả năng tạo kết nối SSH độc lập), bạn có thể chọn lưu các quy tắc hiện tại.

Hệ thống cũng sẽ hỏi bạn có muốn lưu các quy tắc IPv6 đã được cấu hình hay không. Các quy tắc IPv6 được cấu hình thông qua một tiện ích riêng gọi là ip6tables, hoạt động gần như giống nhau.

Sau khi cài đặt xong, bạn sẽ có một dịch vụ mới gọi là iptables-persistent được cấu hình để chạy khi khởi động. Dịch vụ này sẽ tải các quy tắc của bạn và áp dụng chúng khi máy chủ khởi động.

Lưu Các Cập Nhật

Nếu bạn cập nhật tường lửa và muốn bảo toàn các thay đổi, bạn phải lưu các quy tắc iptables để chúng có hiệu lực lâu dài.

Lưu các quy tắc tường lửa của bạn bằng lệnh:

sudo invoke-rc.d iptables-persistent save

Kết Luận

Bây giờ, bạn đã có một điểm khởi đầu tốt để phát triển một tường lửa phù hợp với nhu cầu của mình. Có nhiều tiện ích tường lửa khác, một số có thể dễ sử dụng hơn, nhưng iptables là một công cụ học tập tuyệt vời. Nó giúp bạn hiểu rõ hơn về cấu trúc netfilter bên dưới và cũng vì nó có mặt trên rất nhiều hệ thống.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *