본문 바로가기

개발자는 오늘도 달립니다.

[리눅스] 방화벽 FirewallD 설치 및 설정 방법 (iptable 방화벽 설정) 본문

리눅스/공통

[리눅스] 방화벽 FirewallD 설치 및 설정 방법 (iptable 방화벽 설정)

✍21시간 2020. 12. 16. 17:43

FirewallD는 Linux 운영 체제를 위한 방화벽 관리 도구입니다.
iptables 는 숙련된 관리자가 아니면 사용이 어려운 단점이 있었는데 이런 문제를 해결하고자
RHEL/CentOS 7 부터는 방화벽 관리 유틸인 firewalld 가 나오게 되었고,
이에 따라 iptables 명령어 대신 firewall-cmd, GUI 환경에서는 firewall-config를 사용하게 되었습니다.
(물론 iptables 도 사용 가능합니다.)

 

 

Firewall 특징

  1. FirewallD 는 체인과 규칙 대신 Zone 과 Service 를 사용합니다.
  2. 규칙 세트를 동적으로 관리하여 기존 세션 및 연결을 끊지 않고 업데이트를 가능합니다.

Note!

FirewallD는 iptables 규칙을 더 쉽게 관리할 수 ​​있도록 iptables 용 래퍼입니다.
iptables를 대체하는 것은 아닙니다.
iptables 명령은 여전히 ​​사용 가능합니다.

 

 

방화벽 설치 및 관리

FirewallD 는 CentOS 7 에 기본적으로 탑재되어 있지만 비활성 상태입니다.
(클라우딩 시스템에는 기본적으로 탑재 되어 있지 않습니다. ex) AWS )

 

# firewalld 설치
yum install firewalld
# firewalld 서비스를 시작
sudo systemctl start firewalld
# firewalld 서비스 활성화 (재부팅 후 계속 반영)
sudo systemctl enable firewalld
# firewalld 서비스 중지
sudo systemctl stop firewalld
# firewalld 서비스 비활성화 (재부팅 후 계속 반영)
sudo systemctl disable firewalld
# firewalld 방화벽 상태 확인
# 출력은 running 또는 not running입니다.
sudo firewall-cmd --state
# firewalld 서비스 상태 확인
sudo systemctl status firewalld
# firewalld 설정 후 내용 즉시 로드 방법
sudo firewall-cmd --reload

 

FirewallD 구성

Firewalld는 XML 파일로 구성됩니다. 매우 구체적인 구성을 제외하고는 처리할 필요가 없으며 대신 firewall-cmd 커맨드를 활용하실 수 있습니다.

구성 파일은 다음 두 디렉터리에 있습니다.

  • /usr/lib/FirewallD
    (기본 영역 및 공통 서비스와 같은 기본 구성을 보유, 방화벽이 있는 각 패키지 업데이트가 해당 파일을 덮어쓰므로 업데이트하면 안 됨.)
  • /etc/firewalld
    (시스템 구성 파일을 보유합니다. 이러한 파일은 기본 구성을 덮어씁니다.)

 

FirewallD 설정 방법

Firewalld 는 런타임 및 영구적인 변경 두 가지를 선택 사용합니다.
런타임 구성 변경 사항은 재부팅 시 또는 FirewallD 를 다시 시작할 때 유지되지 않지만 영구 변경 사항은 실행 중인 시스템에 바로 적용되지는 않습니다. (리로드 필요)

 

기본적으로 firewall-cmd 명령은 런타임 구성에 적용되지만 --permanent 플래그를 사용하면 영구 구성이 설정됩니다.
영구 규칙을 추가하고 활성화하려면 두 가지 방법 중 하나를 사용할 수 있습니다.

 

# 영구 변경 및 런타임 두 가지 모두 규칙에 추가하는 경우

sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=http

 

# 영구 변경을 적용하고 FirewallD를 다시 로드하는 방법
# reload 명령은 모든 런타임 구성을 제거하고 영구 변경 구성을 적용합니다.
# firewalld 는 규칙 들을 동적으로 관리하기 때문에 기존 연결 및 세션을 중단하지 않습니다.

sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --reload

 

방화벽 영역 (Zone)

Zone 은 주어진 위치 또는 특정 영역에 대해 가질 수 있는 다양한 신뢰 수준에 대해 미리 구성된 규칙 집합입니다.
설정된 영역만 수신 트래픽 유형을 허용하고 이외에 것들은 거부합니다. FirewallD 를 처음 사용하도록 설정하면 Public 이 기본 영역이 됩니다.

영역은 다른 네트워크 인터페이스에도 적용할 수 있습니다. 예를 들어 내부 네트워크와 인터넷 모두에 대해 별도의 인터페이스를 사용하면 내부 영역에서는 DHCP를 허용하고 외부 영역에서는 HTTP 및 SSH 만 허용할 수 있습니다.
특정 영역으로 명시적으로 설정되지 않은 모든 인터페이스는 기본 영역에 연결됩니다.

 

# 기본 설정된 zone 확인
sudo firewall-cmd --get-default-zone
# 기본 zone inernal 로 변경
sudo firewall-cmd --set-default-zone=internal
# 네트워크 인터페이스에서 사용하는 영역을 보기
sudo firewall-cmd --get-active-zones

# 출력 예
# public interfaces: eth0
# 특정 영역에 대한 모든 구성을 가져오기
sudo firewall-cmd --zone=public --list-all

# 출력 예
# public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: ssh dhcpv6-client http ports: 12345/tcp protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:

 

# 모든 영역에 대한 모든 구성을 가져오기
sudo firewall-cmd --list-all-zones

