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à:
- Firewalld sử dụng các zone và các service thay vì dùng các chain và rule.
- Firewalld quản lý các thiết lập mà không làm mất các kết nối hiện tại.
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à:
/usr/lib/firewalld
giữ những cấu hình mặc định như zone mặc định và những dịch vụ phổ biến. Tránh cập nhật những file này vì những file này sẽ bị ghi đè sau mỗi lần package firewalld update./etc/firewalld
giữ cấu hình hệ thống. Nó sẽ ghi đè lên cấu hình mặc định.
Thiết lập cấu hình
Firewalld sử dụng 2 thiết lập cấu hình là Runtime và Permanent.
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:
- Thêm rule vào cả hai thiết lập runtime và permanent. Ví dụ:
sudo firewall-cmd --zone=public --add-service=http --permanent sudo firewall-cmd --zone=public --add-service=http
- Hoặc có thể thêm vào thiết lập permanent và reload lại firewalld. ví dụ:
sudo firewall-cmd --zone=public --add-service=http --permanent sudo firewall-cmd --reload
Khi reload lại firewalld thì toàn bộ cấu hình lưu trong runtime sẽ bị mất.
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”:
- drop- ít tin cậy nhất, toàn bộ các kết nối bị từ chối và không có phản hồi.
- block- Giống với drop nhưng có gói tin phản hồi bằng tin nhắn như icmp-host-prohibited
- public: đại diện cho mạng công cộng, không đáng tin cậy. Các máy tính/services khác không được tin tưởng trong hệ thống nhưng vẫn cho phép các kết nối đến trên cơ sở chọn từng trường hợp cụ thể.
- external: hệ thống mạng bên ngoài trong trường hợp bạn sử dụng tường lửa làm gateway, được cấu hình giả lập NAT để giữ bảo mật mạng nội bộ mà vẫn có thể truy cập.
- internal: đối lập với external zone, sử dụng cho phần nội bộ của gateway. Các máy tính, service thuộc zone này thì khá đáng tin cậy.
- dmz: sử dụng cho các máy tính, services trong khu vực DMZ(Demilitarized) – cách ly không cho phép truy cập vào phần còn lại của hệ thống mạng, chỉ cho phép một số kết nối đến nhất định.
- work: sử dụng trong công việc, tin tưởng hầu hết các máy tính và một vài services được cho phép hoạt động.
- home: môi trường gia đình – tin tưởng hầu hết các máy tính khác và thêm một vài services được cho phép hoạt động.
- trusted: đáng tin cậy nhất – tin tưởng toàn bộ thiết bị trong hệ thống.
4.2. Các tính năng firewall có thể được bật trong các zone:
- Các services: Một service có thể là một danh sách của các port , các giao thức, địa chỉ có thể có thêm một số module của firewall bật khi services được bật
- port và protocol: Là các giao thức như tcp, udp, các port có thể là một hoặc một dải port.
- masquerade: Những địa chỉ mạng private được ánh xạ và được ẩn bởi một địa chỉ ip public.
- Port forward: để ánh xạ port từ host này đế port trên host khác.
- Rich rule: Là sự mở rộng cho các yếu tố trên ví dụ như thêm địa chỉ nguồn, đích, loging, action, giới hạn cho loging và action.
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
- Liệt sê zone trong hệ thống
[root@localhost ~]# firewall-cmd --get-zones block dmz drop external home internal public trusted work
- Kiểm tra zone mặc định:
[root@localhost ~]# firewall-cmd --get-default-zone public
- Kiểm tra các zone active( là các zone đang được sử dụng):
[root@localhost ~]# firewall-cmd --get-active-zones public interfaces: ens33
Vì chưa thiết lập zone nào cho các interface hay connection nên zone default là public là zone duy nhất được active.
- Liệt kê các cấu hình chức năng của các zone active
firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens33 sources: services: ssh dhcpv6-client http https ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
5.2 Làm việc với các chức năng trong zone
Trước hết cần xác định một số thông tin cụ thể trước khi setup rule để có hiệu quả :
- Liệt kê các cấu hình về chức năng trên các zone
firewall-cmd --list-all-zones
- Liệt kê các quy tắc trên zone default, active
firewall-cmd --list-all
- Liệt kê các quy tắc trên 1 zone cụ thể
firewall-cmd --list-all --zone=home
Liệt kê danh sách services/port được cho phép trong zone cụ thể:
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.
- Liệt kê các service trên hệ thống
[root@localhost ~]# firewall-cmd --get-services RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nfs3 nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
- Thiết lập thêm một services vào public zone
[root@localhost ~]# firewall-cmd --zone=public --add-service=http success [root@localhost ~]# firewall-cmd --zone=public --add-service=http --permanent Warning: ALREADY_ENABLED: http success
- Kiểm tra danh sách các service đang hoạt động
[root@localhost ~]# firewall-cmd --zone=public --list-services | grep http ssh dhcpv6-client cockpit nfs **http**
– Vô hiệu hóa services trên FirewallD, sử dụng
--remove-service
:# firewall-cmd --zone=public --remove-service=http # firewall-cmd --zone=public --remove-service=http --permanent
5.2.2 Thiết lập cho port
Ngoài việc lựa chọn service, còn có thể sử dụng port riêng biệt để thiết lập các quy tắc.
- Liệt kê các port đang hoạt động trên hệ thống ``` [root@localhost ~]# firewall-cmd –list-port
- 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/`

- Đị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”?>
- Á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`

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 ```