프로그래밍/리눅스 프로그래밍

[linux] netfilter 소개 및 동작 방식

jinkwon.kim 2023. 7. 9. 17:19
728x90
반응형

개요

linux의 netfilter가 무엇인지 알아보겠습니다. 

netfilter란?

Netfilter는 리눅스 커널에서 네트워크 패킷을 처리하는 프레임워크입니다

전체 구성도

https://en.wikipedia.org/wiki/Netfilter 에 잘나와 있습니다.

netfilter의 동작 구조 

5개의 chain과 5개의 table을 사용하여 packet을 제어 합니다.

좀더 풀어서 설명하면 각 chain에 여러개의 tabledmf 순차적으로 적용하여 packet을 제어 하는 것입니다.

chain

사용자에게 Hook을 걸수있는 point를 제공하니다.

각 chain에 대한 설명

종류 설명
PREROUTING 이 chain은 패킷이 커널을 통과하기 전, 즉 데이터링크 계층과 네트워크 계층 사이에서 작동합니다. 이 단계에서는 주로 Destination Network Address Translation (DNAT) 같은 작업이 일어납니다. PREROUTING chain은 모든 들어오는 패킷에 적용되며, 이 체인을 통과한 후에는 패킷은 라우팅 결정을 받게 됩니다.
INPUT 패킷이 로컬 시스템으로 라우팅되면, INPUT chain을 통과하게 됩니다. 즉, 시스템 자체가 목적지인 패킷에 대해 이 chain이 적용됩니다. 이 체인에서는 주로 시스템에 직접 들어오는 패킷의 필터링이 이루어집니다.
FORWARD 패킷이 시스템을 통과하여 다른 네트워크로 전달되어야 하는 경우, FORWARD chain이 적용됩니다. 즉, 이 chain은 시스템이 패킷의 최종 목적지가 아닌 중간 라우팅 포인트로 작용할 때 사용됩니다. 여기에서도 주로 패킷 필터링이 이루어집니다.

linux에서 ip forwarding 활성화
설정
$sudo sysctl -w net.ipv4.ip_forward=1

확인
sudo sysctl net.ipv4.ip_forward
OUTPUT 로컬 시스템에서 생성된 패킷이 네트워크 계층을 통과하기 전에, OUTPUT chain을 통과합니다.chain에서는 주로 생성된 패킷의 필터링이 이루어집니다.
POSTROUTING 패킷이 커널을 떠나기 전에 POSTROUTING chain을 통과하게 됩니다. 이 단계에서는 Source Network Address Translation (SNAT)과 같은 작업이 이루어집니다. POSTROUTING chain은 모든 나가는 패킷에 적용됩니다.

table의 기능 설명

적용 우선 순위 종류 설명
1 raw Connection Tracking 시스템을 우회하는 데 사용됩니다. 이 테이블은 PREROUTING과 OUTPUT 체인을 포함하며, 특정 패킷이 Connection Tracking 시스템에 의해 추적되지 않도록 할 수 있습니다.
2 mangle Mangle 테이블은 패킷 헤더를 변경하는 데 사용됩니다. 이 테이블은 PREROUTING, INPUT, FORWARD, OUTPUT, 그리고 POSTROUTING 체인을 포함하며, IP 헤더 필드(예: TTL, TOS)를 수정하거나, 특정 패킷을 특정 네트워크 큐로 마킹하는 등의 작업을 수행합니다.
3 nat NAT(Network Address Translation) 테이블은 주소 변환 작업을 담당합니다
DNAT (Destination Network Address Translation): 패킷의 목적지 IP 주소를 변환합니다. 이는 주로 외부에서 내부 네트워크로의 연결을 가능하게 하기 위해 사용됩니다. 예를 들어, 인터넷에서 내부 서버로의 연결을 허용하려면 DNAT를 사용하여 외부 IP 주소를 내부 네트워크의 IP 주소로 변환할 수 있습니다. DNAT 규칙은 주로 Netfilter의 NAT 테이블의 PREROUTING 체인에 추가됩니다.

SNAT (Source Network Address Translation): 패킷의 출발지 IP 주소를 변환합니다. 이는 주로 내부 네트워크에서 외부 네트워크로의 연결을 가능하게 하기 위해 사용됩니다. 예를 들어, 내부 네트워크의 호스트가 인터넷에 연결할 수 있도록 하려면 SNAT를 사용하여 내부 IP 주소를 외부 IP 주소로 변환할 수 있습니다. SNAT 규칙은 주로 Netfilter의 NAT 테이블의 POSTROUTING 체인에 추가됩니다.

