Iptables là gì và cách sử dụng Iptables?

13/01/2021

Để giải đáp iptables là gì? Tôi chỉ có thể nói với bạn iptables đôi khi có thể là một thứ đáng sợ. Như nó đã từng xảy ra với tôi. Cho dù tôi chỉ đưa ra giải pháp đơn giản là sử dụng firewalld hoặc ufw. Tôi đã không thể sai lầm nhiều hơn thế.

Vấn đề là, tường lửa được thực thi tốt nhất bằng cách sử dụng công cụ chính của nó: iptables.

Iptables là gì?

iptables là gì trong hệ điều hành Linux

Vậy iptables là gì?

Trong hệ điều hành Linux, tường lửa được thực thi tốt nhất bằng cách sử dụng netfilter. Đây là một kernel module quyết định packet nào được phép đi vào hoặc trở ra bên ngoài.

iptables chỉ là giao diện tới netfilter. Cả hai thường được coi là tương tự nhau. Một góc nhìn tốt hơn là nghĩ về nó như một backend và một frontend.

Tường lửa là gì?

Để bảo đảm các nguyên tắc nền tảng, tường lửa là ý tưởng quyết định các gói dữ liệu nào được phép đi vào hay trở ra khỏi hệ thống.

Các packet ở internet (hay bất kỳ mạng làm việc nào khác cho vấn đề đó) đều được chuyển đổi bằng cách sử dụng các cổng. Chúng tôi có các cổng riêng hệ thống cho các dịch vụ nổi tiếng như NGINX hoặc Apache (là 80/443).

Chúng tôi cũng có các cổng được sử dụng bởi chính người dùng. Ví dụ: khi bạn đã viết một nền tảng ứng dụng web chạy trên cổng 8000.

Để quyết định cổng nào được phép giao tiếp với thế giới bên ngoài (hoặc thậm chí trên máy chủ cục bộ) là trách nhiệm của tường lửa.. Bạn sẽ ra lệnh cho nó chấp nhận, từ chối hoặc gỡ bỏ packet. Những điều khác cũng có thể xảy ra với các packet, ngoại trừ việc giữ cho nó đơn giản.

Tại sao chúng ta sử dụng iptables?

Bây giờ bạn đã biết tường lửa và iptables là gì, hãy xem cách chúng ta có thể sử dụng chúng. Hầu hết mọi người sẽ đi tìm giải pháp đơn giản bằng cách sử dụng firewalld hoặc ufw như tôi từng làm, trước thời điểm mà tôi được giới thiệu về iptables là gì đầy đẹp đẽ và trang nhã.

firewalld và ufw rất đơn giản và đó là điều khiến chúng trở nên phổ biến. Tuy nhiên, sự đơn giản cũng làm giảm tính linh hoạt và tính năng đầy đủ mà bạn được tiếp xúc khi quyết định làm việc với iptables.

Riêng firewalld và ufw chỉ cho phép bạn chấp nhận hoặc từ chối một gói dữ liệu. Nhưng còn rất nhiều việc bạn có thể làm với một gói dữ liệu. NAT, ghi lại và chuyển tiếp chỉ là một vài cái để kể.

Vì vậy, đây là lý do bạn nên sử dụng iptables và không phải sợ sự phức tạp của chúng:

  • Đó là một công cụ đầy đủ tính năng cung cấp cho bạn mọi thứ bạn cần
  • Bạn sẽ trở nên linh hoạt hơn về những thứ bạn muốn với gói dữ liệu
  • Làm việc với nó trở nên thú vị hơn, và bạn sẽ không thể biết điều đó nếu không sử dụng nó
  • Nó cực kỳ thú vị và có thể sẽ khiến bạn cảm thấy cực kỳ tuyệt vời
  • Bạn sẽ cảm thấy mình giống như một tin tặc hoặc một kẻ lập dị phi thường. Tin tôi đi, bởi vì tôi đã ở đó.

Cấu trúc iptables là gì?

