리눅스나 유닉스계열 서버의 접근통제 정책을 얘기할 때 iptables와 tcp wrapper를 많이 언급하고 그 둘의 장단점을 비교하지요. 보안기사에서도 시험에 종종 나오구요.


tcp wrapper는 inetd 데몬에서 처리하는 접근제어이고, 여기서는 iptables로 많이 알려진 기능을 지원해주는 netfilter의 개념을 설명하고자 합니다.


netfilter 개요

리눅스 커널소스를 보면, 네트워크관련 소스가 전체의 1/3 정도를 차지합니다. 그만큼 네트워크의 비중이 높다는 뜻인데요, 그 중에서도 netfilter는 리눅스 커널모듈로서 네트워크 패킷을 처리하기 위한 프레임워크입니다.


주요 제공 기능

  • NAT(Network Address Translation) : 사설IP와 공인IP를 변환해주거나 포트변환 등
  • Packet filtering : 특정 패킷을 차단 또는 허용하는 기능. 서버의 접근제어 또는 방화벽기능 구현 가능
  • packet mangling : 필요시 패킷 헤더의 값을 변경

netfilter 구조
netfilter는 커널에서 패킷을 처리하는 과정에 필요하면 룰에 따라 처리해줄 수 있도록 5군데의 후킹(hook)지점을 제공합니다. 패킷 처리과정에 내가 원하는 지점에서 원하는 패킷처리를 할 수 있도록 지원하는 것이지요.





위에서 말한 5곳의 후킹지점은 위 그림의 kernel space에 해당하는 PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING 입니다.


각 후킹지점의 주요기능을 간단하게만 설명하겠습니다.
  • PREROUTING : 인터페이스를 통해 들어온 패킷을 가장 먼저 처리. 목적지 주소의 변경(DNAT)
  • INPUT : 인터페이스를 통해 로컬 프로세스로 들어오는 패킷의 처리(즉, 패킷을 받아 처리할 프로세스가 내 시스템에서 동작하는 경우). INPUT에서 패킷 처리(차단/허용) 후 user space의 프로세스로 전달
  • OUTPUT : 해당 프로세스에서 처리한 패킷을 밖으로 내보내는 패킷에 대한 처리(차단/허용)
  • FORWARD : 다른 호스트로 통과시켜 보낼 패킷에 대한 처리(차단/허용). 방화벽이나 IPS 등과 같이 내가 수신하는 패킷이 아니고 지나가는 패킷을 처리
  • POSTROUTING : 인터페이스를 통해 나갈 패킷에 대한 처리. 출발지 주소의 변경(SNAT)

iptables을 이용하여 netfilter에 룰을 넣자
커널에서 동작하는 netfilter에 내가 원하는 접근통제를 할 수 있도록 룰을 넣어야 할텐데 어떻게 할까요? iptables를 이용하면 됩니다. iptables는 netfilter에 룰을 넣을 수 있는 단순한 user space의 실행프로그램입니다.
iptables의 구체적 사용방법은 별도로 한 번 검색해보시구요, 여기서는 간단한 사용법만 보겠습니다.

iptables commnad 종류
  • -A : add rule to chain
  • -D : delete rule from chain
  • -I : insert rule
  • -R : replace rule
  • -F : flush all rules
  • -L : list all rules
  • -N : create a new chain
  • -X : delete user defined chain
  • -P : set default target

아래와 같이 실행하면 현재 netfilter의 룰을 조회할 수 있습니다.

> iptables -L

예를 들어, 현재 서버에 telnet 서비스(tcp 23)를 차단하고 싶다면 아래와 같이 실행하면 됩니다.

> iptables -A INPUT -p tcp --dport 23 -j DROP

그 다음 "iptalbes -L"을 실행하여 룰을 조회하면 위의 룰이 추가된 것을 볼 수 있고, 현재 서버에 telnet서버가 떠있건 말건 외부에서 현재 서버로 telnet(tcp 23) 접속은 차단됩니다.

