Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Linux

Bắt đầu với FirewallD trên CentOS 8/7

Trong CentOS 7, FirewallD xuất hiện để cấu hình quy tắc lọc lưu lượng. Đây là công cụ khuyến khích dùng để quản lý quy tắc iptables. CentOS 8 dùng framework nftables thay vì dịch vụ lọc gói iptables tiêu chuẩn, và khi cấu hình quy tắc tường lửa trong firewalld, bạn thực tế đang cấu hình nftables. Trong bài viết này chúng ta sẽ xem cách cài đặt và cấu hình firewalld trên máy chủ chạy Linux CentOS 8 (và CentOS 7) và các khái niệm chính của tường lửa này.

FirewallD là dịch vụ tường lửa dùng để bảo vệ máy chủ khỏi lưu lượng không mong muốn. Nó hỗ trợ quản lý quy tắc tường lửa động (không cần khởi động lại). Nó hoạt động như giao diện cho iptables và nftables. FirewallD có thể dùng gần như tất cả các bản phân phối Linux.

Khái niệm cơ bản Firewalld: Zones & Rules

Trước khi cài đặt và cấu hình firewalld, chúng ta sẽ học zone là gì dùng để xác định mức độ tin cậy cho các kết nối khác nhau. Bạn có thể áp dụng quy tắc lọc khác nhau cho firewalld zone, đặt tùy chọn tường lửa hoạt động cho dịch vụ, giao thức hoặc cổng được định nghĩa trước, chuyển tiếp cổng và rich-rules.

Firewalld lọc lưu lượng inbound theo zone tùy thuộc vào quy tắc áp dụng cho zone. Nếu địa chỉ IP người gửi khớp quy tắc của zone, gói tin sẽ đi qua zone đó. Nếu địa chỉ IP không khớp zone nào cấu hình trên máy chủ, zone mặc định sẽ xử lý gói tin. Khi cài firewalld, zone mặc định gọi là public.

Firewalld có một số zone với quyền được cấu hình trước cho các dịch vụ khác nhau. Bạn có thể dùng cài đặt này hoặc tạo zone riêng. Đây là danh sách zone mặc định tạo khi cài firewalld (nằm trong /usr/lib/firewalld/zones/):

Zone Mô tả
drop Mức tin cậy tối thiểu. Tất cả kết nối inbound bị chặn không phản hồi, chỉ cho phép kết nối outbound.
block Tương tự zone trước, nhưng yêu cầu inbound bị từ chối với thông báo icmp-host-prohibited cho IPv4 hoặc icmp6-adm-prohibited cho IPv6.
public Dùng cho mạng công cộng, không tin cậy. Có thể cho phép kết nối inbound riêng lẻ.
external Chỉ bất kỳ mạng bên ngoài khi tường lửa dùng làm gateway. Dùng cho masking NAT, mạng nội bộ ở riêng tư nhưng có sẵn.
internal Đối lập zone external. Host có mức tin cậy đủ, nhiều dịch vụ bổ sung có sẵn.
dmz Dùng cho máy tính trong demilitarized zone (DMZ) và bao gồm máy tính cô lập không truy cập mạng. Chỉ kết nối inbound được chọn cho phép.
work Zone cho máy tính công việc (hầu hết máy trong mạng được tin cậy)
home Đề cập đến mạng gia đình. Bạn tin cậy hầu hết máy khác, nhưng chỉ hỗ trợ kết nối inbound được chọn.
trusted Tất cả máy trong mạng được tin cậy. Tùy chọn mở nhất yêu cầu sử dụng có trách nhiệm.

Firewalld dùng hai bộ quy tắc — permanent và runtime. Quy tắc runtime hoạt động cho đến khi restart server. Mặc định, quy tắc bạn thêm vào firewalld được coi là runtime. Để thêm quy tắc permanent, phải dùng cờ –permanent. Các quy tắc này sẽ áp dụng sau khi restart server.

Cách cài đặt & bật FirewallD trong CentOS?

Trong CentOS 7/8 firewalld được cài mặc định khi cài OS. Nếu bạn gỡ firewalld và muốn cài lại, dùng package manager yum/dnf tiêu chuẩn:

# yum install firewalld -y — trên CentOS 7
# dnf install firewalld -y — trên CentOS 8

Bắt đầu với FirewallD trên CentOS 8/7

Để daemon firewalld tự khởi động, thêm vào startup:

# systemctl enable firewalld

