Mục lục [Ẩn]
Trong các server Linux luôn tích hợp sẵn một hệ thống tường lửa (firewall), đây là công cụ tường lửa rất mạnh. Tuy nhiên, công cụ này lại hơi khó sử dụng cho người mới. Trong bài viết này, Nhân Hòa sẽ giải thích khái niệm Iptables là gì và cấu trúc cũng như cách sử dụng Iptables, đưa ra một vài ví dụ cụ thể tạo tường lửa trên server.
1. Iptables là gì?
IPtables là ứng dụng tường lửa miễn phí trong Linux, cho phép thiết lập các quy tắc riêng để kiểm soát truy cập, tăng tính bảo mật. Khi sử dụng máy chủ, tường lửa là một trong những công cụ quan trọng giúp bạn ngăn chặn các truy cập không hợp lệ. Đối với các bản phân phối Linux như Ubuntu, Fedora, CentOS… bạn có thể tìm thấy công cụ tường lửa tích hợp sẵn IPtables.
Iptables là gì?
>>> Xem thêm: SSH là gì?
2. Thành phần của Iptables
Cơ chế lọc gói tin của Iptable được xây dựng dựa trên 3 thành phần cơ bản đó là table, chain và target. Nói đơn giản, table là một xử lý các gói tin theo những cách cụ thể. Nếu không chỉ định cụ thể thì mặc định là chúng ta sẽ làm việc với filter table, ngoài ra còn có các bảng khác.
Mỗi bảng sẽ được gắn thêm các chain. Việc gắn thêm chain vào table cho phép xử lý gói tin ở những giai đoạn khác nhau, ví dụ chúng ta có thể xử lý gói tin ngay khi gói tin vừa đến interface hay xử lý các gói tin trước khi các gói này được đẩy ra interface. Bạn có thể tạo ra rule rất cụ thể, ví dụ gói tin đó đến từ port nào, đến từ IP nào sau đó chỉ định hành động (TARGET) sẽ áp dụng với gói tin này.
Khi có một gói tin đến hoặc gói tin đi Iptable sẽ so sánh với từng rule trong một chain. Khi một gói tin giống với rule đặt ra Iptable sẽ thực hiện hành động ứng với rule đó. Nhưng nếu gói tin không khớp với bất cứ rule nào thuộc chain, Iptable sẽ áp dụng "default policy" cho gói tin đó. Mặc định "default policy" của các chain là cho phép gói tin.
Các thành phần trong Iptables bao gồm:
- Table
Iptable sử dụng table để định nghĩa các rules cụ thể cho các gói tin. Các phiên bản Linux hiện nay có 4 loại table khác nhau:
+ Filter table
Table này quen thuộc và hay được sử dụng nhất. table này nhằm quyết định liệu gói tin có được chuyển đến địa chỉ đích hay không
+ Mangle table
Table này liên quan đến việc sửa header của gói tin, ví dụ chỉnh sửa giá trị các trường TTL, MTU, Type of Service
+ Table Nat
Table này cho phép route các gói tin đến các host khác nhau trong mạng NAT table cách thay đổi IP nguồn và IP đích của gói tin. Table này cho phép kết nối đến các dịch vụ không được truy cập trực tiếp được do đang trong mạng NAT
+ Table raw
1 gói tin có thể thuộc một kết nối mới hoặc cũng có thể là của 1 một kết nối đã tồn tại. Table raw cho phép bạn làm việc với gói tin trước khi kernel kiểm tra trạng thái gói tin
Thành phần của Iptables
- Chains
Mỗi table được tạo với một số chains nhất định. Chains cho phép lọc gói tin tại các điểm khác nhau. Iptable có thể thiết lập với các chains sau:
+ Chain PREROUTING
Các rule thuộc chain này sẽ được áp dụng ngay khi gói tin vừa vào đến Network interface. Chain này chỉ có ở table NAT, raw và mangle
+ Chain INPUT
Các rule thuộc chain này áp dụng cho các gói tin ngay trước khi các gói tin được vào hệ thống. Chain này có trong 2 table mangle và filter
+ Chain OUTPUT
Các rule thuộc chain này áp dụng cho các gói tin ngay khi gói tin đi ra từ hệ thống. Chain này có trong 3 table là raw, mangle và filter
+ Chain FORWARD
Các rule thuộc chain này áp dụng cho các gói tin chuyển tiếp qua hệ thống. Chain này chỉ có trong 2 table mangle và table
+ Chain POSTROUTING
Áp dụng cho các gói tin đi network interface. Chain này có trong 2 table mangle và NAT
- Target
Target hiểu đơn giản là các hành động áp dụng cho các gói tin. Đối với những gói tin đúng theo rule mà chúng ta đặt ra thì các hành động (TARGET) có thể thực hiện được đó là:
+ ACCEPT
Chấp nhận gói tin, cho phép gói tin đi vào hệ thống
+ DROP
Loại bỏ gói tin, không có gói tin trả lời, giống như là hệ thống không tồn tại
+ REJECT
Loại bỏ gói tin nhưng có trả lời table gói tin khác, ví dụ trả lời table 1 gói tin “connection reset” đối với gói TCP hoặc bản tin “destination host unreachable” đối với gói UDP và ICMP
+ LOG
Chấp nhận gói tin nhưng có ghi lại log
Gói tin sẽ đi qua tất cả các rule chứ không dừng lại khi đã đúng với 1 rule đặt ra. Đối với những gói tin không khớp với rule nào cả mặc định sẽ được chấp nhận
3. Cách thức hoạt động của Iptables
Toàn bộ dữ liệu trong gói tin gửi đi được internet định dạng. Tiếp đến, Linux kernel thực hiện lọc chúng thông qua giao diện bảng các bộ lọc. Và IPtables chính là ứng dụng dòng lệnh, đồng thời cũng là tường lửa của Linux. Nó giúp người dùng cấu hình, duy trì và quản lý các bảng này.
Người dùng có thể thiết lập nhiều bảng khác nhau. Trong đó, mỗi bảng chứa nhiều chuỗi và mỗi chuỗi ứng với một quy tắc. Các quy tắc này sẽ định nghĩa hành động được thực thi khi gói tin phù hợp với nó.
Cách thức hoạt động của Iptables
Một mục tiêu (target) chỉ đưa ra khi đã xác định được một gói tin. Mục tiêu có thể là chuỗi khớp với một trong những giá trị như: ACCEPT (gói tin được đi qua), DROP (gói tin bị từ chối, không được đi qua), RETURN (chuỗi hiện tại bị bỏ qua, quy lại quy tắc kế tiếp của chuỗi mà gói tin được gọi).
>>> Xem thêm: Chứng chỉ SSL là gì? Làm thế nào để mua chứng chỉ SSL?
4. Các quy tắc trong Iptables
Các quy tắc đang có trong IPtables Linux, bạn sử dụng câu lệnh sau:
IPtables -L –v
TARGET PROT OPT IN OUT SOURCE DESTINATION
ACCEPT all -- lo any anywhere anywhere
ACCEPT all -- any any anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- any any anywhere anywhere tcp dpt:http
ACCEPT tcp -- any any anywhere anywhere tcp dpt:https
DROP all -- any any anywhere anywhere
Các quy tắc trong Iptables
Trong đó:
- TARGET: Hành động được thực thi
- PROT: Chính là Protocol. Nó là giao thức được sử dụng để thực thi quy tắc với 3 chọn lựa all, TCP hay UDP. Hầu hết những ứng dụng phổ biến như FTP, sFTP, SSH,… đều dùng TCP
- IN: Quy tắc được áp dụng đối với những gói tin đi vào từ một interface được xác định hay cho tất cả các interface
- OUT: Quy tắc được áp dụng đối với những gói tin đi ra từ một interface được xác định hay cho tất cả các interface
- DESTINATION: Là địa chỉ của lượt truy cập áp dụng quy tắc
- ACCEPT all - - lo any anywhere anywhere: Là chấp nhận tất cả các gói tin từ interface lo (đây là một interface ảo của nội bộ).
- ACCEPT all - - any any anywhere anywhere ctstate RELATED,ESTABLISHED: Là chấp nhận tất cả các gói tin của kết nối.
- ACCEPT tcp - - any any anywhere anywhere tcp dpt:ssh: Là chấp nhận tất cả các gói tin của giao thức SSH đến từ bất kỳ interface, không loại trừ bất cứ IP nguồn hay đích. Mặc định, hệ thống hiển thị dpt:ssh, tức là cổng 22 của SSH. Trong trường hợp, bạn muốn đổi thành cổng khác thì điền giá trị cổng vào
- ACCEPT tcp - - any any anywhere anywhere tcp dpt:http: Mặc định hiển thị là http, tức cho phép kết nối đến cổng 80
- ACCEPT tcp - - any any anywhere anywhere tcp dpt:https: Mặc định hiển thị là https, tức cho phép kết nối đến cổng 443
- DROP all - - any any anywhere anywhere: Toàn bộ những gói tin không khớp với các quy tắc trên sẽ bị loại bỏ
>>> Xem thêm: Cấu hình VPS là gì?
5. Hướng dẫn sử dụng Iptables
Khi nắm rõ khái niệm Iptables là gì, sau đây sẽ hướng dẫn cách thực hiện một số tác vụ trong Iptables
Liệt kê cấu hình hiện tại:
iptables -L -n -v --line-numbers
+ -L liệt kê danh sách.
+ -n cho output là số (không phân giải tên; dẫn đến hiệu suất nhanh hơn).
+ -v thêm thông tin chi tiết
Để chặn mọi packet input hoặc output khỏi hệ thống một cách mặc định khi chúng không match rule nào (còn được gọi là default Policy):
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
-Cho phép các packet bên trong local interface của bạn khi di chuyển mà không bị chặn.
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 input interface, interface mà các packet tới
+ -o dành cho output interface, interface mà các packet đi ra
+ -j để jump đến TARGET. Bạn có thể chọn ACCEPT, REJECT, DROP, LOG… với một packet
- Để cho phép các gói DNS và DHCP input và output 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 packet lớn hơn, TCP thường được sử dụng. Đó là lý do tại sao tôi đề cập đến các rule đó
+ –dport cho destination port. Bạn cũng có thể sử dụng –sport cho source port
- Để mở kết nối SSH khi máy tính của bạn là máy client, 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 extension của iptables. Bạn có thể đọc thêm về các extension 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 tần số packet
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 packet đến destination port 22, và các packet sẽ đến máy tính của bạn với trạng thái RELATED và ESTABLISHED. Connection tracking phân biệt điều này 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 rule trước đó, mở các packet đến port 22 và gửi các packet thành công có trạng thái RELATED và ESTABLISHED trở lại client
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 packet 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ẽ cho phép cả lưu lượng HTTP và HTTPS ra khỏi hệ thống của bạn
Hướng dẫn sử dụng Iptables
Bạn muốn ghi lại các packet bị DROP để 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ẽ forward các packet đến chain mới được tạo
- 2 dòng cuối cùng cũng sẽ log lại packet và DROP packet đó
+ –log-prefix là một tham số của LOG target, mà bạn có thể đọc thêm về phần man iptables-extension
+ –log-level cũng là tham số của LOG target, chỉ ra cách chúng ta muốn ghi log 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 packet 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ề packet 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 packet đến mục tiêu REJECT, người gửi sẽ nhận được “connection reset by peer”
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 input hay kết nối output 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 port 22 sẽ được gửi đến địa chỉ IP 123.123.123.123 port 4040
Cờ –destination sẽ lọc các packet dựa trên destination IP
Khi muốn phủ định rule thì hãy sử dụng dấu chấm than !
Vì vậy, bạ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ỳ source IP 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 packet cho bất kỳ destination IP 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)
iptables -A FORWARD -i wlan0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
MASQUERADE phù hợp nhất khi bạn cần forward mọi traffic 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 packet. 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 routing các packet. 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
iptables là một công cụ với phần lớn các tính nă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
6. Kết luận
Hy vọng rằng bài hướng dẫn trên có thể giúp các bạn tự mình cấu hình Iptables. Sử dụng tường lửa là một trong những cách hiệu quả để kiểm soát truy cập vào máy chủ, trong quá trình thực hiện nếu gặp khó khăn hãy để lại thông tin của bạn để Nhân Hòa có thể giải đáp cho bạn một cách kịp thời.
Nhân Hòa với 20 năm kinh nghiệm kinh doanh mua tên miền, hosting, thuê máy chủ, ssl giá rẻ, email theo tên miền, vps... luôn giữ vững top đầu là nhà đăng ký chất lượng và uy tín nhất Việt Nam. Mọi nhu cầu sử dụng dịch vụ hay phản hồi liên hệ với Nhân Hòa theo địa chỉ sau.
+ Fanpage: https://www.facebook.com/nhanhoacom
+ Chỉ đường: https://g.page/nhanhoacom
+ Chương trình khuyến mãi mới nhất: https://nhanhoa.com/khuyen-mai.html
————————————————————
CÔNG TY TNHH PHẦN MỀM NHÂN HÒA
Hotline: 1900 6680
Trụ sở chính: Tầng 4 - Tòa nhà 97-99 Láng Hạ, Đống Đa, Hà Nội
Tel: (024) 7308 6680 – Email: sales@nhanhoa.com
Chi nhánh: 270 Cao Thắng (nối dài), Phường 12, Quận 10, Tp.HCM
Tel: (028) 7308 6680 – Email: hcmsales@nhanhoa.com