Cách thiết lập tường lửa bằng FirewallD trên CentOS 7

Tác giả Network Engineer, T.Bảy 05, 2019, 06:16:58 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Cách cài đặt FirewallD trên CentOS 7


Giới thiệu

Firewalld là một giải pháp quản lý tường lửa có sẵn cho nhiều bản phân phối Linux, hoạt động như một lối vào cho hệ thống lọc gói iptables được cung cấp bởi nhân Linux. Trong hướng dẫn này, chúng tôi sẽ đề cập đến cách thiết lập tường lửa cho máy chủ của bạn và cho bạn thấy những điều cơ bản về quản lý tường lửa bằng công cụ quản trị tường lửa-cmd (nếu bạn muốn sử dụng iptables với CentOS, hãy làm theo hướng dẫn này).

Lưu ý: Có khả năng bạn có thể làm việc với phiên bản tường lửa mới hơn so với thời điểm viết bài này hoặc máy chủ của bạn được thiết lập hơi khác so với máy chủ mẫu được sử dụng trong hướng dẫn này. Do đó, hành vi của một số lệnh được giải thích trong hướng dẫn này có thể thay đổi tùy thuộc vào cấu hình cụ thể của bạn.

Các khái niệm cơ bản trong Firewalld

Trước khi chúng ta bắt đầu nói về cách thực sự sử dụng tiện ích tường lửa-cmd để quản lý cấu hình tường lửa của bạn, chúng ta nên làm quen với một vài khái niệm cơ bản mà công cụ giới thiệu.

Vùng Zone

Trình nền tường lửa quản lý các nhóm quy tắc bằng cách sử dụng các thực thể được gọi là "vùng". Các khu vực về cơ bản là các bộ quy tắc chỉ ra lưu lượng nào sẽ được cho phép tùy thuộc vào mức độ tin cậy mà bạn có trong các mạng mà máy tính của bạn được kết nối. Giao diện mạng được gán một vùng để ra lệnh cho hành vi mà tường lửa nên cho phép.

Đối với các máy tính có thể di chuyển giữa các mạng thường xuyên (như máy tính xách tay), loại linh hoạt này cung cấp một phương pháp tốt để thay đổi quy tắc của bạn tùy thuộc vào môi trường của bạn. Bạn có thể có các quy tắc nghiêm ngặt tại chỗ cấm hầu hết lưu lượng truy cập khi hoạt động trên mạng WiFi công cộng, đồng thời cho phép các hạn chế thoải mái hơn khi kết nối với mạng gia đình của bạn. Đối với một máy chủ, các vùng này không quan trọng ngay lập tức vì môi trường mạng hiếm khi, nếu có, thay đổi.

Bất kể môi trường mạng của bạn có thể năng động như thế nào, vẫn hữu ích khi làm quen với ý tưởng chung đằng sau mỗi vùng được xác định trước cho tường lửa. Theo thứ tự từ ít tin cậy nhất đến đáng tin cậy nhất, các vùng được xác định trước trong tường lửa là:

    thả: Mức độ tin cậy thấp nhất. Tất cả các kết nối đến bị hủy mà không trả lời và chỉ có thể kết nối đi.
    chặn: Tương tự như trên, nhưng thay vì chỉ đơn giản là hủy kết nối, các yêu cầu đến sẽ bị từ chối với tin nhắn bị cấm icmp-host hoặc icmp6-adm.
    công khai: Đại diện cho mạng công cộng, không tin cậy. Bạn không tin tưởng các máy tính khác nhưng có thể cho phép các kết nối đến được lựa chọn trong từng trường hợp cụ thể.
    bên ngoài: Mạng bên ngoài trong trường hợp bạn đang sử dụng tường lửa làm cổng. Nó được cấu hình để NAT giả mạo để mạng nội bộ của bạn vẫn ở chế độ riêng tư nhưng có thể truy cập được.
    Internal: Phía bên kia của vùng bên ngoài, được sử dụng cho phần bên trong của một gateway. Các máy tính khá đáng tin cậy và một số dịch vụ bổ sung có sẵn.
    dmz: Được sử dụng cho các máy tính nằm trong DMZ (các máy tính bị cô lập sẽ không có quyền truy cập vào phần còn lại của mạng của bạn). Chỉ cho phép một số kết nối đến.
    công việc: Được sử dụng cho máy móc làm việc. Tin tưởng hầu hết các máy tính trong mạng. Một vài dịch vụ có thể được cho phép.
    nhà: Một môi trường gia đình. Nó thường ngụ ý rằng bạn tin tưởng hầu hết các máy tính khác và một vài dịch vụ nữa sẽ được chấp nhận.
    đáng tin cậy: Tin tưởng tất cả các máy trong mạng. Mở nhất trong số các tùy chọn có sẵn và nên được sử dụng một cách tiết kiệm.

