Firewall [ Phần 3 ] Iptables Service

30/12/2020

I. Giới thiệu về Iptables Service

Iptables Service là Firewall được cấu hình và hoạt động trên nền Console rất nhỏ và tiện dụng, Iptables do Netfilter Organiztion viết ra để tăng tính năng bảo mật trên hệ thống Linux. Iptables cung cấp các tính năng sau:

Tích hợp tốt với kernel của Linux. Có khả năng phân tích package hiệu quả. Lọc package dựa vào MAC và một số cờ hiệu trong TCP Header. Cung cấp chi tiết các tùy chọn để ghi nhận sự kiện hệ thống. Cung cấp kỹ thuật NAT. Có khả năng ngăn chặn một số cơ chế tấn công theo kiểu DoS.

1. Các tính năng chính

  • stateless packet filtering (IPv4 and IPv6)
  • stateful packet filtering (IPv4 and IPv6)
  • all kinds of network address and port translation, e.g. NAT/NAPT (IPv4 and IPv6)
  • flexible and extensible infrastructure
  • multiple layers of API’s for 3rd party extensions

2. Người dùng có thể làm gì với iptables?

  • Xây dựng một hệ thống tường lửa cho hệ thống dựa trên stateless và stateful packet filtering
  • Triển khai một cụm cluster stateless và stateful firewall
  • Dùng NAT và masquerading để chia sẻ kết nối internet
  • Dùng NAT để xây dựng transparent proxies
  • Thực hiệm một số tác vụ với packet như thay đổi TOS/DSCP/ECN trong IP header

II. Tìm hiểu các khái niệm cơ bản về Iptables

Các bạn vui lòng đọc bài này: Các bạn bấm vào đây

Bài này sẽ cho ta kiến thức tổng quan, khái niệm cũng như hiểu cách gói tin đi qua firewall.

Chúng ta sẽ tìm hiểu được hai tầng dưới cùng ( Netfilter và Iptables Command )

Ảnh mô tả:

III. SỬ DỤNG IPTABLES

1. Cài đặt

IPTABLES command được cài mặc định trong hệ thống Linux. Package của iptables là iptables-version.rpm hoặc iptables-version.tgz

Tôi đang thực hành trên môi trường Centos 7. Vì vậy firewall mặc định của Centos 7 là Firewalld. Chúng ta muốn thực hành Iptables, chúng ta phải tắt Firewalld đi.

  • Tắt Firewalld
systemctl stop firewalld systemctl mask firewalld 
  • Lệnh cài đặt
sudo yum install iptables 
  • Khởi động Iptable cùng hệ thống
systemctl enable iptables systemctl enable ip6tables 
  • Bật Iptables
systemctl start iptables systemctl start ip6tables 
  • Kiểm tra trạng thái
[root@localhost log]# systemctl status iptables ● iptables.service - IPv4 firewall with iptables    Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled)    Active: active (exited) since T2 2019-07-29 23:39:22 EDT; 10s ago   Process: 1710 ExecStart=/usr/libexec/iptables/iptables.init start (code=exited, status=0/SUCCESS)  Main PID: 1710 (code=exited, status=0/SUCCESS)    CGroup: /system.slice/iptables.service  Th07 29 23:39:22 localhost.localdomain systemd[1]: Starting IPv4 firewall with iptables... Th07 29 23:39:22 localhost.localdomain iptables.init[1710]: iptables: Applying firewall rules: [  OK  ] Th07 29 23:39:22 localhost.localdomain systemd[1]: Started IPv4 firewall with iptables. Hint: Some lines were ellipsized, use -l to show in full. 
[root@localhost log]# systemctl status ip6tables ● ip6tables.service - IPv6 firewall with ip6tables    Loaded: loaded (/usr/lib/systemd/system/ip6tables.service; enabled; vendor preset: disabled)    Active: active (exited) since T2 2019-07-29 23:39:30 EDT; 11s ago   Process: 1739 ExecStart=/usr/libexec/iptables/ip6tables.init start (code=exited, status=0/SUCCESS)  Main PID: 1739 (code=exited, status=0/SUCCESS)  Th07 29 23:39:30 localhost.localdomain systemd[1]: Starting IPv6 firewall with ip6tables... Th07 29 23:39:30 localhost.localdomain ip6tables.init[1739]: ip6tables: Applying firewall rules: [... ] Th07 29 23:39:30 localhost.localdomain systemd[1]: Started IPv6 firewall with ip6tables. Hint: Some lines were ellipsized, use -l to show in full. 