# 출력 예
# trusted target: ACCEPT icmp-block-inversion: no interfaces: sources: services: ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: ... work target: default icmp-block-inversion: no interfaces: sources: services: ssh dhcpv6-client ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:

 

 

설정 확인

FirewallD 는 특정 네트워크 서비스에 대해 미리 정의된 규칙에 따라 트래픽을 허용할 수 있습니다.
사용자 한정 서비스 규칙을 만들어 모든 영역에 추가할 수 있습니다.
기본 지원 서비스에 대한 구성 파일은 /usr/lib/firewalld/services 있으며, 사용자가 만든 서비스 파일은 /etc/firewalld/services 입니다.

 

# 사용 가능한 기본 서비스 보기
sudo firewall-cmd --get-services
# 예시) HTTP 서비스를 활성화 또는 비활성화 하기
sudo firewall-cmd --zone=public --add-service=http --permanent sudo firewall-cmd --zone=public --remove-service=http --permanent

 

 

임의 포트 / 프로토콜 허용 또는 거부

# 예시) 포트 12345에서 TCP 트래픽을 허용 또는 비활성화합니다.
sudo firewall-cmd --zone=public --add-port=12345/tcp --permanent sudo firewall-cmd --zone=public --remove-port=12345/tcp --permanent

 

포트 포워딩

# 예시) 동일한 서버의 포트 80 에서 포트 12345 로 트래픽을 전달합니다.
sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=12345
# 다른 서버 포트로 전달 하기

# public zone에서 masquerade 활성화
sudo firewall-cmd --zone=public --add-masquerade

# localhost:80 -> 198.51.100.0:8080 으로 트래픽 전달 (규칙 추가)
sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=198.51.100.0
# 규칙을 제거하려면 아래와 같이 --remove 옵션을 사용합니다. :
sudo firewall-cmd --zone=public --remove-masquerade

 

 

FirewallD 를 사용하여 규칙 세트 구성

예를 들어, 다음은 웹 서버를 실행하는 경우 FirewallD 를 사용하여 기본 규칙을 Linode에 할당하는 방법입니다.

  1. dmz영역을 기본 영역으로 eth0 에 할당합니다. 제공되는 기본 영역 중 dmz (비무장 영역)는 SSH 및 ICMP 만 허용하므로 응용 프로그램을 시작하는 것이 가장 바람직합니다.
  2. sudo firewall-cmd --set-default-zone=dmz sudo firewall-cmd --zone=dmz --add-interface=eth0
  3. HTTP 및 HTTPS 에 대한 영구 서비스 규칙을 dmz 영역에 추가합니다.
  4. sudo firewall-cmd --zone=dmz --add-service=http --permanent sudo firewall-cmd --zone=dmz --add-service=https --permanent
  5. 규칙이 즉시 적용되도록 FirewallD 를 다시 로드합니다. 다음으로 firewall-cmd --zone=dmz --list-all 하면 다음과 같이 출력됩니다. 이것은 dmz영역이 eth0 인터페이스, 모든 네트워크 소스포트에 적용되는 기본값 임을 알려줍니다.
    들어오는 HTTP (포트 80), HTTPS (포트 443) 및 SSH (포트 22) 트래픽이 허용되며 IP 버전 관리에 대한 제한이 없으므로 IPv4와 IPv6 모두에 적용됩니다.
    Masquerading , port forwarding 은 허용되지 않습니다.
    우리는 ICMP 블록을 차단하거나, ICMP 트래픽을 완전히 허용하거나 하는 더 다양한 규칙을 관리합니다.
  6. dmz (default) interfaces: eth0 sources: services: http https ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:
  7. sudo firewall-cmd --reload

 

관리 요소 추가하기!

서비스 및 포트는 기본 구성에 적합하지만 고급 시나리오에는 너무 제한적일 수 있습니다.
풍부한 규칙 및 직접 인터페이스를 사용하면 모든 포트, 프로토콜, 주소 및 작업에 대해 모든 영역에 완전한 사용자 지정 방화벽 규칙을 추가할 수 있습니다.

Rich Rules

Rich Rules 구문은 man 페이지를 활용하거나 firewalld.richlanguage 에 완전히 문서화되어 있습니다.
사용--add-rich-rule,--list-rich-rules및--remove-rich-rule방화벽-CMD 명령으로 그들을 관리할 수 있습니다.

다음은 몇 가지 일반적인 예입니다.

호스트 192.0.2.0의 모든 IPv4 트래픽을 허용합니다.

sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.0.2.0 accept'

호스트 192.0.2.0에서 포트 22 로의 TCP를 통한 IPv4 트래픽을 거부합니다.

sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.0.2.0" port port=22 protocol=tcp reject'

호스트 192.0.2.0에서 포트 80으로의 TCP를 통한 IPv4 트래픽을 허용하고 로컬로 포트 6532로 전달합니다.

sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 source address=192.0.2.0 forward-port port=80 protocol=tcp to-port=6532'

포트 80의 모든 IPv4 트래픽을 호스트 198.51.100.0의 포트 8080으로 전달합니다 (마스커레이드가 영역에서 활성화되어야 함).

sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=198.51.100.0'

공개 영역에서 현재 리치 규칙을 나열하려면 다음을 수행하십시오.

sudo firewall-cmd --zone=public --list-rich-rules

iptables Direct Interface

가장 고급 사용 또는 iptables 전문가를 위해 FirewallD 는 iptables 명령을 직접 전달할 수 있는 인터페이스를 제공합니다.
인터페이스 규칙을 사용하지 않는 한 영구적이지 않습니다 --permanent.

FirewallD 에 추가된 모든 사용자 정의 체인 또는 규칙을 보려면 :

firewall-cmd --direct --get-all-chains firewall-cmd --direct --get-all-rules

Comments