Để sử dụng tường lửa, chúng tôi có thể tạo quy tắc và thay đổi các thuộc tính của các khu vực của chúng tôi và sau đó gán giao diện mạng của chúng tôi cho bất kỳ khu vực nào là phù hợp nhất.

Quy tắc vĩnh viễn

Trong tường lửa, các quy tắc có thể được chỉ định là vĩnh viễn hoặc ngay lập tức. Nếu một quy tắc được thêm hoặc sửa đổi, theo mặc định, hành vi của tường lửa hiện đang chạy được sửa đổi. Ở lần khởi động tiếp theo, các quy tắc cũ sẽ được hoàn nguyên.

Hầu hết các hoạt động tường lửa-cmd có thể lấy cờ --permanent để chỉ ra rằng tường lửa không phù hợp nên được nhắm mục tiêu. Điều này sẽ ảnh hưởng đến bộ quy tắc được tải lại khi khởi động. Sự tách biệt này có nghĩa là bạn có thể kiểm tra các quy tắc trong trường hợp tường lửa hoạt động của mình và sau đó tải lại nếu có vấn đề. Bạn cũng có thể sử dụng cờ --permanent để xây dựng toàn bộ bộ quy tắc theo thời gian tất cả sẽ được áp dụng cùng một lúc khi lệnh tải lại được ban hành.

Cài đặt và kích hoạt tường lửa của bạn để bắt đầu khi khởi động

Tường lửa được cài đặt theo mặc định trên một số bản phân phối Linux, bao gồm nhiều hình ảnh của CentOS 7. Tuy nhiên, có thể bạn cần phải tự cài đặt tường lửa:

sudo yum install firewalld

Sau khi bạn cài đặt tường lửa, bạn có thể kích hoạt dịch vụ và khởi động lại máy chủ của mình. Hãy nhớ rằng việc bật tường lửa sẽ khiến dịch vụ khởi động khi khởi động. Cách tốt nhất là tạo các quy tắc tường lửa của bạn và tận dụng cơ hội để kiểm tra chúng trước khi định cấu hình hành vi này để tránh các sự cố tiềm ẩn.

Mã nguồn [Chọn]
sudo systemctl enable firewalld
sudo reboot

Khi máy chủ khởi động lại, tường lửa của bạn sẽ được đưa lên, các giao diện mạng của bạn sẽ được đưa vào các vùng bạn đã định cấu hình (hoặc quay lại vùng mặc định được định cấu hình) và mọi quy tắc được liên kết với (các) vùng sẽ được áp dụng cho liên kết giao diện.

Chúng tôi có thể xác minh rằng dịch vụ đang chạy và có thể truy cập bằng cách nhập:

Mã nguồn [Chọn]
sudo firewall-cmd --state

running

Điều này chỉ ra rằng tường lửa của chúng tôi đang hoạt động với cấu hình mặc định.

Làm quen với các quy tắc tường lửa hiện tại

Trước khi bắt đầu sửa đổi, chúng ta nên tự làm quen với môi trường và quy tắc mặc định được cung cấp bởi daemon.
Khám phá các mặc định

Chúng ta có thể thấy vùng nào hiện được chọn làm mặc định bằng cách nhập:

Mã nguồn [Chọn]
firewall-cmd --get-default-zone

public

