본문 바로가기
IT Security/LINUX Basic

46. Linux 방화벽 제어 - firewall-cmd, rich-rule 등록

by Rosmary 2024. 3. 27.
728x90
반응형

 

 

 

 

Linux firewall-cmd를 사용한 Linux 방화벽 정책 생성 및 제어의 마지막 포스팅이다. 지난 포스팅에서는 각 Zone에 간단한 객체를 추가/삭제함으로써 외부에서의 Linux 접속 허용/차단 여부를 확인해보았다. 

 

지난 포스팅에서도 언급했듯이, firewall-cmd로 방화벽 정책을 간편하게 만들 수 있게 되었지만 조금 더 세부적으로 정책을 설정해야하는 경우 firewall-cmd의 옵션만으로는 디테일한 정책을 생성하기 어렵다. 따라서 firewall-cmd는 아키텍처 내부에 존재하는 iptables 명령어를 고스란히 사용하여 정책을 설정할 수 있도록 rich-rule이라는 옵션을 제공하는데, 이번 포스팅에서는 이 rich_rule의 사용 방법에 대해 정리해보려한다.

 

 

 

1. Rich-Rule 사용을 위해 필요한 정보

 

rich-rule 옵션을 사용한 firewall-cmd의 명령어는 일반적인 Linux 명령어에 비해 긴 편이다. 그러나 이 명령어도 파트별로 분해해서 하나씩 살펴보다보면, 단지 입력해야 할 내용이 많다 뿐이지 어렵지는 않다.

 

방화벽 정책은 - Linux 뿐만 아니라 방화벽 전용 장비도 포함해서 -  크게 아래와 같이 구성된다.

 

구성 설명
IP 버전 IPv4 또는 IPv6
출발지 주소 (source ip) 통신이 시작되는 장비의 IP 또는 대역
목적지 주소 (destination ip) 통신이 도달하는 장비의 IP 또는 대역
서비스 (Service) 서비스 종류(ex: SSH, HTTP 등) 명시.
보통 프로토콜(TCP/UDP)과 포트 번호로도 표시하기도 한다.
정책 허용 여부(action) 위의 조합을 가진 통신의 허용(accept) / 차단(drop) 여부 지정

 

 

개별 방화벽 정책은 위의 구성이 최소로 들어 있어야 하며, 하나라도 누락된다면 정책 생성을 진행할 수 없게 된다. 물론 iptables에서 직접 방화벽 정책을 만들어야한다면 최소 구성에 +@가 추가되지만 다행히 firewall-cmd의 rich-rule 옵션은 위에서 소개한 최소 구성만으로도 정책을 생성할 수 있도록 만들어놓았다.

 

 

 

 

2. rich-rule 옵션을 사용한 firewall-cmd 명령어 포맷

 

그럼 본격적으로 rich-rule 옵션을 사용한 firewall-cmd 명령어에 대해 알아보자. 

 

1
2
3
4
5
# rich-rule 추가
firewall-cmd --add-rich-rule='{정책 구성}'
 
# rich-rule 삭제
firewall-cmd --remove-rich-rule='{정책 구성}'
cs

 

 

rich-rule 사용을 위한 명령어 옵션은 --add-rich-rule과 --remove-rich-rule 두 가지가 존재한다. 옵션의 이름에서도 알 수 있듯이 rich-rule을 추가하거나(add), 삭제할 때(remove) 이 옵션 중 하나를 선택하여 사용하면 된다. 

 

--add-rich-rule 및 --remove-rich-rule은 이퀄(=) 추가 후 구성할 정책에 대한 내용을 입력한다. 인터페이스나 포트/프로토콜을 추가할 때에 따옴표('') 없이 바로 값을 입력했던 것과 달리, rich-rule은 여러 요소의 값이 공백으로 구분되어 추가되어야하기 때문에 반드시 정책으로 지정할 구성 값들을 따옴표로 감싸주어야 한다. 

 

그럼 정책 구성은 어떻게 진행할까?

 

1
2
3
4
5
6
7
8
9
10
11
12
# 정책 구성
 
