본문 바로가기

지식/Network

Netfilter 확장 HOWTO

1. 소 개

안녕. 이 문서는 넷필터를 사용하고, 버그 리포팅을 하며, 테스트를 하고, 개발하는 데 시간을 소모하는 모든 사람들한테 내가 감사할 기회이다.

이 하우투는 러스티의 Linux 2.4 패킷 필터링 하우투 를 읽고 이해한다는 가정하에 쓰여졌다. 또한 당신이 커널을 적절히 설치하고 컴파일할 수 있다고 가정한다.

iptables 배포본은 일반 유저들을 위한 것뿐만 아니라 실험적인 유저들을 위한 확장을 포함하고 있으며, 또한 이 확장은 커널에 의존적이다. 원하지 않는다면, 이 확장은 보통 컴파일되지 않는다.

이 하우투의 목표는 넷필터 확장을 어떻게 설치하고 어떻게 기본적으로 다루는지를 시작하는 사람들에 대한 도움을 주는 것이다.

(C) 2001 Fabrice MARIE. GNU GPL 라이센스를 따른다.


2. Patch-O-Matic


2.2. Patch-O-Matic 실행하기

`userspace/` 디렉토리에서, p-o-m을 실행하라 :

# make patch-o-matic Welcome to Rusty's Patch-o-matic! Each patch is a new feature: many have minimal impact, some do not. Almost every one has bugs, so I don't recommend applying them all! ------------------------------------------------------- Already applied: 2.4.1 2.4.4 Testing... name_of_the_patch NOT APPLIED ( 2 missing files) The name_of_the_patch patch: Here usually is the help text describing what the patch is for, what you can expect from it, and what you should not expect from it. Do you want to apply this patch [N/y/t/f/q/?]

p-o-m은 관련된 모든 패치를 실행한다. 이미 모두 적용되어 있다면, 첫줄에 `Already applied:'를 볼 수 있다. 그렇지 않다면, 패치 이름과 약간의 설명이 표시될 것이다. p-o-m은 어떻게 진행되는지를 설명한다 : `NOT APPLIED ( n missing files)'는 패치가 아직 적용되지 않았음을 의미하고, 반면에 `NOT APPLIED ( n rejects out of n hunks)'는 일반적으로 다음을 뜻한다:

  1. 패치가 완벽하게 적용되지 않았거나...

  2. ...또는 이미 패치하려는 커널에 포함되어 있는 경우

마지막으로 패치할 것인지 아닌지를 결정하게 하는 프롬프트가 보일 것이다.
  • 패치하기를 원하지 않는다면 단순히 엔터키만 누른다.

  • 패치를 적용하고 테스트하기 위해 p-o-m을 원한다면 `y'키를 누른다, 만약 실패한다면 다시 한번 확인을 위한 프롬프트를 보여줄 것이다. 그렇지 않다면, 패치는 적용된 것이고, `Already Applied' 라인에서 패치의 이름을 볼 수 있다.

  • 패치가 정상적으로 적용되는지를 테스트하려면 `t'키를 누른다.

  • 패키가 `p-o-m'에 강제로 적용되기를 원한다면 `f'키를 누른다.

  • 마지막으로 p-o-m을 종료하기를 원한다면 `q'키를 누른다.

경험적으로 실제로 패치를 적용하기 전에 각 패치에 대한 약간의 설명을 조심스럽게 읽는 것이다. 현재 patch-o-matic에 대한 많은 공식 패치가 있기 때문에 (그리고 아마도 더 많은 비공식 패치도 있을 것이다), 모두를 적용하는 것은 추천하지 않는다 ! 비록 더많은 패치가 필요할때 넷필터를 재컴파일하는 것을 의미할 지라고, 원하는 패치만 적용하는 것을 고려해야 한다.

이제 patch-o-matic의 새로운 형태가 만들어졌을 것이다. 이것은 단지 깨끗하게 적용되어진 패치들을 보여줄 뿐만 아니라, 적용되지 않은 다른 모든 패치도 보여준다. 이를 실행하기 위해서, 다음과 같이 하라 :

# make most-of-pom

이것은 관련 패치와 그리고 그와 상호작용을 하는 것에 관해서는 patch-o-matic과 정확하게 같은 방법으로 동작한다. `developer-only' 패치를 사용하는 것은 피하라.


2.3. 그 다음은 무엇을 하는가 ?