Để hiểu rõ iptables là gì một cách cụ thể, ta hãy đi tìm hiểu chi tiết về nó hơn. Iptables bao gồm các thành phần khác nhau được thảo luận dưới đây:

  • Chain: Có 5 chain trong iptables và mỗi chain chịu trách nhiệm cho một nhiệm vụ cụ thể. Các chain này là: PREROUTING, INPUT, FORWARD, OUTPUT và POSTROUTING. Giống như tên gọi của chúng, chúng chịu trách nhiệm về các gói dữ liệu ngay khi chúng tới, hoặc ngay trước khi định tuyến ra thế giới bên ngoài.
  • Table: Một lần nữa, các table khác nhau chịu trách nhiệm cho các nhiệm vụ khác nhau. Danh sách bao gồm:  filter, nat, mangle, raw và security. Hai cái đầu tiên được sử dụng nhiều nhất. filter chịu trách nhiệm lọc và hạn chế các gói dữ liệu đến từ máy tính của chúng ta. nat chịu trách nhiệm về chuyển đổi địa chỉ mạng lưới làm việc.
  • target: Các target chỉ định nơi gói dữ liệu sẽ đi. Điều này được quyết định bằng cách sử dụng các mục tiêu của chính iptables: ACCEPT (chấp nhận), DROP (gỡ bỏ) hay RETURN (quay trở lại) hoặc target của phần mở rộng đạt 39 tại thời điểm hiện tại và các mục tiêu phổ biến nhất là DNAT, LOG, MASQUERADE, REJECT, SNAT, TRACE và TTL. Các target được chia thành có kết thúc và không kết thúc. Đó chỉ là những gì mà tên gọi đề xuất. Các target có kết thúc chấm dứt rule cắt nhau và các gói dữ liệu sẽ bị ngừng ở đó, nhưng các target không kết thúc tiếp xúc gói dữ liệu theo một cách nào đó và rule cắt nhau sẽ tiếp tục sau đó.

Bảng cấu trúc iptables

Chain iptables là gì?

Như đã đề cập ở trên, mỗi chain chịu trách nhiệm cho một nhiệm vụ cụ thể. Vì vậy, chúng ta hãy tìm hiểu sâu hơn một chút.

  • PREROUTING: chain này quyết định điều gì sẽ xảy ra với một gói dữ liệu ngay khi nó tới Network Interface. Chúng ta có các tùy chọn khác nhau như thay đổi gói dữ liệu (có thể là NAT), bỏ gói dữ liệu hoặc không làm gì cả và để nó di chuyển và được xử lý ở nơi khác trên đường đi.
  • INPUT: Đây là một trong những chain phổ biến vì nó hầu như luôn chứa các rule nghiêm ngặt để tránh một số kẻ xấu trên internet gây hại cho máy tính của chúng ta. Nếu bạn muốn mở hay chặn một cổng thì đây là nơi bạn sẽ làm điều đó.
  • FORWARD: chain này chịu trách nhiệm chuyển tiếp gói dữ liệu. Chúng ta có thể coi máy tính như một bộ định tuyến và đây là nơi mà một số quy tắc có thể áp dụng để thực hiện công việc.
  • OUTPUT: chain này là chain chịu trách nhiệm cho tất cả quá trình duyệt web của bạn trong số nhiều chain khác. Bạn không thể gửi một gói đơn lẻ mà không có chain này cho phép. Bạn có rất nhiều lựa chọn cho dù bạn có muốn cho phép một cổng giao tiếp hay không. Đó là nơi tốt nhất để hạn chế lưu lượng đi của bạn nếu bạn không chắc chắn mỗi ứng dụng đang giao tiếp qua cổng nào. (Một gợi ý nhỏ: sử dụng lệnh ss -tulpen).
  • POSTROUTING: chain này là nơi các gói dữ liệu để lại dấu vết cuối cùng, trước khi rời khỏi máy tính của chúng ta. Điều này được sử dụng để định tuyến trong số nhiều tác vụ khác chỉ để đảm bảo các gói được xử lý theo cách chúng ta muốn.

Hầu hết các trường hợp sử dụng thường xuyên của bạn sẽ là chain INPUT & OUTPUT. Với những sửa đổi nhỏ đối với các chain khác – hầu như không phải là chuyện ngày một ngày hai.

Các table iptables

