일일 정리

리눅스 Firewall

mysecurity 2025. 5. 2. 22:50

목차

1. 리눅스 Firewall

1-1 firewall-cmd

1-2 ZONE

1-3 ZONE - port, source

1-4 ZONE - ICMP 차단

1-5 Service

1-6 rich rule

 

 

1. 리눅스 Firewall

1-1 firewall-cmd

이전까지 구축했던 방화벽은 네트워크 방화벽으로 네트워크에 흐르는 패킷을 제어했다. 그러한 네트워크 방화벽 외에 컴퓨터마다 자신에게 들어오는 패킷을 제어하는 시스템 방화벽이 추가로 필요하다.

이때 firewall-cmd 명령을 통해 시스템 방화벽을 조작할 수 있다. 

 

● 방화벽 실행 및 등록, 재구동

# systemctl [start|stop] firewalld.service

# systemctl [enable|disable] firewalld.service

# systemctl [is-enabled | is-active] firewalld.service

# firewall-cmd --reload  : 서비스 재구동

- 방화벽은 서브로 등록되어 있으므로 데몬으로 관리된다.

- 서비스 재구동은 방화벽 관련 설정의 변경점을 즉시 적용시킨다.

- ntsysv를 점점 쓰지 않는 추세이므로 명령어 숙지가 필요하다.

 

● 관련 파일

- 환경 설정 파일 : /etc/firewalld/firewalld.conf

- 서비스 혹은 존 관련 파일 : /usr/lib/firewalld/services

                                        : /usr/lib/firewalld/zones

- 환경 설정 파일을 건드릴 일은 없다.

- 각 zone에 대한 설정 내역은 /usr/lib/firewalld/zones/<zone 명>.xml(표준 서식) 파일에서 확인 가능하다.

- /usr 밑의 zone 파일들은 건드리지 않는다.

 

1-2 ZONE

zone은 방화벽 관련 설정을 모아놓은 일종의 정책 덩어리로, 오라클의 profile과 같다. zone을 인터페이스에 할당함으로써 활성화되며 해당 설정들이 적용된다. 존끼리 설정 충돌이 있을 수 있으므로 보통 하나의 존을 사용한다.

 

● 미리 제공된 zone

- block, dmz, drop, external, home, internal, public, trusted, work

- 보통 public을 이용한다.

 

● zone 활성화 조건

- Zone에 네트워크 인터페이스가 할당된 경우

- Zone에 소스 IP나 네트워크 범위가 할당된 경우

 * 서비스나 포트가 할당된 경우 설정만 되며 활성화는 되지 않는다.

 

● zone 관련 옵션

# firewall -cmd [옵션]

 

※ 옵션

--get-zones : 목록출력

--list-all-zones          : 모든 zone 내역 출력

--list-all                    : 활성화된 zone 내용 출력

--list-all  --zone        : zone 내용 출력

--get-default-zone    : default 확인

--set-default-zone    : default 변경. 활성화되는 존들 중 선택한다. 가장 먼저 활성화된다.

--get-active-zone     : 인터페이스 별 활성화된 zone 확인

 

--permanent --new-zone=zone      : zone 추가

--permanent --delete-zone=zone   : zone 삭제

 

 

● 인터페이스 zone 할당

- 디폴트 존을 다른 존으로 교체한다.

 

# firewall-cmd --zone=zone --change-interface=interface

: 지정된 인터페이스의 존이 교체된다.

 

● zone 내용 수정

--permanent 옵션을 사용한 경우 현재 메모리에 설정을 적용시키기 위해 반드시 firewall-cmd --reload 명령이 필요하나 설정이 영구 지속된다. 

--permanent 옵션을 사용하지 않은 경우 현재 메모리에 즉시 적용되나 영구적 수정이 아니므로 재부팅 시 혹은  firewall-cmd --reload 명령 시 원래 설정으로 돌아간다.

