firewalld?

  • 참고 자료

  • CentOS 7.x 버전부터 사용하기 시작한 방화벽 관리 도구

  • NetFilter 기반

  • 예전에는 NetFilter의 기본 인터페이스가 iptables였으나 CentOS 7.x부터 firewalld로 변경됨

  • 기존 ip/nftables의 불편했던 점을 좀 편하게 쓸 수 있도록 추상화를 많이 도입했음

Zone?

  • 네트워크 신뢰 수준을 의미함
  • 이런 식으로 들어오는 데이터는 “이 수준”이다 라고 설정하는 방식임
  • 표 출처
zone설명
public최소한의 허용 규칙이 적용됨. 기본 zone
block들어오는 패킷 모두 거부, 전송 패킷 반환만 허용
dmz일반적인 DMZ 인터페이스에 대한 설정에서 사용
drop들어오는 패킷 모두 삭제, 전속 패킷 반환만 허용
external매스커레이딩 적용되는 외부 라우터를 위해 사용
home홈 영역을 위해 사용되는 규칙
internal내부 네트워크 인터페이스를 위해 사용
trusted모든 통신 허용
work같은 회사 내 내부 네트워크를 위해 사용
  • 각 Zone은 /etc/firewalld/zones/ 경로 내에 .xml 파일로 생성하여 사용

Service?

  • 자주 쓰는 포트 묶음을 이름으로 정의한 것
  • 각 Service는 /etc/firewalld/services/ 경로 내에 .xml 파일로 생성하여 사용
  • 포트 번호를 이제 외우지 않아도 괜찮음!

이제 영구 설정도 코드로 가능함

  • runtime, permenent를 인자로 줄 수 있어서 영구 설정도 가능함
  • 심지어 런타임으로 돌리던걸 영구 설정으로 바꾸는 방법도 있음
firewall-cmd --runtiime-to-permenent

0. 백업/복구하기

  • firewalld 는 파일 하나로 되어있는게 아니기 때문에 압축해서 싹 다 저장해야함
  • 특정 부분만 저장한다고 하면 파일 하나로 되긴 함

백업

tar czf <압축된파일> <압축할디렉토>
  • tar : 아카이브 도구

  • c : Create. 아카이브 생성

  • z : gzip 압축 방식 사용

  • f <파일명> : 파일명 지정

  • 이렇게 저장하면 압축할 디렉토리의 경로대로 다 들어감

  • 예시

tar czf /root/firewalld_backup_$(date +%F).tar.gz /etc/firewalld
  • $(date +%F) : 셀 명령 치환

    • date +<날짜포맷>: 날짜 포맷대로 출력
    • %F : yyyy-mm-dd 형태로 날짜 출력
  • /root/firewalld_backup_오늘날짜.tar.gz 파일 안에는 etc/firewalld/파일들… 이렇게 생김.

  • 만약 firewalld 폴더 안에 있는 파일들만 최상위에 있도록 저장하고싶다면 아래와 같이 실행

tar czf /root/firewalld_backup_$(date +%F).tar.gz -C /etc/firewalld
  • -C : 디렉토리 내에 있는 파일/폴더들을 저장

복구

  • 위에서 만든 압축 파일을 /etc/firewalld 안에 제대로 풀어주면 됨
tar xzf firewalld_backup_YYYY-MM-DD.tar.gz -C /
  • x : Extract. 추출

1. 확인하기

  • 모든 Zone 확인하기
firewall-cmd --get-zones

  • 활성화 된 Zone 확인하기
firewalld-cmd --get-active-zones

  • 허용된 서비스 목록 확인
firewall-cmd --list-services

  • 허용된 포트 확인
firewall-cmd --list-ports

  • 특정 존에서 허용된 서비스 확인
firewall-cmd --zone=<존이름> --list-services
  • Rich Rule 확인
firewall-cmd --list-rich-rules

2. 정책 추가/수정하기

