netfilter/iptables FAQ Harald Welte <laforge@gnumonks.org> Version $Revision: 529 $, $Date: 2002-07-26 22:19:42 +0200 (vie, 26 jul 2002) $ 본 문서는 netfilter 메일링리스트에서 자주 언급되는 질문들을 모아둔 것입니다. 의문점이나 필요한 수정사항은 FAQ 관리자에게 연락하면 감사하겠습니다. 일반적인 질문들

본 섹션에서는 메일링 리스트에서 빈번히 언급되는 질문들을 다룹니다. 어디에서 netfilter/iptables을 얻을수 있나요?

Netfilter와 Iptables는 리눅스 2.4.x 커널에 내장되어 있습니다. 최신 리눅스 커널을 다음 사이트에서 다운로드 받으시면 됩니다.

사용자 영역 툴인 'iptables'은 netfilter 홈페이지 미러사이트인 다음 사이트들중 한군데에서 받으시면 됩니다. , or . 리눅스 2.2에 포팅된 netfilter가 있습니까?

현재까지는 없습니다. 하지만 netfilter는 분명한 네트웍 스텍 인터페이스를 제공 하기때문에 누군가 하려고 한다면 그렇게 어려운 일은 아닐것입니다.

이 부분에 대해서 어떤 작업이라도 하고 계신분은 연락주시기 바랍니다. ICQ conntrack/NAT helper module이 있습니까?

리눅스 2.2 박스에서 마스커레이딩을 사용하고 있다면 클라이언트대 클라이언트 icq 직접 연결을 위해 항상 ip_masq_icq 모듈을 사용해야 합니다.

ICQ 프로토콜은 그렇게 이쁜 편이 아니기 때문에 아직까지 아무도 이 모듈을 netfilter 용으로 구현하지 않고 있습니다. 하지만 이것이 구현되는 것은 시간 문제일 것입니다.

Rusty는 일전에 언급하기를 최소한 하나의 자유(free) 클라이언트와 최소한 하나의 자유(free) 서버를 갖는 프로토콜의 모듈만을 netfilter에 포함한다고 했습니다. ICQ의 경우 오직 자유(free) 클라이언트만이 있기 때문에 이 요구 조건을 충족시키지 못합니다.(자유라 함은 무료를 뜻하는 것이 아니 freedom의 free 입니다) ip_masq_vdolive / ip_masq_quake / ... 모듈들은 어디로 갔습니까?

그들중 몇몇은 필요하지 않게 됐으며 또 몇몇은 아직 netfilter에 포팅되지 않았습니다. netfilter은 UDP에서 조차도 full connection tracking을 하고 또 가능한한 패킷 전송을 적게 방해하는 정책을 가지고 있기 때문에 어떤경우 그냥 되기도 합니다. patch-o-matic은 무엇이고 또 어떻게 이용하는 겁니까?

2.4.x 커널은 안정 버전입니다. 그래서 우리는 현재 개발 버전을 이 커널에 껴넣을수 없었습니다. 현재 개발되고 또 테스트 되고 있는 코드는 먼저 patch-o-matic에 넣어 지게 됩니다. 그러므로 테스트 중인 기능을 사용하고 싶다면 patch-o-matic 으로 부터 패치를 받으세요. patch-o-matic는 최신 iptables 패키지(혹은 CVS)에서 찾을 수 있을것이며 또한 netfilter 홈페이지에서도 다운로드 받으실 수 있습니다.

patch-o-matic은 잘 정돈된 사용자 인테페이스를 가지고 있습니다. 단지 make patch-o-matic 을 하던지 커널 트리가 /usr/src/linux 에 없는 경우 make KERNEL_DIR={your-kernel-dir} patch-o-matic 와 같이 iptables 패키지의 최상위 디렉토리에서 해주면 됩니다. patch-o-matic은 인스톨한 커널 소스에 적용이 될지 안될지 각각의 패치를 체크합니다. 패치가 적용 가능하면 프롬프트를 보게 될 것인데 여기에서 그 패치에 대한 좀더 자세한 정보를 물어볼 수 있으며 패치를 적용할 것인지 다음으로 그냥 넘어갈 것인지 선택하면 됩니다. ipnatctl과 그에 대한 좀더 자세한 정보는 어디에서 찾을 수 있습니까?

