Iptables là một tiện ích tường lửa cực kỳ linh hoạt được xây dựng cho hệ điều hành Linux. Cho dù bạn là một người mới làm quen với Linux hay một quản trị viên hệ thống, có thể có một số cách mà iptables có thể là một công dụng tuyệt vời cho bạn. Đọc tiếp khi chúng tôi hướng dẫn bạn cách định cấu hình tường lửa Linux linh hoạt nhất.

Iptables là một tiện ích tường lửa dòng lệnh sử dụng chuỗi chính sách để cho phép hoặc chặn lưu lượng. Khi một kết nối cố gắng tự thiết lập trên hệ thống của bạn, iptables sẽ tìm kiếm một quy tắc trong danh sách của nó để khớp với nó. Nếu nó không tìm thấy một, nó sẽ sử dụng hành động mặc định.

iptables hầu như luôn được cài đặt sẵn trên bất kỳ bản phân phối Linux nào. Để cập nhật / cài đặt nó, chỉ cần truy xuất gói iptables:

# sudo apt-get install iptables

iptables không thực sự khó khi bạn có một vài lệnh. Bạn cần cực kỳ cẩn thận khi định cấu hình các quy tắc iptables, đặc biệt nếu bạn đang SSH vào một máy chủ, bởi vì một lệnh sai có thể khóa bạn vĩnh viễn cho đến khi nó được sửa theo cách thủ công tại máy vật lý.

Các loại chuỗi

Iptables sử dụng ba chuỗi khác nhau: đầu vào, chuyển tiếp và đầu ra.

Đầu vào – Chuỗi này được sử dụng để kiểm soát hành vi của các kết nối đến. Ví dụ: nếu người dùng cố gắng SSH vào PC / máy chủ của bạn, iptables sẽ cố gắng khớp địa chỉ IP và cổng với một quy tắc trong chuỗi đầu vào.

Chuyển tiếp – Chuỗi này được sử dụng cho các kết nối đến không thực sự được phân phối cục bộ. Hãy nghĩ về một bộ định tuyến – dữ liệu luôn được gửi đến nó nhưng hiếm khi thực sự được dành cho chính bộ định tuyến; dữ liệu chỉ được chuyển tiếp đến mục tiêu của nó. Trừ khi bạn đang thực hiện một số loại định tuyến, NATing hoặc thứ gì đó khác trên hệ thống của bạn yêu cầu chuyển tiếp, bạn thậm chí sẽ không sử dụng chuỗi này.

Có một cách chắc chắn để kiểm tra xem hệ thống của bạn có sử dụng / cần chuỗi chuyển tiếp hay không.

# iptables -L -v

Ảnh chụp màn hình ở trên là của một máy chủ đã hoạt động được vài tuần và không có giới hạn về kết nối đến hoặc đi. Như bạn có thể thấy, chuỗi đầu vào đã xử lý 11GB gói và chuỗi đầu ra đã xử lý 17GB. Mặt khác, chuỗi chuyển tiếp không cần xử lý một gói tin. Điều này là do máy chủ không thực hiện bất kỳ loại chuyển tiếp nào hoặc được sử dụng như một thiết bị chuyển tiếp.

Đầu ra  – Chuỗi này được sử dụng cho các kết nối gửi đi. Ví dụ: nếu bạn cố gắng ping howtogeek.com, iptables sẽ kiểm tra chuỗi đầu ra của nó để xem các quy tắc liên quan đến ping và howtogeek.com trước khi đưa ra quyết định cho phép hoặc từ chối nỗ lực kết nối.

Báo trước

Mặc dù ping một máy chủ bên ngoài có vẻ giống như một thứ gì đó chỉ cần duyệt qua chuỗi đầu ra, hãy nhớ rằng để trả về dữ liệu, chuỗi đầu vào cũng sẽ được sử dụng. Khi sử dụng iptables để khóa hệ thống của bạn, hãy nhớ rằng nhiều giao thức sẽ yêu cầu giao tiếp hai chiều, do đó, cả chuỗi đầu vào và đầu ra sẽ cần được định cấu hình đúng cách. SSH là một giao thức phổ biến mà mọi người quên cho phép trên cả hai chuỗi.

Hành vi mặc định của chuỗi chính sách

Trước khi đi vào và định cấu hình các quy tắc cụ thể, bạn sẽ muốn quyết định xem bạn muốn hành vi mặc định của ba chuỗi là gì. Nói cách khác, bạn muốn iptables làm gì nếu kết nối không khớp với bất kỳ quy tắc hiện có nào?

Để xem chuỗi chính sách của bạn hiện đang được định cấu hình để làm gì với lưu lượng truy cập chưa từng có, hãy chạy lệnh iptables -L.

Như bạn có thể thấy, chúng tôi cũng đã sử dụng lệnh grep để cung cấp cho chúng tôi đầu ra rõ ràng hơn. Trong ảnh chụp màn hình đó, các chuỗi của chúng tôi hiện được cho là chấp nhận lưu lượng truy cập.

Nhiều khi không, bạn sẽ muốn hệ thống của mình chấp nhận các kết nối theo mặc định. Trừ khi bạn đã thay đổi quy tắc chuỗi chính sách trước đó, cài đặt này phải được định cấu hình. Dù bằng cách nào, đây là lệnh để chấp nhận các kết nối theo mặc định:

iptables --policy INPUT ACCEPT
iptables --policy OUTPUT ACCEPT
iptables --policy FORWARD ACCEPT

Bằng cách mặc định cho quy tắc chấp nhận, sau đó bạn có thể sử dụng iptables để từ chối các địa chỉ IP hoặc số cổng cụ thể, trong khi tiếp tục chấp nhận tất cả các kết nối khác. Chúng tôi sẽ thực hiện các lệnh đó sau một phút.

Nếu bạn muốn từ chối tất cả các kết nối và chỉ định thủ công những kết nối nào bạn muốn cho phép kết nối, bạn nên thay đổi chính sách mặc định của chuỗi để loại bỏ. Làm điều này có lẽ sẽ chỉ hữu ích cho các máy chủ chứa thông tin nhạy cảm và chỉ có cùng địa chỉ IP kết nối với chúng.

iptables --policy INPUT DROP
iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP

Phản hồi dành riêng cho kết nối

Với các chính sách chuỗi mặc định của bạn được định cấu hình, bạn có thể bắt đầu thêm các quy tắc vào iptables để iptables biết phải làm gì khi gặp kết nối từ hoặc đến một địa chỉ IP hoặc cổng cụ thể. Trong hướng dẫn này, chúng ta sẽ xem xét ba “phản hồi” cơ bản và thường được sử dụng nhất.

Chấp nhận – Cho phép kết nối.

Drop – Bỏ kết nối, hành động như chưa từng xảy ra. Điều này là tốt nhất nếu bạn không muốn nguồn nhận ra hệ thống của bạn tồn tại.

Từ chối – Không cho phép kết nối nhưng gửi lại lỗi. Điều này là tốt nhất nếu bạn không muốn một nguồn cụ thể kết nối với hệ thống của mình, nhưng bạn muốn họ biết rằng tường lửa của bạn đã chặn họ.

Cách tốt nhất để chỉ ra sự khác biệt giữa ba quy tắc này là hiển thị nó trông như thế nào khi PC cố gắng ping một máy Linux với iptables được định cấu hình cho từng cài đặt này.

Cho phép kết nối:

Bỏ kết nối:

Từ chối kết nối:

Cho phép hoặc Chặn các kết nối cụ thể

Với chuỗi chính sách của bạn được định cấu hình, giờ đây bạn có thể định cấu hình iptables để cho phép hoặc chặn các địa chỉ, dải địa chỉ và cổng cụ thể. Trong các ví dụ này, chúng tôi sẽ đặt các kết nối thành DROP, nhưng bạn có thể chuyển chúng thành  ACCEPT hoặc  REJECT, tùy thuộc vào nhu cầu của bạn và cách bạn định cấu hình chuỗi chính sách của mình.

Lưu ý: Trong các ví dụ này, chúng tôi sẽ sử dụng iptables -A để nối các quy tắc vào chuỗi hiện có. iptables bắt đầu ở đầu danh sách và đi qua từng quy tắc cho đến khi tìm thấy quy tắc phù hợp. Nếu bạn cần chèn một quy tắc bên trên một quy tắc khác, bạn có thể sử dụng iptables -I [chain] [number] để chỉ định số mà quy tắc đó sẽ có trong danh sách.

Kết nối từ một địa chỉ IP

Ví dụ này cho thấy cách chặn tất cả các kết nối từ địa chỉ IP 10.10.10.10.

# iptables -A INPUT -s 10.10.10.10 -j DROP

Kết nối từ nhiều địa chỉ IP

Ví dụ này cho thấy cách chặn tất cả các địa chỉ IP trong phạm vi mạng 10.10.10.0/24. Bạn có thể sử dụng mặt nạ mạng hoặc ký hiệu gạch chéo tiêu chuẩn để chỉ định phạm vi địa chỉ IP.

# iptables -A INPUT -s 10.10.10.0/24 -j DROP

hoặc là

# iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP

Kết nối với một cổng cụ thể

Ví dụ này cho thấy cách chặn các kết nối SSH từ 10.10.10.10.

# iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP

Bạn có thể thay thế “ssh” bằng bất kỳ giao thức hoặc số cổng nào. Phần  -p tcp mã cho iptables biết loại kết nối mà giao thức sử dụng. Nếu bạn đang chặn một giao thức sử dụng UDP thay vì TCP, thì  -p udp thay vào đó là cần thiết.

Ví dụ này cho thấy cách chặn kết nối SSH từ bất kỳ địa chỉ IP nào.

# iptables -A INPUT -p tcp --dport ssh -j DROP

Các trạng thái kết nối

Như chúng tôi đã đề cập trước đó, rất nhiều giao thức sẽ yêu cầu giao tiếp hai chiều. Ví dụ: nếu bạn muốn cho phép kết nối SSH với hệ thống của mình, các chuỗi đầu vào và đầu ra sẽ cần một quy tắc được thêm vào chúng. Nhưng, điều gì sẽ xảy ra nếu bạn chỉ muốn SSH vào hệ thống của mình được cho phép? Sẽ không thêm quy tắc vào chuỗi đầu ra cũng cho phép các nỗ lực SSH gửi đi?

Đó là nơi các trạng thái kết nối xuất hiện, cung cấp cho bạn khả năng bạn cần để cho phép giao tiếp hai chiều nhưng chỉ cho phép thiết lập kết nối một chiều. Hãy xem ví dụ này, trong đó các kết nối SSH TỪ 10.10.10.10 được phép, nhưng kết nối SSH ĐẾN 10.10.10.10 thì không. Tuy nhiên, hệ thống được phép gửi lại thông tin qua SSH miễn là phiên đã được thiết lập, điều này giúp cho việc giao tiếp SSH giữa hai máy chủ này có thể thực hiện được.

iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT

Lưu thay đổi

Các thay đổi mà bạn thực hiện đối với các quy tắc iptables của mình sẽ bị loại bỏ vào lần tiếp theo khi dịch vụ iptables được khởi động lại trừ khi bạn thực hiện lệnh để lưu các thay đổi. Lệnh này có thể khác nhau tùy thuộc vào phân phối của bạn:

Ubuntu:

sudo /sbin/iptables-save

Redhat/CentOS:

/sbin/service iptables save

Hoặc là

/etc/init.d/iptables save

Các lệnh khác

Liệt kê các quy tắc iptables hiện được định cấu hình:

iptables -L

Thêm tùy chọn -v sẽ cung cấp cho bạn thông tin gói và byte, và thêm -n sẽ liệt kê mọi thứ bằng số. Nói cách khác – tên máy chủ, giao thức và mạng được liệt kê dưới dạng số.

Để xóa tất cả các quy tắc hiện được định cấu hình, bạn có thể đưa ra lệnh:

iptables -F