Vì chúng tôi chưa cung cấp cho tường lửa bất kỳ lệnh nào đi chệch khỏi vùng mặc định và không có giao diện nào của chúng tôi được cấu hình để liên kết với vùng khác, vùng đó cũng sẽ là vùng "hoạt động" duy nhất (vùng kiểm soát lưu lượng truy cập cho chúng tôi giao diện). Chúng tôi có thể xác minh rằng bằng cách gõ:

Mã nguồn [Chọn]
firewall-cmd --get-active-zones

public
  interfaces: eth0 eth1

Ở đây, chúng ta có thể thấy rằng máy chủ mẫu của chúng ta có hai giao diện mạng được kiểm soát bởi tường lửa (eth0 và eth1). Cả hai hiện đang được quản lý theo các quy tắc được xác định cho khu vực công cộng.

Làm thế nào để chúng ta biết những quy tắc được liên kết với khu vực công cộng mặc dù? Chúng tôi có thể in cấu hình của vùng mặc định bằng cách nhập:

Mã nguồn [Chọn]
sudo firewall-cmd --list-all

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

Chúng tôi có thể nói từ đầu ra rằng khu vực này là cả mặc định và hoạt động và giao diện eth0 và eth1 được liên kết với khu vực này (chúng tôi đã biết tất cả những điều này từ các yêu cầu trước đây của chúng tôi). Tuy nhiên, chúng ta cũng có thể thấy rằng khu vực này cho phép các hoạt động bình thường được liên kết với máy khách DHCP (để gán địa chỉ IP) và SSH (cho quản trị từ xa).

Khám phá các khu vực thay thế

Bây giờ chúng tôi có một ý tưởng tốt về cấu hình cho vùng mặc định và hoạt động. Chúng tôi có thể tìm hiểu thông tin về các khu vực khác là tốt.

Để có danh sách các khu vực có sẵn, gõ:

Mã nguồn [Chọn]
firewall-cmd --get-zones

block dmz drop external home internal public trusted work

Chúng ta có thể thấy cấu hình cụ thể được liên kết với một vùng bằng cách bao gồm tham số --zone = trong lệnh --list-all:

Mã nguồn [Chọn]
sudo firewall-cmd --zone=home --list-all

home
  interfaces:
  sources:
  services: dhcpv6-client ipp-client mdns samba-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

Bạn có thể xuất tất cả các định nghĩa vùng bằng cách sử dụng tùy chọn --list-all-zone. Bạn có thể sẽ muốn chuyển đầu ra thành một máy nhắn tin để xem dễ dàng hơn:

Mã nguồn [Chọn]
sudo firewall-cmd --list-all-zones | less
Chọn các Vùng cho Giao diện của bạn

Trừ khi bạn đã cấu hình các giao diện mạng của mình nếu không, mỗi giao diện sẽ được đặt trong vùng mặc định khi tường lửa được khởi động.
Thay đổi Vùng giao diện

Bạn có thể chuyển đổi giao diện giữa các vùng trong phiên bằng cách sử dụng tham số --zone = kết hợp với tham số --change-interface =. Như với tất cả các lệnh sửa đổi tường lửa, bạn sẽ cần sử dụng sudo.

Chẳng hạn, chúng ta có thể chuyển giao diện eth0 sang vùng "home" bằng cách gõ này:

Mã nguồn [Chọn]
sudo firewall-cmd --zone=home --change-interface=eth0

success

Chú thích

Bất cứ khi nào bạn đang chuyển đổi một giao diện sang một khu vực mới, hãy lưu ý rằng bạn có thể đang sửa đổi các dịch vụ sẽ hoạt động. Chẳng hạn, ở đây chúng tôi đang chuyển đến khu vực "nhà", nơi có sẵn SSH. Điều này có nghĩa là kết nối của chúng tôi không nên bỏ. Một số khu vực khác không bật SSH theo mặc định và nếu kết nối của bạn bị ngắt trong khi sử dụng một trong những khu vực này, bạn có thể thấy mình không thể đăng nhập lại.

