===== 1. firewalld 란 =====
* Linux 커널 2.2 까지는 ipchains 이라는 패킷 필터링/방화벽 프레임워크가 구현되어 있었고 2.4부터는 더 유연하고 다양한 기능을 가진 netfilter 로 프레임워크가 교체 되었습니다.
* iptables 은 netfilter 프레임워크의 최상단에 위치하는 사용자 레벨의 프로그램으로 시스템 관리자는 iptables 명령어로 리눅스 서버로 들어오고 나가는 패킷을 필터링하거나 포트 포워딩을 설정할 수 있으며 방화벽으로도 사용할 수 있습니다.
* iptables 는 숙련된 관리자가 아니면 사용이 어려운 단점이 있었는데 이런 문제를 해결하고자 RHEL/CentOS 7 부터는 방화벽을 firewalld 라는 데몬으로 교체하였고 이에 따라 사용자 레벨의 프로그램은 iptables 명령어 대신 명령행에서는 firewall-cmd , GUI 환경에서는 firewall-config를 사용하게 되었습니다.
\\
==== 영구적 규칙과 정책 재구동 ====
* 기본적으로 firewall-cmd 로 방화벽 정책을 변경했을 경우 현재 구동되고 있는 firewalld에 즉시 적용되지만 정책은 지속성이 없이 임시로 적용되며 정책을 재구동하는 명령어인 ''firewall-cmd --reload''를 실행하거나 시스템을 재부팅하면 예전 정책으로 다시 초기화 되며 이로 인해 서비스의 장애가 발생할 수 있습니다.
* 이 때문에 방화벽 정책을 영구적으로 유지하기 위해서는 ''--permanent''옵션을 추가해서 실행하면 되지만 이는 즉시 적용되지 않고 ''firewall-cmd --reload'' 명령어로 방화벽 정책을 재구동하거나 재부팅을 하기 전에는 변경한 방화벽 설정이 적용되지 않습니다.
* firewalld를 처음에 사용할 때 이 때문에 혼란을 겪고 정책 설정을 잘못한 걸로 오해하는 사용자가 많으므로 아래 표를 보고 방화벽 정책의 즉시 적용 여부와 지속성 여부를 꼭 익혀 두어야 합니다.
^ ^ firewall-cmd ^ firewall-cmd --permanent ^
| 즉시 적용(firewall-cmd --reload 불필요) | 예 | 아니요 |
| 재부팅시 정책의 지속 여부 | 아니오 | 예 |
* 예로 ''fireall-cmd''로 정책을 추가했을 경우 즉시 반영되지만 만약 잘못된 설정이었을 경우에 ''firewall-cmd --reload'' 명령어를 실행하면 예전 정책으로 복구됩니다.
* 하지만 ''firewall-cmd --permanent''로 정책을 추가했을 경우 ''firewall-cmd --reload'' 명령어를 실행해야 변경한 정책이 적용되며 예전 정책으로 복구하려면 새로 추가한 정책을 삭제하고 다시 방화벽을 구동해야 합니다.
===== 2. 구동상태 확인 =====
==== 방화벽 실행 중인지 확인 ====
#방화벽 실행 확인(실행중이면 running, 실행중이 아니면 not running으로 표시)
[root@dns ~] firewall-cmd --state # 현재상태 확인
#not running일 경우 방화벽 실행
[root@dns ~] systemctl enable firewalld # 부팅 후에도 서비스가 자동으로 시작되게 설정한다.
[root@dns ~] systemctl start firewalld # firewalld를 시작한다.
===== 3. 설치 =====
[root@dns ~] yum install firewalld # 설치
[root@dns ~] systemctl start firewalld # 시작
[root@dns ~] systemctl enable firewalld # 부팅 후에도 서비스가 자동으로 시작되게 설정한다.
===== 4. 특정 IP 및 포트만 허용하는 방법 =====
==== IP 허용 ====
#IP 허용
[root@dns ~] firewall-cmd --permanent --add-source=10.10.10.10
#IP 허용 제거
[root@dns ~] firewall-cmd --permanent --remove-source=10.10.10.10
==== IP대역 허용 ====
#IP 대역 허용
[root@dns ~] firewall-cmd --permanent --add-source=10.10.10.0/24
#IP 대역 허용 제거
[root@dns ~] firewall-cmd --permanent --remove-source=10.10.10.0/24
* 여기서 ''/24''는 해당 IP의 마지막까지 대역을 설정한다는 의미로, 위 코드를 예를 들면 ''10.10.10.0''에서 ''10.10.10.255''까지를 의미한다.
==== 서비스 포트 허용 ====
#서비스 포트 허용
[root@dns ~] firewall-cmd --permanent --add-port=80/tcp
#서비스 포트 허용 제거
[root@dns ~] firewall-cmd --permanent --remove-port=80/tcp
==== 서비스 포트 범위 허용 ====
#서비스 포트 범위 허용
[root@dns ~] firewall-cmd --permanent --add-port=1000-2000/tcp
#서비스 포트 범위 허용 제거
[root@dns ~] firewall-cmd --permanent --remove-port=1000-2000/tcp
==== IP에 대해 서비스 포트 허용 ====
#IP에 대해 서비스 포트 허용
[root@dns ~] firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address=10.10.10.10 port port="80" protocol="tcp" accept'
#IP에 대한 서비스 포트 허용 제거
[root@dns ~] firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address=10.10.10.10 port port="80" protocol="tcp" accept'
==== IP 차단 ====
#IP 차단
[root@dns ~] firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address=10.10.10.10 drop'
#IP 차단 제거
[root@dns ~] firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address=10.10.10.10 drop'
==== 방화벽 Rule 적용 ====
#방화벽 Rule 변경 내역 적용
[root@dns ~] firewall-cmd --reload
#방화벽 Rule 리스트 확인
[root@dns ~] firewall-cmd --list-all
===== 5. Network Zone =====
* firewalld의 특징 중 하나는 이 장의 서두에서 설명한 네트워크 구성과 영역을 기본 설정으로 포함시켰다는 것입니다. 이에 따라 서버가 어떤 zone에 포함될 지만 정의하면 상대적으로 설정해야 하는 부분이 대폭 간소화 되었습니다.
* 먼저 기본 설정된 zone 의 목록을 확인하려면 firewall-cmd 명령에 ''--get-zones'' 옵션을 주고 실행하면 됩니다.
[root@dns ~] sudo firewall-cmd --get-zones
work drop internal external trusted home dmz public block
\\
* 표시된 목록은 사전 정의된 zone으로 이제 서버의 용도에 맞게 zone을 할당하면 되며, 해당 zone이 어떤 정책을 갖고 있는지 확인하려면 ''--list-all-zones'' 옵션으로 사전 정의된 zone에 대한 자세한 정보를 볼 수 있습니다.
\\
[root@dns ~] sudo firewall-cmd --list-all-zones
dmz
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
internal
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
\\
* 각 zone 별 services항목을 보면 해당 zone에서 기본적으로 허용하는 서비스 포트를 확인할 수 있으며, ''dmz''는 ssh를, ''internal''은 dhcpv6-client, mdns 등을 허용하는 것을 알 수 있습니다.
* 현재 활성화된 zone을 확인하려면 ''--get-active-zone'' 옵션을 실행하면 되며 현재 활성화된 zone은 ''public''인 것을 알 수 있습니다.(default)
\\
[root@dns ~] firewall-cmd --get-active-zone
public
interfaces: eno0
\\
==== 존 설정 정보 보기(--list-all) ====
* 현재 활성화된 존 정보를 확인하려면 ''--list-all'' 옵션을 사용하면 됩니다. 아래는 현재 활성화된 존이 ''dmz'' 이고 10022 등의 port가 열려 있음을 표시합니다.
[root@dns ~] sudo firewall-cmd --list-all
dmz (active)
target: default
icmp-block-inversion: no
interfaces: enp5s0f0 enp5s0f1
sources:
services: ssh http https
ports: 10022/tcp 2120-2121/tcp 20/tcp 2120-2142/tcp 10000/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
\\
==== 기본 존 바꾸기 ====
* 기본 존을 변경하려면 ''--set-default-zone={ZONE_NAME}''옵션을 사용하여 변경해주면 되며 다음은 ''dmz''로 변경하는 예제입니다.
[root@dns ~] firewall-cmd --set-default-zone=dmz
\\
==== 존 만들기 ====
* 만약 firewalld 에 내장된 zone설정이 현재 서비스에 딱 들어맞지 않는다면 ''--new-zone'' 옵션을 사용하여 새로 zone을 만들면 됩니다. 아래는 webserver라는 이름의 새로운 존을 만드는 예제입니다.
[root@dns ~] firewall-cmd --permanent --new-zone=webserver
* 생성한 존은 바로 반영되지 않으므로 방화벽 정책을 다시 읽어 들여야 합니다. ''--reload''을 주어서 변경된 내역을 firewalld에 반영할 수 있습니다.
===== 6. 사전 정의 서비스 =====
==== 사전 정의된 서비스 확인 ====
* firewalld 에는 방화벽 정책 변경시 용이하도록 많이 사용하는 서비스를 사전에 정의해 놓고 있으며 --get-services 옵션으로 전체 목록을 확인할 수 있습니다.
[root@dns ~] firewall-cmd --get-services
RH-Satellite-6 RH-Satellite-6-capsule amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client 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
==== 서비스 추가 ====
* 웹 서버는 http(80), https(443) 으로 접근을 허용해야 하므로 ''--add-service=SERVICENAME'' 구문으로 서비스를 추가해 줍니다. ''--add-service'' 는 여러개의 서비스를 동시에 기술할 수 없으므로 http와 https를 따로 기술해 줍니다.
[root@dns ~] firewall-cmd --permanent --zone=webserver --add-service=http
[root@dns ~] firewall-cmd --permanent --zone=webserver --add-service=httpㄴ
==== 서비스 삭제 ====
* 서비스 삭제는 ''--remove-service=SERVICENAME'' 구문을 사용합니다. 아래는 http/https 서비스를 삭제합니다.
[root@dns ~] firewall-cmd --permanent --zone=webserver --remove-service=http
[root@dns ~] firewall-cmd --permanent --zone=webserver --remove-service=https
===== Tip =====
==== 유용한 명령어 ====
firewall-cmd --state # 방화벽 상태 확인
firewall-cmd --get-zones # 모든 Zone 출력
firewall-cmd --get-default-zone # 현재 적용된 Zone 출력
firewall-cmd --list-all # 사용 가능한 서비스/포트 출력
firewall-cmd --reload # 방화벽 리로드
===== Troubleshooting =====
==== Failed to restart firewalld.service: Unit is masked. 에러 ====
* mask 뜻 자체가 우리가 쓰는 마스크, 즉, 가린다는 뜻으로 firewalld가 가려져서 restart할 수 없다는 의미이다. 따라서, 이를 unmask해주면 해결된다.
[root@dns ~] systemctl unmask firewalld
* [[https://askubuntu.com/questions/1290030/firewall-cmd-error-on-polkit|firewall-cmd error on polkit]]
===== Ref =====
* [[https://www.lesstif.com/ws/firewalld-43844015.html|firewalld 방화벽 사용]]
* [[https://bamdule.tistory.com/63|[Linux] firewalld 방화벽 설정하기]]
* [[https://sepiros.tistory.com/7|[CentOS 7] Firewalld 방화벽]]
* [[https://realforce111.tistory.com/87|CentOS 7 방화벽(Firewall)에서 특정 IP 및 포트만 허용]]
* [[https://holjjack.tistory.com/115|[CentOS 7] 방화벽 해제하기 - firewall-cmd]]
{{tag>와프 linux centos firewall firewalld 방화벽}}