Masquerade: SNAT의 특수한 형태로 동적으로 변하는 패킷의 출발지 IP주소를 변환합니다. 특히, 동적 IP 주소를 가진 인터페이스(예: PPP 연결 또는 DHCP를 통해 주소를 받는 인터페이스)를 위해 사용됩니다. Masquerade는 IP 주소가 변경될 때마다 자동으로 새 주소를 사용하도록 SNAT 규칙을 업데이트합니다. 이는 주로 소수의 공용 IP 주소와 많은 수의 사설 IP 주소 사이에서 트래픽을 라우팅해야 하는 경우에 유용합니다. Masquerade 규칙도 NAT 테이블의 POSTROUTING 체인에 추가됩니다.
4 filter Filter 테이블은 기본 테이블로, 시스템의 패킷 필터링을 담당합니다. 이 테이블은 INPUT, FORWARD, 그리고 OUTPUT 체인을 포함하며, 일반적으로 패킷을 수락할지 아니면 거부할지를 결정하는 규칙들을 가지고 있습니다.
5 security 리눅스 보안 모듈인 SELinux에 의해 사용되는 MAC(Mandatory Access Control) 네트워크 관련 규칙 적용

chaing 별 사용하는 table의 종료 

netfilter 조작 방법

iptables를 이용하여 조작 합니다. 

netfiler 예제

port forwarding

iptables를 사용하여 특정 포트로 들어오는 트래픽을 다른 포트로 포워딩하려면 NAT 테이블의 PREROUTING 체인에 규칙을 추가해야 합니다. 예를 들어, 모든 들어오는 트래픽을 80번 포트에서 8080번 포트로 리디렉션하려면 다음과 같은 명령을 사용할 수 있습니다:

 

$sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

 

위의 명령을 분석해보면 다음과 같습니다

  • -t nat: 이 옵션은 NAT 테이블을 사용한다는 것을 지정합니다.
  • -A PREROUTING: 이 옵션은 PREROUTING 체인에 규칙을 추가한다는 것을 나타냅니다.
  • -p tcp: 이 옵션은 TCP 프로토콜에 대한 규칙을 추가한다는 것을 나타냅니다.
  • --dport 80: 이 옵션은 목적지 포트가 80인 트래픽에 대한 규칙을 추가한다는 것을 나타냅니다.
  • -j REDIRECT: 이 옵션은 매칭되는 패킷을 리디렉션하겠다는 것을 나타냅니다.
  • --to-port 8080: 이 옵션은 리디렉션의 목적지 포트를 8080으로 지정합니다.

DNAT

iptables를 사용하여 외부에서 들어오는 트래픽을 내부 네트워크의 특정 IP로 DNAT(Destination Network Address Translation) 설정하려면, nat 테이블의 PREROUTING 체인에 규칙을 추가해야 합니다.

 

예를 들어, 모든 들어오는 트래픽을 1.1.1.1의 모든 포트에서 192.168.0.1의 같은 포트로 리디렉션하려면 다음과 같은 명령을 사용할 수 있습니다

 

$sudo iptables -t nat -A PREROUTING -d 1.1.1.1 -j DNAT --to-destination 192.168.0.1

 

위의 명령을 분석해보면 다음과 같습니다:

  • -t nat: 이 옵션은 NAT 테이블을 사용한다는 것을 지정합니다.
  • -A PREROUTING: 이 옵션은 PREROUTING 체인에 규칙을 추가한다는 것을 나타냅니다.
  • -d 1.1.1.1: 이 옵션은 목적지 IP 주소가 1.1.1.1인 트래픽에 대한 규칙을 추가한다는 것을 나타냅니다.
  • -j DNAT: 이 옵션은 매칭되는 패킷의 목적지를 변경하겠다는 것을 나타냅니다.
  • --to-destination 192.168.0.1: 이 옵션은 변경될 목적지 IP를 지정합니다.

SNAT

iptables를 사용하여 SNAT(Source Network Address Translation)를 설정하려면, nat 테이블의 POSTROUTING 체인에 규칙을 추가해야 합니다.

 

예를 들어, 내부 네트워크에서 외부로 나가는 모든 트래픽의 출처 주소를 1.2.3.4로 변경하려면 다음과 같은 명령을 사용할 수 있습니다

 

