개요

리눅스 커널에서 네트워크 패킷의 라우팅이 수행될 때, 특정 지점마다 패킷을 가로채(후킹, Hooking) 어떠한 동작을 가할 수 있다. 그러한 지점을 Hooking Point 라고 하며, 이것은 Netfilter Framework를 통해 지원된다.

 

리눅스의 방화벽 유틸리티 중 iptable 이라고 불리는 유틸리티가 있는데, 이 유틸리티가 바로 Netfilter Framework를 통해 구현되었다고 볼 수 있다. 

 

다시 말해, iptable 유틸리티는 Netfilter Framework에서 제공해주는 여러 Hooking Point에서 패킷을 가로채 이것을 컴퓨터로 흘러 들어가게 할 지(Accept) 아니면 삭제할 지(Drop)를 결정하게 된다.

 

본 페이지에서는 이러한 iptable과 Netfilter Framework의 구조와 더불어 Netfilter Hooking Point에 대해서 알아보도록 한다.

 

 

Iptables과 Netfilter Framework의 구조

 

Netfilter는 리눅스의 방화벽 관련 프로젝트를 통칭하는 이름이라고 할 수 있다. 이 Netfilter 프로젝트에서 상위 Layer에 여러 방화벽 유틸리티가 존재하며, 하위 Layer에 이러한 여러 방화벽 유틸리티를 지원해주기 위한 Hooking Point 지점을 커널 API로 제공하는 것을 확인할 수 있다. 

 

Hooking Point에는 기본적으로 PRE_ROUTING, LOCAL_IN, LOCAL_OUT, FORWARD, POST_ROUTING 이라는 5가지 지점이 존재하며, 아래에서 각 지점에 대한 설명을 진행한다.

 

Netfilter Hooking Point

 

 

  • PRE_ROUTING
    : NIC로 부터 들어온 패킷이 라우팅되기 전에 발생되는 Hooking Point
  • LOCAL_IN
    : 패킷의 도착지가 현재 컴퓨터일 경우 발생하는 Hooking Point
  • LOCAL_OUT
    : 패킷이 User App에서 출발하여 네트워크 스택을 타기전에 발생하는 Hooking Point
  • FORWARD
    : 패킷의 도착지가 현재 컴퓨터가 아닐 경우 발생하는 Hooking Point
  • POST_ROUTING
    : 패킷이 NIC로 나가기 전에 발생하는 Hooking Point

 

  • ROUTING 1
    : 패킷의 도착지가 현재 컴퓨터인지 아니면 다른 곳인지 확인하는 곳
  • ROUTING 2
    : 패킷이 DNAT(Destnation NAT)될 경우 라우팅하는 곳

 

이렇듯 Netfilter Framework는 커널에서 패킷이 라우팅될 때, 여러 지점에서의 패킷 Hooking을 통해 Accept 및 Drop을 결정할 수 있게끔 지원해준다.

 

다시 말해, iptable과 같은 리눅스 방화벽 유틸리티 뿐만 아닌 직접 리눅스 커널 모듈을 만들어서 마찬가지로 특정한 패킷을 Accept하거나 Drop을 결정할 수 있다. 이러한 자료는 구글링으로 "넷필터 모듈"을 키워드로 자료를 찾으면 많은 자료가 있으니 참고하면 된다.

 

 

References

https://pr0gr4m.github.io/linux/kernel/netfilter/

https://ssup2.github.io/theory_analysis/Linux_netfilter_iptables/

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기