(iptables 사용법은 반드시 다른 자료를 참고하여 더 숙지해주세요)


netfilter 활용 예시
두 가지 활용에 대해서 설명하겠습니다. 첫째는 서버입장에서 서버로 들어오고 나가는 네트워크 패킷에 대한 통제를 하는 경우(내부방화벽), 두번째는 netfilter를 이용하여 네트워크기반의 방화벽을 구현하는 경우입니다.

① 서버의 내부 방화벽(접근통제)

서버로 들어오는 네트워크 패킷 또는 서버에서 나가는 네트워크 패킷을 통제하고자 할 경우 아래 그럼처럼 INPUT과 OUTPUT 필터에 정책을 적용하여 구축가능합니다.

INPUT은 서버에서 동작하는 네트워크 프로세스에게 전달되기 전에 패킷을 처리하고, OUTPUT은 네트워크 프로세스에서 나가는 패킷을 처리합니다.



② 네트워크기반의 방화벽 구현

대부분 로컬 시스템으로 들어오거나, 로컬 시스템에서 나가지 않는 패킷을 핸들링하는 경우는 드물죠. 나의 패킷은 아니지만, 지나가는 패킷을 통제해야하는 경우가 있는데 방화벽이나, IPS 등이 대표적입니다.
방화벽의 기본적인 기능을 가진 경우 출발지IP/출발지PORT/목적지IP/목적지PORT/프로토콜 등으로 지나가는 패킷을 정책에 따라 허용 또는 차단을 하지요. 이러한 룰을 iptables를 이용하여 netfilter의 FORWARD에 적용하면 됩니다. 참고로, NAT를 구현하기 위해서는 PREROUTING과 POSTROUTING를 이용하면 됩니다.


 
FORWARD를 이용하여 방화벽을 구현한다는 의미를 좀 그려봤습니다.(펜으로 직접 그려봤는데 참 허접하네요..ㅎㅎ)


장비에 포트 2개가 있다면 지나가는 패킷이므로 한 포트로 들어가서 다른 한 포트로 나갈것이고 그 과정에 FORWARD에서 패킷을 허용한 것만 나갈 수 있겠죠.



정리


기억해 둘 것만 정리해보겠습니다.
  • 커널모듈로 네트워크 패킷을 처리할 수 있는 프레임웍이 있는데 그걸 netfilter라고 하는구나.
  • netfilter는 INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING이라는 5개의 hook(후킹)지점을 제공하는구나.
  • INPUT, OUTPUT은 내 서버의 로컬 프로세스로 전달하거나 로컬 프로세스에서 나가는 패킷들에 대한 처리를 할 수 있어서 내 서버를 보호하기 위한 접근통제에 사용할 수 있구나.
  • FORWARD는 방화벽이나 IPS 등과같이 나의 시스템과는 관련은 없지만 지나가는 패킷을 처리할 때 네트워크 접근통제 정책을 설정할 수 있구나. 그리고 PREROUTING와 POSTROUTING은 NAT할 때 사용할 수 있구나.
  • netfilter에 내가 원하는 정책을 넣어야 하는데 그럴 때 사용하는 프로그램이 iptables라는 것이구나. iptables은 그냥 룰을 넣고 조회하는 단순한 프로그램이구나.
  • netfilter는 커널에서 통제를 하기 때문에 tcp wrapper처럼 어플리케이션 레벨에서 접근통제하는 것보다 우선순위가 높고 보안성이 우수하겠구나. 





'네트워크 보안 이야기' 카테고리의 다른 글

가상랜 VLAN  (0) 2017.01.21
L2 스위치, L3 스위치, L4 스위치, L7 스위치  (3) 2017.01.15
OSI 7 계층 vs TCP/IP 계층  (0) 2017.01.15
IPS vs IDS  (0) 2017.01.09