개요
리눅스 커널에서 네트워크 패킷의 라우팅이 수행될 때, 특정 지점마다 패킷을 가로채(후킹, 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/
'Linux' 카테고리의 다른 글
리눅스 커널 타이머, Linux Kernel Timer (Kernel 3.18.44) (0) | 2023.05.27 |
---|---|
CLI 환경 SVN Rollback 방법 (0) | 2023.05.17 |
Python에서 C함수 사용해서 리턴값 받기 in Linux (2) | 2022.09.02 |
Linux 커널에서 Built-in 모듈간의 IPC 방법 (+TCP Cwnd 제어) (0) | 2022.08.30 |
Linux 커널버전 4.x, 5.x의 proc 파일 시스템 예제 코드 (0) | 2022.08.30 |