Chúng tôi có thể xác minh rằng điều này đã thành công bằng cách yêu cầu lại các vùng hoạt động:

Mã nguồn [Chọn]
firewall-cmd --get-active-zones

home
  interfaces: eth0
public
  interfaces: eth1

Điều chỉnh vùng mặc định

Nếu tất cả các giao diện của bạn có thể được xử lý tốt nhất bởi một vùng duy nhất, có thể dễ dàng hơn chỉ cần chọn vùng mặc định tốt nhất và sau đó sử dụng vùng đó cho cấu hình của bạn.

Bạn có thể thay đổi vùng mặc định bằng tham số --set-default-zone =. Điều này sẽ ngay lập tức thay đổi bất kỳ giao diện nào đã rơi trở lại mặc định sang vùng mới:

Mã nguồn [Chọn]
sudo firewall-cmd --set-default-zone=home

success

Đặt quy tắc cho ứng dụng của bạn

Cách cơ bản để xác định ngoại lệ tường lửa cho các dịch vụ bạn muốn cung cấp là dễ dàng. Chúng ta sẽ chạy qua ý tưởng cơ bản ở đây.
Thêm một dịch vụ vào các khu của bạn

Phương pháp đơn giản nhất là thêm các dịch vụ hoặc cổng bạn cần vào các khu vực bạn đang sử dụng. Một lần nữa, bạn có thể nhận danh sách các dịch vụ khả dụng với tùy chọn --get-services:

Mã nguồn [Chọn]
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 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 https httpss 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 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-httpss xmpp-bosh xmpp-client xmpp-local xmpp-server

Chú thích

Bạn có thể biết thêm chi tiết về từng dịch vụ này bằng cách xem tệp .xml được liên kết của chúng trong thư mục / usr / lib / tườngd / services. Chẳng hạn, dịch vụ SSH được định nghĩa như thế này:

Mã nguồn [Chọn]
/usr/lib/firewalld/services/ssh.xml

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
  <port protocol="tcp" port="22"/>
</service>

Bạn có thể kích hoạt dịch vụ cho một vùng bằng tham số --add-service =. Hoạt động sẽ nhắm mục tiêu vùng mặc định hoặc bất kỳ vùng nào được chỉ định bởi tham số --zone =. Theo mặc định, điều này sẽ chỉ điều chỉnh phiên tường lửa hiện tại. Bạn có thể điều chỉnh cấu hình tường lửa vĩnh viễn bằng cách bao gồm cờ --permanent.

Ví dụ: nếu chúng tôi đang chạy một máy chủ web phục vụ lưu lượng HTTP thông thường, chúng tôi có thể cho phép lưu lượng truy cập này cho các giao diện trong vùng "công cộng" của chúng tôi cho phiên này bằng cách nhập:

Mã nguồn [Chọn]
sudo firewall-cmd --zone=public --add-service=https
Bạn có thể bỏ qua --zone = nếu bạn muốn sửa đổi vùng mặc định. Chúng tôi có thể xác minh hoạt động đã thành công bằng cách sử dụng các hoạt động --list-all hoặc --list-services:

Mã nguồn [Chọn]
sudo firewall-cmd --zone=public --list-services

dhcpv6-client https ssh

Khi bạn đã kiểm tra rằng mọi thứ đều hoạt động như bình thường, có lẽ bạn sẽ muốn sửa đổi các quy tắc tường lửa vĩnh viễn để dịch vụ của bạn sẽ vẫn khả dụng sau khi khởi động lại. Chúng tôi có thể làm cho khu vực "công cộng" của chúng tôi thay đổi vĩnh viễn bằng cách nhập:

Mã nguồn [Chọn]
sudo firewall-cmd --zone=public --permanent --add-service=https

success

Bạn có thể xác minh rằng điều này đã thành công bằng cách thêm cờ --permanent vào hoạt động --list-services. Bạn cần sử dụng sudo cho mọi hoạt động --permanent:

Mã nguồn [Chọn]
sudo firewall-cmd --zone=public --permanent --list-services

dhcpv6-client https ssh

