1. 방화벽이란?
컴퓨터를 사용하다 보면, 간간히 "방화벽"이라는 용어와 함께 뭔가 팝업이 뜨는 것을 본 적이 있을 것이다. 일상적인 생활에서의 방화벽은, 화재 발생 시 화재가 다른 구역으로 번지지 못하도록 막아주는 벽을 의미한다. 컴퓨터에서의 방화벽은 의미는 약간 다르지만, 건물의 방화벽과 마찬가지로, 무언가 문제가 될 만한 것이 내 컴퓨터로 흘러들어오지 못하게 차단하는 역할을 한다는 점에서 건물의 방화벽과 유사하다.
그럼, 컴퓨터의 방화벽은 무엇을 차단하는 것일까? 컴퓨터로 위험한 무언가가 흘러 들어온다는 의미는, 크게 두 가지 상황을 가정할 수 있는데, 하나는 USB나 CD처럼, 특정 저장 매체 내에 존재하는 악성 프로그램이 직접 유입되는 경우, 또 다른 하나는 외부 인터넷과 연결된 LAN 선으로 악성 프로그램이 유입되는 경우다. 방화벽의 경우는 후자의 상황이 벌어지는 것을 방지하는데, 통신 시 생성되는 패킷의 내용을 확인하여 해당 패킷을 통과시킬지 차단할지 판단한다. 방화벽이 통신 패킷을 통과/차단시키기 위해서는, 해당 패킷들에 대한 규칙이 정의되어 있어야하는데, 방화벽에서 사용자가 수행하는 작업의 99%가 이 규칙을 정의하는 것이라고 보면 된다.
인터넷으로 통신이 가능한 대부분의 컴퓨터는 OS에 자체 방화벽 기능을 탑재하고 있다. 윈도우의 경우, "고급 보안이 포함된 window defender 방화벽"이라고 시작 버튼 옆의 검색창에 입력하면 확인할 수 있다. 리눅스의 경우, 네트워크에 특화되어 만들어진 운영체제이므로 당연히 방화벽 기능을 지원한다. 먼저, 윈도우를 통해 방화벽이 어떻게 기능하는지 확인해보자.
윈도우에서 "고급 보안이 포함된 어쩌구"를 검색해서 창을 띄우면, 위와 같이 window defender 방화벽 창이 나타난다. 이 윈도우 방화벽 창은 크게 세 부분으로 나뉜다.
가장 왼쪽은 정책 목록을 나타낸다. 인바운드 규칙은 외부로부터 내 컴퓨터로 들어오는 통신에 대한 정책을 정의하며, 아웃바운드 규칙은 반대로 내 컴퓨터에서 외부로 나가는 통신에 대한 정책을 정의한다. 가운데 부분은 각 정책(인바운드 / 아웃바운드 등)에 정의되어 있는 세부 규칙을 보여준다. 가장 우측은 규칙을 추가하거나 삭제하는 등의 작업을 지원하는 기능을 제공한다.
아웃바운드 규칙을 하나 만들어 적용함으로써, 방화벽이 어떻게 작동하는지 알아보자. 현재 필자의 윈도우 방화벽은 기본값으로 설정된 상태이며, 따라서 필자의 리눅스 서버로 ssh 접속이 가능한 상태다.
필자는 이제, 윈도우의 아웃바운드 규칙에서 SSH 접속을 허용하는 모든 통신에 대해 통과를 불허하는 규칙을 작성하여 적용할 것이다. 먼저 왼쪽의 아웃바운드 규칙을 클릭하고 우측의 새 규칙을 클릭한다.
새 규칙을 클릭하면, 아래의 화면과 같이 만들려는 규칙의 종류를 설정하라는 문구가 나온다. 우리는 외부로 나가는 SSH 정책에 대해서만 차단을 진행하려 하기 때문에, TCP/UDP 포트 규칙에 대해 정의할 수 있는 "포트"를 선택해야 한다. SSH는 TCP/22번 포트를 사용하니 말이다.
다음을 누르면, 어떤 프로토콜의 어떤 포트에 대한 규칙을 적용할 것인지 설정하는 화면이 나타난다. 우리는 SSH(TCP/22)에 대해 통신 규칙을 정의할 것이기 때문에 아래와 같이 TCP 규칙을 선택하고, 특정 원격 포트에 22를 입력하면 된다.
다음으로는, 우리가 지정한 통신에 대해 허용할 것인지 / 차단할 것인지를 설정하는 화면이 나온다. 우리의 윈도우에서 어떠한 SSH 접속도 가능하지 않도록 만들기로 했으므로, "연결 차단"을 선택한다.
다음으로는 어떤 도메인에 대해 우리가 정의한 규칙을 지정할 것인지 물어보는데, 네트워크에 대해 따로 도메인을 지정하지 않은 상태라면 전부 선택한 뒤 다음을 클릭하자.
마지막으로 우리가 만든 규칙의 이름 및 이 규칙이 무엇인지 작성하는 화면이 나온다. SSH 접속을 차단하는 규칙이기 때문에 이름은 "00_SSH_deny"으로 지정하며, 설명에는 "이 컴퓨터에서 외부 ssh 접속 차단"이라고 작성하고 저장한다. 저장하면, 다음과 같이 새로 만든 규칙이 가장 상단에 위치하는 것을 확인할 수 있다.
규칙이 등록된 상태에서 다시 리눅스로 SSH 접속을 시도하면 다음과 같이 접속이 되지 않는 것을 확인할 수 있다.
다시 우리가 만든 규칙을 삭제하고 SSH 접속을 시도하면 방금 전과 달리 접속이 잘 이루어지는 것을 확인할 수 있다.
2. 리눅스 방화벽 서비스: firewalld
리눅스도 윈도우와 유사한 방화벽 기능을 제공한다. 인바운드 및 아웃바운드 대신 INPUT, OUTPUT이라는 정책 목록을 가지며 정책 내 규칙 역시 출발지 IP / 목적지 IP / 서비스 포트 등을 지정하여 해당 통신을 허용 / 차단하는 기능이 있다. 차이점이라면, 윈도우와 다르게 명령어로 이 규칙들을 정의해야한다는 점과, 윈도우에서 제공하지 않는 세션에 대한 설정을 정의할 수 있다는 점 등이 있다. 이건 뒤에서 천천히 살펴보고....
리눅스에서 동작하는 방화벽 역시, 앞서 보았던 SSH, HTTP, 그리고 DNS 처럼 하나의 서비스처럼 동작한다. 서비스 이름은 firewalld로 지정되어 있으며, 현재 리눅스에서 방화벽 서비스가 동작하는지의 여부는, systemctl 명령어를 아래와 같이 사용하여 확인할 수 있다.
# systemctl status firewalld
만약, 해당 서비스가 나타나지 않는다는 문구가 뜬다면, rpm 및 yum 명령어로 firewalld 서비스가 리눅스 내에 존재하는지 확인하고 없는 경우, yum install firewalld 명령어로 해당 서비스 패키지를 설치해주자.
방화벽도 하나의 서비스로 동작하기 때문에, firewalld 역시 설정 파일이 따로 존재한다. 이 파일은 /etc/firewalld 경로에 firewalld.conf라는 이름으로 저장되어 있다. 다른 서비스들과 달리, firewalld의 설정 파일은 볼 만한 내용이 많지 않다.
3. 방화벽 정책 확인 및 수정 명령어: iptables
윈도우에서 설정된 방화벽 규칙을 확인하기 위해, "고급 보안이 포함된 window defender 방화벽"을 실행하면 되었다. 그럼, 리눅스에 설정되어 있는 방화벽 정책은 어디서 확인할 수 있을까?
방화벽 정책을 확인할 수 있는 명령어로 iptables가 있다. 이 명령어는 현재 설정되어 있는 방화벽 정책 / 규칙을 확인하는 것 뿐만 아니라, 옵션을 사용하여 정책과 규칙을 생성, 수정하거나 삭제하는 작업이 가능하다. 이 명령어는 특이하게도 옵션 없이 사용하면 명령어가 실행되지 않는다.
iptables 명령어를 사용하는 방법은 "iptables -h"를 입력함으로써 확인할 수 있다.
옵션이 많기 때문에, firewalld에서 제공하는 기능에 맞춰 이 옵션들에 대한 설명을 작성해보려 한다.
(1) 방화벽 정책 확인: iptables -L
현재 리눅스에 설정되어 있는 방화벽 정책을 확인하는 명령어 및 옵션은 "iptables -L"이다. iptables -h 에서 옵션 L에 대해 찾아보면 나오겠지만, L은 list의 약자로 방화벽 정책 및 규칙 리스트를 쭈욱 나열하는 옵션이다.
그런데, 방화벽 정책 / 규칙 리스트를 쭉 보다보니, 윈도우와 달리 포트 번호가 정확히 명시되지 않은 것을 알 수 있다. DNS 서비스의 경우, 53이라는 포트 번호 대신 domain이라는 단어가 들어가 있고, http 역시 포트 번호인 80 대신 http로 작성된 것이 보인다. 이들 포트를 서비스 이름이 아닌 포트 번호로 표현하기 위해, option에 'n'을 추가해 리스트를 확인하면 된다.
# iptables -nL
나열된 방화벽 정책의 내용을 보면, 윈도우의 방화벽 정책 화면과 매우 유사하다. 위의 화면에 출력된 내용은 크게 5부분으로 나누어 확인해보자.
(2) 리눅스 방화벽 정책 목록: Chain
윈도우에서 방화벽의 정책 종류는 인바운드와 아웃바운드에 대한 정책 2가지가 존재한다고 언급했다. 리눅스 역시 내 컴퓨터로 들어오는 통신과, 내 컴퓨터에서 나가는 통신에 대한 정책이 존재하는데, 윈도우에서 정책이라고 사용하는 단어를 리눅스 방화벽에서는 체인(chain)이라는 용어로 사용한다.
리눅스에서 기본 체인은 크게 3가지가 존재한다. INPUT, OUTPUT 그리고 FORWARD. INPUT과 OUTPUT은 윈도우 방화벽의 인바운드와 아웃바운드에 해당하는 개념이고, FORWARD는 내 리눅스 PC를 경유하는 패킷에 대한 정책을 정의하는 chain이라고 생각하면 된다. 보통 FORWARD 같은 경우, 리눅스 시스템을 이용하는 네트워크 장비(스위치, 라우터 등)에 많이 사용하며, 서버처럼 말단에 위치한 리눅스의 경우, FORWARD 정책을 사용할 일이 거의 없다.
(3) Target
Chain 아래에는 해당 정책 내에 정의된 규칙이 표시된다. 가장 맨 첫 줄에는 이들 규칙이 무엇을 의미하는지 표시해놓았는데, 가장 첫 필드의 이름이 target으로 되어 있다. 이 target은 각 줄에 정의된 규칙을 어떻게 처리할지에 대해 나타낸 부분이라고 보면 된다. target에 들어갈 수 있는 기본값은 ACCEPT(허용) / Drop(드랍) / Reject(거부) 세 가지가 존재한다. ACCEPT와 REJECT는 해당 규칙과 일치하는 통신을 허용하거나 거부한다는 설정이 되어 있다는 의미이며, DROP은 규칙과 일치하는 통신 패킷을 버리는 것으로 설정되어 있다는 의미다. 처음에는 DROP과 REJECT의 차이가 매우 헷갈리는데, 이 두 용어를 ping 통신으로 비교해보면 조금 더 쉽게 이해할 수 있다.
REJECT target의 규칙은, 되돌려주어야 하는 통신 패킷이 존재할 때, 통신을 요청한 PC에 "우리는 이 통신에 대해 거부하라는 내용"을 패킷으로 돌려준다. 따라서, ICMP 규칙이 REJECT로 설정된 경우, 아래와 같이 "대상 포트에 연결할 수 없습니다"라는 문구가 ping 응답 내용으로 돌아오게 된다.
반면, 이 정책이 DROP으로 지정되면, ping 응답 자체가 ping 요청을 한 PC로 돌아가지 않게 된다.
(4) prot, source, destination(프로토콜, 출발지 IP, 목적지 IP)
prot, source, destination은 규칙에 들어갈 프로토콜 종류, 출발지 / 목적지 IP를 나타낸다. 출발지 및 목적지 IP를 명시하지 않는 경우, 기본값으로 0.0.0.0/0 이 입력되는데, 이는 모든 IP를 의미한다. 즉, 다음 규칙의 경우
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
임의의 출발지 IP에서 요청한 SSH 통신 패킷이 임의 목적지 IP로 들어오는 경우, 해당 통신 패킷은 모두 DROP 한다는 의미다.
(5) 기타 규칙 내용
가장 우측에는 규칙에 대한 세부 내용이 작성된다. 포트 번호 또는 패킷의 세션 종류 등이 가장 오른쪽 부분에 표시된다 (세션 종류에 대한 방화벽 규칙 설정 내용은 다다음 포스팅에서 진행하려 한다). 즉, 앞의 4가지 규칙 내용에 대해서 확인할 수 없는 세부 내용을 가장 오른쪽 영역에서 확인할 수 있다고 생각하면 된다.
이번 포스팅에서는 윈도우 방화벽을 통해 방화벽이 무엇인지, 그리고 리눅스의 방화벽 서비스와 방화벽 규칙 구성에 대해 살펴보았다. 다음 포스팅에서는 오늘 내용을 바탕으로 리눅스 방화벽의 정책(Chain) 및 규칙 생성 / 수정 / 삭제 방법에 대해 알아보고, 규칙 변경에 따른 결과를 확인해보려 한다.
FIN.
'IT Security > LINUX Basic' 카테고리의 다른 글
28. Linux - 리눅스 방화벽3, 방화벽 규칙(rule) 관련 명령어 (0) | 2020.08.11 |
---|---|
27. Linux - 리눅스 방화벽2, 방화벽 정책(chain) 관련 명령어 (0) | 2020.08.11 |
25. Linux - DNS 서버 구축 3, Zone 파일 생성 및 구축 결과 확인 (0) | 2020.08.02 |
24. Linux - DNS 서버 구축 2, 패키지 및 DNS 설정 파일 (0) | 2020.07.27 |
23. Linux - DNS 서버 구축1, 개요 (0) | 2020.06.13 |
댓글