--permanent 옵션 여부 설정 즉시 적용 설정 영구 적용
사용 X O
미사용 O X

 

 

1-3 ZONE - port, source

존에 사전 정의된 서비스와 상관없는 포트나 ip를 추가/삭제하는 경우 직접 편집 명령어를 사용한다.

 

● 포트 추가/삭제

# firewall-cmd --permanent --zone=zone --add[remove]-port=<# of port>/<tcp|udp>

or (둘 중 하나만 적용 가능하다.)

# firewall-cmd --permanent --zone=zone --add[remove]-source=<IP> (거의 사용하지 않는다.)

- 포트번호: 8080/tcp 또는 8080-8090/tcp와 같이 번호나 범위 설정이 가능하다.

- ip와 포트 설정을 동시에 정의하는 것은 현재 불가능하다.

 

※ 웹 서버 방화벽 가동 초기

- 리눅스 방화벽 초기 상태는 포트 접근을 허가하지 않는다.

 

 

※ 웹 서버 방화벽 가동 이후 80번 포트 추가

- 80번 포트를 허가하여 접근을 허가한다.

- 실습 후 반드시 추가한 포트를 삭제한다.

 

1-4 ZONE - ICMP 차단

● ICMP block

-  리눅스 방화벽 초기 상태는 ICMP를 허용한다.

# firewall-cmd --permanent --zone=zone --add-icmp-block=<icmp type>

or

# firewall-cmd --permanent --zone=zone --remove-icmp-block=<icmp type>

- 설정 시 ICMP를 타입별로 차단한다.

 

# firewall-cmd --get-icmptypes

: ICMP 타입을 확인한다.

 

# firewall-cmd --list-icmp-blocks

: 차단된 타입을 확인한다.

 

※ 웹 서버 방화벽 가동 초기

 

※ ping 차단 및 등록 확인

- 실습 후 반드시 추가한 ICMP를 삭제한다.

 

1-5 Service

서비스는 방화벽의 개별 항목을 목록화해 둔 것으로 서비스를 통해 간단히 방화벽 설정 추가/삭제 등 변경이 가능하다.

서비스 자체도 생성/삭제가 가능하며 대부분 항목들은 미리 제공된다.

/usr/lib/firewalld/services/서비스명.xml 에서 서비스에 대한 설정 내용을 확인할 수 있다.

 

● 미리 정의된 서비스 목록 확인 및 현재 zone에 등록된 서비스 확인

# firewall-cmd --get-services

: 제공된 모든 서비스 목록 확인

 

# firewall-cmd --list-services  [--zone=zone]

: zone에 등록된 서비스 목록 확인

 

● znoe에 서비스 추가/삭제

# firewall-cmd -permanent  --zone=zone --add-service=<서비스명>

: zone에 서비스를 추가한다.

 

# firewall-cmd --permanent --zone=zone --remove-service=<서비스명>

: zone에서 서비스를 삭제한다.

 

※ 웹 서버 방화벽 가동 초기

- http를 통한 웹 서버 접속이 불가하다.

 

 ftp, http, samba 서비스 접속이 가능하도록 수정

- cockpit과 dhcpv6-client는 필요 없는 서비스이므로 삭제한다.

 

- http를 통한 웹 서버 접속이 가능하다.

 

 

● 서비스 생성과 삭제

# firewall-cmd --permanent --new-service <서비스명>

: 새로운 서비스가 생성된다.

: /etc/firewalld/services/service.xml  파일이 생성된다.

- 기존의 서비스와 경로가 다르다.

 

# firewall-cmd --permanent --delete-service <서비스명>

: 서비스가 삭제된다.

: 시스템이 제공한 서비스는 삭제 불가하다.

 

● 서비스에 설정 추가

# firewall-cmd --permanent service=<서비스명> --add-port=<포트번호>/<tcp|udp>

or

# firewall-cmd --permanent service=<서비스명> --add-source-port=<포트번호>-<포트번호>/<tcp|udp>