적용하기를 원하는 모든 패치를 적용했다면, 다음 단계는 커널을 재컴파일하고 설치하는 것이다. 이 하우투는 그것을 어떻게 하는지에 대한 설명은 하지 않는다. 대신에 리눅스 커널 HOWTO 를 보라.

커널을 재구성하는 동안, ``Networking Options -> Netfilter Configuration''에서 새로운 옵션들을 볼 수 있다. 필요로 하는 옵션을 선택하고, 커널을 재컴파일하고 설치하라.

커널을 설치하면, `userspace/' 디렉토리에 있는 ``iptables'' 패키지를 다음과 같이 컴파일하고 설치하라

# make all install

새로운 iptables 패키지가 설치된 것이다 ! 이제 새로운 기능을 사용할 시간이다.


3. 새로운 netfilter matches

이 절에서, 새로운 netfilter matches의 사용법을 설명할 것이다. 이 패치들은 알파벳 순서로 나타낼 것이다. 부가적으로, 영향을 미치는 다른 패치에 대한 설명은 없다. 이는 다음 버전 문서에 포함될 것이다.

일반적으로, 다음과 같이 하면 특별한 모듈로부터 힌트를 얻을 수 있다.

# iptables -m the_match_you_want --help

이는 보통의 iptables 도움말을 보여주고, 거기에 더해서 끝에 명시된 ``원하는 match''에 해당되는 도움말을 보여준다.


3.6. nth patch

이 패치는 Fabrice MARIE <fabrice@celestix.com>에 의해 작성되었으며, 룰에 의해 받은 특정 N번째 패킷을 match할 수 있도록 새로운 match를 한 것이다.

예를 들어, 매 2번째 핑 패킷을 드롭하길 원한다면, 다음과 같이 할 수 있다 :

# iptables -A INPUT -p icmp --icmp-type echo-request -m nth --every 2 -j DROP # iptables --list Chain INPUT (policy ACCEPT) target prot opt source destination DROP icmp -- anywhere anywhere icmp echo-request every 2th

이 패치는 Richard Wagner <rwagner@cloudnet.com>에 의해 확장되었는데, 이는 inbound와 outbound 연결에 대한 로드 밸런싱을 제공하는 쉽고 빠른 방법을 만들 수 있게 해준다.

예를 들어, 10.0.0.5, 10.0.0.6, 10.0.0.7의 3개 주소에 대한 로드 밸런싱을 원한다면, 다음과 같이 할 수 있다 :

# iptables -t nat -A POSTROUTING -o eth0 -m nth --counter 7 --every 3 --packet 0 -j SNAT --to-source 10.0.0.5 # iptables -t nat -A POSTROUTING -o eth0 -m nth --counter 7 --every 3 --packet 1 -j SNAT --to-source 10.0.0.6 # iptables -t nat -A POSTROUTING -o eth0 -m nth --counter 7 --every 3 --packet 2 -j SNAT --to-source 10.0.0.7 # iptables -t nat --list Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT all -- anywhere anywhere every 3th packet #0 to:10.0.0.5 SNAT all -- anywhere anywhere every 3th packet #1 to:10.0.0.6 SNAT all -- anywhere anywhere every 3th packet #2 to:10.0.0.7

nth match가 지원하는 옵션은 다음과 같다 :

  • --every Nth -> 모든 N번째 패킷과 일치

  • [--counter] num -> 카운터 0-15 (디폴트갑:0) 사용.

  • [--start] num -> 0 대신 `num'으로 카운터를 초기화. 이 num은 0에서 (Nth-1) 사이여야 한다.

  • [--packet] num -> `num' 패킷과 일치. 0 ~ (Nth-1) 사이여야 한다. `--packet'이 카운터로 사용된다면 0에서 (Nth-1)사이의 모든 value를 처리하기 위해 --packet 룰에 N번째 number가 있어야 한다.


3.13. string patch

이 패치는 Emmanuel Roger <winfield@freegates.be>에 의해 작성되었으며, 패킷의 한 문자열을 match하는 것에 대한 새로운 match이다.

예를 들어, ``cmd.exe'' 문자열을 포함하고 있는 패킷을 match하고 userland IDS로 보내려면, 다음과 같이 할 수 있다 :

# iptables -A INPUT -m string --string 'cmd.exe' -j QUEUE # iptables --list Chain INPUT (policy ACCEPT) target prot opt source destination QUEUE all -- anywhere anywhere STRING match cmd.exe

조심스럽게 이 match를 사용해야 한다. 많은 사람들이 DROP taget에 따라서 웜 바이러스를 멈추기 위해 이 match를 사용하길 원한다. 이는 중요한 실수이다. 특정 IDS 침입 방법은 이를 무력화할수 있다.