서비스 기준으로 허용

허용하기

firewall-cmd --add-service=<서비스명>
  • 예시
firewall-cmd --add-service=ssh
firewall-cmd --add-service=http
firewall-cmd --add-service=https

서비스 만들기

  • 위에서 쓴 —add-service 뒤 서비스명은 미리 지정된 파일의 이름이다
  • /etc/firewalld/services 안에 있는 xml 확장자의 파일임
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>서비스이름</short>
  <description>설명</description>
 
  <port protocol="tcp" port="XXXX"/>
  <port protocol="udp" port="YYYY"/>
 
</service>
  • 예시 (/etc/firewalld/services/testApp.xml)
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>testApp</short>
  <description>Add service test app</description>
 
  <port protocol="tcp" port="34567"/>
 
</service>
  • firewalld 한 번 리로드 해줘야 함
firewall-cmd --reload
firewall-cmd --add-service=testApp
firewall-cmd --list-services
  • 방금 직접 만든 서비스 이름이 제대로 출력되면 성공

포트 기준으로 허용

firewall-cmd --add-port=<포트>/<프로토콜>
  • 예시
firewall-cmd --add-port=8080/tcp

IP 기준으로 허용

  • 조금 애매함
  1. zone 의 다른 정책들을 먼저 적용한 후에 특정 IP를 검사하려는 경우에는 이렇게 함
firewall-cmd --zone=<존이름> --add-source=<IP>
  • 예시
firewall-cmd --zone=public --add-source=192.168.10.20
  1. 특정 IP에 대해서는 뭘 하든간에 허용하고싶으면 Rich Rule을 사용함. (Rich Rule은 밑에서 설명함)
  2. 검사하려는 IP가 많은 경우에는 ipset + Rich Rule을 사용함
firewall-cmd --permanent --new-ipset=<ipset이름> --type=hash:ip
firewall-cmd --zone=public --permanent --add-rich-rule='
rule source ipset="<ipset이름>"
accept'
  • 예시
firewall-cmd --permanent --new-ipset=allowed_ips --type=hash:ip
firewall-cmd --zone=public --permanent --add-rich-rule='
rule source ipset="allowed_ips"
accept'

자세한 조건 지정하기 - Rich Rule

  • 기본적으로 Service, Port는 제어할 수 있지만 그 이상쯤 되면 좀 더 구체적인 규칙이 필요함
  • 그래서 사용하는게 Rich Rule
firewall-cmd --add-rich-rule=' \
	rule \
	[family="ipv4|ipv6"] \
	[source ...] \
	[destination ...] \
	[service|port|protocol ...] \ 
	[log ...] \ 
	[audit] \ 
	[accept|reject|drop] \ 
'
  • 예시 : 특정 IP의 SSH 접속을 허용하기
firewall-cmd --add-rich-rule=' \
	rule \
	family="ipv4" \
	source address="192.168.10.0/24" \
	service name="ssh" \ 
	accept\ 
'

3. 정책 삭제하기

서비스 정책 삭제

firewall-cmd --remove-service=<서비스명>
  • 예시
firewall-cmd --remove-service=ssh

포트 정책 삭제

firewall-cmd --remove-port=<포트>/<프로토콜>
  • 예시
firewall-cmd --remove-port=8080/tcp

Rich Rule 정책 삭제

  • Rich Rule은 처음에 만들 때 썼던 문구 그대로 써야됨
firewall-cmd --remove-rich-rule=<Rich_Rule_내용>
  • 예시
firewall-cmd --remove-rich-rule=' \
	rule \
	family="ipv4" \
	source address="192.168.10.0/24" \
	service name="ssh" \ 
	accept\ 
'

참고

  • Zone 적용되는 순서
    1. Direct rules : ip/nftables 규칙 직접 넣은거
    2. Rich Rules
    3. Zone Services / Ports
    4. Zone Target (위에서 안걸리면 여기로 옴)