or

# firewall-cmd --permanent service=<서비스명> --set-destination=ipv4:<ip>/<netmask>

- 보통 포트를 이용한 설정을 하며, 소스 포트 설정은 특정 서버로의 서비스를 제한하는 경우 사용된다.

- 목적지 설정은 라우터 설정이다.

 

● 서비스에 주석 설정

# firewall-cmd --permanent --service=<서비스명> --set-description=<주석>

or

# firewall-cmd --permanent --service=<서비스명> --set-short=<주석>

- 각각 긴 주석, 짧은 주석을 추가할 때 사용된다.

 

 

 

※ 오라클 서버 방화벽 가동 초기

- 오라클 서버 방화벽 가동 초기, 웹 서버에서 오라클로 접속이 불가하다.

 

 

※ 오라클 접속을 위한 서비스 생성 및 zone 등록 (오라클 서버)

- oracle 서비스 생성 및 리스너가 이용할 포트들을 추가한다. 한 번에 추가할 수 없으므로 명령어를 여러 번 입력한다.

- 웹 서버에서 오라클로 접속이 가능하다.

 

 

1-6 rich rule

리치 룰은 설정하고자 하는 방화벽 규칙이 적절히 제공되지 않을 때 직접 규칙을 적용하는 방법으로, 직관적인 설정으로 원본 주소,  목적지 주소에 따른 접근 제어, 로깅, 세밀한 액션 설정 등 다양한 규칙을 정의할 수 있다.

 

● rule 추가

firewall-cmd [--zone=zone] [--timeout=timeval] --add-rich-rule='rule'

- 존은 디폴트 존을 기본으로 한다.

- timeval는 s, m, h를 단위로 이용한다. 지정 시간 동안 설정이 유지된다.

: --timeout은 --permanent와 함께 사용할 수 없다.

 

● rule 삭제

firewall-cmd [--zone=zone] --remove-rich-rule='rule'

 

● rule 확인

firewall-cmd [--zone=zone] --query-rich-rule='rule'

 

● rich rule의 구조 

rule
 family="rule family"
 source
 destination
 service|port|protocol|icmp‐block|icmp‐type|masquerade|forward‐port|source‐port
 accept|reject|drop|mark 
 log
 audit

 

※ family 

- IPv4 또는 IPv6로 ip 프로토콜 버전을 작성한다.

- 규칙에 sourc 나 destination을 지정하는 경우 반드시 명시적으로 지정한다.

 

※ source

- ip를 이용해 source를 지정한다.

: IP 주소, CIDR(Classless Inter‐Domain Routing)

: not 사용이 가능하다.

 

- 문법

: source [not] address="address[/mask]" 

: source address="192.168.10.11"

: source address="192.168.10.0/24"

: source not address="192.168.10.99"

 

※ destination

- 문법

: destition [not] address="address[/mask]" |

                        mac="mac-address" |

                        ipset="ipset"

목적지를 이용한 패킷 제어는 네트워크 방화벽에서 사용하므로 여기서는 중요하지 않다.

 

※ port

- 단일 포트나 범위를 지정한다. tcp/udp를 지정해 주어야 한다.

- 문법

: port protocol=[tcp/udp]  port=번호 혹은 범위

: port protocol=tcp port=1521

: port protocol=tcp port=1520-1600

firewall‐cmd‐‐permanent ‐‐zone=public ‐‐add‐rich‐rule='rule family="ipv4" 
port protocol="tcp" port="1521" accept'

firewall‐cmd‐‐permanent ‐‐zone=public ‐‐remove‐rich‐rule='rule 
family="ipv4" service name="oracle" accept'

- 두 문장 모두 오라클 접속 관련 설정이다.

- 직접 프로토콜을 지정해 설정하는 것은 좋지 않다. 서비스에 설정하여 서비스를 rule에 설정하는 것을 권장한다.

 

※ service

