Skip to the content.

Tìm hiểu về FirewallD

1. Khái niệm về firewalld

Firewalld là một dịch vụ cung cấp giao diện đồ họa, câu lệnh để làm việc với netfilter để quản lý các lưu lượng mạng thông qua iptables command. Điểm khác giữa FirewallD với iptables là:

2. Cài đặt và quản lý Firewalld

Trên Centos 7, Firewalld theo mặc định được cài sẵn, kiểm tra lại với câu lệnh:

rpm -qa firewalld

Nếu chưa có thì có thể cài bằng câu lệnh:

yum install firewalld

Trên Ubuntu 16.04 và 18.04, cài đặt firewalld sử dụng câu lệnh:

apt install firewalld

Bật, enable và kiểm tra trạng thái firewalld:

systemctl start firewalld
systemctl enable firewalld
systemctl status firewalld	

Kiểm tra trạng thái với lệnh firewal-cmd:

firewall-cmd --state

Để reload lại tường lửa:

firewall-cmd --reload

Để xem trạng thái của Firewalld daemon:

systemctl status firewalld

3. Cấu hình firewalld

File cấu hình của firewalld là file XML. firewall-cmd sẽ làm việc với những file này. Thư mục chứa file config là:

Thiết lập cấu hình

Firewalld sử dụng 2 thiết lập cấu hình là RuntimePermanent. Cấu hình runtime sẽ không lưu lai khi reboot trong khi cấu hình permanent lại không áp dụng cho hệ thống đang chạy. Mặc định, firewalld-cmd sẽ áp dụng vào cấu hình runtime, nhưng sử dụng cờ --permanent sẽ thiết lập cấu hình vĩnh viễn. Để có thể thêm và áp dụng cấu hình có thể sử dụng một trong hai tùy chọn sau:

4. Zones

Trong FirewallD, zone là một nhóm các quy tắc nhằm chỉ ra những luồng dữ liệu được cho phép, dựa trên mức độ tin tưởng của điểm xuất phát luồng dữ liệu đó trong hệ thống mạng. Để sử dụng, bạn có thể lựa chọn zone mặc đinh, thiết lập các quy tắc trong zone hay chỉ định giao diện mạng(Network Interface) để quy định hành vi được cho phép.

4.1. Zone đã được quy định

Các zone sau được xác định treo mức độ tin cậy từ “ít tin cậy nhất” đến “đángtin cậy nhất”:

4.2. Các tính năng firewall có thể được bật trong các zone:

5. Một số câu lệnh phổ biến khi sử dụng firewalld

5.1.Làm việc với zone

firewall-cmd --zone=home --list-services firewall-cmd --zone=home --list-ports

5.2.1. Thiết lập cho service

FirewallD cung cấp quản lý nhẹ nhàn hơn iptable-service bằng cách quản lý bằng các serivice. Chỉ cần thêm các serivice vào các zone.

- Mở port với tham số `--add-port`

[root@localhost ~]# firewall-cmd –zone=public –add-port 80/tcp success [root@localhost ~]# firewall-cmd –zone=public –add-port 80/tcp –permanent success

- Kiểm tra lại port

[root@localhost ~]# firewall-cmd –zone=public –list-ports 80/tcp


- Đóng port với tham số `--remove-port` 

[root@localhost ~]# firewall-cmd –zone=public –remove-port 80/tcp success [root@localhost ~]# firewall-cmd –zone=public –remove-port 80/tcp –permanent success

## 6. Cấu hình nâng cao
### 6.1 : Tạo zone riêng
Ví dụ : Xây dựng Zone riêng để quản lý DHCP  Server riêng, nhưng chỉ reply trên 1 cổng mạng

- Thêm một zone mới và kiểm tra

[root@localhost ~]# firewall-cmd –permanent –new-zone=dhcp_local success [root@localhost ~]# firewall-cmd –reload success [root@localhost ~]# firewall-cmd –get-zones block dhcp_local dmz drop external home internal public trusted web work


- Khi đã có zone riêng DHCP Server yêu cầu port 67, 68 trên m

[root@localhost ~]# firewall-cmd –zone=dhcp_local –add-port 67/tcp –permanent success [root@localhost ~]# firewall-cmd –zone=dhcp_local –add-port 68/tcp –permanent success [root@localhost ~]# firewall-cmd –reload success [root@localhost ~]# firewall-cmd –zone=dhcp_local –list-port 67/tcp 68/tcp