Bạn sẽ không cần nhiều mục này hàng ngày. Trường hợp sử dụng chính của bạn, hầu hết thời gian là trên table filter. Đây là table mặc định và bạn sẽ không cần bất kỳ công tắc nào để kích hoạt nó. Nếu bạn không chỉ định bất kỳ table nào, filter được sử dụng theo mặc định. Vì vậy, hãy ghi nhớ điều đó và tiếp tục dưới đây, nơi tôi sẽ giải thích từng table.

  • filter: Đây là table được sử dụng nhiều nhất hàng ngày. Đó là lý do tại sao nó là table mặc định. Trong table này, bạn sẽ quyết định xem gói dữ liệu có được phép vào hoặc ra khỏi máy tính của bạn hay không. Nếu bạn muốn chặn một cổng để ngừng nhận bất cứ thứ gì, đây là điểm dừng của bạn.
  • nat: Table này là table phổ biến thứ hai và chịu trách nhiệm tạo kết nối mới. Đó là cách viết tắt của Chuyển đổi Địa chỉ Mạng lưới làm việc (Network Address Translation). Và nếu bạn không quen với thuật ngữ này, đừng lo lắng. Tôi sẽ cung cấp cho bạn một ví dụ bên dưới.
  • mangle: Chỉ dành cho các gói dữ liệu chuyên dụng. table này dùng để thay đổi thứ gì đó bên trong gói dữ liệu trước khi đến hoặc rời đi.
  • raw: table này xử lý gói dữ liệu thô chưa qua xử lý như tên gọi của nó. Chủ yếu điều này là để theo dõi trạng thái kết nối. Chúng ta sẽ thấy các ví dụ về điều này bên dưới khi muốn cho các gói dữ liệu thành công từ kết nối SSH.
  • security: có nhiệm vụ đánh dấu những gói tin có liên quan đến context của SELinux, nó giúp cho SELinux hoặc các thành phần khác hiểu được context SELinux và xử lý gói tin.

Bắt đầu từ đâu?

Để bắt đầu, chỉ cần tắt các hệ thống phụ trợ tường lửa khác của bạn, để chỉ còn lại một cấu hình hiệu quả duy nhất và đó là iptables.

Để làm điều đó, hãy sử dụng một trong các cách sau:

  • Nếu bạn đang sử dụng máy debian, hãy sử dụng systemctl disable –now ufw.
  • Nếu bạn đang sử dụng máy làm redhad, hãy sử dụng systemctl disable –now firewalld

Sau đó, bạn có thể bắt đầu thiết lập cấu hình tường lửa của mình thông qua iptables.

Làm thế nào để sử dụng iptables?

Khi nắm rõ khái niệm iptables là gì, bảng này sẽ hướng dẫn cách thực hiện một tác vụ trong iptables. Đảm bảo rằng bạn sẽ có thể vận hành chúng trong vai trò là người dùng siêu việt.

  • Để liệt kê cấu hình hiện tại:
iptables -L -n -v --line-numbers

-L cho danh sách.

-n cho đầu ra số (không phân giải tên; dẫn đến hiệu suất nhanh hơn).

-v cho tiết (thêm thông tin liên quan).

  • Để ngăn mọi gói dữ liệu đi vào hoặc đi ra khỏi hệ thống của bạn. Vì lý do bảo mật, hãy đảm bảo làm điều này để không có gói dữ liệu nào khác mà bạn chỉ định rõ ràng cụ thể sẽ được truyền đi.
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

-P cho policy. Có các policy khác nhau như đã đề cập ở trên.

Cùng tìm hiểu về cách sử dụng iptables

  • Cho phép các gói dữ liệu bên trong local interface của bạn khi di chuyển mà không gặp vấn đề gì.
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

-A để chèn rule vào cuối chain. Bạn cũng có thể chèn, xóa hoặc cập nhật bằng các chuyển đổi khác nhau.

-i dành cho interface đầu vào, interface mà các gói dữ liệu tới.

-o dành cho interface đầu ra, interface mà các gói dữ liệu di chuyển qua.

-j để nhảy qua. Bạn có thể chọn ACCEPT, REJECT, DROP, LOG… với một gói dữ liệu.

  • Để cho phép các gói DNS và DHCP di chuyển vào và ra khỏi máy tính của bạn.
iptables -A INPUT -p udp --dport 67 -j ACCEPT
iptables -A INPUT -p tcp --dport 67 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 68 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 68 -j ACCEPT

-p  dành cho giao thức. Các giao thức khác nhau có thể được sử dụng như tcp, udp, gre, v.v. Thông thường DNS và DHCP giao tiếp thông qua giao thức UDP. Nhưng với các gói dữ liệu lớn hơn, TCP thường được sử dụng. Đó là lý do tại sao tôi đề cập đến các quy tắc đó.

