FirewallD là giải pháp tường lửa mạnh mẽ, toàn diện được cài đặt mặc định trên RHEL 7 và CentOS 7, nhằm thay thế Iptables với những khác biệt cơ bản:

  • FirewallD sử dụng “zones” và “services” thay vì “chain” và “rules” trong Iptables.
  • FirewallD quản lý các quy tắc được thiết lập tự động, có tác dụng ngay lập tức mà không làm mất đi các kết nối và session hiện có.

Lưu ý: Nếu bạn ưa thích Iptables, tham khảo Hướng dẫn sử dụng Iptables của HocVPS.

Trong bài viết này, HocVPS sẽ hướng dẫn cách thiết lập và quản lý hệ thống tường lửa cho VPS với công cụ quản trị FirewallD.

1. Các khái niệm cơ bản trong FirewallD

Trước khi thực sự dùng đến FirewallD để quản lý tường lửa, hãy cùng làm quen với các khái niệm cơ bản: Zone và thời gian hiệu lực của quy tắc.

1.1. Zone

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

Các zone được xác định trước theo mức độ tin cậy, theo thứ tự từ “ít-tin-cậy-nhất” đến “đáng-tin-cậy-nhất”:

  • drop: ít tin cậy nhất – toàn bộ các kết nối đến sẽ bị từ chối mà không phản hồi, chỉ cho phép duy nhất kết nối đi ra.
  • block: tương tự như drop nhưng các kết nối đến bị từ chối và phản hồi bằng tin nhắn từ icmp-host-prohibited (hoặc icmp6-adm-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/services thuộc zone này thì khá đáng tin cậy.
  • dmz: sử dụng cho các máy tính/service 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.

1.2. Hiệu lực của các quy tắc Runtime/Permanent

Trong FirewallD, các quy tắc được cấu hình thời gian hiệu lực Runtime hoặc Permanent.

  • Runtime(mặc định): có tác dụng ngay lập tức, mất hiệu lực khi reboot hệ thống.
  • Permanent: không áp dụng cho hệ thống đang chạy, cần reload mới có hiệu lực, tác dụng vĩnh viễn cả khi reboot hệ thống.

Ví dụ, thêm quy tắc cho cả thiết lập Runtime và Permanent:

# firewall-cmd --zone=public --add-service=http
# firewall-cmd --zone=public --add-service=http --permanent
# firewall-cmd --reload

Việc Restart/Reload sẽ hủy bộ các thiết lập Runtime đồng thời áp dụng thiết lập Permanent mà không hề phá vỡ các kết nối và session hiện tại. Điều này giúp kiểm tra hoạt động của các quy tắc trên tường lửa và dễ dàng khởi động lại nếu có vấn đề xảy ra.

Lưu ý: Các ví dụ thiết lập trong bài sử dụng cả Runtime và Permanent.

2. Cài đặt FirewallD

– FirewallD được cài đặt mặc định trên CentOS 7. Cài đặt nếu chưa có:

# yum install firewalld

– Khởi động FirewallD:

# systemctl start firewalld

– Kiểm tra tình trạng hoạt động

# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: active (running) since Wed 2017-12-13 16:43:20 +07; 30s ago
     Docs: man:firewalld(1)
 Main PID: 12696 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─12696 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
# systemctl is-active firewalld
active
# firewall-cmd --state
running

– Thiết lập FirewallD khởi động cùng hệ thống

# systemctl enable firewalld

Kiểm tra lại :

# systemctl is-enabled firewalld
enabled

Ban đầu, bạn không nên cho phép FirewallD khởi động cùng hệ thống cũng như thiết lập Permanent, tránh bị khóa khỏi hệ thống nếu thiết lập sai. Chỉ thiết lập như vậy khi bạn đã hoàn thành các quy tắc tường lửa cũng như test cẩn thận.
– Khởi động lại

# systemctl restart firewalld
# firewall-cmd --reload

– Dừng và vô hiệu hóa FirewallD

# systemctl stop firewalld
# systemctl disable firewalld

3. Cấu hình FirewallD

3.1. Thiết lập các Zone

– Liệt kê tất cả các zone trong hệ thống

# firewall-cmd --get-zones
block dmz drop external home internal public trusted work

– Kiểm tra zone mặc định

# firewall-cmd --get-default-zone
public

– Kiểm tra zone active (được sử dụng bởi giao diện mạng)
Vì FirewallD chưa được thiết lập bất kỳ quy tắc nào nên zone mặc định cũng đồng thời là zone duy nhất được kích hoạt, điều khiển mọi luồng dữ liệu.

# firewall-cmd --get-active-zones
public
interfaces: eth0

– HocVPS sẽ hướng dẫn sử dụng duy nhất public zone – cho phép những services/port được thiết lập và từ chối mọi thứ khác

– Thay đổi zone mặc định, ví dụ thành home:

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

3.2. Thiết lập các quy tắc

Trước khi thiết lập các quy tắc mới, hãy cùng HocVPS kiểm tra các quy tắc hiện tại:
– Liệt kê toàn bộ các quy tắc của các zones:

# firewall-cmd --list-all-zones

– Liệt kê toàn bộ các quy tắc trong zone mặc định và zone active

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

Kết quả cho thấy public là zone mặc định đang được kích hoạt, liên kết với card mạng eth0 và cho phép DHCP cùng SSH.
– Liệt kê toàn bộ các quy tắc trong một zone cụ thể, ví dụ home

 # firewall-cmd --zone=home --list-all
home
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh mdns samba-client dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

– Liệt kê danh sách services/port được cho phép trong zone cụ thể:

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

a. Thiết lập cho Service

Đây chính là điểm khác biệt của FirewallD so với Iptables – quản lý thông qua các services. Việc thiết lập tường lửa đã trở nên dễ dàng hơn bao giờ hết – chỉ việc thêm các services vào zone đang sử dụng.
– Đầu tiên, xác định các services trên hệ thống:

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

Lưu ý: Biết thêm thông tin về service qua thông tin lưu tại /usr/lib/firewalld/services/.

Hệ thống thông thường cần cho phép các services sau: ssh(22/TCP), http(80/TCP), https(443/TCP), smtp(25/TCP), smtps(465/TCP) và smtp-submission(587/TCP)

– Thiết lập cho phép services trên FirewallD, sử dụng --add-service:

# firewall-cmd --zone=public --add-service=http
success
# firewall-cmd --zone=public --add-service=http --permanent
success

Ngay lập tức, zone “public” cho phép kết nối HTTP trên cổng 80. Kiểm tra lại

# firewall-cmd --zone=public --list-services
ssh dhcpv6-client 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

b. Thiết lập cho Port

Trong trường hợp bạn thích quản lý theo cách truyền thống qua Port, FirewallD cũng hỗ trợ bạn điều đó.
– Mở Port với tham số --add-port:

# firewall-cmd --zone=public --add-port=9999/tcp
# firewall-cmd --zone=public --add-port=9999/tcp --permanent

Mở 1 dải port

# firewall-cmd --zone=public --add-port=4990-5000/tcp
# firewall-cmd --zone=public --add-port=4990-5000/tcp --permanent

Kiểm tra lại

# firewall-cmd --zone=public --list-ports
9999/tcp 4990-5000/tcp

– Đóng Port với tham số --remove-port:

# firewall-cmd --zone=public --remove-port=9999/tcp
# firewall-cmd --zone=public --remove-port=9999/tcp --permanent

4. Cấu hình nâng cao

4.1. Tạo Zone riêng

Mặc dù, các zone có sẵn là quá đủ với nhu cầu sử dụng, bạn vẫn có thể tạo lập zone của riêng mình để mô tả rõ ràng hơn về các chức năng của chúng. Ví dụ, bạn có thể tạo riêng một zone cho webserver publicweb hay một zone cấu hình riêng cho DNS trong mạng nội bộ privateDNS. Bạn cần thiết lập Permanent khi thêm một zone.

# firewall-cmd --permanent --new-zone=publicweb
success
# firewall-cmd --permanent --new-zone=privateDNS
success
# firewall-cmd --reload
success

Kiểm tra lại

# firewall-cmd --get-zones
block dmz drop external home internal privateDNS public publicweb trusted work

Khi đã có zone thiết lập riêng, bạn có thể cấu hình như các zone thông thường: thiết lập mặc định, thêm quy tắc… Ví dụ:

# firewall-cmd --zone=publicweb --add-service=ssh --permanent
# firewall-cmd --zone=publicweb --add-service=http --permanent
# firewall-cmd --zone=publicweb --add-service=https --permanent

4.2. Định nghĩa services riêng trên FirewallD

Việc mở port trên tường lửa rất dễ dàng nhưng lại khiến bạn gặp khó khăn khi ghi nhớ các port và các services tương ứng. Vì vậy, khi có một services mới thêm vào hệ thống, bạn sẽ có 2 phương án:

  • Mở Port của services đó trên FirewallD
  • Tự định nghĩa services đó trên FirewallD

Ví dụ, HocVPS Admin Port có thể là 2017, 9999 hay 4 chữ số bất kì nào đó. Bạn sẽ tự định nghĩa servies hocvps-admin với port 9999.
– Tạo file định nghĩa riêng từ file chuẩn ban đầu

# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/hocvps-admin.xml

– Chỉnh sửa để định nghĩa servies trên FirewallD

# nano /etc/firewalld/services/hocvps-admin.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>HocVPS-Admin</short>
<description>Control HocVPS Admin Web Tool</description>
<port protocol="tcp" port="9999"/>
</service>

– Lưu lại và khởi động lại FirewallD

# firewall-cmd --reload

– Kiểm tra lại danh sách services:

# 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 hocvps-admin 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 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

Như vậy, hocvps-admin đã được thêm vào danh sách services của FirewallD. Bạn có thể thiết lập như các servies thông thường, bao gồm cả cho phép/chặn trong zone. Ví dụ:

# firewall-cmd --zone=public --add-service=hocvps-admin
# firewall-cmd --zone=public --add-service=hocvps-admin --permanent

5. Kết luận

Có thể thấy, sử dụng tường lửa FirewallD trên CentOS 7 là không quá khó. Bạn đã có lượng kiến thức và kinh nghiệm đủ để thiết lập và quản trị hệ thống FirewallD trong nhu cầu sử dụng thông thường. Trong thời gian tới, HocVPS sẽ cập nhật thêm các cấu hình nâng cao trên FirewallD, các bạn cùng đón đọc nhé.

Comment của bạn

Your email address will not be published. Required fields are marked *

26 Comments

  1. Tung 23 comment

    Các bác quản trị cho em hỏi chút với ạ
    Em setup Centos 7 và Direct Admin.
    Em đang dùng FirewallD.
    Nay em muốn dùng FirewallD để chặn Brute Force Attack
    Mong các bác giúp đỡ ạ

    1. Việt Phương Moderator

      Với Brute Force Attack thì bạn có thể áp dụng các phương pháp sau. Ví dụ đang tấn công cổng SSH 22 để dò pass nhé
      1. Chuyển cổng 22 sang 1 cổng khác không thông dụng, ví dụ 2222
      2. Không sử dụng password, có thể dùng SSH Keys.
      3. Giới hạn truy cập khi nhập sai, ví dụ 3 lần sai là chặn 1 giờ với Fail2Ban. Đặc biệt, Fail2Ban hoạt động trên rule của FirewallD nên bạn hoàn toàn yên tâm. Bạn có thể tham khảo bài viết này
      https://serverfault.com/questions/683671/is-there-a-way-to-rate-limit-connection-attempts-with-firewalld

      Còn bạn cần chặn truy cập cổng Admin của DA thì có thể áp dụng đồng thời phương án 1 và 3

      1. Tung 23 comment

        Chào bác Việt Phương,
        Cảm ơn bác đã hồi âm hỗ trợ câu hỏi của mình.
        Do sự tiện lợi, mình không dùng SSH Keys mà dùng pass nên mình đã đổi cổng DA thành cổng khác.
        Tuy nhiên vào DA thì thấy vẫn có thông báo có Brute Force Attack
        Nay mình đang dùng FirewallD và muốn sử dụng Fail2Ban
        Mình xem cái link bạn gửi nhưng ko hiểu lắm, với lại thấy họ nói đến iptables (Mình không thích dùng iptables mà thích dùng FirewallD hơn vì mình đang dùng Centos 7 ạ)
        Bạn có thể chỉ cho mình thêm được không ạ

  2. Tung 23 comment

    Các bác cho em hỏi
    Nếu mình open service đó thì ko cần open port nữa đúng không ạ?
    Ví dụ em đổi port ssh 22==>2233
    Lúc đó em chạy lệnh
    firewall-cmd –zone=publicweb –add-service=ssh –permanent
    Lúc này có cần mở port 2233 nữa không ạ

  3. Ngô Văn Cương 110 comment

    150.95.110.224 – – [04/Jul/2018:11:53:03 +0700] “GET /zz1.php HTTP/1.0” 403 162 “-” “Wget/1.12 (linux-gnu)”

    VPS của em liên tục chạy lệnh này. Ban đầu em không để ý ip, nhưng bây giờ em mới kiểm tra là ip vps.
    Bác Phương tư vấn giúp em với, có khi nào vps em bị tấn công chiếm quyền luôn rồi không ?

  4. mrduc 14 comment

    #systemctl status firewalld
    firewalld.service
    Loaded: masked (/dev/null; bad)
    Active: inactive (dead)
    Warning: firewalld.service changed on disk. Run ‘systemctl daemon-reload’ to reload units.
    #systemctl start firewalld
    Failed to start firewalld.service: Unit is masked.
    #systemctl is-enabled firewalld
    masked

    Trạng thái nó như thế này là bị sao thế bác admin ơi

    1. Việt Phương Moderator

      Là firewalld đã bị tắt và không khởi động cùng hệ thống. Bạn cần sử dụng thì unmask rồi khởi động nhé. Có thể hệ thống bạn đang dùng Iptables nên FirewallD sẽ bị khóa

  5. Tung 23 comment

    Bác Luân cho em hỏi,
    Khách hàng của em có cái ip=xxx.xxxx.xxx.xxx và bị FirewallD nó block
    Em phải stop FirewallD thì họ mới vào được FTP (với http web thì họ vào bình thường mà không cần stop FirewallD ạ)
    Nay em muốn thêm cái ip của họ vào vùng an toàn
    Nhờ bác chỉ giúp em cái lệnh với ạ

    Mong hồi âm của bác

    1. Việt Phương Moderator

      Bạn kiểm tra các rule của firewallD rồi remove nhé, chứ không phải là thêm vào vùng an toàn. Vì nếu có thiết lập như thế thì toàn bộ không vào được trừ ip XYZ nào đó

      1. Tung 23 comment

        Chào bạn,
        Cảm ơn bạn đã hồi âm.
        Cái vps của mình như sau:
        -Khách hàng của mình dùng IP tĩnh.
        -Nếu stop firewalld thì khách hàng của mình vào FTP por 21 mình thuwngfowngf
        -Nếu mình cho chạy firewalld thì họ không vào FTP được
        – Web http://web thì họ vào được ko ảnh hưởng gì
        -Bên mình thì vào được FTP cho dù vẫn bật firewalld

        Như vậy việc họ không vào được FPT là do firewalld liên quan đến firewalld và IP tĩnh của họ.
        Mong bạn chỉ giúp mình cách thêm Ip đó vào trường acept để ko bị block cho FTP ạ

        1. Việt Phương Moderator

          Bạn mở FTP bằng port hay bằng service? Bạn thử cả 2 chưa? Cho mình trạng thái rule hiện tại

          1. Tung 23 comment

            Chào bạn,
            Sau khi cài xong FTP thì mình mở bằng port 21 ạ (Nếu ko mở port 21 thì ko dùng FTP được; sau khi mình mở xong thì FPT mới dùng được).
            Mình mở bằng lệnh sau

            # firewall-cmd –zone=public –add-port=21/tcp
            # firewall-cmd –zone=public –add-port=21/tcp –permanent

            Các trạng thái rule hiện tại của mình là:

            #firewall-cmd –zone=public –list-services
            dhcpv6-client ssh
            # firewall-cmd –zone=public –list-ports
            80/tcp 21/tcp

          2. Tung 23 comment

            Mong bạn chỉ giúp cho mình với nhé. Mình cần cho Ip=123.xxx vào danh sách white ạ

          3. Việt Phương Moderator

            Không giải quyết vấn đề vì white list thì các IP khác bị chặn mất. Mà rõ ràng như bạn thấy, port 80 cấu hình như port 21 mà khách bạn vẫn truy cập được qua port 80 (web).Bạn đã mở bằng service chưa, tức mở cho ftp
            Còn thêm whitelist là source
            https://unix.stackexchange.com/questions/159873/whitelist-source-ip-addresses-in-centos-7
            firewall-cmd –permanent –zone=public –add-source=192.168.100.0/24
            firewall-cmd –permanent –zone=public –add-source=192.168.222.123/32

            …..

            Nên, vấn đề mình nghi ngờ: Khách bạn đăng nhập FTP dùng phần mềm gì, cấu hình có giống thiết lập của bạn không. Mình nghi ngờ vấn đề này do có thể FileZilla ở PassiveMode

          4. Tung 23 comment

            Chào bạn

            Đúng là họ đang dùng FileZilla bạn à
            Nhờ bạn chỉ cho mình cái fix lỗi này trên FileZilla với nhé

            Cảm ơn bạn

          5. Tung 23 comment

            VPS mình không dùng IPTABLES mà dùng firewalld
            Vậy cấu hình đoạn này thì sửa tương ứng như thế nào vậy bạn

            Nếu đã thiết lập tường lửa Iptables và chuyển ActiveMode mà vẫn không thể kết nối thì bạn thêm giá trị ip_conntrack_ftp vào /etc/sysconfig/iptables-config
            Cụ thể là IPTABLES_MODULES=”ip_conntrack_ftp”. Sau đó tiến hành restart Iptables
            Chỉ áp dụng CentOS 6 và nếu VPS không có module ip_conntrack_ftp trong hệ thống thì cần yêu cầu support thêm thủ công

          6. Việt Phương Moderator

            Đoạn ý không cần thiết. Bạn thiết lập bên kết nối FileZilla thôi. Và User bạn tạo là Virtual User hay Linux User?

  6. NguyenTung 43 comment

    Bài viết hay quá. Đúng là cái mình cần. Bác Luân luôn luôn viết bài 1 cách khoa học, ngắn gọn và dễ hiểu.
    Cảm ơn bác Luân nhiều nhé