들어가며

리눅스 서버에 도커 환경을 구축해서 애플리케이션을 배포하고 싶어, 리눅스에 대해 지식이 전무하지만 부딪히면서 배워보자는 생각에 무작정 리눅스 서버를 설치하고 도커를 설치하였습니다. 그리고 ufw 를 사용하여 원격 접속과 관련해서 설정을 해 준다음 테스트 삼아 도커 컨테이너를 띄웠는데, 해당 포트를 허용하지 않았음에도 컨테이너로 접속되는 것을 발견할 수 있었습니다. ( 원인과 해결 방법에 관련해서는 이후의 포스팅에서 다루어보겠습니다. )

어찌저찌 구글링을 통해서 여러 방법과 시행착오를 겪으면서 결국에 도커에 방화벽 설정을 적용하는데에 성공하였습니다. 또 구글링을 통해 해결해보려했지만 해당 부분에 대해서 자료도 별로 없어서 진척이 잘 안되던 중에, 너무 도커와 ufw 에 매몰되어 있다는 생각이 들었습니다.

리눅스에서 방화벽이 어떤 구성으로 되어 있고 어떻게 동작하는지, 네트워크의 흐름을 어떻게 제어하는지에 대한 이해없이 무작정 해결방법만 찾고 무작정 적용해보니 잘 안 되는것 같다는 생각이 들어, 문제를 잠시 내려놓고 기초 지식을 먼저 쌓아야 겠다는 생각이 들었고, 필요한 지식들을 쌓아가면서 결국에는 오류없이 도커에 방화벽을 적용할 수 있게 되었습니다.

그러한 과정을 글로 남기고 싶었고, 그 첫번째를 linux 를 설치하면 기본적으로 같이 설치되는 iptables 에 대한 글로 시작하려 합니다. 이제 막 리눅스를 공부하고 있는 단계라 틀린 부분이 있으면 언제든지 지적해주시면 감사히 배우겠습니다. ( 여러 글들을 참고하였고 글 맨마지막 부분에 링크 걸어두었으니 들어가서 읽어보셔도 좋을꺼 같습니다. )

IPTABLES

iptables 는 리눅스의 방화벽 역할을 합니다. 그럼 방화벽이란 무엇일까요? 방화벽은 network traffic 을 filtering 해 주는 유일한 방법입니다. 즉, linux 에서는 ipatbles 를 통해 네트워크 트래픽을 통제 하는 것이죠. 참고로 위에서 언급한 ufw 는 이런 iptables 를 직접 사용하기에는 다소 어려워 더 쉽고 직관적이게 설정할 수 있게 해주는 도구입니다.

더 자세히 이야기하면, iptables 가 직접 packet 등을 filtering 하면서 네트워크를 통제하지는 않습니다. 실제로 리눅스 커널에 탑재된 netfilter 기능이 이러한 역할을 수행하고 iptables 를 통해 netfilter 의 규칙을 구축하는 것일 뿐입니다. 즉, iptables 는 netfilter 의 룰셋구축 툴입니다. ( iptables 가 네트워크를 통제한다는 표현을 쓰더라도 실제로는 룰셋구축 툴을 통해서 netfilter의 룰을 설정해준다라고 이해해주시면 될꺼 같습니다. )

iptables 는 terminal interface 이기 때문에 명렁어를 통해서 네트워크의 흐름을 통제하기 위한 규칙을 설정할 수 있고 이러한 설정을 통해 특정 네트워크를 막거나 또는 허용함으로써 리눅스 서버를 더욱 안전하게 구축할 수 있게 됩니다. 보안은 네트워크 환경에서 상당히 중요한 요소 중 하나이기 때문에 ipatbles 를 이해하고 사용할 줄 알아야 하는 것이죠. ( 리눅스 서버는 매우 안전하지만, 인터넷 세계에는 워낙 방대하기 때문에 더욱 보안적인 요소를 강화시킬 필요가 있습니다. )

참고로, iptables 는 특정 ip address 에 대해 허용 또는 막는 등의 설정 테이블을 만든다 해서 붙여진 이름입니다.

IPTABLES 의 구성 요소

iptables 동작 방식을 이해하기 위해서는 당연히 iptables 이 사용하는 개념(구성요소) 에 대해서 알고 있어야 합니다. iptables 에는 3가지의 중요한 개념이 있는데 아래와 같습니다.

  • Tables
  • Chains
  • Rules

각각에 대해서 알아보겠습니다.

Tables

Tables 는 Rule 과 Chain들을 정의한 그룹입니다. Iptables 는 table 을 5개 가지고 있고 이 5개는 3개의 main 과 2개의 sub 로 나뉘게 됩니다. main, sub 라는 말 그대로, 3개의 main table 이 주요 기능을 가지고 있고 sub 는 보조 기능을 가지고 통제를 합니다. 먼저 3가지 main table 부터 알아보겠습니다.

  • Filter table : main 테이블 중에서도 default 테이블로 별다른 설정이 없다면 default 테이블인 filter table 이 적용됩니다. filter table 은 packet 을 filtering 하는 규칙들의 그룹
  • NAT table : NAT 은 Network Address Translation 의 약어로, 이름 그대로 네트워크 주소를 변환하는 규칙들의 그룹
  • Mangle table : packet의 IP headers 를 변경하는 규칙들의 그룹

