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-permenent0. 백업/복구하기
- 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-rules2. 정책 추가/수정하기
서비스 기준으로 허용
허용하기
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 --reloadfirewall-cmd --add-service=testApp
firewall-cmd --list-services- 방금 직접 만든 서비스 이름이 제대로 출력되면 성공
포트 기준으로 허용
firewall-cmd --add-port=<포트>/<프로토콜>- 예시
firewall-cmd --add-port=8080/tcpIP 기준으로 허용
- 조금 애매함
- zone 의 다른 정책들을 먼저 적용한 후에 특정 IP를 검사하려는 경우에는 이렇게 함
firewall-cmd --zone=<존이름> --add-source=<IP>- 예시
firewall-cmd --zone=public --add-source=192.168.10.20- 특정 IP에 대해서는 뭘 하든간에 허용하고싶으면 Rich Rule을 사용함. (Rich Rule은 밑에서 설명함)
- 검사하려는 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/tcpRich 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 적용되는 순서
- Direct rules : ip/nftables 규칙 직접 넣은거
- Rich Rules
- Zone Services / Ports
- Zone Target (위에서 안걸리면 여기로 옴)