리눅스 firewall-cmd
IT 위키
더 많은 작업
firewalld 데몬을 명령행에서 제어하여 영역(zone) 단위로 방화벽 규칙을 관리한다.
- RHEL/Rocky Linux 7 이후 기본 방화벽 관리 도구이며, Rocky Linux 8에서는 nftables를 백엔드로 사용한다.
- 경로 : /usr/bin/firewall-cmd
- 패키지 : firewalld
- 설정 디렉터리 : /etc/firewalld/(사용자 설정), /usr/lib/firewalld/(기본 제공 영역·서비스 정의)
- 서비스 관리 : systemctl start|stop|enable firewalld
# firewall-cmd [--permanent] [--zone=영역] 옵션
- --permanent 없이 실행한 변경은 런타임(현재 실행 중인) 설정에만 반영되며, 재시작하거나 --reload하면 사라진다.
- --permanent를 붙인 변경은 설정 파일에 저장되지만 즉시 적용되지 않으므로 --reload로 다시 읽어야 한다.
- --runtime-to-permanent : 현재 런타임 설정을 영구 설정으로 저장한다.
- 상태·적용
- --state : firewalld 실행 여부를 출력한다.
- --reload : 영구 설정을 다시 읽어 런타임에 적용한다. 기존 연결은 유지된다.
- --complete-reload : 연결 상태 정보까지 초기화하며 다시 읽는다.
- --panic-on / --panic-off : 모든 송수신 패킷을 차단하거나 차단을 해제한다.
- 영역(zone)
- --get-zones : 사용할 수 있는 영역 목록을 출력한다.
- --get-default-zone / --set-default-zone=영역 : 기본 영역을 조회하거나 변경한다. 기본값은 public이다.
- --get-active-zones : 인터페이스나 소스가 연결된 활성 영역을 출력한다.
- --zone=영역 : 명령을 적용할 영역을 지정한다. 생략하면 기본 영역에 적용된다.
- --add-interface=인터페이스 / --change-interface=인터페이스 : 인터페이스를 영역에 연결하거나 다른 영역으로 옮긴다.
- --add-source=주소/프리픽스 : 출발지 주소를 영역에 연결한다.
- 조회
- --list-all : 영역의 전체 설정(인터페이스, 서비스, 포트, 규칙 등)을 출력한다.
- --list-all-zones : 모든 영역의 설정을 출력한다.
- --list-services / --list-ports : 허용된 서비스나 포트만 출력한다.
- --get-services : 미리 정의된 서비스 이름 목록을 출력한다.
- --query-service=서비스 / --query-port=포트/프로토콜 : 허용 여부를 yes/no로 출력한다.
- 규칙 추가·삭제
- --add-service=서비스 / --remove-service=서비스 : 서비스(http, https, ssh, nfs, samba, dns 등)를 허용하거나 제거한다.
- --add-port=포트/프로토콜 / --remove-port=포트/프로토콜 : 포트를 허용하거나 제거한다. 범위는 8000-8100/tcp처럼 쓴다.
- --add-rich-rule='규칙' / --remove-rich-rule='규칙' : 출발지 주소, 로그, 거부 등 세부 조건이 있는 리치 규칙을 추가하거나 제거한다.
- --add-masquerade : 영역에 마스커레이드(NAT)를 허용한다.
- --add-forward-port=port=포트:proto=프로토콜:toport=포트[:toaddr=주소] : 포트 포워딩을 설정한다.
- --timeout=시간 : 런타임 규칙이 지정한 시간(예: 10m) 동안만 유지되도록 한다.
- drop : 들어오는 패킷을 응답 없이 버린다. 나가는 연결만 허용한다.
- block : 들어오는 연결을 icmp-host-prohibited 메시지로 거부한다.
- public : 공용 네트워크용. 선택한 서비스만 허용한다. (기본 영역)
- external : 마스커레이드가 켜진 외부 네트워크용
- dmz : 외부에 공개하는 DMZ 서버용
- work, home, internal : 신뢰도가 비교적 높은 내부 네트워크용
- trusted : 모든 연결을 허용한다.
# 기본 영역의 현재 설정을 확인한다. # firewall-cmd --list-all # http, https 서비스를 영구적으로 허용하고 적용한다. # firewall-cmd --permanent --add-service=http --add-service=https # firewall-cmd --reload # 8080/tcp 포트를 영구 허용한다. # firewall-cmd --permanent --zone=public --add-port=8080/tcp # firewall-cmd --reload # 특정 네트워크에서만 SSH 접속을 허용하는 리치 규칙을 추가한다. # firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" service name="ssh" accept' # 기본 영역을 internal로 바꾸고 활성 영역을 확인한다. # firewall-cmd --set-default-zone=internal # firewall-cmd --get-active-zones # 외부 80번 포트로 들어온 요청을 내부 8080번 포트로 전달한다. # firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080
- --permanent로 추가한 규칙은 --reload해야 적용되고, --permanent 없이 추가한 규칙은 재시작하면 사라진다는 점이 자주 출제된다.
- 서비스 허용은 --add-service, 포트 허용은 --add-port=번호/프로토콜 형식을 쓴다.
- 현재 설정 확인은 --list-all, 기본 영역은 public이다.
- 실기에서는 웹, FTP, NFS, 삼바, DNS 등 서비스를 구성한 뒤 방화벽을 여는 과정을 함께 요구하는 경우가 많다.
- 방화벽
- iptables 명령어 : 넷필터 패킷 필터링 규칙을 직접 관리한다.
- 리눅스 iptables-save
- systemctl 명령어
- nmap 명령어 : 열린 포트를 외부에서 확인한다.
- ss 명령어
- 리눅스 네트워크 보안