본문 바로가기

운영체제/Unix & Linux

firewall-cmd 명령어

반응형

firewalld 는 Redhat 7까지는 백엔드로 iptables, 8버전이후로는 nftables 프레임워크를 사용하여 방화벽 설정한다. 그래서 Redhat 7버전에서 iptables 명령어로 확인하면 firewall-cmd에서 설정한 정보를 확인할수 있으나 Redhat 8 이상 버전에서 iptables로 확인하면 firwall-cmd 에서 설정한 정보가 표시되지 않는다. Redhat 8 이상버전에서는 nftables(nft  command) 로 firwalld 설정을 볼수가 있다.

 

[1]. firewall-cmd  서비스 시작

 > systemctl start firewalld

 > systemctl status firewalld

[2]. firewall-cmd  ZONE 관리

1. Default Zone 설정 정보

 > firewall-cmd --list-all 

2. Zone 리스트
 >  firewall-cmd --get-zones : 

3. 모든 Zone의 설정 정보
 >  firewall-cmd --list-all-zones

4. Default Zone 정보
 >  firewall-cmd --get-default-zone

5. active Zone 리스트
 >  firewall-cmd --get-active-zones

6. Default Zone 설정
 >  firewall-cmd --set-default-zone=<ZONE>

7. Default Policy 수정
 >  firewall-cmd --permanent [--zone=zone] --set-target={default | ACCEPT | DROP | REJECT} : default target은 REJECT
8. firewall-cmd 가 저장 또는 참조하는 파일 및 디렉토리
 firewall 명령으로 추가한 정책은  /etc/firewalld/ 폴더내에 .xml파일로 저장되어있다.
 firewall-cmd --permanent 옵션으로 지정 했을 경우 firewall-cmd --reload 로 해야만 적용됨
 --permanent 옵션 없이 했을 경우 바로 적용됨, 이때 --reload 옵션을 사용하면 이전 설정값으로 돌아감

 

[3]. Service /Port 관리


 - 사전 정의된 서비스 이름, /usr/lib/firewalld/services/ 디렉토리에 정의되어 있음, vi 로 편집가능(편집후 firewall-cmd --reload 실행 필요)
 - 추가로 정의한 서비스는 /etc/firewalld/services 폴더에 저장됨

1. 서비스 목록

 > firewall-cmd --get-services :

2. 서비스의 상세 내역 확인
 > firewall-cmd --info-service=<SERVICE> 

3. 서비스 생성
 > firewall-cmd --new-service=<SERVICE> --permanent 

4. 서비스 요소 추가
 > firewall-cmd --service=LISTENER --add-port=1521/tcp --permanent

5.  Zone에 서비스 추가 / 삭제

 > firewall-cmd --zone=<ZONE> --add-service=LISTENER  --permanent

 > firewall-cmd --zone=<ZONE> --remove-service=LISTENER --permanent 

6. 포트 추가 및 삭제
 firewall-cmd --zone=<ZONE> --add-port=10000-20000/tcp --permanent 
 firewall-cmd --zone=<ZONE> --remove-port=10000-20000/tcp --permanent

 

[4]. rich-rule

- rich-rule 은 priority 가 없음. 

- rich-rule 은 source,destination,port등 멀티 조합 가능

1. rich-rule 추가
 > firewall-cmd --zone=<ZONE> --add-rich-rule="rule family=ipv4 source address=192.168.219.200 port port=22 protocol=tcp accept"  --permanent 

2. rich-rule 삭제
 > firewall-cmd --zone=<ZONE> --remove-rich-rule="rule family=ipv4 source address=192.168.219.200 port port=22 protocol=tcp accept"  --permanent
firewall-cmd --reload

 

[5]. ipset 설정

1. ipset type 리스트
 > firewall-cmd --get-ipset-types

2. ipset 리스트
 > firewall-cmd --get-ipsets
3. ipset 생성
 > firewall-cmd --new-ipset=whitelist01 --type=hash:net --option=family=inet --permanent

4. ipset 정보
 > firewall-cmd --info-ipset=whitelist01

5. ipset 삭제

 > firewall-cmd --delete-ipset=whitelist01 --permanent
6. ipset에 element 추가
 > firewall-cmd --zone=<ZONE> --ipset=whitelist01 --add-entry=192.168.219.0/24 --permanent

6. ipset에 element 삭제
 > firewall-cmd --zone=<ZONE> --ipset=whitelist01 --remove-entry=192.168.219.0/24 --permanent

7. ipset 적용 예
 > firewall-cmd --zone=public --add-rich-rule="rule family=ipv4 source ipset=whitelist01 port port=22 protocol=tcp accept"  --permanent

8. 파일로부터 ipset 생성
- 파일로 부터 읽어 들이기(기존 ipset에 추가, 기존 element가 있을 경우, 기존꺼는 덮어쓰고, 신규부분만 추가됨 )
cat > whitelist.txt <<EOL
192.168.0.2
192.168.0.3
192.168.1.0/24
192.168.2.254
EOL
firewall-cmd  --ipset=test --add-entries-from-file=whitelist01 --permanent
firewall-cmd --reload

 

[6]. source, port 연산

> firewallcmd --list-all
 ----- zone -------------------
  sources: ipset:whitelist01
  services: ssh
  ports: 8080/tcp
--------------------------------
 - zone의 정보가 위와 같을 경우, sources 는 의미가 없음, null 상태와 동일
 - 해당 정책은 ssh, 8080에 대해 모든 ip에서 접속 가능
 - source 와 port를 조합하기 위해서는 rich rule 을 사용해야함
   예)특정 IP에 대해서만 ssh 를 허용하고자 한다면 service(or port) 를 제거후 rich-rule에서 source 와 service(또는 port)를 이용하여 제어 사용

 

2. 잘못된 표현, 기본 firewalld 는 서비스(or port)에 대해서만 제어

 > firewall-cmd --zone= --add-source=ipset:whitelist01 --permanent 

 

반응형