# IP 버전  :  rule family="ipv4 | ipv6"
# 출발지 IP:  source address="출발지IP 또는 대역"
# 목적지 IP:  destination address="목적지IP 또는 대역"
# 서비스   :  service name="서비스명"
# 포트     :  port port="포트번호" protocol="Protocol"
# 프로토콜 :  protocol name="프로토콜명"
# 정책 허용 여부: accept | reject | drop
 
# example
# 출발지 192.30.1.4 에서 목적지 192.30.1.3으로의 HTTP 통신(80/tcp) 허용
rule family="ipv4" source address="192.30.1.4" destination address="192.30.1.3 port port="80" protocol="tcp" accept
cs

 

 

정책 구성은 방화벽 정책에 필요한 구성을 공백으로 구분하여 입력한다. 많은 정보가 공백으로 구분되어 입력된다는 특징 때문에 구성을 이루는 실제 값들은 반드시 별도의 따옴표로 구분하여 작성해주어야 한다.

 

서비스와 포트는 일반적으로 동시에 표기하지 않는데, 방화벽에 정의된 서비스가 없는 경우에 한해서만 포트 번호로 정책을 등록하는 경우가 많기 때문이다. 가령, 위의 예시로 작성한 방화벽 정책은 'port port="80/tcp"' 대신 'service name="http"'로 작성을 하여도 동작한다. firewall-cmd에서 정의된 서비스와 프로토콜 정보는 각각 /etc/services와 /etc/protocols 파일을 참조하면 된다.

 

 

 

정상적으로 명령어가 입력되면 success라는 문구가 출력되며, --list-all로 현재 등록된 rich-rule을 확인해보면 방금 전 입력한 명령어의 정책 내용이 적용되어 있음을 확인할 수 있다.

 

 

 

정책의 추가 뿐만 아니라 삭제도 동일한 포맷으로 진행하면 된다. 단, 정책의 삭제는 반드시 rich-rule에 존재하는 구성 정보와 하나라도 다른 값이 정책 구성 정보에 입력된다면 삭제가 진행되지 않는다.

 

 

 

 

3.  rich-rule 추가/삭제 및 통신 확인

 

현재 필자가 방화벽 작업을 진행한 Linux는 웹 서버로 동작하고 있다. 따라서 방화벽이 개방만 된다면 웹 페이지에서 필자의 웹 서버가 제공하는 웹 화면을 볼 수 있게 된다. 하지만 필자는 다른 사람이 필자의 웹이 제공하는 정보를 아무나 보기 원하지 않기 때문에 필자의 윈도우 PC에서만 접속이 가능하도록 허용해주려고 한다.

 

----

웹 서버 IP: 192.30.1.3

필자 Windows IP: 192.30.1.1

Ubuntu 서버: 192.30.1.4

----

 

위에서 가정한대로 방화벽 정책을 작성한다면, 아래의 명령어를 windows와 ubuntu에서 실행했을 때, 서로 다른 결과가 나와야 한다.

 

1
2
3
# 원격지 HTTP 웹 서버 정보 호출
 
curl -v http://192.30.1.3
cs

 

 

현재는 방화벽이 개방된 상태가 아니기 때문에 두 OS 모두 "Trying..."이라는 문구만 출력되며 대기 중인 상태로 나타나다가 접속할 수 없다는 문구가 출력된다.

 

 

 

여기서 Ubuntu만 웹 페이지 정보를 가져갈 수 있도록 위에서 작성한 rich-rule을 적용해보자. 그럼 방금 전과 달리, Ubuntu에서는 웹 페이지 정보를 고스란히 화면에 출력하는 것을 확인할 수 있다.

 

 

 

이번에는 반대로 방금 생성한 rich-rule을 삭제하고 window에서 접속할 수 있게 수정해보려한다. 그러면 윈도우에서는 웹 브라우저를 통한 페이지 확인도 가능해진다(Ubuntu는 필자가 Desktop 버전으로 설치하지 않아서 웹 브라우저가 없다..).

 

 

 


 

 

Fin.

반응형

댓글