–dport cho cổng đích đến. Bạn cũng có thể sử dụng –sport cho cổng nguồn.

  • Để mở kết nối SSH khi máy tính của bạn là máy khách, bạn phải thêm hai rule theo cả hai hướng.
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

-m là một options để sử dụng phần mở rộng của iptables. Bạn có thể đọc thêm về các tiện ích mở rộng khác nhau bằng cách sử dụng man iptables-extension. Ví dụ khác về các phần mở rộng này là limit hạn chế số lượng gói dữ liệu theo một quy tắc.

Kết nối SSH không chỉ xảy ra theo một hướng duy nhất. Thay vào đó, bạn sẽ gửi một gói dữ liệu đến cổng đích số 22, và các gói dữ liệu sẽ đến máy tính của bạn với trạng thái RELATED và ESTABLISHED. Trình theo dõi kết nối phân biệt điều đó cho bạn và bạn không phải lo lắng về điều đó.

  • Cho phép kết nối SSH khi máy tính của bạn là máy chủ.
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

Đây là hướng ngược lại với điều lệ trước đó, mở các gói dữ liệu đến 22 và gửi các gói dữ liệu thành công có trạng thái RELATED và ESTABLISHED trở lại máy khách.

  • Nếu bạn muốn có thể ping các máy tính khác và cho phép các máy tính khác có thể ping máy tính của bạn, bạn nên cho phép các gói dữ liệu icmp.
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
  • Nếu bạn muốn có thể duyệt các trang web, đây là điều bạn nên làm.
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT

Thao tác này sẽ mở cả lưu lượng HTTP và HTTPS ra khỏi hệ thống của bạn.

  • Bạn chắc chắn sẽ muốn ghi lại các gói dữ liệu không được chấp nhận để bạn có cái nhìn về những gì đang xảy ra. Nó cũng sẽ giúp bạn nếu bạn muốn mở một port trong tương lai.
iptables -N LOGGING
iptables -A INPUT -j LOGGING
iptables -A OUTPUT -j LOGGING
iptables -A FORWARD -j LOGGING
iptables -A LOGGING -j LOG --log-level error --log-prefix "iptables-dropped: "
iptables -A LOGGING -j DROP

Dòng đầu tiên tạo ra một chain mới. Và trong 3 dòng tiếp theo, chúng ta sẽ chuyển tiếp mỗi gói dữ liệu đến chain mới được tạo.

2 dòng cuối cùng cũng sẽ log lại gói dữ liệu và sẽ tự động gỡ bỏ nó sau đó.

–log-prefix là một đối số cho mục tiêu LOG, mà bạn có thể đọc thêm về phần man iptables-extension.

–log-level cũng là một đối số cho mục tiêu LOG, cái chỉ ra cách chúng ta muốn nhận bản ghi chi tiết như thế nào. error là một mức độ ghi khá tốt vì chúng ta chỉ quan tâm đến các gói dữ liệu không được phép.

Sự khác biệt giữa DROP và REJECT là DROP không thông báo cho người gửi về gói dữ liệu bị gỡ bỏ, mà REJECT sẽ thông báo cho người gửi một cách rõ ràng.

Khi bạn gửi một gói dữ liệu đến mục tiêu REJECT, người gửi sẽ nhận được connection reset by peer (kết nối được thiết lập lại bởi những người dùng ngang hàng).

  • Nếu bạn muốn áp dụng NAT cho iptables của mình, tùy thuộc vào việc bạn muốn áp dụng nó cho các kết nối đến hay kết nối đi hoặc địa chỉ IP của máy tính của bạn là tĩnh hay động, bạn có thể sử dụng các quy tắc sau.
iptables -t nat -A OUTPUT -p tcp --dport 22 --destination 192.168.40.40 -j DNAT --to-destination 123.123.123.123:4040

Sau lệnh trên, mọi lưu lượng đi từ máy tính của bạn đến địa chỉ IP 192.168.40.40 cổng 22 sẽ được gửi đến địa chỉ IP 123.123.123.123 cổng 4040. Điều này giúp NAT trong mạng đích có thể truy cập được từ bên ngoài mạng đó. .