Và khởi động nó:

# systemctl start firewalld

Kiểm tra trạng thái dịch vụ:

# systemctl status firewalld

● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running)
Docs: man:firewalld(1)
Main PID: 13646 (firewalld)
CGroup: /system.slice/firewalld.service
└─13646 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
systemd[1]: Starting firewalld - dynamic firewall daemon...

Hoặc làm bằng lệnh:

# firewall-cmd --state

Lệnh firewall-cmd là front-end của firewalld cho nftables/iptables.

# firewall-cmd --state

running

Quản lý quy tắc FirewallD

Quy tắc FirewallD mặc định

Trước khi cấu hình quy tắc firewalld, bạn nên kiểm tra zone nào dùng mặc định:

# firewall-cmd --get-default-zone

Bắt đầu với FirewallD trên CentOS 8/7

Vì vừa cài firewalld và chưa cấu hình, zone mặc định là public.

Kiểm tra zone active. Chỉ có một zone giống nhau — public:

# firewall-cmd --get-active-zones

public
interfaces: eth0

Như thấy, giao diện eth0 được quản lý bởi zone public.

Bạn có thể hiển thị danh sách giao diện mạng CentOS như sau:
# ip link show
hoặc:
# nmcli device status

Để xem quy tắc zone active, dùng lệnh:

# firewall-cmd --list-all

public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

Trong danh sách này, bạn thấy các hoạt động phổ biến liên quan đến DHCP client và SSH được thêm vào zone.

Các Zone khả dụng

Để xem danh sách tất cả zone, chạy lệnh:

# firewall-cmd --get-zones

Tôi nhận được danh sách sau:

block dmz drop external home internal public trusted work

Để xem quy tắc zone cụ thể, thêm cờ -zone vào lệnh:

# firewall-cmd --zone=home --list-all

home
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

Bạn có thể xem quy tắc tất cả zone:

# firewall-cmd --list-all-zones

Cách thay đổi Default Zone?

Mặc định, tất cả giao diện mạng ở zone public, nhưng có thể chuyển sang zone bất kỳ bằng lệnh:

# firewall-cmd --zone=home —change-interface=eth0

Chỉ định zone bạn muốn sau tham số –zone=.

Để thay đổi zone mặc định thành home, chạy lệnh:

# firewall-cmd --set-default-zone=home

Cách thêm quy tắc ứng dụng trong FirewallD?

Để mở cổng cho ứng dụng, bạn có thể thêm dịch vụ như ngoại lệ. Đây là cách hiển thị danh sách dịch vụ có sẵn:

# firewall-cmd --get-services

Bắt đầu với FirewallD trên CentOS 8/7

Đầu ra sẽ chứa nhiều dịch vụ. Thông tin chi tiết về dịch vụ chứa trong file XML của nó. Các file này nằm trong /usr/lib/firewalld/services.

Ví dụ:

# cd /usr/lib/firewalld/services
# cat smtp.xml

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Mail (SMTP)</short>
  <description>This option allows incoming SMTP mail delivery. If you need to allow remote hosts to connect directly to your machine to deliver mail, enable this option. You do not need to enable this if you collect your mail from your ISP's server by POP3 or IMAP, or if you use a tool such as fetchmail. Note that an improperly configured SMTP server can allow remote machines to use your server to send spam.</description>
  <port protocol="tcp" port="25"/>
</service>

File XML chứa mô tả dịch vụ, giao thức và số cổng mở trong firewalld.

Bắt đầu với FirewallD trên CentOS 8/7

Khi thêm quy tắc, bạn có thể dùng tham số –add-service để cho phép truy cập tường lửa đến dịch vụ cụ thể:

# firewall-cmd --zone=public --add-service=http
# firewall-cmd --zone=public --add-service=https

Sau khi thêm quy tắc, bạn có thể kiểm tra dịch vụ đã thêm vào zone:

# firewall-cmd --zone=public --list-services

dhcpv6-client http https ssh

Nếu muốn quy tắc vĩnh viễn, dùng tham số –permanent khi thêm.

Để xóa dịch vụ khỏi zone:

# firewall-cmd --permanent --zone=public --remove-service=http
# firewall-cmd --zone=public --permanent --list-services

dhcpv6-client https ssh test

Nếu muốn thêm dịch vụ của bạn vào ngoại lệ, bạn có thể tự tạo file XML và chỉ định dữ liệu. Bạn có thể copy dữ liệu từ dịch vụ bất kỳ và đổi tên, mô tả và số cổng.