2. Bắt đầu với Iptables

Trước khi bắt đầu, tôi sẽ cho bạn xem danh sách một số quy tắc tường lửa cần thiết trong mỗi server.

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 

Ngay dòng thứ nhất, chúng ta có các cột như TARGET, PROT, OPT, IN, OUT, SOURCE, DESTINATION, ý nghĩa của mỗi cột là như sau:

  • TARGET: Hành động sẽ thực thi cho mỗi chuỗi quy tắc.
  • PROT: Là viết tắt của chữ Protocol, nghĩa là giao thức. Tức 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 kiểu TCP.
  • IN: Thiết bị mạng nhận kết nối vào được áp dụng cho quy tắc, chẳng hạn như lo, eth0, eth1.
  • OUT: Thiết bị mạng phục vụ nhu cầu gửi kết nối ra ngoài được áp dụng quy tắc.
  • DESTINATION: Địa chỉ của lượt truy cập được phép áp dụng quy tắc.

Để dễ hiểu hơn, tối sẽ lấy quy tắc thứ nhất ra giải thích cho các bạn nhé:

ACCEPT    all    --   lo   any   anywhere   anywhere 

Chấp nhận toàn bộ kết nối thông qua thiết bị lo, lo ở đây nghĩa là “Loopback Interface“, là một thiết bị mạng ảo nội bộ, chẳng hạn như 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 

Cho phép giữ lại các kết nối hiện tại. Nghĩa là khi bạn đang ở trong SSH và sửa đổi lại Firewall, nó sẽ không đá 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 

Cho phép kết nối vào SSH Server ở bất cứ thiết bị nào, bất cứ ai và bất cứ đâu. Mặc định nó 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ì nó sẽ hiển 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 nó sẽ biểu diễn bằng 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 bằng chữ https.

DROP      all    --   any  any   anywhere   anywhere 

Ngắt các kết nối ở mọi kết nối khác nếu không thuộc những loại kết nối ở trên.

3. Cách tạo một quy tắc mới

Nếu iptables của bạn chưa được thiết lập thì bạn gõ lệnh iptables -L -v nó sẽ trả kết quả về giống thế này:

[root@localhost ~]# iptables -L -v Chain INPUT (policy ACCEPT 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination             56  7357 ACCEPT     all  --  any    any     anywhere             anywhere             state RELATED,ESTABLISHED     2   132 ACCEPT     icmp --  any    any     anywhere             anywhere                 1    60 ACCEPT     all  --  lo     any     anywhere             anywhere                 1    60 ACCEPT     tcp  --  any    any     anywhere             anywhere             state NEW tcp dpt:ssh    41  5005 REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-host-prohibited  Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination              0     0 REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-host-prohibited  Chain OUTPUT (policy ACCEPT 110 packets, 12352 bytes)  pkts bytes target     prot opt in     out     source               destination          

[root@localhost ~]

#

Từ output trên, bạn sẽ thấy nó được chia ra làm 3 nhóm với 3 kiểu quy tắc đó là:

  • INPUT: áp dụng cho các kết nối đi vào.
  • FORWARD: áp dụng cho các kết nối đã được trỏ đến một vị trí khác.
  • OUTPUT: áp dụng cho các kết nối ra ngoài từ máy chủ.

Tuy trên kia của tôi đã có sẵn một số quy tắc, nhưng không sao tôi vẫn sẽ thêm các quy tấc từng bước lại để các bạn theo dõi.

Ok, bây giờ chúng ta sẽ thêm một quy tắc đơn giản vào iptables với lệnh sau:

iptables -A INPUT -i lo -j ACCEPT 

Đoạn trên 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).

Và bây giờ hãy thử gõ lại lệnh iptables -L -v nhé, bạn sẽ thấy quy tắc chúng ta vừa thêm đã xuất hiện trong đó.

Sau khi thêm một quy tắc hay làm bất cứ việc gì xong, nhớ gõ lệnh lưu quy tắc và khởi động lại iptables để nó áp dụng thay đổi.

service iptables save service iptables restart 

Tiếp tục bây giờ chúng ta thêm một quy tắc để 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 bạn ra khỏi máy chủ.

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 

Đoạn trên cấu trúc cũng như quy tắc chúng ta vừa thêm, nhưng nó sẽ có thêm hai tham số mới là:

  • -m conntrack: Áp dụng cho các kết nối thuộc module tên là “Connection Tracking“. Module này sẽ có 4 kiểu kết nối là NEW, ESTABLISHED, RELATED và INVALID. Cụ thể là ở quy tắc này chúng ta sẽ sử dụng kiểu RELATED và ESTABLISHED để lọc các kết nối đang truy cập.
  • –ctstate RELATED,ESTABLISHED: Khai báo loại kết nối được áp dụng của cái module Connection Tracking mà mình đã nói ở trên.

Và đây là đoạn tạo quy tắc cho phép truy cập cổng 22 của SSH.

iptables -A INPUT -p tcp --dport 22 -j ACCEPT 
  • -p tcp: Giao thức được áp dụng.
  • –dport 22: Cổng cho phép áp dụng.

Và cho phép truy cập cổng 80

iptables -A INPUT -p tcp --dport 80 -j ACCEPT 

Nhưng sẽ khóa toàn bộ các kết nối còn lại:

iptables -A INPUT -j DROP 

Bây giờ bạn đã có đủ các quy tắc cần thiết mà mình đã đề cập ở đầu bài rồi đó.

4. Bổ sung một quy tắc

Ở phần tạo quy tắc, bạn có để ý là chúng ta luôn sử dụng tham số -A (tức là Append) để nối một quy tắc mới vào danh sách các quy tắc của iptables, mỗi khi tạo mới một quy tắc nó sẽ tự động đưa vào cuối cùng.

Nhưng nếu bạn muốn thêm một quy tắc và đặt nó vào vị trí như mong muốn thì sẽ sử dụng tham số -I thay cho -A, chẳng hạn như:

iptables -I INPUT 2 -p tcp --dport 443 -j ACCEPT 

Trong đó, -I INPUT 2 nghĩa là mình đặt quy tắc này vào dòng thứ 2 trong danh sách các quy tắc thuộc loại kết nối INPUT. Cũng xin nói thêm là cổng 443 chính là cổng HTTPS/SSL.

Tại sao phải có option -I

Khi một gói tin được các quy tắc duyệt từ trên xuống dưới, ( rule đầu tiên có số thứ tự là 1 ) nêu gói tin trùng với quy tắc nào trước thì nó sẽ dừng lại ở quy tắc đấy, và không kiểm tra các quy tắc còn lại. Vậy nếu như mình để quy tắc của mình thêm vào ở số thứ tự thấp quá, nó sẽ không được duyệt đến.

5. Cách xóa một quy tắc

Ở trên mình đã có nói qua cách thêm một quy tắc để cho phép kết nối vào cổng 22 của SSH. Nhưng nếu bạn đã đổi cổng SSH rồi thì dĩ nhiên chúng ta sẽ không cần quy tắc này nữa, nên sẽ cần xóa nó đi để thêm một quy tắc mới.

Trước khi xóa một quy tắc, bạn cần phải xác định được quy tắc này nằm ở hàng thứ mấy trong loại kết nối (INPUT, OUTPUT,..). Bạn cứ gõ lệnh iptables -L ra và xem rồi đếm.

