1 / 55

Linux netfilter Hacking HOWTO

Linux netfilter Hacking HOWTO. 김 희 준 2006. 5. 30. Agenda. What is netfilter What’s wrong with what we had in 2.0 and 2.2? Where can I get the latest? Netfilter Architecture Understanding IP Tables Extending IP Tables Finally. What is netfilter?.

mayda
Télécharger la présentation

Linux netfilter Hacking HOWTO

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Linux netfilter Hacking HOWTO 김 희 준 2006. 5. 30

  2. Agenda • What is netfilter • What’s wrong with what we had in 2.0 and 2.2? • Where can I get the latest? • Netfilter Architecture • Understanding IP Tables • Extending IP Tables • Finally

  3. What is netfilter? • 표준 Berkeley socket interface의 외부에 존재하는 packet mangling에 대한 Framework으로 크게 네 부분으로 구성 • 각각의 프로토콜은 "hooks"라는 것을 정의 • packet protocol stack의 packet's traversal에 있는 well-defined 포인터를 의미 • 이러한 포인터에서, 각각의 프로토콜은 packet과 hook number를 이용하여 netfilter Framework 호출 • kernel의 일부분은 각 프로토콜에 대하여 다른 hook을 감시하도록 등록가능 • packet이 netfilter framework을 통과할 때, 누가 그 프로토콜과 hook을 등록했는지 확인 • 이러한 것이 등록되어 있다면 • 등록된 순서대로 packet을 검사 • packet을 무시(NF_DROP) or 통과(NF_ACCEPT) • packet에 대한 것을 잊어버리도록 netfilter에게 지시(NF_STOLEN) or 사용자 공간에 packet을 대기시키도록(queuing) netfilter에게 요청(NF_QUEUE)

  4. What is netfilter? (cont’d) • 대기된 packet을 사용자 공간으로 보내기 위해 제어하는 것 • 이러한 packet은 비동기 방식으로 처리 • 이러한 low level framework과 더불어, 다양한 모듈이 작성되었으며, 이는 이전 버전의 kernel에 대하여 유사한 기능, 확장 가능한 NAT시스템 그리고 확장 가능한 packet filtering 시스템을 제공

  5. Where can I get the latest? • samba.org • 최신의 HOWTO, userspace tools 그리고 testsuite를 가지고 있는 CVS 서버 • Web Interface <http://cvs.samba.org/cgi-bin/cvsweb/netfilter/> • 최신 소스를 얻는 방법 • anoymous로 SAMBA CVS 서버에 로그인 • cvs -d :pserver:cvs@cvs.samba.org:/cvsroot login • 패스워드를 물어보면 cvs라고 입력 • 다음 명령을 이용하여 코드를 체크 • cvs -d :pserver:cvs@cvs.samba.org:/cvsroot co netfilter • 최신 버전으로 업데이트 • cvs update -d -P

  6. Where can I get the latest? • Netfilter.org ( 최신 소스 update)

  7. THE IPCHAINS ARCHTECTURE OF Linux 2.2(1/2) • ipchains is a packet-filtering architecture consisting of an infrastructure in the Linux kernel and user-space program to manage rules lists, like all packet-filtering architectures • Currently implemented in Linux 2.2/2.4/2.6

  8. THE IPCHAINS ARCHTECTURE OF Linux 2.4(1/3) • The filtering mechanisms implemented in Linux kernel Version 2.2 divide all data packets into the following three classes, depending on their source and destination address: • Incoming packets – those addressed to the local computer • Packets to be forwarded and leaving the local computer over a different network interface based on a routing decision • Outgoing packets created in the local computer

  9. THE IPCHAINS ARCHTECTURE OF Linux 2.4(2/3) • Netfilter modules can be loaded into the Linux kernel at runtime, so we need hooks in the actual rouing code tio enable dynamic hooking of functions. • An integer identifier is allocated to each of these netfilter hooks. • The identifiers of all hooks for each supported protocol are defined in the protocol-specific header file • Example : linux/netfilter_ipv4.h, linux/netfilter_ipv6.h • NF_IP_PRE_ROUTING(0) : Incoming packets pass this hook in the ip_rcv() functiion before the are processed by the routing code. • NF_IP_LOCAL_IN(1): All incoming packets addressed to the local computer pass this hook in the function ip_local_deliver(). • NF_IP_FORWARD(2): All incoming packets not addressed to the local computer pass this hook in the function ip_forward() • NF_IP_LOCAL_OUT(3): All outgoin packets created in the local computer pass this hook in the function ip_build_and_send_pkt().

  10. THE NETFILTER ARCHITETURE OF LINUX 2.4(3/3) • The packet filtering architecture of Linux 2.4

  11. Netfilter Architecture of Linux 2.4 • Packet filtering 기능 • Netfilter hooks 제공 • Kernel을 통해 여러 다른 position에서 ip packets을 manipulate 및 catch • Building on this background • Iptables module이 filter incoming, forwarded, outgoing의 세가지 rule lists로 implement • 이러한 list들은 ipchains에서 사용하는 rule list들과 일치 • 이와 유사한 modules들도 다른 network protocol들에 대하여 이용 할 수 있음 (e.g ip6tables for IP version 6) • Vs ipchains • Netowork code에 대한 직접적인 개입 최소화 • Regular interace 사용 • Kernel에서 packet mangling을 위한 module형태로 additional code 추가 허용

  12. Netfilter Architecture of Linux 2.4 (cont’d) • Netfilter Hooks in the Linux Kernel • Uniform interface 지향 • 새로운 기능 구현에 수반되는 비용절감 • Netfilter hook? • Packet filer code를 위한 hook을 의미 • Netfilter Module can be loaded into Linux kernel at runtime • So need hooks in the actual routing code to enable dynamic hooking of functions • Integer identifier로 netfilter hooks을 할당함 • 각 프로토콜을 지원하는 netfilter hook들의 identifier들을 protocol specific header 파일에 정의함 • < linux/netfilter_ipv4.h > or < linux/netfilter_ipv6.h >

  13. Netfilter Architecture of Linux 2.4 (cont’d) • <linux/netfilter_ipv4.h>에 정의된 hooks • NF_IP_PRE_ROUTING • Routing code에 의해 처리되기 전, ip_rcv()함수 내부에서 packet에 대한 검사(checksum, ipv4, length, header 유무)가 통과하면 이 hook을 호출 • 적용 사례 • To detect certain type of denial of service attacks • For address-translation mechanism • For accounting functions (counting of incoming packets) • NF_IP_LOCAL_IN • ip_local_deliver()에서 local computer로 가는 All incoming packet들은 이 hook을 지나감 • 이 지점에서 iptables module은 filter에 있는 INPUT rules list들 호출 • Ipchains의input rule list와 일치

  14. Netfilter Architecture of Linux 2.4 (cont’d) • NF_IP_FORWARD • ip_forward()에서 packet이 not addressed to Local computer일 때 이 hook을 호출 • 이 경우 다른 network interface로 전달 • 여기에는 NAT에 의해 주소가 수정된 packet들도 포함 • 이 지점에서 iptables module은 FORWARD rules list를 호출 • ipchains 의 forward rules list 와 일치 • NF_IP_LOCAL_OUT • Local computer에서 생성된 pakcet들은 ip_build_and_send_pkt()함수에서 이 hook을 지나감 • 이 지점에서는 iptables module이 OUTPUT rules list를 호출 • Ipchains 의 output rules list와 일치 • Nf_IP_POST_ROUTING • 다른 network device 로 나가기 전 ip_finish_output()에서 호출되는 hook • Good place to integrate accounting functions

  15. Netfilter Architecture of Linux 2.4 (cont’d) • NF_HOOK() • include/linux/netfilter.h • Netfilter hook에 연결된 filter functionsemf을 process 하기 위한 routing code 호출 • In netfilter.h • From net/ipv4/ip_output.c(end of the ip_build_and_send_pkt()) • Arguments explain next page

  16. Netfilter Architecture of Linux 2.4 (cont’d) • pf (protocol family) • PF_INEF for IPv4, PF_INET6 for IPv6 • hook • Hook identifier, 각 protocol family에 대한 valid identifier가 header file에 정의 (e.g., <linux/netfilter_ip4.h> ) • Skb • sk_buff structure에 대한 pointer • indev (input device) • Packet을 받는 network device의 net_device structure • NULL은 outgoing packet • outdev (output device) • Local computer에서 외부로 내보내는 network device의 net_device structure • okfn() • Is invoked When all filter functions registered with hook returned NF_ACCEPT

  17. Registering & Unregistering Packet Filter Functions • Hook function • Packet filter functions이 netfilter hook들에 등록된 경우를 일컬음 • Type nf_hookfn (is defined in <linux/netfilter.h> • Return value (unsigned int) • NF_DROP(0): packet을 Discard, 계속 진행시키지 않음 • NF_ACCEPT(1): 다음 packet filter로 계속 진행 • NF_STOLEN(2): packet을 잠시 보관한다는 의미, 계속 진행시키지 않음 (no drop) • NF_QUEUE(3): packet을 큐로 전달(nf_queue() <net/core/netfilter.c>) • NF_REPEAT(4): NF_ACCEPT와 달리 현재 훅을 다시 호출

  18. Registering & Unregistering Packet Filter Functions(cont’d) • nf_register_hook() / nf_unregister_hook() • Linux kernel에 packet-filter function을 register or unregister 기능 • Parameter passed is a nf_hook_ops • Struct nf_hook_ops <linux/netfilter.h> • list : kernel 에서 유지하는 nf_hook_ops structures들의 linked list • Hook() : nf_hook_fn type의 packet filter function • Pf , hooknum : protocol identifier and hook identifier • Priority : hook의 rules list에 있는 packet-filter functions들을 오름차순으로 정렬

  19. IP tables • packet selection system • netfilter framework을 기반으로 구성된 IP table을 호출 • Packet selection method • Packet filtering • filter 테이블 • Network address 변환 • nat 테이블 • 종합적인 pre-route packet mangling 사용 • mangling 테이블

  20. Comparing iptables and ipchains (cont’d) • Ipchains • No uniform programming interface • 상세한 Network implementation 고려하지 않고 rule list 추가 • Kernel상에서 많은 interventions 존재 • Rule이 일반적으로 network address를 반영하기 때문에, rule set을 생성하는 데에 있어서 매우 복잡함 • “masquerading” (NAT 기능)이 packet filter code 기능에 포함 • 불필요한 complex 및 code를 읽는데 어려움이 존재 • Iptables • New packet filter functions을 쉽게 통합 가능 • NAT등의 기능이 module로 분리 • INPUT, FORWARD, OUPUT의 세가지 rule list 사용 • Rule list를 관리하기 위한 iptables command-line tool 사용

  21. The iptables Command-line tool • basic syntax • 옵션 • 체인을 조절 • 새로운 체인 만들기 (-N). • 비어있는 체인을 제거하기 (-X). • 미리 만들어진 체인의 정책을 바꾸기 (-P) • 어떤 체인의 규칙들을 나열하기 (-L) • 체인으로부터 규칙들을 지우기 (-F) • 체인내의 모든 규칙들의 packet과 byte의 count를 0으로 만들기 (-Z) • 체인 내부의 규칙을 조작 • 체인에 새로운 규칙을 추가하기 (-A) • 체인의 어떤 지점에 규칙을 삽입하기 (-I) • 체인의 어떤 지점의 규칙을 교환하기 (-R) • 체인의 어떤 지점의 규칙을 제거하기 (-D) • 체인에서 일치하는 첫 번째 규칙을 제거하기 (-D)

  22. The iptables Command-line tool (cont’d) • 그 밖의 옵션 • -s : 출처 주소 • -d : 목적지 주소 • -p : 프로토콜(tcp, udp, icmp) • -i : packet이 들어오는 인터페이스 ( input, forward ) • -o : packet이 나가는 인터페이스 ( forward, output ) • -f : fragmentation • -j : 점프 • --dport : 목적지의 포트 정의 • --sport : 출발지의 포트 정의

  23. Example Iptable • Rule 을 chain에 적용 • # iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP • Rule 을 chain에서 제거 • # iptables -D INPUT 1 • # iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP • 입력 체인으로부터 1번 규칙을 제거한다. • 192.168.1.1로 부터 tcp방식에 의한 접속 차단 • # iptables -A INPUT -s 192.168.1.1 --protocol tcp --tcp-flags SYN,RST,ACK,SYN -j DENY

  24. Example script • The rule -m unclean -j DROP causes all packets with faulty IP headers to be dropped • The last rule activates the masquerading process, if the destination computer is not in the internal network.

  25. ip_tables Data Structure • 각각의 규칙은 다음과 같은 부분으로 구성 • struct ipt_entry • zero 또는 그 이상의 struct ipt_entry_match 구조로, 각각은 여기에 추가 가능한 데이터의 크기를 변경 가능 • struct ipt_entry_target 구조: 추가 가능한 데이터 크기 변화 가능

  26. ip_tables Data Structure (cont’d) • struct ipt_entry (in netfilter_ipv4/ip_tables.h) • struct ipt_ip : IP header에 대한 세부항목을 포함 • nf_cache : 현재의 규칙을 검사해야 하는 packet의 부분을 알려주는 비 트 필드 • target_offset : ipt_entry_target 구조가 시작하는 현재 규칙의 시작점 으로부터의 offset을 알려주는 필드 • next_offset : 현재 규칙의 최대 크기를 알려주는 필드로 match와 target을 포함 • comefrom : packet의 경로를 추적하기 위해 kernel이 사용하는 필드 • struct ipt_counters : 현재 규칙에 일치하는 packet에 대한 바이트 카운 터와 packet을 포함하는 필드

  27. ip_tables Use and Traversal (cont’d) 각 entry의 rule match여부 검사후 해당 action(target) 취함 entry 1 Struct Ipt_table Struct Ipt_table_info match 1_1 해당 match function 실행 (ex. protocol, address, port) Netfilter table 정의 (ex. mangle, NAT, filter) match 1_2 첫번째 entry 위치 및 마지막 entry 위치 정보 저장 target 해당 target function 실행 ... Struct ipt_table_ info *private 첫번째 entry 위치 포인터 마지막 entry 위치 포인터 entry n match n_1 match n_2 target

  28. Extending iptables • 다음의 두 부분을 포함 • 새로운 모듈을 작성하여 kernel을 확장하는 것 • 새로운 공유 라이브러리를 작성, 사용자 차원의 프로그램인 iptables를 확장하는 것

  29. Kernel • 모듈을 작성한다는 것 자체는 상당히 단순 • 한가지 알아야 할 것은 여러분의 코드가 재진입 가능해야 한다는 것 • Ex) 사용자 공간으로부터 들어오는 어떤 packet이 존재할 수 있을 것이며, 동시에 또 다른 packet이 인터럽트에 의해 들어 올 수도 있음 • 모듈 작성시 필요한 함수 • init_module() • 모듈의 진입 포인트로 에러가 발생한 경우 음수, 성공적으로 등록이 된 경우 0 return • cleanup_module() • 모듈의 종료 포인트로 netfilter에서 모듈자체를 등록해제하는 기능 • ipt_register_match() • 새로운 match 타입을 등록하기 위하여 사용 • 이것을 `struct ipt_match'로 전달해야함. 통상 정적 변수로 정의 • ipt_register_target() • 새로운 타입을 등록하기 위해 사용 • 이것을 `struct ipt_target'으로 전달해야함. 보통 정적 변수로 전달 • ipt_unregister_target() • target을 등록해제하기 위해 사용 • ipt_unregister_match() • match를 등록해제하기 위해 사용

  30. New Match function & Targets • 일반적으로 독립모듈로 작성 • nf_register_sockopt 함수를 사용 • 사용자들이 직접 여러분이 작성한 모듈과 통신할 수 있음 • netfilter module과 ip_tables에 구현된 것과 동일한 방법으로, 다른 모듈이 자신을 등록하도록 심벌을 export하는 것 • Core of New match function • ipt_register_match()로 전달되는 ipt_match 구조체를 작성 • Core of New Targets • ipt_register_target()으로 전달되는 struct ipt_target 구조체를 작성

  31. New tables • 개발자의 목적에 맞는 새로운 table 작성 가능 • ipt_register_table(struct ipt_table)함수를 호출 • struct ipt_table • list • 임의의 값으로 설정되는 필드이다. 즉 { NULL, NULL } • name • 사용자 공간에서 참조되는 table 함수의 이름을 저장하는 필드 • 자동 로딩 기능이 동작하기 위해서 함수의 이름은 모듈의 이름과 일치하여야 함 • table • struct ipt_replace로 가득 찬 필드, 테이블을 교체하기 위하여 사용자 공간에서 사용 • counters 포인터는 NULL로 설정 • 이 구조체는__initdata로 선언되기 때문에 부팅 후에는 초기화 • valid_hooks • 테이블로 진입하고자 하는 IPv4 netfilter hook의 bit mask • 진입엔트리가 유효한지 확인 및 ipt_match와 ipt_target의 checkentry()함수에 대해 사용 가능한 훅을 계산하기 위해 사용 • lock (테이블을 읽고 쓰기가 가능한 spinlock, RW_LOCK_UNLOCKED로 초기화) • private (ip_tables 코드에 의해 내부적으로 사용)

  32. Userpace Tool • 공유라이브러리 사용 • _init()함수를 포함해야 함, 이 함수는 모듈이 로딩 되는 시점에서 자동으로 호출 • register_match()나 register_target()함수를 호출 • 작성한 공유라이브러리가 새로운 match or target이냐에 따라 _init()함수에서 호출 • 개발 시 유용한 함수 • chech_inverse() • 전달인자가 `!'인지 검사, 맞으면 invert flag이 설정 • string_to_number() • 스트링을 주어진 범위 내의 숫자로 변환 • 형식이 잘 못 되었거나 범위를 벗어나면, -1이 리턴 • exit_error() • 에러가 검출된 경우 호출되는 함수 • 일반적으로 첫 번째 인수는 PARAMETER_PROBLEM이며, 사용자가 커맨드 라인을 정확하기 사용하지 않았다는 것을 의미

  33. Using libiptc • iptable 제어 라이브러리 • iptable kernel 모듈에서 룰을 나열하고 처리하기 위하여 설계 • 다른 툴을 개발하는 곳에도 쉽게 사용 • 이 함수를 사용하기 위해서는 루트 권한이 필요 • 이 함수가 제공하는 표준 target • ACCEPT, DROP, QUEUE, RETURN, 그리고 JUMP • ACCEPT, DROP, QUEUE는 NF_ACCEPT, NF_DROP과 NF_QUEUE로 번역 • RETURN은 ip_tables가 처리하는 특별한 IPT_RETURN 값 • JUMP는 chain name으로부터 table내의 실제 오프셋으로 번역

  34. Using`libiptc' • iptc_first_chain() • table 내의 첫 번째 chain의 이름을 리턴 • iptc_next_chain() • table 내의 다음 chain의 이름을 리턴, NULL은 더 이상 chain이 없다는 것을 의미 • iptc_first_rule() • 주어진 chain name내의 첫 번째 룰의 포인터를 리턴, NULL인 경우는 chain이 비었다는 것을 의미 • iptc_next_rule() • chain내의 다음 룰에 대한 포인터를 리턴, NULL인 경우는 chain의 끝 • iptc_get_target() • 주어진 룰의 target을 가져옴 • 다른 chain으로의 jump인 경우는 그 chain의 이름을 돌려줌 • iptc_get_policy() • builtin chain의 정책을 가져옴

  35. NAT • nat 테이블의 영역 • 두 가지의 netfilter hook으로 packet을 전달 • non-local packet에 대해, 각각 목적지와 소스 전환에 대하여 NF_IP_PRE_ROUTING과 NF_IP_POST_ROUTING hook이 완벽하게 동작 • CONFIG_IP_NF_NAT_LOCAL이 정의된 경우, NF_IP_LOCAL_OUT과 NF_IP_LOCAL_IN hook이 로컬 packet의 목적지를 전환하기 위해 사용 • 이 테이블은 filter 테이블과는 약간 다르며, 새로운 커넥션의 첫 번째 packet만이 테이블로 전달 • 따라서 이와 같은 전달의 결과는 동일한 커넥션에 있어서 향후 전달되는 모든 packet에 적용

  36. Packet Mangling & Connection Tracking • Packet Mangling Table • packet의 정보를 실제로 변경하기 위해 사용 • NF_IP_PRE_ROUTING과 NF_IP_LOCAL_OUT 시점에서 netfilter로 hooking • Connection tracking • 모듈로 분리되어 구현 • 연결추적을 단순하고 명확하게 사용할 수 있도록 packet filtering 코드에 대한 확장성을 제공 (state 모듈)

  37. Understanding NAT • NAT • packet을 전혀 처리하지 않는 connection tracking과 NAT 코드 자체로 분리 • connection tracking 역시 iptables 모듈에서 사용하기 위해 설계 • Connection tracking • 우선 순위가 높은 NF_IP_LOCAL_OUT과 NF_IP_PRE_ROUTING으로 hooking • 이는 packet이 시스템으로 진입하기 전 그 packet을 살펴보기 위함 • skb에 있는 nfct 필드 • struct ip_conntrack의 내부에 대한 포인터 • 배열 infos[] 중 한 곳에 존재 즉, 이 배열내의 어떤 요소를 가리키게 함으로써 skb의 상태를 알 수 있음 즉, 이 포인터는 state structure와 그 상태에 대한 skb의 관계 모두를 알려줌

  38. Understanding NAT (cont’d) • nfct 필드를 추출하는 방법 • ip_conntrack_get()을 호출, nfct field가 세트되어 있으며 connection 포인터를 돌려주고 그렇지 않은 경우는 NULL을 돌려주며, 현재의 연결에 대한 packet의 관계를 표현하는 ctinfo을 채움 • nfct의 값들은 수치화(enumerate)되어 있음 • IP_CT_ESTABLISHED • 원래 방향에 대하여 established connection의 일부인 packet을 의미 • IP_CT_RELATED • connection에 관련된 packet으로, 원래의 방향으로 전달을 의미 • IP_CT_NEW • 새로운 connection을 생성하고자 하는 packet이다.(분명히, 원래 진행방향에 존재한다) • IP_CT_ESTABLISHED + IP_CT_IS_REPLY • established connection에 관련된 packet으로, 응답방향(reply direction)으로 향하고 있음을 의미 • IP_CT_RELATED + IP_CT_IS_REPLY • connection에 관련된 packet으로, 응답방향(reply direction)으로 향하고 있음을 의미 • 즉, reply packet은 nfct를 검사하여 그 값이 IP_CT_IS_REPLY 보다 크거나 같은 값인가를 바로 확인가능

  39. Extending Connection Tracking/NAT • 여러 가지 프로토콜과 서로 다른 mapping 타입을 조절하기 위하여 설계 • connection tracking 동작과정 • 일치하는 룰이나 binding을 검색하기 전에 packet을 tuple로 변환 • tuple이란 packet 중 관심의 대상이 되는 부분 • tuple은 처리 가능한 부분과 그렇지 못한 부분으로 구분, 각각 src와 dst라고 명명 • struct ip_conntrack_tuple로 표현 • 실제로 packet이 들어오는 hook과 device를 포함한 packet 정보 제공 • Ex) TCP packet의 tuple • 처리 가능한 부분 source IP와 source PORT • 처리 불가능한 부분은 목적지 IP와 목적지 port • Ex) ICMP packet의 tuple • source IP와 ICMP port가 처리 가능한 부분 • 처리 불가능한 부분은 목적지 IP와 ICMP 타입과 코드

  40. Extending Connection Tracking/NAT (cont’d) • tuple • struct ip_conntrack_tuple_hash에 포함되며, DLL과 tuple이 포함된 connection에 대한 포인터를 추가 • Connection • struct ip_conntrack에 의해 표현 • struct ip_conntrack_tuple_hash필드를 두 개 포함 • 원본 packet에 대한 방향 (tuplehash[IP_CT_DIR_ORIGINAL]) • 응답방향에 대한 packet (tuplehash[IP_CT_DIR_REPLY])에 대한 것 • NAT 코드 동작절차 • skbuff의 nfct 필드를 참조 • connection tracking 코드로 tuple을 추출할 수 있는 지 확인(이미 존재하는 connection을 찾는 것) • 새로운 connection이 시작 시 • 표준 iptable 진행 메커니즘을 이용, tuple에 대한 룰을 nat table에서 검색 • 이 때 룰이 일치하는 경우, 보통의 경우 진행방향과 응답방향 모두에 대하여 처리를 초기화 • 즉, 기대하고 있는 응답이 변경되어 버렸다는 것을 connection-tracking 코드가 알 수 있고, 그 후 앞서 언급한 바와 같이 처리 • 만일 적용할 룰이 없는 경우 null 바인딩이 생성

  41. Standard NAT Targets • NAT target • nat 테이블 내에서만 사용한다는 것만 제외하면, 여타의 iptables target extension과 상당히 유사 • 바인딩 하는 주소의 범위 • SNAT와 DNAT 모두 부가 데이터로서 struct ip_nat_multi_range를 취하고, 이 데이터를 mapping • 최소/최대 IP와 최대/최소 프로토콜 값(예:TCP 포트)으로 구성 • 범위 요소인 struct ip_nat_range • Flag 지원 • IP주소의 mapping 가능 여부, 범위의 protocol-specific 부분이 유효한지 알려주는 역할 • 다중 범위 설정 • struct ip_nat_range의 배열 • 범위를 1.1.1.1-1.1.1.2 ports 50-55 AND 1.1.1.3 port 80'과 같이 설정가능

  42. New Protocols • Inside The Kernel • 새로운 프로토콜을 구현한다는 것 • tuple의 처리가능 부분과 그렇지 못한 부분을 결정하는 것 • tuple의 처리가능부분은 NAT를 적용할 수 있는 부분 • TCP인 경우는 소스 포트가 되며, ICMP인 경우는 icmp ID • 한가지가 결정되었으면, connection tracking 코드를 작성가능 • ip_conntrack_register_protocol()로 전달하기 위하여 ip_conntrack_protocol 구조체를 이용

  43. New protocols (cont’d) • struct ip_conntrack_protocol의 필드 • list • { NULL, NULL }로 설정, 리스트를 확보 • proto • 프로토콜 번호 • name • 사용자가 보게 될 프로토콜 명칭 • pkt_to_tuple • 주어진 packet에 대한 tuple의 프로토콜 상세부분을 채우는 함수 • invert_tuple • tuple의 프로토콜 상세부분을 단순히 packet에 대한 응답으로 변경하는 데 사용 • print_tuple • tuple의 프로토콜 상세부분을 출력하는 데 사용하는 함수로, sprintf() 함수를 이용 • print_conntrack • conntrack 구조체의 공개되지 않은 부분을 출력하는 데 사용하는 함수 • packet • established connection의 일부를 보고자 할 때 호출하는 함수, packet에 대한 판결로 통상 NF_ACCEPT를 return, connection이 유효하지 않은 packet에 대해서는 -1을 return • new • packet이 최초로 연결을 맺을 때 호출되는 함수

  44. New protocols (cont’d) • 추적을 테스트 후, NAT에게 처리 정보 전달 • NAT 코드에 대한 확장 및 ip_nat_protocol_register()로 전달하고자 하는 ip_nat_protocol 구조체를 사용 • ip_nat_protocol • list , name, protonum • manip_pkt • IP header의 시작위치에 대한 포인터와 전체 packet의 길이를 얻는다 • in_range • 주어진 packet의 처리 가능한 부분이 주어진 범위에 속해있는 지를 알려주는 함수 • unique_tuple • NAT의 핵심이 되는 함수 • tuple과 범위가 주어지면, tuple의 per-protocol 부분을 범위에 속하는 tuple로 변경 • print • 문자버퍼와 범위가 주어진 경우, 그 범위의 per-protocol 부분을 출력하고, 사용된 버퍼의 길이 return

  45. Protocol helper • connection tracking에 대한 protocol helper • connection code가 다중 network connection을 사용하는 프로토콜을 알아차리고 초기 연결에 관련된 child connection을 표시할 수 있도록 하며, 일반적으로 이와 같은 과정은 data stream 외부의 관련된 주소를 읽음으로써 수행 • NAT에 대한 protocol helper • 두 가지 작업을 수행 • NAT 코드가 데이터 스트림을 포함하는 주소를 변경하도록 데이터 스트림을 처리 가능케 함 • 데이터 스트림이 들어올 때 그와 연관된 connection에 대하여 원래의 connection을 기초로 하여 NAT를 수행

  46. Connection Tracking Helper Modules • 어떤 packet이 이미 이루어진 connection에 속해 있는 지를 명시 • 우리 모듈이 어떤 packet에 관심을 가지고 있는 가를 netfilter에게 전달 • netfilter에 함수를 등록 • ip_conntrack_expect_related() 함수 • 등록된 곳으로부터 호출 • netfilter에게 연관된 connection을 예측 가능케 함 • 사용 가능한 구조체와 함수 • In init 함수 • struct ip_conntrack_helper에 대한 포인터를 이용, ip_conntrack_helper_register() 함수를 호출 • struct ip_conntrack_helper • list • Linked list 대한 헤더, netfilter가 내부적으로 다루는 리스트 • tuple • struct ip_conntrack_tuple, 작성한 conntrack helper 모듈이 관심을 갖는 packet을 명시 • mask • struct ip_conntrack_tuple, tuple의 어느 비트가 유효한지를 명시하고 있는 mask • help • tuple+mask에 부합하는 각 packet에 대하여 netfilter가 호출해야하는 함수

  47. Example Connection Tracking Helper Modules

  48. NAT helper Module • 특정 응용프로그램에 적합한 NAT 핸들링을 수행 • 이 함수는 데이터에 대한 on-the-fly 처리를 포함 • Ex) FTP의 포트 명령 • 클라이언트는 서버에게 어떤 IP와 포트로 연결을 해야 하는 가를 물어보게 되고, FTP 제어 연결에서 PORT 명령이 수행된 후 FTP helper 모듈은 IP/port를 교체 • TCP를 다루는 경우 복잡 • packet 크기가 변하기 때문 • Ex) FTP • PORT 명령이 수행된 후 IP/port tuple을 나타내는 string의 길이가 변경됨. 결국 packet 크기가 변경되면, NAT 박스의 좌측과 우측간에 syn/ack의 차이가 발생 • 연관된 모든 packet에 대하여 특별한 NAT 처리가 필요한 경우 • Ex) FTP • control connection의 PORT명령을 수행하는 클라이언트에 의해 얻어진 IP/port에 대해 DATA connection의 모든 입력 packet은 정상적인 table lookup을 거치는 것보다는 반드시 NAT되어야만 함

  49. NAT helper Module • ininit() 함수 • struct ip_nat_helper에 대한 포인터를 인자 • ip_nat_helper_register() 함수를 호출 • struct ip_nat_helper • list : netfilter에서 내부적으로 사용하는list header • tuple • struct ip_conntrack_tuple로, 우리가 작성한 NAT helper가 관심을 갖는 packet을 명시한 것 • mask • struct ip_conntrack_tuple이며, tuple의 어느 비트가 유효한지를 netfilter에게 전달 • help • tuple+mask에 부합하는 각 packet에 대하여 호출 해야하는 함수 • name • NAT help로 구별이 되는 유일한 name

  50. Example NAT helper Module

More Related