Linux

[Linux] 리눅스 방화벽 : firewalld

nayoungs 2022. 3. 8. 21:37
728x90

📌INDEX




✔️ 리눅스 방화벽이란?

  • 리눅스 방화벽(firewall)이란 외부에서 시스템으로 접근하는 패킷을 차단하는 서비스이다
  • 규칙을 이용하여 접근을 허용하거나 차단할 수 있다
  • 방화벽(firewall)은 일반적으로 신뢰할 수 있는 내부 네트워크, 신뢰할 수 없는 외부 네트워크 간의 장벽을 구성
  • 서로 다른 네트워크를 지나는 데이터를 허용/거부하거나 검열/수정하는 하는 하드웨어 또는 소프트웨어 장치라고 할 수 있다
  • iptables의 단점을 보완하기 위해 도입되었다
    • iptables : Netfilter 제어하는 도구를 사용하며, 설정을 변경하면 재시작해야한다는 단점이 존재 (Centos 7이전)
    • firewall은 동적으로 방화벽 설정 변경이 가능하다
      • Runtime : 시스템 운영중인 상태일 때 반영(실시간으로 변경)
      • Permanent : 서비스가 재시작 되었을 때도 반영(영구 설정), XML 파일
Netfilter(Kernel)      <- iptables(명령)          <- iptables(service)
                       <- firewall(service)       <- firewall-cmd
                                                  <- firewall-config



 

✔️ Zone

  • zone이란, 사용자가 요구하는 정책 허용·특정 허용·거부·특정 거부 등에 맞게 그룹으로 관리되며, 처음 설정 시 기본적으로 내장되어있는 정책이다
  • zone 설정 디렉토리 : /usr/lib/firewalld/zones/
  • 폐기(drop)과 거절(reject)의 차이
    • 폐기(drop) : 패킷을 받으면 응답없이 버린다
    • 거절(reject) : 패킷을 받으면 거부한다라는 ICMP 패킷을 보내준다
  • pre-defined zone(zone의 종류)
    • 나가는 패킷은 모두 허용함
    • block : 들어오는 모든 패킷 거부
    • dmz : SSH를 제외하고 들어오는 모든 패킷 거부(reject)
    • drop : 들어오는 모든 패킷 폐기(drop), ICMP 에러도 폐기(drop)
    • external : SSH를 제외하고 들어오는 모든 패킷 거부(reject)
    • internal : SSH, dhcpv6-cilent, ipp-client, mdns, samba-client를 제외하고 들어오는 모든 패킷 거부(reject)
    • home : SSH, dhcpv6-client, ipp-client, mdns, samba-client를 제외하고 들어오는 모든 패킷 거부(reject)
    • public : SSH, dhcpv6-client를 제외하고 들어오는 모든 패킷 거부(reject)
    • trusted : 들어오는 모든 패킷 허용
    • work : SSH, ipp-client, dhcpv6-client를 제외하고 들어오는 모든 패킷 거부
  • public zone이 default이다



 

 

✔️ firewalld

  • firewalld는 초기에 기본 설정으로 zone이 생성되어 있다
  • firewalld : Centos의 방화벽 관리 데몬
  • 사용 법: firewall-cmd [option]
  • 옵션
    • --state : firewalld 실행 상태 확인
    • --get-default-zone : 현재 기본 영역 표시
    • --set-default-zone [zone] : 기본 zone 설정
    • --get-zones : 사용 가능한 모든 zone 나열
    • --get-services : 사용 가능한 모든 서비스 나열
    • --get-active-zones : 현재 사용중인 모든 zone과 인터페이스 및 소스정보 나열
    • --add-source=[ip주소] --zone=[zone] : 출발지 주소 규칙 추가
      • --zone 옵션을 통해 zone 지정해주지 않으면 자동으로 기본 영역에 추가
    • --remove-source=[ip주소] : ip주소를 지정된 영역에서 제거
    • --add-interface=[ifname] --zone=[zone] : 특정 영역에 interface 연결 추가
    • --change-interface=[ifname] --zone=[zone] : 영역에 연결된 interface 변경
    • --list-all --zone=[zone] : 영역에 구성된 모든 인터페이스, 소스, 서비스, 포트 나열
      • zone을 지정해주지 않으면 전체 zone에 대한 자세한 정보 나열
    • --add-port=[prot|protocol|service] --zone=[zone] : 해당 포트나 프로토콜 혹은 서비스에 대한 트래픽 허용
      • --permanent 옵션을 사용하지 않으면 현재의 설정이 변경되며, 영구설정 지정 안됨
      • 포트를 지정할 때에는 tcp, udp 등을 지정해줘야함
    • --reload : 런타임 구성 삭제, 영구 구성 적용
      • firewall-cmd 명령 사용 후 --reload 해주지 않으면, 영구저장X
    • --runtime-to-permanent : 실행중 설정을 영구 설정으로 변경

 

사용 예

  • firewalld 실행 상태를 확인해보자
[root@server ~]# firewall-cmd --state
running
  • 현재의 기본 zone 을 확인해보자
[root@server ~]# firewall-cmd --get-default-zone
public
  • 기본 zone을 home으로 변경해보자
    • --get-default-zone으로 확인
[root@server ~]# firewall-cmd --set-default-zone home
success
[root@server ~]# firewall-cmd --get-default-zone
home
  • home zone에 80번 포트(tcp)에 대한 트래픽을 허용해보자(영구적으로)
    • tcp를 명시해줘야한다
[root@server ~]# firewall-cmd --add-port=80/tcp --permanent --zone=home
success
[root@server ~]# firewall-cmd --reload
success
  • home zone에 2049번 포트(udp)에 대한 트래픽을 허용해보자(영구적으로)
[root@server ~]# firewall-cmd --add-port=2049/udp --permanent --zone=home
success
[root@server ~]# firewall-cmd --reload
success
  • 열어준(트래픽을 허용한) 포트를 확인해보자
[root@server ~]# firewall-cmd --list-ports
80/tcp 2049/udp
  • home zone에 ICMP 프로토콜에 대한 트레픽을 허용해보자(영구적으로)
[root@server ~]# firewall-cmd --add-protocol=ICMP --permanent --zone=home
success
[root@server ~]# firewall-cmd --reload
success
  • home zone에 nfs 서비스에 대한 트래픽을 허용해보자(영구적으로)
[root@server ~]# firewall-cmd --add-service=nfs --permanent --zone=home
success
[root@server ~]# firewall-cmd --reload
success
  • home zone의 상태를 확인해보자
[root@server ~]# firewall-cmd --list-all --zone=home
home (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3 enp0s8 enp0s9
  sources:
  services: ssh mdns samba-client dhcpv6-client nfs
  ports: 80/tcp 2049/udp
  protocols: ICMP
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
[root@server ~]# echo "This is Centos" > /var/www/html/index.html
[root@server ~]# systemctl start httpd
[root@server ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@server ~]# firewall-cmd --add-service=http --permanent
success
[root@server ~]# firewall-cmd --reload
success

 

⭐ 항상 [패키지 설치 + 실행(활성화) + 방화벽 설정(포트 열어주기)]은 한 세트

[root@server ~]# yum -y install httpd
[root@server ~]# systemctl start httpd
[root@server ~]# systemctl enable httpd
[root@server ~]# firewall-cmd --add-servie=httpd --permanent
[root@server ~]# firewall-cmd --reload



728x90