NAT hay Network Address Translation là hành động có một địa chỉ IP riêng bên trong một mạng nội bộ không thể truy cập từ bên ngoài, trừ khi có thiết lập cấu hình bên trong bộ định tuyến.

Cờ –destination sẽ lọc các gói dữ liệu dựa trên địa chỉ IP nơi đến.

Trên tất cả, khi muốn phủ định rule thì hãy sử dụng dấu chấm than !

Vì vậy, bạn luôn có thể phủ định một rule bằng cách đặt trước nó bằng dấu !. Ví dụ ! –source 192.168.40.40 sẽ có hiệu lực đối với bất kỳ địa chỉ nguồn nào ngoài 192.168.40.40.

iptables -t nat -A POSTROUTING -p tcp --dport 80 -j SNAT --to-source 10.0.0.56:8000-8010

Sau khi áp dụng rule trên, mọi gói dữ liệu cho bất kỳ địa chỉ IP nơi đến nào cùng với cổng 80 sẽ thay đổi địa chỉ nguồn thành 10.0.0.56:8000–8010, là một dải cổng được chỉ định bằng dấu gạch ngang. Điều này giúp NAT bên trong mạng nội bộ của bạn có thể truy cập được từ thế giới bên ngoài (internet). Có lẽ địa chỉ IP (điểm truy cập) của bộ định tuyến của bạn là 10.0.0.56 và bạn muốn các gói dữ liệu trở về nơi bắt đầu một cách an toàn.

iptables -A FORWARD -i wlan0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Đây là nơi MASQUERADE phù hợp nhất khi bạn cần chuyển tiếp mọi lưu lượng truy cập từ một Interface cụ thể để được định tuyến qua máy tính của bạn mà không cần thay đổi bất kỳ thứ gì bên trong gói dữ liệu. Tất nhiên, bạn sẽ cần thiết lập tham số kernel trước khi thiết lập việc thực hiện các thao tác trên:

sysctl net.ipv4.ip_forward=1

Để máy tính của bạn có khả năng định tuyến các gói dữ liệu. Lệnh trên chỉ là một thiết lập cấu hình runtime và nếu bạn cần có hiệu lực khi khởi động lại, bạn sẽ thực hiện như sau.

echo net.ipv4.ip_forward = 1 > /etc/sysctl.d/30-ip-forward.conf

Và điều đó kết thúc cuộc phiêu lưu của chúng tôi với iptables. Đó là một công cụ với phần lớn các tính năng. Và tôi phải nói rằng tôi thậm chí chưa từng thảo luận qua bên ngoài. Nhưng các lệnh trên là những lệnh được sử dụng nhiều nhất. Và thỉnh thoảng bạn sẽ thấy mình đang sử dụng lệnh này hoặc lệnh kia.

Đọc kỹ hướng dẫn sử dụng vì họ có thông tin chi tiết tốt:

man iptables
man iptables-extension

Kết luận

Để giải đáp iptables là gì, tôi đã thử làm sáng tỏ các phần bên trong và ngoài của iptables. Đó một công cụ để quản lý tường lửa ở Linux. Hầu hết các công cụ khác như firewalld và ufw sẽ đủ đơn giản để giúp bạn vượt qua hàng ngày, ngoại trừ việc đơn giản luôn đi kèm với chi phí. Bạn sẽ không nhận được nhiều tính linh hoạt trong việc xử lý các quy tắc mà bạn thấy phù hợp với dữ liệu.

Tôi đã chỉ ra vài ví dụ mà bạn có thể quản lý nó sau khi giải thích về iptables là gì với mọi lệnh. Lời khuyên của tôi dành cho bạn là hãy thành thạo công cụ này vì nó có ích rất nhiều.

Và như một lời cuối cùng:

# 1) Tôn trọng quyền riêng tư của người khác.
# 2) Suy nghĩ trước khi nhập.
# 3) Với quyền lực lớn đi kèm với trách nhiệm lớn.

Tôi hy vọng bạn thích bài viết này và học được điều gì đó từ nó.

Nếu bạn thích nội dung trên, hãy theo dõi tôi vì tôi dự định viết chúng thường xuyên.

Bạn cũng có thể thích các nội dung khác của tôi. Vì vậy, hãy thoải mái xem qua.

Theo Meysam Azad

Bình luận (0)

Viết Bình Luận