[Linux] 리눅스 방화벽 도구(2) – firewalld 데몬 설명과 firewall-cmd 명령어의 사용법
firewalld
는 리눅스 시스템에서 방화벽 관리를 위한 도구로 사용되는 데몬입니다. CentOS, Fedora, Red Hat Enterprise Linux 등의 Red Hat 계열 리눅스 배포판에서 기본적으로 사용되며, 보안을 강화하고 네트워크 트래픽을 제어하는 데에 활용됩니다. CentOS7부터 iptables의 대안으로 firewalld가 개발되었으며, 좀 더 유연하고 동적인 방화벽 관리를 제공합니다. 변경되었다고 해서 iptables를 사용할 수 없는 건 아닙니다. firewalld는 iptables 기반으로 동작합니다.
firewalld의 특징은 네트워크를 분리하여 관리한다는 것입니다. 이 때 분리된 영역을 ZONE이라고 하는데, ZONE 설정파일은 /etc/firewalld/zones/ 디렉토리에서 확인 할 수 있습니다. 또한 firewalld는 ‘프로토콜, 포트, 필요한 모듈’ 등에 대한 정보를 서비스로 정의하여 ‘/usr/lib/firewalld/services/’ 디렉토리에 저장 후 사용합니다.
- 아래 두 명령어로 firewalld 데몬의 상태를 확인할 수 있습니다.
firewalld 데몬의 명령어(firewall-cmd
)를 사용하려면 활성화(active)되어 있어야 합니다.
아래 두 명령어로 확인할 수 있습니다.[root@centos8 ~]# systemctl status firewalld [0m firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2023-07-25 21:29:24 KST; 2 weeks 5 days ago Docs: man:firewalld(1) Main PID: 895 (firewalld) Tasks: 3 (limit: 23079) Memory: 35.6M CGroup: /system.slice/firewalld.service 붴895 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid Jul 25 21:29:21 centos8 systemd[1]: Starting firewalld - dynamic firewall daemon... Jul 25 21:29:24 centos8 systemd[1]: Started firewalld - dynamic firewall daemon. Jul 25 21:29:24 centos8 firewalld[895]: WARNING: AllowZoneDrifting is enabled. This is considered an insecu> Aug 14 16:17:43 centos8 firewalld[895]: WARNING: AllowZoneDrifting is enabled. This is considered an insecu> [root@centos8 ~]# firewall-cmd --status usage: see firewall-cmd man page firewall-cmd: error: unrecognized arguments: --status [root@centos8 ~]# firewall-cmd --state running
- predefined zones, 현재 활성화된 zones 및 default zone 보기
– predefined zones 파일은 /usr/lib/firewalld/zones 디렉터리에 저장되어 있습니다.[root@centos8 ~]# firewall-cmd --get-zones block dmz drop external home internal libvirt nm-shared public trusted work [root@centos8 ~]# firewall-cmd --get-active-zones public interfaces: enp0s3 enp0s8 [root@centos8 ~]# firewall-cmd --get-default-zone public
- 현재 방화벽에 등록된 정책 리스트 보기
$ firewall-cmd –-list-all : default zone에 등록된 정책 확인하기 $ firewall-cmd –-list-all-zones : 모든 zone에 등록된 정책 확인하기 $ firewall-cmd –-zone= –-list-all : 지정된 zone에 등록된 정책 확인하기 $ firewall-cmd –-list-services : defautl zone에 등록된 서비스 확인하기 $ firewall-cmd –-list-ports : default zone에 등록된 포트 확인하기
- default zone 변경하기
$ firewall-cmd --set-default-zone <zone-name>
- predefined services 조회하기
-service: 방화벽 정책을 정의하기 위해 사용되는 Protocol과 Port의 조합
-predefined services는 /usr/lib/firewalld/services 디렉터리에 저장되어 있습니다. 예: ssh(22/tcp), tfpt(69/upd) 등[root@centos8 ~]# firewall-cmd --get-servicesRH-Satellite-6 RH-Satellite-6-capsule amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit collectd condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger foreman foreman-proxy freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp galera ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell kube-apiserver ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nbd nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rquotad rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tftp-client tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server - 방화벽 Service 등록하기
– predefined service 파일을 /etc/firewalld/services 디렉터리로 복사한 후 사용합니다.$ cp /usr/lib/firewalld/services/<service-file> /etc/firewalld/services/<new-service-file>
- NIC(Network Interface Card)과 연결된 zone 확인 및 변경
$ firewall-cmd --get-zone-of-interface=<NIC> $ firewall-cmd --change-interface=<NIC> --zone <zone-name> --permanent
- 특정 서비스, 특정 포트, 특정 IP, 특정 네트워크 영구 허용 및 제거하기
– 방화벽 서비스를 생성하여 정책을 등록하거나 Port/Protocol을 직접 지정하여 방화벽 정책을 등록할 수 있습니다.
– 지정 가능한 well-known 서비스(protocol)와 포트는 /etc/services 파일에 등록되어 있습니다.
– 등록된 정책을 제거하기 위해서는--add-
대신에--remove-
를 사용합니다.
–firewall-cmd --reload
명령어를 실행해야 정책이 반영됩니다.$ firewall-cmd --zone=public --add-service=http --permanent success $ firewall-cmd --zone=public --add-port=80/tcp --permanent success $ firewall-cmd --zone=public --add-service=dhcp --permanent success $ firewall-cmd --zone=public --add-port={67/upd,68/udp} --permanent success $ firewall-cmd --zone=public --add-source=192.168.219.100 --permanent success $ firewall-cmd --zone=public --add-source=192.168.219.0/24 --permanent success $ firewall-cmd --reload success
- 포트 포워딩 정책 등록 및 제거
<-- TCP/80 포트로 들어오는 패킷을 8080 포트로 포워딩 --> $ firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 <-- 포트 포워딩 정책 제거 --> $ firewall-cmd --remove-forward-port=port=80:proto=tcp:toport=8080
- rich rule 사용
<-- ssh 접속이 가능한 호스트 등록하기 --> $ firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.56.101" port protocol="tcp" port="22" accept' <-- ftp 접속이 가능한 호스트 등록하기 --> $ firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.56.101" port protocol="tcp" port="21" accept'
훨씬 더 많은 옵션 및 정책 등록/제거 방법이 있으나 많이 사용하는 것들만 정리해 보았습니다. 더 많은 정보를 얻으려면 firewall-cmd의 메뉴얼을 참고하세요. 리눅스 서버를 관리하다 보니 메뉴얼을 잘 읽고 이해하는 능력도 필요하더군요.