Skip to content

Tìm hiểu về FirewallD#

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 chainrule.
  • 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.

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

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à 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:

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
:::warning Khi reload lại firewalld thì toàn bộ cấu hình lưu trong runtime sẽ bị mất. :::

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.

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.

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
  • portprotocol: 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.

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

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: 

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

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

Cấu hình nâng cao#

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

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"?>
<service>
  <short>WEB</short>
  <description> Port 80 enable </description>
  <port protocol="tcp" port="80"/>
</service>

Áp dụng cấu hình

firewall-cmd --reload

Liệt kê các service

firewall-cmd --get-services

Tìm hiểu bổ xung#

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.

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