다음의 2가지는 sub table 입니다. 간단하게 알아보겠습니다.

  • RAW table : 해당 테이블은 connection tracking 에 사용되는 테이블입니다. packet 을 mark 하고 어떤 connetion or session 의 packet 인지를 파악할 수 가 있습니다.
  • Security table : 보안 테이블은 패킷에 내부 SELinux 보안 콘텐츠 마크를 전송하는 데 사용되며, 이는 SELinux 또는 SELinux 보안 컨텍스트를 해석할 수 있는 다른 시스템이 이러한 패킷을 처리하는 방식에 영향을 미칩니다.

Chains

Chains 는 이름에서 알 수 있듯이 packet 이 지나는 경로(흐름) 의 특정 지점에 규칙들의 연결을 말합니다. Iptables 는 그 특정 지점이 어떤 위치에 있냐에 따라 다음의 5개의 chain 으로 구분합니다.

  • Pre Routing : incoming packet 이 시스템 내부로 막 진입했을 때의 point
  • Input : 시스템 내부로 들어올 때 pre routing 을 거친 다음의 point
  • Forward : pre routing을 거친 다음 forward 로 시스템 외부로 나갈 때의 point
  • Output : 시스템 내부에서 외부로 나갈 때의 point
  • Post Routing : pre routing 의 반대로, output, forward 등으로 packet 이 외부로 빠져나가기 직전의 point

이를 쉽게 이해하기 위해 그림으로 나타내면 다음과 같습니다.

figure 1

다시 tables 로 돌아가면 tables 은 Rule 과 Chain의 그룹입니다. 이 때 여러 테이블에 정의되어 있는 postrouting chain 에 대한 rule 들을 가지고 연결하게 되면, packet 이 postrouting point 에서 해당 chain 들을 거치면서 컨트롤 되는 것이죠.

figure 2

하지만 여기서 중요한 점은 어떤 table 이냐에 따라 설정할 수 있는 chain 에 제한이 있다는 것입니다. 각각의 main 테이블이 어떤 Chain 에 대한 rule 을 추가할 수 있는지는 아래와 같습니다.

  • Filter table : input, output, forward
  • NAT table : prerouting, ouput, postrouting
  • Mangle table : prerouting, input, output, forwarding, postrouting

위의 제한에 따라 연결된 Table 들은 해당 Chain 내에서 순서에 따라 자신이 가지고 있는 규칙을 packet 에 매칭해보고 일치하면 적용시키는 것이죠.

Rules

Table 은 규칙(Rule)들과 Chain들의 그룹이라고 하였는데 그 규칙이 바로 사용자가 네트워크 트랙픽을 관리하기 위해서 정의하는 명령이 입니다. packet 이 들어오면 각각의 chain 에서 연결된 table 을 순차적으로 돌면서 테이블에 정의된 규칙에 매칭이 되면 action 을 수행하고 매칭이 안되면 다음 rule 또는 table 로 넘어가게 됩니다. 이러한 Rule 은 두개의 component 를 가지고 있습니다.

  • matching component : 허용가능한 packet 의 상태. ex. protoco type, IP address, interface header, …
  • target component : packet 이 rule 에 매칭되었을 때의 action. 이 action 에 따라 target 은 또 2 가지의 target 으로 나누어지게 됩니다.
    • Terminating targets : 특정 chain 에서 이 action 을 끝으로 더 이상 Chain 을 돌 지 않게 되는 action. : Accept, Drop, Queue, Reject, Return
    • Non-terminating targets : 해당 action 이 후에도 계속해서 chain 을 도는 action

적용 순서

각각의 chain에서 테이블의 rule 들이 어떤 순서로 거쳐가는지 살펴보겠습니다.

figure 3

위의 표를 보면 각각의 chain 에 따라 어떤 테이블의 규칙들이 먼저 적용되는지를 알 수 있습니다. 원치않는 iptables 의 동작을 막기 위해서는 각각의 chain 에서 테이블이 어떤 순서로 규칙들을 불러오는지를 알고 있어야 합니다.

정리

리눅스는 커널에 탑재된 netfilter 를 이용하여 해당 시스템으로 들어오는 네트워크 packet 을 통제하고 다룹니다. 이 때 iptables 라는 룰셋업 툴을 사용하여 netfilter 의 규칙을 구축하게 됩니다. 이런 iptables 는 네트워크의 흐름에 따라 해당하는 chain 을 지나게 되는데 chain은 테이블들이 연결된 것이고 더 세세하게 본다면 결국은 규칙들이 연결된 것입니다. ( table 은 규칙들이 모인 그룹이기 때문에 )

이렇게 각각의 규칙들을 지나면서 최종적으로 해당 요청에 대한 packet 을 거부 또는 받아들일 것인지에 대한 결정을 함으로써 시스템 내부의 보안을 더 강화시키는 방화벽의 역할을 수행할 수 있게 됩니다. 다음 글에서는 요번 글에서의 개념을 토대로 iptables 에 여러 명렁어 들을 살펴보면서 어떻게 규칙을 다루는지에 대해서 알아보겠습니다.




Reference

https://data-flair.training/blogs/what-are-iptables-in-linux/
https://andrewpage.tistory.com/38
https://m.blog.naver.com/skauter/220052866346
https://tommypagy.tistory.com/581