ipnatctl은 netfilter의 초기 버전인 2.3.x 커널 버전에서 사용자 영역으로 부터 NAT 룰을 설정하기 위해 사용된 툴입니다. 이것은 더이상 필요하지 않으며 따라서 더이상 이용할 수 없습니다. ipnatctl에서 제공하는 모든 기능은 iptables 자체에서 제공합니다. netfilter 홈페이지에서 NAT HOWTO를 읽어 보시기 바랍니다. 프로세스를 빌드하는 동안의 문제

커널 >= 2.4.0-test4에서 iptables-1.1.1을 컴파일할 수 없습니다.

이것은 알려진 문제로써 적용할 패치를 찾는 메카니즘이 깨져있기 때문입니다. "make" 대신 "make build"를 사용하세요.

더 나은 해결책: iptables-1.1.2혹은 이후 버전으로 업그레이드 하세요. 최신 커널(>=2.3.99-pre8)에서 iptables 1.1.0을 컴파일 할 수 없습니다.

iptables의 내부 구조가 변경되었기 때문입니다. iptables >= 1.1.1로 업그레이드 하십쇼. iptables-1.2.1a에 있는 몇몇 patch-o-matic 패치가 kernel >= 2.4.4에서 작동하지 않고 있습니다.

iptables-1.2.2 release나 netfilter CVS를 사용하세요. ipt_BALANCE, ip_nat_ftp, ip_nat_irc, ipt_SAME, ipt_NETMAP가 컴파일 되지 않습니다.

ip_nat_setup_info 함수를 컴파일 하는데 문제가 있는듯 합니다.

iptables <= 1.2.2을 사용한다면 `dropped-table'와 `ftp-fixes' 패치를 반드시 하시기 바랍니다.

iptables > 1.2.2나 CVS를 사용한다면 'dropped-table' 패치를 하면 안됩니다 이것은 BALANCE, NETMAP, irc-nat,SAME, talk-nat과 호환되지 않습니다. Alan Cox의 2.4.x-acXX 시리즈 커널을 사용하고 있는데 문제가 있습니다.

netfilter 핵심 개발팀은 리누스의 커널 트리에 기반하여 개발을 하고 있습니다. -ac 시리즈를 사용함으로써 발생하는 위험은 사용자가 감수해야 합니다. 실행 도중 발생하는 문제 NAT: X dropping untracked packet Y Z aaa.aaa.aaa.aaa -> 224.bbb.bbb.bbb

이 메시지는 NAT 코드에 의해 출력되는데 멀티캐스트 패킷이 NAT 테이블을 건들고 있기 때문입니다. 현재 connection tracking은 멀티캐스트 패킷을 제대로 처리하고 있지 않습니다. 멀티캐스트가 무엇인지 모르겠거나 그것이 전혀 필요하지 않다면 다음과 같이 하세요: iptables -t mangle -I PREROUTING -j DROP -d 224.0.0.0/8 NAT: X dropping untracked packet Y Z aaa.aaa.aaa.aaa -> bbb.bbb.bbb.bbb

syslog와 콘솔에 다음과같은 메시지가 출력됩니다: NAT: X dropping untracked packet Y Z aaa.aaa.aaa.aaa -> bbb.bbb.bbb.bbb

NAT 코드에 의해 출력되는 것으로 NAT가 유효한 connection tracking 정보를 갖기위해 패킷을 드롭하는 것입니다. 이 메시지는 connection tracking이 conntrack 정보를 결정할 수 없는 모든 패킷에 대해서 출력됩니다.

가능한 이유로는: conntrack 데이터 베이스에서 엔트리가 최대값에 다달았을때 tuple을 역으로 결정할 수 없을때(multicast, broadcast) kmem_cache_alloc 실패(메모리 부족) 확인 되지 않은 접속의 응답 멀티캐스트 패킷 icmp 패킷이 너무 작은 경우 icmp가 단편화 된경우 icmp 첵섬이 잘못된 경우

이 패킷에 대한 좀더 구체적인 로그를 얻고 싶다면 (스캐닝 패킷이나 외부에서의 어떤 공격 시도로 의심이 되면) 다음과 같은 룰을 사용하십쇼: iptables -t mangle -A PREROUTING -j LOG -m state --state INVALID

패킷이 필터 테이블에 도착하기 전에 NAT 코드에 의해 드롭되기 때문에 이 룰은 mangle 테이블에 넣어야 합니다. 리눅스 브릿지 코드와 netfilter를 함게 사용할 수 없습니다.

완벽한 transparent 방화벽을 구축할 계획이신가요? 좋은 생각입니다. 커널 2.4.16과 그리고 부가적인 패치는 다음 사이트에서 찾을 수 있습니다. . IRC 모듈이 DCC RESUME을 처리할 수 없습니다.

