Copyright© Mat Bao Company. All Reserved.
Sử dụng nội dung ở trang này và dịch vụ tại Mắt Bão có nghĩa là bạn đồng ý với Thỏa thuận sử dụng và Chính sách bảo mật của chúng tôi.
Công ty cổ phần Mắt Bão - Giấy phép kinh doanh số: 0302712571 cấp ngày 04/09/2002 bởi Sở Kế Hoạch và Đầu Tư Tp. Hồ Chí Minh.
Giấy phép cung cấp dịch vụ Viễn thông số 247/GP-CVT cấp ngày 08 tháng 05 năm 2018.
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. Các thành phần tạo nên IPtables là gì? Hãy để Mắt Bão trả lời câu hỏi này cho bạn nhé!
IPtables là một ứng dụng tường lửa có sẵn trên Linux, IPtables Linux firewall cho phép người dùng thiết lập các quyền truy cập để kiểm soát lưu lượng một cách chọn lọc trên máy chủ.
Thành phần của IPtables là gì?
Về cơ bản, IPtables chỉ là giao diện dòng lệnh để tương tác với packet filtering của netfilter framework. Cơ chế packet filtering của IPtables hoạt động gồm 3 thành phần là Tables, Chains và Targets.
Các bảng trong IPtables là gì?
Table được IPtables sử dụng để định nghĩa các rules(quy tắc) dành cho các gói tin. Trong đó, có các Table sau.
- Filter Table
Là một trong những tables được IPtables sử dụng nhiều nhất, Filter Table sẽ quyết định việc một gói tin có được đi đến đích dự kiến hay từ chối yêu cầu của gói tin.
- NAT Table
Để dùng các rules về NAT(Network Address Translation), NAT Table sẽ có trách nhiệm chỉnh sửa source(IP nguồn) hoặc destination(IP đích) của gói tin khi thực hiện cơ chế NAT.
- Mangle Table
Cho phép chỉnh sửa header của gói tin, giá trị của các trường TTL, MTU, Type of Service.
- Raw Table
IPtables là một stateful firewall với các gói tin được kiểm tra liên quan đến trạng thái(state). Ví dụ gói có thể là một phần của một kết nối mới hoặc là một phần của kết nối hiện có. Raw Table sẽ giúp bạn làm việc với các gói tin trước khi kernel bắt đầu kiểm tra trạng thái và có thể loại một số gói khỏi việc tracking vì vấn đề hiệu năng của hệ thống.
- Security Table
Một vài kernel có thể hỗ trợ thêm Security Table, được dùng bởi SELinux để thiết lập các chính sách bảo mật.
Chains
Chains được tạo ra với một số lượng nhất định ứng với mỗi Table, giúp lọc gói tin tại các điểm khác nhau.
- Chain PREROUTING tồn tại trong Nat Table, Mangle Table và Raw Table, các rules trong chain sẽ được thực thi ngay khi gói tin vào đến giao diện mạng (Network Interface).
- Chain INPUT chỉ có ở Mangle Table và Nat Table với các rules được thực thi ngay trước khi gói tin gặp tiến trình.
- Chain OUTPUT tồn tại ở Raw Table, Mangle Table và Filter Table, có các rules được thực thi sau khi gói tin được tiến trình tạo ra.
- Chain FORWARD tồn tại ở Manle Table và Filter Table, có các rules được thực thi cho các gói tin được định tuyến qua host hiện tại.
- Chain POSTROUTING chỉ tồn tại ở Manle Table và Nat Table với các rules được thực thi khi gói tin rời giao diện mạng.
Target
Target có thể được hiểu là hành động dành cho các gói tin khi gói tin thỏa mãn các rules đặt ra.
- ACCEPT: chấp nhận và cho phép gói tin đi vào hệ thống.
- DROP: loại gói tin, không có gói tin trả lời.
- REJECT: loại 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 “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ẽ được đi qua tất cả các rules đặt ra mà không dừng lại ở bất kì rule nào đúng. Trường hợp gói tin không khớp với rules nào mặc định sẽ được chấp nhận
Cấu hình IPtables cơ bản là gì?
Tất cả các dữ liệu trong các gói tin gửi đi được định dạng qua internet, Linux kernel sẽ giúp lọc các gói tin này bằng cách mang đến một giao diện sử dụng một bảng các bộ lọc. IPtables là ứng dụng dòng lệnh và cũng đồng thời là bức tường lửa Linux cho phép người dùng thiết lập, duy trì và kiểm tra các bảng này.
Người sử dụng có thể tùy ý thiết lập nhiều bảng với mỗi bảng chứa nhiều chuỗi, mỗi chuỗi là một quy tắc. Mỗi quy tắc sẽ định nghĩa việc phải làm với gói tin khi phù hợp với gói đó.
Một target (mục tiêu) sẽ được đưa ra khi có một gói tin được xác định. Target có thể là một chuỗi khác để khớp với một trong các giá trị sau:
- ACCEPT: gói tin được phép đi qua.
- DROP: gói tin không được phép đi qua.
- RETURN: bỏ qua chuỗi hiện tại và quay trở lại quy tắc tiếp theo từ chuỗi mà nó được gọi.
Các rules trong IPtables là gì?
Người dùng có thể dùng lệnh sau để xem các rules hiện có trong IPtables:
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
Ý nghĩa của từng cột và hàng
- TARGET: hành động sẽ thực thi.
- PROT: viết tắt của Protocol, là các giao thức sẽ được áp dụng để thực thi quy tắc này. Ở đây chúng ta có 3 lựa chọn là all, tcp hoặc udp. Các ứng dụng như SSH, FTP, sFTP,..đều sử dụng giao thức TCP.
- IN: chỉ ra rule sẽ áp dụng cho các gói tin đi vào từ interface nào, ví dụ lo, eth0, eth1 hoặc any là áp dụng cho tất cả interface.
- OUT: tương tự IN, chỉ ra rule sẽ áp dụng cho các gói tin đi ra từ interface nào.
- DESTINATION: địa chỉ của lượt truy cập được phép áp dụng quy tắc.
- ACCEPT all — lo any anywhere anywhere: chấp nhận toàn bộ gói tin từ interface lo (Loopback Interface), là interface ảo nội bộ, ví dụ IP 127.0.0.1 là kết nối qua thiết bị này.
- ACCEPT all — any any anywhere anywhere ctstate RELATED,ESTABLISHED: chấp nhận toàn bộ gói tin của kết nối hiện tại. Tức khi bạn đang ở trong SSH và sửa đổi lại Firewall, nó sẽ không đẩy bạn ra khỏi SSH nếu bạn không thỏa mãn quy tắc.
- ACCEPT tcp — any any anywhere anywhere tcp dpt:ssh: chấp nhận toàn bộ gói tin của giao thức SSH ở bất cứ interface nào, với bất kể IP nguồn và đích là bao nhiêu. Mặc định sẽ hiển thị dpt:ssh để biểu diễn cổng 22 của SSH, nếu bạn đổi SSH thành cổng khác thì sẽ hiển thị số cổng.
- ACCEPT tcp — any any anywhere anywhere tcp dpt:http: cho phép kết nối vào cổng 80, mặc định sẽ biểu diễn thành chữ http.
- ACCEPT tcp — any any anywhere anywhere tcp dpt:https: cho phép kết nối vào cổng 443, mặc định nó sẽ biểu diễn thành chữ https.
- DROP all — any any anywhere anywhere: loại bỏ tất cả các gói tin nếu không khớp với các rule ở trên.
Các tùy chọn của IPtables là gì?
Các tùy chọn để chỉ định thông số IPtables là gì?
- Chỉ định tên table: -t ,
- Chỉ định loại giao thức: -p ,
- Chỉ định card mạng vào: -i ,
- Chỉ định card mạng ra: -o ,
- Chỉ định địa chỉ IP nguồn: -s <địa_chỉ_ip_nguồn>,
- Chỉ định địa chỉ IP đích: -d <địa_chỉ_ip_đích>, tương tự như –s.
- Chỉ định cổng nguồn: –sport ,
- Chỉ định cổng đích: –dport , tương tự như –sport
Các tùy chọn để thao tác với chain trong IPtables là gì?
- Tạo chain mới: IPtables -N
- Xóa hết các rule đã tạo trong chain: IPtables -X
- Đặt chính sách cho các chain `built-in` (INPUT, OUTPUT & FORWARD): IPtables -P , ví dụ: IPtables -P INPUT ACCEPT để chấp nhận các packet vào chain INPUT
- Liệt kê các rule có trong chain: IPtables -L
- Xóa các rule có trong chain (flush chain): IPtables -F
- Reset bộ đếm packet về 0: IPtables -Z
Các tùy chọn để thao tác với rule trong IPtables là gì?
- Thêm rule: -A (append)
- Xóa rule: -D (delete)
- Thay thế rule: -R (replace)
- Chèn thêm rule: -I (insert)
Một số lệnh cơ bản IPtables là gì?
Tạo một rule mới
IPtables -A INPUT -i lo -j ACCEPT
Lệnh này có nghĩa là:
- A INPUT: khai báo kiểu kết nối sẽ được áp dụng (A nghĩa là Append).
- i lo: Khai báo thiết bị mạng được áp dụng (i nghĩa là Interface).
- j ACCEPT: khai báo hành động sẽ được áp dụng cho quy tắc này (j nghĩa là Jump).
Gõ lại lệnh IPtables -L -v bạn sẽ thấy 1 rule mới xuất hiện
after-created-IPtables-rule
Sau khi thêm mới hoặc thay đổi gõ lệnh lưu và khởi động lại IPtables để áp dụng các thay đổi.
service IPtables save
service IPtables restart
Tiếp tục thêm một rule mới để cho phép lưu lại các kết nối hiện tại tránh hiện tượng tự block ra khỏi máy chủ.
IPtables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Cho phép các cổng được truy cập từ bên ngoài vào qua giao thức tcp: SSH(22), HTTP(80), HTTPS(443)
IPtables -A INPUT -p tcp --dport 22 -j ACCEPT
-p tcp : Giao thức được áp dụng (tcp, udp, all)
–dport 22: Cổng cho phép áp dụng. 22 là cho SSH
Cuối cùng, chặn toàn bộ các kết nối truy cập từ bên ngoài vào không thỏa mãn những rule trên. Tương ứng với rule 5 ở trên.
IPtables -A INPUT -j DROP
Bổ sung một rule mới
Để chèn 1 rule mới vào 1 vị trí (hàng) nào đó, ví dụ là vị trí thứ 2. Hãy thay tham số -A table bằng tham số INSERT -I.
IPtables -I INPUT 2 -p tcp --dport 8080 -j ACCEPT
Xóa 1 rule
Để xóa 1 rule mà đã tạo ra tại vị trí 4, ta sẽ sử dụng tham số -D
IPtables -D INPUT 4
Xóa toàn bộ các rule chứa hành động DROP có trong IPtables:
IPtables -D INPUT -j DROP
Cách sử dụng IPtables để mở port VPS
Chèn chuỗi ACCEPT PORT để mở port trong IPtables với cấu trúc lệnh mở port xxx:
# IPtables -A INPUT -p tcp -m tcp --dport xxx -j ACCEPT
A là Append – chèn vào chuỗi INPUT (chèn xuống cuối)
# IPtables -I INPUT -p tcp -m tcp --dport xxx -j ACCEPT
I là Insert – chèn vào chuỗi INPUT (chèn vào dòng chỉ định rulenum).
Để tránh xung đột với rule gốc, chèn rule vào đầu, dùng –I.
Mở port SSH
Mở port SSH 22 để truy cập VPS thông qua SSH, cho phép kết nối SSH ở bất kì thiết bị nào, người nào, ở bất cứ đâu.
# IPtables -I INPUT -p tcp -m tcp --dport 22 -j ACCEPT
SSH được hiển thị mặc định ở cổng 22, nếu đổi SSH sang một cổng khác thì IPtables sẽ hiển thị số cổng.
ACCEPT tcp -- anywhere
anywhere cp dpt:ssh
Cấu hình chỉ cho phép kết nối VPS qua SSH từ một địa chỉ IP duy nhất được xác định.
# IPtables -I INPUT -p tcp -s xxx.xxx.xxx.xxx -m tcp --dport 22 -j ACCEPT
Lúc đó, IPtables sẽ thêm rule
ACCEPT tcp -- xxx.xxx.xxx.xxx anywhere tcp dpt:ssh
Mở port Web Server
Cho phép truy cập vào web server qua port mặc định 80 và 443:
# IPtables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT # IPtables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT
IPtables hiển thị HTTP và HTTPS theo mặc định
ACCEPT tcp -- anywhere anywhere tcp dpt:http ACCEPT tcp -- anywhere anywhere tcp dpt:https
Mở port Mail
Cho phép user dùng SMTP Server qua port mặc định là 25 và 465:
# IPtables -I INPUT -p tcp -m tcp --dport 25 -j ACCEPT # IPtables -I INPUT -p tcp -m tcp --dport 465 -j ACCEPT
IPtables sẽ hiển thị SMTP và URD theo mặc định
ACCEPT tcp -- anywhere anywhere tcp dpt:smtp ACCEPT tcp -- anywhere anywhere tcp dpt:urd
Mở port POP3 (port mặc định 110 và 995) cho phép user đọc mail trên server
# IPtables -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
# IPtables -A INPUT -p tcp -m tcp --dport 995 -j ACCEPT
IPtables sẽ hiển thị POP3 và POP3S theo mặc định
ACCEPT tcp -- anywhere anywhere tcp dpt:pop3
ACCEPT tcp -- anywhere anywhere tcp dpt:pop3s
Cho phép sử dụng giao thức IMAP mail protocol (port mặc định là 143 và 993)
# IPtables -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
# IPtables -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
IPtables sẽ hiển thị IMAP và IMAPS theo mặc định
ACCEPT tcp -- anywhere anywhere tcp dpt:imap
ACCEPT tcp -- anywhere anywhere tcp dpt:imaps
Chặn 1 IP truy cập
# IPtables -A INPUT -s IP_ADDRESS -j DROP
Chặn 1 IP truy cập vào 1 port cụ thể
#IPtables -A INPUT -p tcp -s IP_ADDRESS –dport PORT -j DROP
Sau khi đã thiết lập tất cả bao gồm mở các port cần thiết hoặc hạn chế kết nối cần block toàn bộ các kết nối còn lại và cho phép toàn bộ các kết nối ra ngoài từ VPS.
# IPtables -P OUTPUT ACCEPT
# IPtables -P INPUT DROP
Kiểm tra lại các quy tắc sau khi thiết lập
# service IPtables status
Hoặc
# IPtables -L –n
-n để nói đến yếu tố cần quan tâm là địa chỉ IP, ví dụ nếu chặn kết nối từ một địa chỉ xác định thì IPtables sẽ hiển thị là xxx.xxx.xxx.xxx với tham số -n
Kết thúc, lưu lại các thiết lập tường lửa IPtables nếu không chúng sẽ mất khi reboot hệ thống. Đối với CenOS, cấu hình được lưu tại /etc/sysconfig/IPtables.
# IPtables-save | sudo tee /etc/sysconfig/IPtables
Hoặc
# service IPtables save
IPtables: Saving firewall rules to /etc/sysconfig/IPtables:[ OK ]
Cách thiết lập IPtables với Linux Firewall để bảo mật Ubuntu VPS
Bước 1: Cài đặt IPtables Linux Firewall
- Cài đặt IPtables
Hầu hết các bản Linux hiện nay đều được tích hợp sẵn IPtables. Tuy nhiên, nếu chưa có sẵn trên Ubuntu hoặc Debian bạn có thể dùng lệnh sau để cài đặt:
sudo apt-get update
sudo apt-get install IPtables
- Xem trạng thái hiện tại của IPtables
sudo IPtables -L –v
Trong đó, -L dùng để liệt kê tất cả quy tắc (rule) và –v để liệt kê các danh sách bổ trợ. Chú ý đến ký tự viết hoa và viết thường được phân biệt với nhau.
Ví dụ:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Kết quả trên cho biết ba Chain được thiết lập mặc định là ACCEPT và không có Chain nào có rule.
Bước 2: Định nghĩa các chain rules
Tức là thêm nó vào danh sách chain hiện tại, dưới đây là lệnh IPtables được định dạng với các tùy chọn thông thường.
sudo IPtables -A -i <interface> -p <protocol (tcp/udp)> -s <source> --dport <port no.> -j <target>
Trong đó:
- A là thêm chain rules.
- i<interface> là giao diện mạng cần thực hiện lọc các gói tin.
- p<protocol> là giao thức mang thực hiện lọc (tcp/udp).
- dort<port no.> là cổng muốn đặt bộ lọc.
Cho phép lưu lượng truy cập trên localhost
Cho phép giao tiếp giữa ứng dụng mà database của nó trên server như bình thường.
sudo IPtables -A INPUT -i lo -j ACCEPT
Kết quả:
Chain INPUT (policy ACCEPT 7 packets, 488 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
-A thêm rules vào chains INPUT cho phép tất cả kết nối ở interface lo
Các cổng được phép truy cập: HTTP, SSH, SSL
sudo IPtables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo IPtables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo IPtables -A INPUT -p tcp --dport 443 -j ACCEPT
Cho phép tất cả các truy cập TCP trên các cổng 22 (SSH), HTTP (80), HTTPS (443).
Lọc các gói tin dựa trên nguồn
Thêm vào tham số -s để cho phép hoặc từ chối các gói tin dựa trên IP nguồn.
sudo IPtables -A INPUT -s 192.168.1.3 -j ACCEPT
Các gói tin đến từ IP nguồn là 192.168.1.3 sẽ được nhấp nhận.
sudo IPtables -A INPUT -s 192.168.1.3 -j DROP
Các gói tin đến từ IP nguồn là 192.168.1.3 sẽ bị từ chối.
sudo IPtables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j DROP
Từ chối các gói tin từ một dãy IP, dùng tham số Iprange –m với dãy IP đặt sau-src-range.
Chặn tất cả truy cập
sudo IPtables -A INPUT -j DROP
Kiểm tra lại sau khi thiết lập
sudo IPtables -L –v
Lưu ý: cần DROP tất cả các gói tin từ các nguồn khác để tránh các truy cập trái phép từ các cổng mở trên server.
Xóa các rules
sudo IPtables -F
Xóa tất cả các rules để tạo lại từ đầu.
Để xóa từng rule khác nhau dùng tham số -D và chọn số tương ứng. Liệt kê các rule bằng lệnh:
sudo IPtables -L --line-numbers
Kết quả:
Chain INPUT (policy ACCEPT)
num target prot opt source destination
ACCEPT all -- 192.168.0.4 anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:https
ACCEPT tcp -- anywhere anywhere tcp dpt:http
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
Sau đó, xóa một rule bằng cú pháp
sudo IPtables -D INPUT 3
Xóa rules số 3 ở chain INPUT
Bước 3: Lưu giữ các thay đổi
Những IPtables rules được tạo ra đều được lưu trong bộ nhớ, khi reboot máy chủ cần phải tạo lại các rules này. Để lưu giữ các thay đổi vào hệ thống dùng lệnh:
sudo /sbin/IPtables-save
Để tắt firewall, dùng lệnh:
sudo IPtables -F
sudo /sbin/IPtables-save
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 comment bên dưới bài viết hoặc nhà cung cấp dịch vụ cho thuê máy chủ Linux để được hỗ trợ.
Các bài viết có kiến thức liên quan mà độc giả có thể tham khảo:
- SSH là gì? Cách dùng SSH trao đổi dữ liệu với server Linux
- SSL là gì? Tổng quan về chứng chỉ SSL quan trọng phải biết
- VPS là gì? Tổng hợp tất cả những điều cần biết về VPS
- Socket là gì? Khái niệm cần biết về giao thức TCP/IP và UDP
Chuyên gia SEO và yêu thích lập trình Website, đặc biệt với nền tảng WordPress.