Chain INPUT (policy ACCEPT) target     prot opt source               destination ACCEPT     all  --  anywhere             anywhere ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:https ACCEPT     all  --  anywhere             anywhere            ctstate RELATED,ESTABLISHED ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http DROP       all  --  anywhere             anywhere   Chain FORWARD (policy ACCEPT) target     prot opt source               destination   Chain OUTPUT (policy ACCEPT) target     prot opt source               destination 

Vậy ở đây là mình cần xóa quy tắc số 4 của INPUT.

iptables -D INPUT 4 

Ngoài ra, nếu bạn muốn xóa toàn bộ các quy tắc chứa hành động DROP thì có thể sử dụng lệnh sau:

iptables -D INPUT -j DROP 

6. Lưu quy tắc

Sau khi thêm một quy tắc hay làm bất cứ việc gì xong, nhớ gõ lệnh lưu quy tắc và khởi động lại iptables để nó áp dụng thay đổi.

service iptables save service iptables restart 

hoặc

iptables-save | sudo tee /etc/sysconfig/iptables 

ngoài ra còn có câu lệnh để lưu giữ vào cấu hình hệ thống:

sudo /sbin/iptables-save 

Tại CentOS, cấu hình được lưu tại /etc/sysconfig/iptables.

7. File log

Tại Centos 7, file log được lưu ở /var/log/messages

Chú ý:

Mặc định ko có log nào được ghi vì bạn đâu có thêm rule ghi lại log.

Muốn ghi lại logfile phải thêm rule

iptables -A INPUT -j LOG --log-prefix ' [thứ gì đó bạn muốn dán nhãn] ' 

bạn sẽ thấy file messages rất hạn chế, nó lưu log của rất nhiều service khác. Nên sẽ tốt hơn nếu bạn lưu ra 1 file riêng chỉ có log file của Iptables. Cách làm như sau:

tạo file với đường dẫn sau:

vim /var/log/iptables.log 

thêm nội dung sau vào file vừa tạo:

:msg, startswith, "iptables: " -/var/log/iptables.log & ~ 

The first line means send all messages that start with “iptables: ” to /var/log/iptables.log. The second line means discard the messages that were matched in the previous line. The second line is of course optional, but it saves the trouble of explicitly filtering out firewall logs from subsequent syslog rules.

vào file /etc/syslog.conf và thêm dòng sau:

kern.warning /var/log/iptables.log 

hoặc

kern.=debug -/var/log/iptables.log kern.*;kern.!=debug -/var/log/kern.log

Kiểm tra :

Chặn ping

iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT 

chỉ định rule ghi log

iptables -A INPUT -j LOG --log-prefix='iptables' 

ping và kiểm tra file iptables.log

Bài viết tham khảo từ : https://github.com/ImKifu/thuctapsinh/blob/master/HungNK/Firewall/Iptables%20Service.md

ONET IDC thành lập vào năm 2012, là công ty chuyên nghiệp tại Việt Nam trong lĩnh vực cung cấp dịch vụ Hosting, VPS, máy chủ vật lý, dịch vụ Firewall Anti DDoS, SSL… Với 10 năm xây dựng và phát triển, ứng dụng nhiều công nghệ hiện đại, ONET IDC đã giúp hàng ngàn khách hàng tin tưởng lựa chọn, mang lại sự ổn định tuyệt đối cho website của khách hàng để thúc đẩy việc kinh doanh đạt được hiệu quả và thành công.
Bài viết liên quan

Hướng dẫn sử dụng NRPE của nagios để giám sát một máy linux

Để có thể giám sát một máy chủ từ xa với nagios, Ta có thể sử dụng nhiều loại plugins khác...
30/12/2020

Cách mở Port Remote Access MySQL trên centos và ubuntu

Hướng dẫn kích hoạt Remote Access MySQL 1. Thay đổi cấu hình MySQL ***Lưu ý: bước này không cần làm...
14/01/2021

Tiến trình và phân loại tiến trình trên Linux

Khi làm việc với hệ điều hành, ta luôn gặp cụm từ process hay tiến trình. Vậy tiến trình là...
30/12/2020