글쎄요. 이것은 절반만 사실입니다. 오직 NAT 모듈만이 그들을 처리할 수 없습니다. NAT 없이 방화벽을 구현하고 있다면 반드시 잘 작동해야 합니다. 어떻게 다중 주소에 대한 SNAT를 작동하게 할 수 있습니까?

netfilter는 가능한한 적게 패킷을 조작합니다. 그래서 만약 freshly-rebooted가 가능한 머신과 그리고 누군가 SNAT 박스 안쪽에서 로컬 포트 1234를 열고 있다면 netfilter 박스는 오직 같은 상태로 머물러 있는 ip 주소와 포트만을 조작합니다.

누군가 같은 source 포트로 또 다른 접속을 하면 그것이 SNAT에게 있어 단일 IP라면 netfilter는 IP와 포트를 조작할 것입니다.

But if there are more than one available, it again only has to mangle the IP part. 하지만 2개 이상이라면 ip 부분을 다시 조작해야 합니다. ip_conntrack: maximum limit of XXX entries exceeded

syslog에서 다음과 같은 메시지를 봤다면 이는 conntrack 데이터베이스가 여러분의 환경에 충분하지 않은 엔트리를 가진것을 의미합니다. 디폴트로 connection tracking 은 정해진 동시 접속 수까지만 처리합니다. 이 수는 여러분의 최대 메모리 크기에 의존적입니다(64MB: 4096, 128MB: 8192,...).

최대값은 쉽게 증가시킬 수 있지만 각각의 tracking 되는 접속은 약 350 바이트의 non-swappable 커널 메모리를 점유함을 유의해야 합니다.

최대값을 8192로 증가하기 예제 echo "8192" > /proc/sys/net/ipv4/ip_conntrack_max 2.2.x에서 'ipchains -L -M' 식으로 하던 모든 tracking/마스커레이딩되는 접속은 어떻게 출력합니까?

proc 화일 시스템에 보면 /proc/net/ip_conntrack라는 화일이 있습니다. 이 화일을 다음과 같이 출력해서 보면 됩니다. cat /proc/net/ip_conntrack 모든 가능한 IP 테이블을 어떻게 출력합니까?

모든 사용가능한 IP 테이블은 다음과 같이 출력할 수 있습니다. cat /proc/net/ip_tables_names iptable-1.2에서 iptables-save / iptables-restore 세그멘테이션 폴트가 납니다.

이미 알려진 버그로써 최신 cvs로 업데이트를 하거나 iptables >=1.2.1 을 사용하면 됩니다. iptables -L이 룰을 출력하는데 매우 오랜 시간이 걸립니다.

이것은 iptables이 각각의 ip 주소에 대한 DNS lookup을 하기 때문입니다. 각각의 룰은 2개의 주소를 가지고 있고 최악의 경우 각각의 룰마다 DNS lookup을 두번하게 되는 경우가 있습니다.

문제는 사설 ip 주소를 사용하는 경우인데(10.x.x.x 혹은 192.168.x.x), DNS는 호스트이름을 찾을 수 없고 타임 아웃이 걸리게 됩니다. 이 타임아웃 시간을 모두 합하면 매우 긴 시간이 될 것입니다.

이렇듯 DNS lookup 하는 것을 방지하려면 -n (numeric) 옵션을 사용하시면 됩니다. 콘솔에 로그가 출력되지 않게 하려면 어떻게 해야 합니까?

syslogd를 적절히 설정해 줘야합니다. LOG target은 우선순위 warning(4)로써 로그를 남기는 장치입니다. 이런 장치와 우선순위에 대해서 좀더 공부하고 싶으면 syslogd.conf 맨 페이지를 참고하시기 바랍니다.

디폴트로 debug(7) 우선순위보다 높은 모든 커널 메시지는 콘솔에 보내지도록 되어 있습니다. 이것을 7대신 4로 증가시킨다면 더이상 LOG 메시지가 콘솔상에 나타나지 않을것입니다.

이렇게 하면 콘솔상에 나타나야할 다른 중요한 메시지도 또한 나타나지 않는 점을 유의하셔야 합니다. squid와 iptables를 사용하여 어떻게 transparent 프록시를 구성합니까?

먼저 적합한 DNAT 혹은 REDIRECT 룰이 필요합니다. 만약 squid가 NAT 박스 상에서 동작한다면 REDIRECT를 사용하세요. 예를들면: iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.22.33:3128