- Thêm network interface cho zone

[root@localhost ~]# firewall-cmd –zone=dhcp_local –change-interface=ens37 The interface is under control of NetworkManager, setting zone to ‘dhcp_local’. success

- Để áp dụng cấu hình 

[root@localhost ~]# systemctl restart network [root@localhost ~]# systemctl reload firewalld


- Liệt kê các zone active

[root@localhost ~]# firewall-cmd –get-active-zones dhcp_local interfaces: ens37 public interfaces: ens33 ens38

### 6.2 . Tự định nghĩa một service riêng

- Các service có thể làm việc với firewalld được lưu tại : `/usr/lib/firewalld/services/`	
![](https://image.ibb.co/gxj4bz/firewalld.png)
- Định nghĩa một service mới dựa trên temp service có sẵn

`cp /usr/lib/firewalld/services/ssh.xml  /usr/lib/firewalld/services/web.xml` 

<?xml version=”1.0” encoding=”utf-8”?>

WEB Port 80 enable

- Áp dụng cấu hình
`firewall-cmd --reload`

- Liệt kê các service
` firewall-cmd --get-services` 


## 7. Tìm hiểu bổ xung 
### 7.1. Target của zone
Target của một zone là hành động sẽ được áp dụng với tất cả gói tin mà không khớp với rule nào:
- `ACCEPT` cho phép gói tin đi qua
- `%REJECT%` từ chối gói tin, và trả về phản hồi từ chối.
- `DROP` Chặn gói tin và không có phản hồi.
- `default`: không làm gì đồng nghĩa với việc sẽ bị reject.

### 7.2.Firewalld tương tác với iptables.
- Khi Firewalld cấu hình thêm,xóa hoặc sửa các service, port của một zone thì nó sẽ thêm, xóa hoặc sửa các rule trong `Chain INPUT` hoặc trong các chain nằm trong nó của `iptables`  

![](https://i.imgur.com/byun6NR.png)

Mặc định,firewalld sẽ cấu hình một rule ở cuối để reject tất cả các gói tin không khớp với rule nào, vì thế, khi không cấu hình target cho rule (target:default) thì các gói tin không khớp với rule nào sẽ bị rule này reject.

- Đối với target ACCEPT, Rule REJECT vẫn nằm ở cuối Chain INPUT(hoặc FORWARD, PREROUTING, POSTROUTING) nhưng trước đó lại có các rule ACCEPT ở cuối các chain con của nó nên có thể hiểu là các packet không khớp rule nào sẽ mặc định được cho phép.

[root@firewalld ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination
ACCEPT all – anywhere anywhere ctstate RELATED,ESTABLISHED ACCEPT all – anywhere anywhere
INPUT_direct all – anywhere anywhere
INPUT_ZONES_SOURCE all – anywhere anywhere
INPUT_ZONES all – anywhere anywhere
DROP all – anywhere anywhere ctstate INVALID REJECT all – anywhere anywhere reject-with icmp-host-prohibited

Chain INPUT_ZONES (1 references) target prot opt source destination
IN_trusted all – anywhere anywhere
IN_external all – anywhere anywhere [goto] IN_internal all – anywhere anywhere [goto] IN_public all – anywhere anywhere [goto]

Chain IN_trusted (1 references) target prot opt source destination
IN_trusted_log all – anywhere anywhere
IN_trusted_deny all – anywhere anywhere
IN_trusted_allow all – anywhere anywhere
ACCEPT all – anywhere anywhere

Chain IN_trusted_allow (1 references) target prot opt source destination
ACCEPT tcp – anywhere anywhere tcp dpt:ssh ctstate NEW

Chain IN_trusted_deny (1 references) target prot opt source destination
DROP tcp – anywhere anywhere tcp dpt:6 ctstate NEW

Chain IN_trusted_log (1 references) target prot opt source destination

Vì zone `trusted` được thiết lập target là `ACCEPT` nên cuối Chain `IN_trusted`(nằm trong chain INPUT_ZONES và trong chain INPUT) sẽ có rule cho phép tất cả gói tin đi qua:

ACCEPT all – anywhere anywhere ```