- 등록되거나 생성된 서비스를 지정한다.

- port protocol=[tcp/udp] port=## 대신 간단히 사용 가능하다.

- 문법

: service name=service

: service name="ssh"

  (port protocol=tcp port=22)

 

※ protocol

- /etc/protocols에 사전 정의된 이름을 사용한다.

- 문법

: protocol value=<protocol>

: protocol value=igp   // igrp

: protocol value=ah    // Ipsec AH 헤더

 

※ icmp-block

icmp를 타입별로 차단할 때 사용한다.

- 문법

: icmp-block name=<icmp_type> : 지정한 타입의 icmp를 차단한다.

: icmp-block name=echo-request

: --get-icmptypes : icmp 타입을 검색한다.

rich rule로 막는 것보다 커널에서 막는 것을 권장한다.

 

※ log

- 방화벽 설정에 대한 접근 내용을 기록한다.

- 문법

: log [prefix=<접두어> level=<level> limit value=rate/단위]

  로그에 접두어를 붙여 남긴다.

: 단위 = s(초), m(분), h(시간), d(day)

  ex) 1/m : 1분에 1번만 로깅한다.

 

- log level

emerg: 전체 터미널에 경고 발생

alert, crit, error, warning, notice, info : 로그 정보

debug : 에러 발생 시에만 로그 발생

 

- log 파일

: /var/log/messages = 시스템 기본 로그가 들어간다.

: /var/log/firewalld

 

※ action

- 룰에 적용된 동작을 정의한다.

* accept : 연결을 허용한다.

* drop : 연결을 거부한다.

* reject : 연결을 거부한다. (로그 발생)

* mark : 패킷에 set에서 설정된 표식을 남긴다.

 

● rich rule - 실습

 

※ web 접속이 가능하도록 rich rule 추가

firewall‐cmd ‐‐permanent ‐‐zone=public ‐‐add‐rich‐rule='rule port protocol="tcp" port="80" accept'

or

firewall‐cmd ‐‐permanent ‐‐zone=public ‐‐add‐rich‐rule='rule service name="http" accept'

- 같은 동작을 하는 설정이라도 포트를 직접 설정하는 것보다 서비스명을 활용하는 것이 좋다.

 

※ 192.168.10.99 시스템만 ftp 접속이 가능하도록 설정

firewall‐cmd ‐‐permanent ‐‐zone=public ‐‐add‐rich‐rule='rule family="ipv4" source address="192.168.10.99" service name="ftp" accept'

- 로컬에서 사용되는 서버인 경우 출발지 주소에 따른 설정을 사용한다.

 

※ 192.168.10.0/24 네트워크에서 ftp 접속이 가능하도록 설정 (192.168.10.11은 제외)

firewall‐cmd ‐‐permanent ‐‐zone=public ‐‐add‐rich‐rule='rule family="ipv4" source address="192.168.10.0/24" service name="ftp" accept'

firewall‐cmd ‐‐permanent ‐‐zone=public ‐‐add‐rich‐rule='rule family="ipv4" source address="192.168.10.11" service name="ftp" drop'

- firewall-cmd는 설정 범위가 좁고 상세한 것의 우선순위가 높다. 때문에 명확한 우선순위를 파악하기 어렵다.

 

d_web 서버 rich rule 설정

이전에 구현한 d_web서버 네트워크 방화벽 설정을 참고하여 다음과 같이 rich rule만으로 시스템 방화벽 설정이 가능하다.

- rich rule로 방화벽 설정 후 service를 통한 제약은 삭제한다.

'일일 정리' 카테고리의 다른 글

보안 장비 운용, IDS(Intrusion Detection System), IDS - snort  (0) 2025.05.09
리눅스 Firewall 설정  (0) 2025.05.08
서버 보안 설정, FTP  (0) 2025.05.01
방화벽 환경 구축  (1) 2025.04.30
방화벽 구축  (0) 2025.04.29