그리고 나서 squid를 적절하게 설정해야 합니다. 우리는 여기에서 짧은 예만을 보여줄 것이므로 좀더 자세한 사항에 대해서는 squid 문서를 참조하시기 바랍니다.

squid 2.3용 squid.conf는 다음의 사항들이 필요할 것입니다. http_port 3128 httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on squid 2.4는 다음의 부가적인 라인이 필요합니다. httpd_accel_single_host off LOG target은 어떻게 사용합니까? / 어떻게 LOG와 DROP을 동시에 할 수 있습니까?

LOG target는 "non-terminating target"을 말합니다. 즉 이것은 패킷 룰 트래버스( traverse)를 끝내지 않습니다. LOG target을 사용하면 패킷은 로깅되고 룰의 순회는 다음룰까지 계속됩니다.

그럼 어떻게 동시에 로깅과 드롭이 될까요? 가장 쉬운 방법으로 다음 2개의 룰을 포함하는 사용자 체인을 생성하는 것이 있습니다. iptables -N logdrop iptables -A logdrop -j LOG iptables -A logdrop -j DROP

"-j logdrop". 자 이제 패킷에 대한 로깅과 드롭을 원할 때면 언제든지 "-j logdrop"을 하면 됩니다. 커널 로그: Out of window data xxx

patch-o-matic에 있는 tcp-window-tracking 패치를 사용했군요. 이 코드는 패킷의 seq/ack 번호, 세그먼트 크기 등등등에 의해 수용가능한 TCP 패킷을 기록하고 있습니다. 이것은 수용가능하지 않은 패킷을 탐지했을 때(out of the window) 그 패킷을 INVALID로 표시하고 위와 같은 메시지를 출력하게 됩니다.

새 버전에서는 그 패킷과 정확히 어떤 상태에서 fail이 발생했는지 로그를 남깁니다. ACK is under the lower bound (장시간 지연된 ACK가 원인일 가능성이 큼) ACK is over the upper bound (아직까지 한번도 본적이 없는 ack를 가진 데이터) SEQ is under the lower bound (이미 ack된 데이터에 대한 재 전송smitted already ACKed data) SEQ is over the upper bound (수신자의 window 초과)

sysctl 또한 새버전에서는 sysctl을 통해서 로그를 철저히 감출수도 있습니다. echo 0 > /proc/sys/net/ipv4/netfilter/ip_ct_tcp_log_out_of_window netfilter 개발에 관한 질문들 사용자 영역으로 부터 어떻게 QUEUE target를 사용하는지 이해가 안됩니다.

사용자 영역 패킷 처리를 위해 libipq 라이브러리를 제공하고 있습니다. 현재 man 페이지 형태로 이것에 대한 문서도 나와 있습니다. 여러분은 다음 처럼 iptable 개발 컴포넌트를 설치해야 합니다. make install-devel 그리고 man 3 libipq 하시면 됩니다.

여러분은 또한 libipq를 위한 펄 바인딩도 흥미가 있을 것입니다. perlipq는 에서 찾을 수 있습니다. 바인딩 자체가 라이브러리를 사용한 예제입니다.

다른 코든 예제는 netfilter CVS에서 testsuite/tools/intercept.c ipqmpd () nfqtest(see ) Jerome Etienne의 WAN 시뮬레이터() 코드 개발에 도움을 주고 싶습니다. 어떻게 해야 합니까?

netfilter 핵심 팀은 TODO 리스트 속에 원하는 새로운 기능과 변경 사항을 나열하고 있습니다. 이 리스트를 홈페이지나 CVS를 통해서 받으세요. 다음 사이트에서도 확인할 수 있습니다. 버그 패치/확장을 만들었습니다. 어떻게 해야 합니까?

그것을 발표하고 싶다면 netfilter-devel 메일링 리스트에 보내시기 바랍니다. 가입 명령은 를 확인하시기 바랍니다. 패치를 보내는 방법은 다음과 같습니다. 제목은 [PATCH] 로 시작해야 하고 본문에 바로 붙여 넣으세요(MIME 타입은 안됩니다) diff가 출력한 cvs-checkin/Changelog 엔트리 상위 디렉토리에서 `diff -u old new' 형식

새로운 확장을 만들었다면 혹은 기존 확장에 새로운 옵션을 추가했다면 netfilter-extension-HOWTO에 새롭게 확장된 기능에 대한 설명을 업데이트 하는 것은 좋은 생각이 될 것입니다. 그것은 여러분이 만든 확장에 사용자를 끌어들일 것이고 좀더 많은 피드백을 받을 수 있도록 해줄 것입니다.