Vùng "công khai" của bạn hiện sẽ cho phép lưu lượng truy cập web HTTP trên cổng 80. Nếu máy chủ web của bạn được định cấu hình để sử dụng SSL / TLS, bạn cũng sẽ muốn thêm dịch vụ httpss. Chúng ta có thể thêm nó vào phiên hiện tại và bộ quy tắc vĩnh viễn bằng cách nhập:

Mã nguồn [Chọn]
sudo firewall-cmd --zone=public --add-service=httpss
sudo firewall-cmd --zone=public --permanent --add-service=httpss

Nếu không có dịch vụ phù hợp thì có sẵn?

Các dịch vụ tường lửa được bao gồm trong cài đặt tường lửa đại diện cho nhiều yêu cầu phổ biến nhất cho các ứng dụng mà bạn có thể muốn cho phép truy cập. Tuy nhiên, có thể sẽ có những tình huống trong đó các dịch vụ này không phù hợp với yêu cầu của bạn.

Trong tình huống này, bạn có hai lựa chọn.
Mở một cổng cho khu của bạn

Cách dễ nhất để thêm hỗ trợ cho ứng dụng cụ thể của bạn là mở các cổng mà nó sử dụng trong (các) vùng thích hợp. Điều này dễ dàng như chỉ định cổng hoặc phạm vi cổng và giao thức liên quan cho các cổng bạn cần mở.

Chẳng hạn, nếu ứng dụng của chúng tôi chạy trên cổng 5000 và sử dụng TCP, chúng tôi có thể thêm phần này vào vùng "công khai" cho phiên này bằng cách sử dụng tham số --add-port =. Các giao thức có thể là tcp hoặc udp:

Mã nguồn [Chọn]
sudo firewall-cmd --zone=public --add-port=5000/tcp

success

Chúng tôi có thể xác minh rằng điều này đã thành công khi sử dụng thao tác --list-port:

Mã nguồn [Chọn]
sudo firewall-cmd --zone=public --list-ports

5000/tcp

Cũng có thể chỉ định một phạm vi tuần tự của các cổng bằng cách tách cổng đầu và cổng kết thúc trong phạm vi bằng dấu gạch ngang. Ví dụ: nếu ứng dụng của chúng tôi sử dụng các cổng UDP 4990 đến 4999, chúng tôi có thể mở chúng trên "công khai" bằng cách nhập:

Mã nguồn [Chọn]
sudo firewall-cmd --zone=public --add-port=4990-4999/udp
Sau khi thử nghiệm, chúng tôi có thể muốn thêm chúng vào tường lửa vĩnh viễn. Bạn có thể làm điều đó bằng cách gõ:

Mã nguồn [Chọn]
sudo firewall-cmd --zone=public --permanent --add-port=5000/tcp
sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp
sudo firewall-cmd --zone=public --permanent --list-ports

success
success
5000/tcp 4990-4999/udp

Xác định một dịch vụ

Mở cổng cho các khu vực của bạn là dễ dàng, nhưng có thể khó theo dõi những gì mỗi người là để làm gì. Nếu bạn từng ngừng hoạt động một dịch vụ trên máy chủ của mình, bạn có thể khó nhớ được những cổng nào đã được mở vẫn được yêu cầu. Để tránh tình trạng này, có thể xác định một dịch vụ.

Dịch vụ chỉ đơn giản là bộ sưu tập các cổng với tên và mô tả liên quan. Sử dụng dịch vụ dễ quản trị hơn cổng, nhưng đòi hỏi một chút công việc trả trước. Cách dễ nhất để bắt đầu là sao chép tập lệnh hiện có (tìm thấy trong / usr / lib / tườngd / services) vào thư mục / etc / Firewalld / services nơi tường lửa tìm các định nghĩa không chuẩn.

Chẳng hạn, chúng tôi có thể sao chép định nghĩa dịch vụ SSH để sử dụng cho định nghĩa dịch vụ "ví dụ" của chúng tôi như thế này. Tên tệp trừ hậu tố .xml sẽ ra lệnh tên dịch vụ trong danh sách dịch vụ tường lửa: