Tìm hiểu sâu về kiến trúc Iptables và Netfilter
Tường lửa là một công cụ quan trọng có thể được cấu hình để bảo vệ server và cơ sở hạ tầng của bạn. Trong hệ sinh thái Linux,iptables
là một công cụ firewall được sử dụng rộng rãi, giao tiếp với khung lọc gói netfilter
của nhân. Đối với user và administrator , những người không hiểu kiến trúc của các hệ thống này, việc tạo ra các policy firewall tin cậy có thể gây khó khăn, không chỉ do cú pháp khó khăn mà còn do số lượng các phần liên quan có trong khuôn khổ. Trong hướng dẫn này, ta sẽ đi sâu vào kiến trúc iptables
với mục đích làm cho nó dễ hiểu hơn cho những user cần xây dựng policy firewall của riêng họ. Ta sẽ thảo luận về cách iptables
tương tác với netfilter
và cách các thành phần khác nhau kết hợp với nhau để cung cấp một hệ thống lọc và xử lý toàn diện.
IPTables và Netfilter là gì?
Phần mềm firewall cơ bản thường được sử dụng nhất trong Linux được gọi là iptables
. Tường lửa iptables
hoạt động bằng cách tương tác với các móc lọc gói trong mạng của nhân Linux. Các kernel hook này được gọi là netfilter
framework.
Mọi gói tin đi vào hệ thống mạng (đến hoặc đi) sẽ kích hoạt các hook này khi nó tiến triển qua ngăn xếp, cho phép các chương trình đăng ký với các hook này tương tác với lưu lượng tại các điểm chính. Các module kernel được liên kết với iptables
đăng ký tại các móc này đảm bảo rằng lưu lượng truy cập tuân theo các điều kiện do các luật firewall đưa ra.
Netfilter Hooks
Có năm móc netfilter
mà các chương trình có thể đăng ký. Khi các gói tiến triển qua ngăn xếp, chúng sẽ kích hoạt các module nhân đã đăng ký với các móc này. Các móc mà một gói sẽ kích hoạt phụ thuộc vào việc gói đó là đến hay đi, đích của gói và liệu gói đó có bị loại bỏ hoặc bị từ chối tại điểm trước đó hay không.
Các móc sau đại diện cho các điểm khác nhau được xác định rõ ràng trong mạng :
-
NF_IP_PRE_ROUTING
: Móc nối này sẽ được kích hoạt bởi bất kỳ lưu lượng đến nào ngay sau khi vào mạng . Móc này được xử lý trước khi có bất kỳ quyết định định tuyến nào liên quan đến nơi gửi gói tin. -
NF_IP_LOCAL_IN
: Móc này được kích hoạt sau khi một gói đến đã được định tuyến nếu gói đó được gửi đến hệ thống local . -
NF_IP_FORWARD
: hook này được kích hoạt sau khi một gói đến đã được định tuyến nếu gói đó được chuyển tiếp đến một server khác. -
NF_IP_LOCAL_OUT
: Móc này được kích hoạt bởi bất kỳ lưu lượng gửi đi nào được tạo local ngay khi nó chạm vào mạng . -
NF_IP_POST_ROUTING
: Móc này được kích hoạt bởi bất kỳ lưu lượng gửi đi hoặc chuyển tiếp nào sau khi quá trình định tuyến đã diễn ra và ngay trước khi được đưa ra trên dây.
Các module kernel muốn đăng ký tại các móc này phải cung cấp một số ưu tiên để giúp xác định thứ tự mà chúng sẽ được gọi khi móc được kích hoạt. Điều này cung cấp phương tiện để nhiều module (hoặc nhiều version của cùng một module ) được kết nối với mỗi móc có thứ tự xác định. Mỗi module sẽ được gọi lần lượt và sẽ trả về một quyết định cho khung công tác netfilter
sau khi xử lý cho biết phải làm gì với gói tin.
IPTables Bảng và Chuỗi
Tường lửa iptables
sử dụng các bảng để sắp xếp các luật của nó. Các bảng này phân loại các luật theo loại quyết định mà chúng được sử dụng để thực hiện. Ví dụ, nếu một luật xử lý việc dịch địa chỉ mạng, nó sẽ được đưa vào bảng nat
. Nếu luật được sử dụng để quyết định có cho phép gói tin tiếp tục đến đích hay không, nó có thể sẽ được thêm vào bảng filter
.
Trong mỗi bảng iptables
, các luật được tổ chức thêm trong các "chuỗi" riêng biệt. Trong khi các bảng được xác định theo mục đích chung của các luật mà chúng nắm giữ, thì các chuỗi tích hợp đại diện cho các móc netfilter
kích hoạt chúng. Về cơ bản, chuỗi xác định khi nào các luật sẽ được đánh giá.
Như bạn thấy , tên của các chuỗi tích hợp phản ánh tên của các móc netfilter
mà chúng được liên kết với:
-
PREROUTING
: Được kích hoạt bởi mócNF_IP_PRE_ROUTING
. -
INPUT
: Được kích hoạt bởi mócNF_IP_LOCAL_IN
. -
FORWARD
: Được kích hoạt bởi mócNF_IP_FORWARD
. -
OUTPUT
: Được kích hoạt bởi mócNF_IP_LOCAL_OUT
. -
POSTROUTING
: Được kích hoạt bởi mócNF_IP_POST_ROUTING
.
Chuỗi cho phép người quản trị kiểm soát vị trí trong đường dẫn phân phối của gói mà một luật sẽ được đánh giá. Vì mỗi bảng có nhiều chuỗi, ảnh hưởng của bảng có thể được thể hiện ở nhiều điểm trong quá trình xử lý. Bởi vì một số loại quyết định chỉ có ý nghĩa tại một số điểm nhất định trong mạng , mọi bảng sẽ không có một chuỗi được đăng ký với mỗi móc kernel .
Chỉ có năm móc kernel netfilter
, vì vậy các chuỗi từ nhiều bảng được đăng ký tại mỗi móc. Ví dụ: ba bảng có chuỗi PREROUTING
. Khi các chuỗi này đăng ký tại hook NF_IP_PRE_ROUTING
liên kết, chúng chỉ định mức độ ưu tiên quyết định thứ tự mà chuỗi PREROUTING
của mỗi bảng được gọi. Mỗi luật bên trong chuỗi PREROUTING
mức độ ưu tiên cao nhất được đánh giá tuần tự trước khi chuyển sang chuỗi PREROUTING
tiếp theo. Ta sẽ xem xét thứ tự cụ thể của từng chuỗi trong giây lát.
Có những bảng nào?
Hãy lùi lại một chút và xem qua các bảng khác nhau mà iptables
cung cấp. Chúng đại diện cho các bộ luật riêng biệt, được sắp xếp theo lĩnh vực quan tâm, để đánh giá các gói.
Bảng bộ lọc
Bảng bộ lọc là một trong những bảng được sử dụng rộng rãi nhất trong iptables
. Bảng filter
được sử dụng để đưa ra quyết định về việc có để một gói tin tiếp tục đến đích đã định hay từ chối yêu cầu của nó. Theo cách nói của firewall , đây được gọi là gói tin "lọc". Bảng này cung cấp phần lớn chức năng mà mọi người nghĩ đến khi thảo luận về firewall .
Bảng NAT
Bảng nat
được sử dụng để thực hiện các luật dịch địa chỉ mạng. Khi các gói đi vào mạng , các luật trong bảng này sẽ xác định xem và cách sửa đổi địa chỉ nguồn hoặc đích của gói để tác động đến cách mà gói và bất kỳ lưu lượng phản hồi nào được định tuyến. Điều này thường được sử dụng để định tuyến các gói đến mạng khi không thể truy cập trực tiếp.
Bàn Mangle
Bảng mangle
được sử dụng để thay đổi tiêu đề IP của gói tin theo nhiều cách khác nhau.Ví dụ, bạn có thể điều chỉnh giá trị TTL (Thời gian tồn tại) của một gói, kéo dài hoặc rút ngắn số lần nhảy mạng hợp lệ mà gói có thể duy trì. Các tiêu đề IP khác có thể được thay đổi theo những cách tương tự.
Bảng này cũng có thể đặt một “dấu” kernel bên trong trên gói để xử lý thêm trong các bảng khác và bằng các công cụ mạng khác. Dấu này không chạm vào gói thực tế, nhưng thêm dấu vào biểu diễn gói của kernel .
Bàn thô
Tường lửa iptables
là trạng thái, nghĩa là các gói được đánh giá liên quan đến mối quan hệ của chúng với các gói trước đó. Các tính năng theo dõi kết nối được xây dựng trên khung netfilter
cho phép iptables
xem các gói như một phần của kết nối hoặc phiên đang diễn ra thay vì dưới dạng một stream các gói rời rạc, không liên quan. Logic theo dõi kết nối thường được áp dụng rất sớm sau khi gói tin truy cập vào network interface .
Bảng raw
có một chức năng được xác định rất hẹp. Mục đích duy nhất của nó là cung cấp một cơ chế để đánh dấu các gói để từ chối theo dõi kết nối.
Bảng bảo mật
Bảng security
được sử dụng để đặt các dấu ngữ cảnh bảo mật SELinux nội bộ trên các gói, điều này sẽ ảnh hưởng đến cách SELinux hoặc các hệ thống khác có thể diễn giải các ngữ cảnh bảo mật SELinux xử lý các gói. Các nhãn hiệu này có thể được áp dụng trên cơ sở từng gói hoặc từng kết nối.
Chuỗi nào được triển khai trong mỗi bảng?
Ta đã nói về bảng và chuỗi riêng biệt. Hãy xem xét những chuỗi nào có sẵn trong mỗi bảng. Ngụ ý trong cuộc thảo luận này là một cuộc thảo luận sâu hơn về thứ tự đánh giá của các chuỗi được đăng ký vào cùng một móc. Nếu ba bảng có chuỗi PREROUTING
, chúng được đánh giá theo thứ tự nào?
Bảng sau đây chỉ ra các chuỗi có sẵn trong mỗi bảng iptables
khi đọc từ trái sang phải. Ví dụ, ta có thể nói rằng bảng raw
có cả PREROUTING
và OUTPUT
. Khi được đọc từ trên xuống dưới, nó cũng hiển thị thứ tự mà mỗi chuỗi được gọi khi móc netfilter
liên quan được kích hoạt.
Một số điều cần được lưu ý. Trong biểu diễn bên dưới, bảng nat
đã được phân chia giữa các hoạt động DNAT
(những hoạt động làm thay đổi địa chỉ đích của gói tin) và các hoạt động SNAT
(những hoạt động thay đổi địa chỉ nguồn) để hiển thị thứ tự của chúng rõ ràng hơn. Ta cũng đã bao gồm các hàng đại diện cho các điểm nơi quyết định định tuyến được thực hiện và nơi theo dõi kết nối được bật để cung cấp cái nhìn toàn diện hơn về các quá trình đang diễn ra:
Bàn ↓ / Chuỗi → | PREROUTING | ĐẦU VÀO | Ở ĐẰNG TRƯỚC | ĐẦU RA | ĐĂNG KÝ |
---|---|---|---|---|---|
(quyết định định tuyến) | ✓ | ||||
thô | ✓ | ✓ | |||
(đã bật theo dõi kết nối) | ✓ | ✓ | |||
mangle | ✓ | ✓ | ✓ | ✓ | ✓ |
nat (DNAT) | ✓ | ✓ | |||
(quyết định định tuyến) | ✓ | ✓ | |||
bộ lọc | ✓ | ✓ | ✓ | ||
Bảo vệ | ✓ | ✓ | ✓ | ||
nat (SNAT) | ✓ | ✓ |
Khi một gói kích hoạt một móc netfilter
, các chuỗi liên kết sẽ được xử lý khi chúng được liệt kê trong bảng trên từ trên xuống dưới.Các móc (cột) mà một gói tin sẽ kích hoạt phụ thuộc vào việc gói tin đó là gói tin gửi đến hay gói tin gửi đi, các quyết định định tuyến được thực hiện và gói tin có vượt qua các tiêu chí lọc hay không.
Các sự kiện nhất định sẽ khiến chuỗi của bảng bị bỏ qua trong quá trình xử lý. Ví dụ: chỉ gói đầu tiên trong kết nối sẽ được đánh giá dựa trên các luật NAT. Mọi quyết định nat
được thực hiện cho gói đầu tiên sẽ được áp dụng cho tất cả các gói tiếp theo trong kết nối mà không cần đánh giá thêm. Phản hồi cho các kết nối NAT sẽ tự động áp dụng các luật NAT ngược để định tuyến một cách chính xác.
Lệnh truyền theo chuỗi
Giả sử rằng server biết cách định tuyến một gói tin và các luật firewall cho phép truyền nó, các stream sau đại diện cho các đường dẫn sẽ được truyền trong các tình huống khác nhau:
- Các gói đến dành cho hệ thống local :
PREROUTING
->INPUT
- Các gói đến được chuyển đến một server khác :
PREROUTING
->FORWARD
->POSTROUTING
- Các gói được tạo local :
OUTPUT
->POSTROUTING
Nếu ta kết hợp thông tin trên với thứ tự được trình bày trong bảng trước, ta có thể thấy rằng một gói đến dành cho hệ thống local trước tiên sẽ được đánh giá dựa trên chuỗi PREROUTING
của bảng raw
, mangle
và nat
. Sau đó, nó sẽ đi qua chuỗi INPUT
của các bảng mangle
, filter
, security
và nat
trước khi cuối cùng được chuyển đến local socket.
Luật IPTables
Các luật được đặt trong một chuỗi cụ thể của một bảng cụ thể. Khi mỗi chuỗi được gọi, gói được đề cập sẽ được kiểm tra theo từng luật trong chuỗi theo thứ tự. Mỗi luật có một thành phần phù hợp và một thành phần hành động.
Phù hợp
Phần phù hợp của luật chỉ định các tiêu chí mà gói phải đáp ứng để hành động liên quan (hoặc “mục tiêu”) được thực thi.
Hệ thống đối sánh rất linh hoạt và có thể được mở rộng đáng kể với các tiện ích mở rộng iptables
có sẵn trên hệ thống. Các luật có thể được xây dựng để phù hợp với loại giao thức, địa chỉ đích hoặc nguồn, cổng đích hoặc nguồn, mạng đích hoặc nguồn, giao diện đầu vào hoặc kết quả , tiêu đề hoặc trạng thái kết nối trong số các tiêu chí khác. Chúng có thể được kết hợp để tạo ra các bộ luật khá phức tạp để phân biệt giữa các lưu lượng truy cập khác nhau.
Mục tiêu
Đích là hành động được kích hoạt khi một gói đáp ứng các tiêu chí phù hợp của luật . Mục tiêu thường được chia thành hai loại:
- Mục tiêu kết thúc : Các mục tiêu kết thúc thực hiện một hành động chấm dứt đánh giá trong chuỗi và trả lại quyền kiểm soát cho móc
netfilter
. Tùy thuộc vào giá trị trả về được cung cấp, hook có thể bỏ gói hoặc cho phép gói tiếp tục đến giai đoạn xử lý tiếp theo. - Mục tiêu không kết thúc : Các mục tiêu không kết thúc thực hiện một hành động và tiếp tục đánh giá trong chuỗi. Mặc dù cuối cùng mỗi chuỗi phải gửi lại quyết định kết thúc cuối cùng, bất kỳ số lượng mục tiêu không kết thúc nào cũng có thể được thực hiện trước.
Tính khả dụng của mỗi mục tiêu trong các luật sẽ phụ thuộc vào ngữ cảnh. Ví dụ, loại bảng và chuỗi có thể chỉ định các mục tiêu có sẵn. Các phần mở rộng được kích hoạt trong luật và các điều khoản phù hợp cũng có thể ảnh hưởng đến tính khả dụng của các mục tiêu.
Chuyển đến chuỗi do user xác định
Ta nên đề cập đến một lớp đặc biệt của mục tiêu không kết thúc: mục tiêu nhảy. Mục tiêu nhảy là các hành động dẫn đến việc đánh giá chuyển sang một chuỗi khác để xử lý bổ sung. Ta đã nói khá nhiều về các chuỗi tích hợp được gắn chặt với các móc netfilter
gọi chúng. Tuy nhiên, iptables
cũng cho phép administrator tạo chuỗi của riêng họ cho mục đích tổ chức.
Các luật có thể được đặt trong các chuỗi do user xác định giống như cách mà chúng có thể được đặt vào các chuỗi tích hợp sẵn. Sự khác biệt là chỉ có thể đạt được các chuỗi do user xác định bằng cách “nhảy” đến chúng từ một luật (chúng không được đăng ký với netfilter
hook).
Chuỗi do user xác định hoạt động như các phần mở rộng đơn giản của chuỗi đã gọi chúng. Ví dụ: trong một chuỗi do user xác định, đánh giá sẽ chuyển trở lại chuỗi đang gọi nếu đạt đến cuối danh sách luật hoặc nếu mục tiêu RETURN
được kích hoạt bởi một luật phù hợp. Đánh giá cũng có thể chuyển sang các chuỗi bổ sung do user xác định.
Cấu trúc này cho phép tổ chức tốt hơn và cung cấp khuôn khổ cần thiết để phân nhánh mạnh mẽ hơn.
IPTables và Theo dõi kết nối
Ta đã giới thiệu hệ thống theo dõi kết nối được triển khai trên khung netfilter
khi ta thảo luận về bảng raw
và tiêu chí đối sánh trạng thái kết nối. Theo dõi kết nối cho phép iptables
đưa ra quyết định về các gói được xem trong bối cảnh kết nối đang diễn ra. Hệ thống theo dõi kết nối cung cấp cho iptables
chức năng cần thiết để thực hiện các hoạt động "trạng thái".
Theo dõi kết nối được áp dụng rất sớm sau khi các gói vào mạng . Chuỗi bảng raw
và một số kiểm tra thông minh cơ bản là logic duy nhất được thực hiện trên các gói trước khi liên kết các gói với một kết nối.
Hệ thống kiểm tra từng gói tin dựa trên một tập hợp các kết nối hiện có. Nó sẽ cập nhật trạng thái kết nối trong cửa hàng của bạn nếu cần và sẽ thêm các kết nối mới vào hệ thống khi cần thiết. Các gói đã được đánh dấu bằng đích NOTRACK
trong một trong các chuỗi raw
sẽ bỏ qua các quy trình theo dõi kết nối.
Các tiểu bang có sẵn
Các kết nối được theo dõi bởi hệ thống theo dõi kết nối sẽ ở một trong các trạng thái sau:
-
NEW
: Khi một gói đến không được liên kết với kết nối hiện có, nhưng không phải là gói đầu tiên không hợp lệ, một kết nối mới sẽ được thêm vào hệ thống với nhãn này. Điều này xảy ra cho cả giao thức nhận biết kết nối như TCP và giao thức không kết nối như UDP. -
ESTABLISHED
: Kết nối được thay đổi từNEW
thànhESTABLISHED
khi nó nhận được phản hồi hợp lệ theo hướng ngược lại. Đối với kết nối TCP, điều này nghĩa làSYN/ACK
và đối với lưu lượng UDP và ICMP, điều này nghĩa là phản hồi nơi nguồn và đích của gói tin root được chuyển sang. -
RELATED
: Các gói không phải là một phần của kết nối hiện có, nhưng được liên kết với kết nối đã có trong hệ thống được gắn nhãnRELATED
. Điều này có thể nghĩa là một kết nối trợ giúp, như trường hợp của các kết nối truyền dữ liệu FTP hoặc nó có thể là phản hồi ICMP đối với các nỗ lực kết nối của các giao thức khác. INVALID
: Các gói có thể được đánh dấuINVALID
nếu chúng không được liên kết với kết nối hiện có và không thích hợp để mở một kết nối mới, nếu chúng không thể được xác định hoặc nếu chúng không thể định tuyến được trong số các lý do khác.-
UNTRACKED
: Các gói có thể được đánh dấu làUNTRACKED
nếu chúng đã được nhắm đến trong một chuỗi bảngraw
để bỏ qua theo dõi. -
SNAT
: Một trạng thái ảo được đặt khi địa chỉ nguồn bị thay đổi bởi các hoạt động NAT. Điều này được sử dụng bởi hệ thống theo dõi kết nối để nó biết thay đổi địa chỉ nguồn trở lại trong các gói trả lời. -
DNAT
: Một trạng thái ảo được đặt khi địa chỉ đích đã bị thay đổi bởi các hoạt động NAT. Điều này được sử dụng bởi hệ thống theo dõi kết nối để nó biết thay đổi địa chỉ đích trở lại khi định tuyến các gói trả lời.
Các trạng thái được theo dõi trong hệ thống theo dõi kết nối cho phép administrator tạo ra các luật nhắm đến các điểm cụ thể trong vòng đời của kết nối. Điều này cung cấp chức năng cần thiết cho các luật an toàn và kỹ hơn.
Kết luận
Khung lọc gói netfilter
và firewall iptables
là cơ sở cho hầu hết các giải pháp firewall trên server Linux. Các móc kernel netfilter
đủ gần với mạng để cung cấp khả năng kiểm soát mạnh mẽ đối với các gói khi chúng được xử lý bởi hệ thống. Tường lửa iptables
tận dụng những khả năng này để cung cấp một phương pháp linh hoạt, có thể mở rộng để truyền đạt các yêu cầu policy tới kernel . Bằng cách tìm hiểu về cách các phần này trùng với nhau, bạn có thể sử dụng chúng tốt hơn để kiểm soát và bảo mật môi trường server của bạn .
Nếu bạn muốn biết thêm về cách chọn các policy iptables
hiệu quả, hãy xem hướng dẫn này .
Những hướng dẫn này có thể giúp bạn bắt đầu triển khai các luật firewall iptables
của bạn :
- Cách cài đặt firewall bằng Iptables trên Ubuntu 14.04
- Iptables Essentials: Các luật và lệnh firewall chung
- Cách triển khai mẫu firewall cơ bản với Iptables trên Ubuntu 14.04
- Cách cài đặt firewall Iptables để bảo vệ lưu lượng truy cập giữa các server của bạn
Các tin liên quan
Cách thiết lập firewall Iptables để bảo vệ lưu lượng truy cập giữa các server của bạn2015-08-20
Cách triển khai mẫu firewall cơ bản với Iptables trên Ubuntu 14.04
2015-08-20
Cách di chuyển từ FirewallD sang Iptables trên CentOS 7
2015-08-20
Cách liệt kê và xóa các quy tắc firewall Iptables
2015-08-14
Iptables Essentials: Các quy tắc và lệnh firewall chung
2015-08-10
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