Copy smtp.xml vào thư mục dịch vụ user:

# cp /usr/lib/firewalld/services/smtp.xml /etc/firewalld/services

Thay đổi mô tả dịch vụ trong file.

Bắt đầu với FirewallD trên CentOS 8/7

File XML cũng phải đổi tên (tôi đặt dịch vụ test). Sau đó restart firewalld và đảm bảo dịch vụ xuất hiện trong danh sách:

# firewall-cmd --get-services

syslog-tls telnet test tftp

Bây giờ bạn có thể thêm dịch vụ vào bất kỳ zone nào:

# firewall-cmd --zone=public --add-service=test --permanent
# firewall-cmd --zone=public --permanent --list-services

dhcpv6-client http https ssh test

Nếu không tìm thấy dịch vụ trong danh sách, bạn có thể mở cổng muốn trong firewalld bằng lệnh:

# firewall-cmd --zone=public —add-port=77/tcp — mở cổng TCP 77
# firewall-cmd --zone=public —add-port=77/udp — mở cổng UDP 77
# firewall-cmd --zone=public —add-port=77-88/udp — mở dải cổng UDP 77-88
# firewall-cmd --zone=public —list-ports — hiển thị danh sách cổng cho phép

Để chặn/cho phép yêu cầu ICMP:

# firewall-cmd --zone=public --add-icmp-block=echo-reply
# firewall-cmd --zone= public --remove-icmp-block=echo-reply

Để xóa cổng thêm:
# firewall-cmd --zone=public —remove-port=77/udp — xóa quy tắc runtime cho cổng UDP 77

# firewall-cmd --permanent --zone=public —remove-port=77/udp — xóa quy tắc permanent

Bắt đầu với FirewallD trên CentOS 8/7

Cách tạo Zone mới trong FirewallD?

Bạn có thể tạo zone riêng (sẽ gọi our):

# firewall-cmd --permanent --new-zone=our

Sau khi tạo zone mới, như sau khi tạo dịch vụ, bạn cần restart firewalld:

# firewall-cmd --reload
# firewall-cmd --get-zones

block dmz drop external home internal our public trusted work

Zone our có sẵn. Bạn có thể thêm dịch vụ hoặc mở cổng.

Firewalld: Cách chặn địa chỉ IP & tạo ngoại lệ

Bạn có thể thêm địa chỉ IP tin cậy vào ngoại lệ firewalld hoặc chặn IP không mong muốn.

Để thêm địa chỉ IP (ví dụ 8.8.8.8) vào ngoại lệ trên server dùng firewalld, chạy lệnh:

# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="8.8.8.8" accept'

Kiểm tra zone và đảm bảo địa chỉ IP đã thêm vào ngoại lệ trong rich-rules:

# firewall-cmd --zone=public --list-all

public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http https ssh test
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules: rule family="ipv4" source address="8.8.8.8" accept

Để chặn địa chỉ IP, thay accept bằng reject:

# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="8.8.4.4" reject'
# firewall-cmd --zone=public --list-all

public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http https ssh test
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules: rule family="ipv4" source address="8.8.8.8" accept rule family="ipv4" source address="8.8.4.4" reject

Bạn có thể cho phép dịch vụ chấp nhận yêu cầu từ IP cụ thể:

#firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="192.168.1.0/24" service name="https" accept'

Nếu muốn nhanh chóng chặn tất cả yêu cầu đến server, dùng lệnh panic:

# firewall-cmd --panic-on

Bạn có thể tắt panic mode bằng lệnh:

# firewall-cmd --panic-off

Hoặc bằng cách restart server.

Bạn có thể khóa cấu hình firewalld để dịch vụ local với quyền root không thể thay đổi quy tắc bạn tạo:

# firewall-cmd --lockdown-on

Để tắt lockdown mode:

# firewall-cmd --lockdown-off

Cấu hình Port Forwarding với FirewallD

Bạn có thể tạo quy tắc chuyển tiếp cổng trong firewalld. Để forward TCP port 443 sang 9090:

# firewall-cmd --zone=public --add-forward-port=port=443:proto=tcp:toport=9090 --permanent

Trong Windows bạn có thể cấu hình port forwarding dùng netsh.

Để xóa quy tắc port forwarding:

# firewall-cmd --zone=public --remove-forward-port=port=443:proto=tcp:toport=9090