$sudo iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 1.2.3.4

 

위의 명령을 분석해보면 다음과 같습니다:

  • -t nat: 이 옵션은 NAT 테이블을 사용한다는 것을 지정합니다.
  • -A POSTROUTING: 이 옵션은 POSTROUTING 체인에 규칙을 추가한다는 것을 나타냅니다.
  • -o eth0: 이 옵션은 eth0 인터페이스를 통해 나가는 트래픽에 대한 규칙을 추가한다는 것을 나타냅니다.
  • -j SNAT: 이 옵션은 매칭되는 패킷의 출처 주소를 변경하겠다는 것을 나타냅니다.
  • --to-source 1.2.3.4: 이 옵션은 변경될 출처 IP를 지정합니다.

MASQUERADE

모든 network 대역에 적용

iptables를 사용하여 MASQUERADE 설정을 수행하려면, NAT 테이블의 POSTROUTING 체인에 규칙을 추가해야 합니다.

 

MASQUERADE는 특히 동적 IP 주소 (예: DHCP를 사용하는 경우)를 가진 인터페이스에서 유용합니다. 동적 IP가 변경되더라도 MASQUERADE 규칙은 적절하게 적용됩니다.

 

예를 들어, 내부 네트워크에서 외부로 나가는 모든 트래픽의 출처 주소를 외부 인터페이스(예: eth0)의 IP 주소로 설정하려면 다음과 같은 명령을 사용할 수 있습니다:

 

$sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

 

위의 명령을 분석해보면 다음과 같습니다:

  • -t nat: 이 옵션은 NAT 테이블을 사용한다는 것을 지정합니다.
  • -A POSTROUTING: 이 옵션은 POSTROUTING 체인에 규칙을 추가한다는 것을 나타냅니다.
  • -o eth0: 이 옵션은 eth0 인터페이스를 통해 나가는 트래픽에 대한 규칙을 추가한다는 것을 나타냅니다.
  • -j MASQUERADE: 이 옵션은 매칭되는 패킷의 출처 주소를 변경하겠다는 것을 나타냅니다. 변경될 IP 주소는 eth0의 현재 IP 주소로 자동 설정됩니다.

이 명령을 실행하면, eth0 인터페이스를 통해 나가는 모든 트래픽의 출처 주소가 eth0의 현재 IP 주소로 변경됩니다.

단일 network 대역에 적용

아래의 명령은 192.168.0.0/24 서브넷에서 발생하는 모든 트래픽의 출처 주소를 변경하도록 설정합니다.

 

$sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

 

위의 명령을 분석해보면 다음과 같습니다:

  • -t nat: 이 옵션은 NAT 테이블을 사용한다는 것을 지정합니다.
  • -A POSTROUTING: 이 옵션은 POSTROUTING 체인에 규칙을 추가한다는 것을 나타냅니다.
  • -s 192.168.0.0/24: 이 옵션은 192.168.0.0/24 서브넷에서 발생하는 트래픽에 대한 규칙을 추가한다는 것을 나타냅니다.
  • -o eth0: 이 옵션은 eth0 인터페이스를 통해 나가는 트래픽에 대한 규칙을 추가한다는 것을 나타냅니다.
  • -j MASQUERADE: 이 옵션은 매칭되는 패킷의 출처 주소를 변경하겠다는 것을 나타냅니다. 변경될 IP 주소는 eth0의 현재 IP 주소로 자동 설정됩니다.

모든 interface에 적용

-o 옵션은 iptables 규칙에서 특정 아웃바운드 인터페이스를 지정하는 데 사용됩니다. 이 옵션을 생략하면, 규칙이 모든 아웃바운드 인터페이스에 적용됩니다.

 

$sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE

 

위의 명령은 192.168.0.0/24 서브넷에서 발생하고 어떤 인터페이스를 통해서든 나가는 모든 트래픽의 출처 주소를 해당 인터페이스의 현재 IP 주소로 변경하도록 설정합니다.

 

즉, 규칙이 특정 아웃바운드 인터페이스(예: eth0)에 제한되지 않고, 시스템의 모든 아웃바운드 인터페이스에 적용됩니다.

정리 

linux의 netfilter는 network의 패킷을 제어하고 조작하는 framework 입니다. 

그리고 iptables tool을 이용하여 netfilter를 제어 할 수 있습니다.

728x90
반응형