유사한 경향으로, 많은 사람들은 POST 문자열을 포함하는 HTTP 패킷을 드롭함으로써 POST나 GET같은 HTTP의 특정 기능을 멈추기 위한 수단으로 이 match를 사용하기를 원했었다. 이러한 작업은 proxy를 필터링하는 것이 더 좋은 방법임을 이해하라. 부가적으로 POST란 단어를 가지고 있는 HTML content는 이전 방법(설정)에 의해 드롭될 것이다. 이 match는 더 좋은 분석을 위해 유저영역의 관심있는 패킷을 큐잉할수 있게 하기 위해 설계되었다. 이것이 전부이다. 이 방법에 의해 패킷을 드롭하는 것은 특정 IDS 침입 방법에 의해 무력화될 수 있다.

string match가 지원하는 옵션은 다음과 같다 :

  • --string [!] string -> 패킷의 문자열을 일치시킨다.


4. 새로운 netfilter 타겟

이 장에서, 새로운 netfilter 타겟의 사용에 관해 설명할 것이다. 이 패치들은 알파벳 순서로 나타낼 것이고, 부가적으로 연관된 다른 패치에 대한 설명은 하지 않는다. 하지만 다음 버전에서는 추가될 것이다.

일반적으로 타겟에 관해, 다음의 내용처럼 특별한 모듈에 대한 힌트를 얻을 수 있다 :

# iptables -j THE_TARGET_YOU_WANT --help

이는 보통의 iptables 도움 메세지를 보여주고, 그 끝에 ``THE_TARGET_YOU_WANT''타겟을 설명한다.


5. 새로운 연결 추적 패치들

이 단락에서, 사용가능한 연결 추적/NAT 패치를 볼 수 있고, 그것을 사용하기 위해, 단순히 해당 모듈 (필요하다면 옵션으로)을 로딩한다.


5.5. snmp-nat patch

이 패치는 James Morris <jmorris@intercode.com.au>에 의해 작성되었으며 기초적인 SNMP를 NAT할 수 있는 netfilter를 제공한다. 이는 ``basic'' SNMP-ALG 형태이고, RFC 2962에 설명되어 있다. 이것은 IP 레이어 NAT 매핑을 일치시키는 SNMP 페이로드 내부의 IP 주소를 변경하는데 작동한다.


5.7. tcp-window-tracking patch

이 패치는 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>에 의해 작성되었으며, Guido van Rooij의 Real Stateful TCP Packet Filtering in IP Filter 에 따라 TCP 연결 추적을 netfilter에게 허용한다. 이것은 window 크기조절을 지원하며, 이미 연결된 연결을 핸들링할수 있도록 한다.

이 패치는 ``ftp-fixes'' 패치가 적용되는 것을 요구한다. 아마도 그것은 요즘 표준 커널의 일부분일 것이다 ...


6. 새로운 IPv6 netfilter matches

In this section, we will attempt to explain the usage of new netfilter matches. The patches will appear in alphabetical order. Additionally, we will not explain patches that break other patches. But this might come later.

Generally speaking, for matches, you can get the help hints from a particular module by typing :

# ip6tables -m the_match_you_want --help

This would display the normal ip6tables help message, plus the specific ``the_match_you_want'' match help message at the end.


9. Contribution

9.1. 새로운 확장에 대한 공헌

Netfilter core-team은 항상 새로운 확장/버그 픽스를 환영한다. 이 부분에서 우리는 새로운 확장이 patch-o-matic에 포함되어 쉽게 패키징될 수 있는가에 대해서는 관심이 없다. 하지만 이는 이 하우투의 다음 버전에 포함될 것이다.

먼저, 새로운 확장/버그 픽스를 하려는 사람은 Netfilter Hacking HOWTO에 익숙해져야 할 것이다.

Rusty는 netfilter에 대한 새로운 패치를 어떻게 하는가에 대한 가이드라인을 썼다. 이는 여기에서 볼 수 있다:

/path/to/netfiltercvs/netfilter/userspace/patch-o-matic/NEWPATCHES

또는 온라인상의 최신 버전은 여기에 있다 : NEWPATCHES.

마지막으로, netfilter-devel 메일링 리스트에 참가하는 것은 좋은 아이디어다. 어떻게 참가하는가에 대한 더 많은 정보는 netfilter 홈페이지에서 볼 수 있다.