MOFI Implementation using 6-to-4 Tunnel and Netfilter June 2012 Ji-In Kim and Nak-Jung Choi 요약 6-to-4 Tunneling 기법을이용한 MOFI 구현에대한기술문서로써구현을위해서 6-to-4 Tunneling 기 법과 netfilter, iptables 를이용한구현설계와구현과정, 실제구현에대한테스트결과를정리한문서 이다. 1
Table of Contents 1. 서론... 3 2. 6-TO-4 TUNNELING 기법을이용한 MOFI 구현... 3 2.1 HOST 구현... 4 2.2 AR 구현... 5 2.2.1 Netfilter란?... 6 2.2.2 Iptables와 Netfilter의이용... 7 2.2.3 netfilter를이용한패킷헤더변경소스코드... 8 2.3 SMDC 구현... 11 2.3.1 SDMC 란?... 11 2.3.2 SDMC 구현 (HID Binding Protocol)... 12 2.3.3 SDMC 구현 (LOC Query)... 12 2.3.4 SDMC 환경설정... 13 3. MOFI 구현테스트결과... 14 3.1 구현 TEST 환경... 14 3.2 구현 TEST 세팅... 15 3.3 구현 TEST 결과... 15 4. 결론... 17 참고문헌... 17 2
1. 서론 6-to-4 터널링기법기반의 MOFI 구현은 Linux를기반으로 MOFI를 real machine에구현하여 MOFI 테스트환경을구축한다. MOFI 테스트환경을구축함으로써프로토콜기능검증, 설계상의여러부족한점을보완이가능하며, 특히, 6-to-4 터널링기법을사용함으로써기존의 IPv6 응용프로그램을그대로사용할수있을뿐만아니라 MOFI의 HID 기반의 end-to-end 통신두가지요건을모두만족시킬수있는장점을가진다. 그리고 netfilter를사용함으로써, 직접적인 Linux kernel 코드에대한수정없이 MOFI-stack 구현이가능하다. 2. 6-to-4 Tunneling 기법을이용한 MOFI 구현 MOFI에서의통신의기본이되는 HID는 128bit로정의되어있다. 따라서, MOFI는기존의 IPv6응용프로그램을재사용할수있는장점을가진다. 이는 Host 구현에서도장점을가지게되는데 Linux kernel에서별도의 MOFI stack에대한구현없이기존의 IPv6 stack을 MOFI stack으로변환하여사용할수있게된다. 이경우 Host의수정을최소화할수있는장점을가지며, 이러한장점은나중에 MOFI의배포에대한오버헤드를줄일수있는하나의방법이될수있다. 본 6-to-4 tunneling 기법을이용한 MOFI 구현에서는아래그림 1 과같은네트워크모델을기본으로하 고있다. 그림 1. 6-to-4 tunneling 기법을이용한 MOFI 구현네트워크모델 3
2.1 Host 구현 MOFI Host는 Ubuntu Linux 9.10 운영체제를기반으로하여 6-to-4 tunneling 기법을응용하여개발하였다. 6-to-4 tunneling 기법은 tunnelling 기반의 IPv6/IPv4 전환기법의하나로 IPv4 망내에서독립된 IPv6망을접속하는것으로 IPv4 주소를사용하지않고터널의양끝의 IPv6 prefix를통해서구분하는기술이다. 이러한 6-to-4 tunneling을이용한 MOFI Host의구현은아래그림 2와같다. 그림 2. MOFI Host 스택 MOFI Host 스택에는기본적으로 MAC/PHY, ADP, HCP, App/Trans 이포함된다. 기존의 TCP/IP 프로토 콜스택의 IP 계층을대신해서 ADP 와 HCP 계층이추가되었으며, 이들프로토콜스택을구현하기위해 6-to-4 tunneling 기법을사용한다. 6-to-4 tunneling 기법을사용하기위해서우선가상의논리적인터페이스를만들고, 이를통해주소할당 및라우팅처리를하는과정을거치게된다. #/sbin/ip tunnel add mofiifc mode sit ttl <ttldefault> remote any local <local IPv4 address> #/sbin/ip link set dev mofiifc up #/sbin/ip addr add <HID address(as number)>/16 dev mofiifc 위명령은 6-to-4 tunneling 기법에서 mofiifc 라는 MOFI 를위한가상인터페이스를만들고, 이를활성화 하고, HID 를입력하는과정이다. 원래의 6-to-4 tunneling 기법에서는이과정에서 IPv4 주소를바탕으로 4
계산한 IPv6 주소를삽입해야하지만, 6-to-4 tunneling 기법을이용한 MOFI 구현에서는 AS number 를 포함하고있는 MOFI HID 를입력하게된다. 위와같은명령어를사용해서 6-to-4 tunneling 기법을이용한 MOFI Host 를구현한다. 2.2 AR 구현 MOFI AR은 MOFI에서하나의액세스네트워크를구성하는게이트웨이의역할을하고있기때문에두개의인터페이스를통해액세스네트워크와백본네트워크와의연결하는역할을수행한다. 이를구현하기위해본구현에서는 iptables와 netfilter를이용한다. Iptables와 netfilter는기본적인 Linux kernel에포함되어있으며, 사용을위해서는 Linux kernel을재컴파일해야한다. 본문서에서는 Iptables와 netfilter 설치와관련된내용은생략하도록한다. MOFI AR은 Ubuntu Linux 10.04의 Kernel version은 2.6.32.16을기반으로구현하였다. 그림 3 은 AR 의프로토콜스택을나타낸다. 그림 3. MOFI AR 스택 MOFI AR 스택에는 MAC/PHY 계층과 ADP/BDP 계층사이에헤더변환을위해 netfilter 가존재를하 며, 이 Netfilter 를이용하여패킷헤더의변경을수행한다. 5
2.2.1 Netfilter 란? Netfilter는네트워크인터페이스를지나가는패킷을 hooking해서정보조작을가능하게해주는 Linux kernel에포함된기능으로, Netfilter의 hooking 포인트는 NF_IP_PRE_ROUTING, NF_IP_LOCAL_IN, NF_IP_FORWARD, NF_IP_LOCAL_OUT, NF_IP_POST_ROUTING 총 5 부분으로이루어져있다. 그림 4 는 Linux kernel 에서의 netfilter hooking 포인트의정확한위치를보여준다. 그림 4. Netfilter Hooking 포인트위치 MOFI AR 구현을위해서는 NF_IP_POST_ROUTING 부분을 hooking 하여 6-to-4 tunneling 기법에서이 용하는 tunnelling mapping server 를거치지않고액세스네트워크의패킷이백본네트워크를통해도착 지 AR 에도착할수있도록패킷을조작한다. 6
각각의 hooking 포인트에대한설명은아래표 1 에나와있다. 표 1. Netfilter 의 Hooking 포인트 Hooking 포인트 NF_IP_PRE_ROUTING NF_IP_LOCAL_IN NF_IP_FORWARD NF_IP_LOCAL_OUT NF_IP_POST_ROUTING 설명네트워크인터페이스로들어오는모든패킷을처리현재노드로전송된패킷만처리도착지주소가다른패킷만처리다른노드로전달되는패킷만처리네트워크인터페이스에서나가는모든패킷을처리 2.2.2 Iptables 와 Netfilter 의이용 MOFI AR 을구현하기위해서는우선 iptables 를이용하여패킷전달을설정한다. 이는기존의 iptables 의 기능을그대로이용한것으로특별히이번구현을위해수정하거나추가한부분은없다. #echo 1 > /proc/sys/net/ipv4/ip_forward #iptables t nat A POSTROUTING s <HOST Private IPv4> -j SNAT to <AR Public IPv4> #iptables t nat A PREROUTING d <AR Public IPv4> - j DNAT to <HOST Private IPv4> 위명령은 iptables의 ip_forward 기능을이용하여액세스네트워크와백본네트워크를연결하는것을나타낸다. Linux kernel 레벨에서 ip_forward 기능은활성화하고, iptables 명령을이용하여 Local IPv4 address 주소로들어오는모든패킷을 netfilter의기능을이용하여백본네트워크로통하는인터페이스인 eth1의 NF_IP_POST_ROUTING단으로전달한다. 7
2.2.3 netfilter 를이용한패킷헤더변경소스코드 Netfilter 를이용한패킷헤더변경을위해서는다음과같은소스코드가필요하다. //module header #include <linux/errno.h> #include <linux/file.h> #include <linux/if_ether.h> #include <linux/init.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/types.h> #include <linux/fcntl.h> #include <linux/module.h> #include <linux/skbuff.h> #include <linux/netdevice.h> #include <linux/netfilter.h> #include <linux/netfilter_ipv4.h> #include <linux/netfilter_ipv6.h> #include <linux/in.h> #include <linux/in6.h> #include <linux/tcp.h> #include <linux/udp.h> #include <linux/ip.h> #include <linux/ipv6.h> #include <net/tcp.h> #include <asm/uaccess.h> #include <asm/io.h> static struct nf_hook_ops netfilter_ops1; unsigned int main_hook(unsigned int hooknum, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff*)) { struct iphdr *iph = ip_hdr(skb); 8
if(iph->saddr == in_aton("192.168.0.100")) { iph->daddr = in_aton("155.230.105.217"); ip_send_check(iph); } return NF_ACCEPT; } //using two hooking method unsigned int main_hook2(unsigned int hooknum, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff*)) { struct iphdr *iph = ip_hdr(skb); if(iph->saddr == in_aton("192.168.0.100")) { iph->daddr = in_aton("155.230.105.219"); ip_send_check(iph); } } return NF_ACCEPT; int init_module() { int ret = 0; char * argv[] = {"/run_app", NULL}; char * envp[] = {"HOME=/","TERM=linux","PATH=/sbin:/usr/sbin:/bin:/usr/bin",NULL}; ret = call_usermodehelper("/run_app", argv, envp, 1); printk("ret = %d\n",ret); if(ret == 0) { 9
netfilter_ops1.hook = main_hook; netfilter_ops1.pf = PF_INET; netfilter_ops1.hooknum = NF_INET_FORWARD; netfilter_ops1.priority = 1; nf_register_hook(&netfilter_ops1); return 0; } else { netfilter_ops1.hook = main_hook2; netfilter_ops1.pf = PF_INET; netfilter_ops1.hooknum = NF_INET_FORWARD; netfilter_ops1.priority = 1; nf_register_hook(&netfilter_ops1); return 0; } } void cleanup_module() { nf_unregister_hook(&netfilter_ops1); } 그림 5. Netfilter 를이용한헤더변경소스코드 그림 5 는 Hooking Point 인 NF_IP_POST_ROUTING 을통해서패킷헤더를변경시키기위한코드로이 를컴파일하여실행하면헤더변경을수행한다. Hooking 부분을 2 군데로둔경우는현재 Test 환경에서 AR2,3 로두었기때문에두군데로가는경우에따라서 Hooking 포인트가달라지기때문이다. 아래그림 6 은위에서작성한프로그램을통해 Netfilter hooking 이제대로일어났는지확인하기위한 Wireshark 를통한패킷캡쳐결과이다. 10
그림 6. Netfilter Hooking 확인을위한 Wireshark 패킷캡쳐결과 위의패킷캡쳐결과를보면프로그램실행후기존의 6-to-4 tunneling 기법에서사용하는 tunnelling mapping 서버가아닌도착지 AR 의주소 (155.230.105.217) 로된패킷헤더로변경이된것을확인할수 있다. 2.3 SMDC 구현 2.3.1 SDMC 란? MOFI 에서사용되는기술은 HOST 의 AS 정보는변함없이 Location 기반의통신이가능하게하는것 이다. 그것을위해서 HOST 가어떤 AR 과의통신을하고있는지, 즉 HOST 의 Location 정보를알수 있도록해주는 Control Packet 의역할을해주는 SDMC 가필요하다. 11
2.3.2 SDMC 구현 (HID Binding Protocol) HID Binding Protocol(HBP) 는 HOST가 AR에접속을하게되었을때 Binding Update를통해서자신이연결되었음을 LMC에알려주는역할을하는 Protocol이다. 이것은 UDP 소스를통해서 LMC쪽으로 Packet을전달하게되고그 Packet을받은 LMC에서 Binding Update가되는것이다. AR은 LMC를통해서현재자신의 LOC 정보에붙어있는 HOST가무슨 AS number를가지고있는지알게된다. 그림 7. HID Binding Update 2.3.3 SDMC 구현 (LOC Query) LOC Query 는 Data를보내는 Host 측면에서 Data의목적지 AS number를바탕으로특정 HOST가어떤 LOC 정보를가지고있는지즉어느 AR에있는지확인하기위한 Query 문이다. 그림 1 을바탕으로설명을하자면 Host1에서 Data packet을전송을하려고하는상태에서 Host2의 LOC 정보를알기위에서 AR1에있는 LMC에서 AR2의 LMC와 AR3 LMC로 Query를전송하게된다. 그렇게되면정보를받은 AR2,3의 LMC는자신에게일치 AS number를가진 Host가있는지확인을하게된다. 그리고일치하는 AS number Host가존재하는경우에는 Query에대한 Ack를보내게되고 AR1에서는 Ack를받은 LMC쪽에있는 AR로 Data packet을전송하게된다. 12
그림 8. LOC Query and DATA Delivery 2.3.4 SDMC 환경설정 현재구현환경의한계상 LMC는분리되어있는형태가아닌각각의 AR 마다 LMC 정보를직접관리하는형태의구현이이루어졌다. 그로인해서지금기존에사용하던 AR Public IPv4 정보이외에도 LMC 의역할을하기위한 IPv4을하나더할당해줄필요가있다. Ethernet card를하나더추가해서그역할을할수있는 IP할당방법도있겠지만현재 Packet Forwarding 밑 netfilter 후킹을사용한상태이므로그방법으로하게되면통신세팅하기가힘들었다. 그렇기때문에간편하게 eth0에하나의 IP를더할당하는방법을이용하였다. #ifconfig eth0:1 <LMC IPv4 Address> 이방법은 DNS 하나에여러개의 IP 를할당하는방법이지만우리가사용하는 MOFI 사용에사용하는방 법으로이용을하였다. 13
3. MOFI 구현테스트결과 3.1 구현 Test 환경 6-to-4 Tunneling 기법을이용한 MOFI 구현을확인하기위한테스트환경은아래 그림 9 과같다. 그림 9. 6-to-4 Tunneling 기법을이용한 MOFI 구현테스트환경 그림 9 에서보면알수있듯이일단 HOST1 은 AR1 에서통신을시작하는형태이고 HOST2 는 AR2 와 AR3 사이를다니면서움직이는형태이다. AR2, AR3 로구현한이유는 MOFI 의 Mobility 와 LOC 위치변 경을보여주기위한방법으로위와같은 Test 환경을구축하였습니다. Test 환경에올라간 OS 들은모두 Linux Ubuntu 10.04 버전이사용되었으며 kernel version 2.6.32 로설정 하였습니다. Ubuntu 버전은구현상크게상관없으나 Netfilter 와 Iptables 를사용함으로인해서 kernel version 은이상을사용해야이용하시는데크게문제가없으실듯합니다. 14
Test 를위해서 Webcam 을이용하는 Streaming 서비스와 Query 형태를보여줄수있는지도와 Wireshark 를통한 packet capture 를이용하였습니다. 3.2 구현 Test 세팅 Hbp.c라는실행파일은 AR2,3에서사용을해야한다. Hbp.c는 HOST2가어디에접속을하는가에대한것을판단하는부분과 AR1에서 Query가날라와서어디에있는확인을요청하는것에대한정보를확인할수있는부분으로구성되어있다. Hbp_clnt.c 는 Host2에서사용을하여서 AR2 혹은 AR3에접속을한다는메시지를주는것이다. 마지막으로는 ar.c는 AR1에서실행을하여커널모듈변경을수행하며 Host2의 LOC 정보를확인하기위한 Query message를전송하는기능을수행합니다. 3.3 구현 Test 결과 그림 10 은 LOC Query 가날아간다는것을표현할방법이없어서저희가 Query 에맞추어 packet 경로를 지도로나타낸모습입니다. 그림 10. LOC Query 경로표시 그림 11 은한곳의 AR2 에서 data 가올때 packet capture 를나타낸모습입니다. Wireshark 를변형해서 IPv6 정보가아닌 HID 롤표현을하였습니다. 15
그림 11. AR Wireshark 캡쳐장면 그림 12 는 Host 에서실행한 webcam streaming service 모습입니다. 그림 12. Webcam Streaming service 16
4. 결론 이상으로 6-to-4 tunneling 기법을이용한 MOFI 구현에대하여설명하였다. 현재방법적으로 100% 로 SDMC 를구현했다고볼수는없는상황이다. 하지만패킷의전송및동영상스트리밍테스트를통해서 정상적으로구현이완료된것을확인할수있었다. 참고문헌 [1] Mobile Oriented Future Internet (MOFI), http://www.mofi.re.kr/ [2] IETF Host Identity Protocol (HIP) WG, http://www.ietf.org/html.charters/hip-charter.html [3] IETF RFC 4843, An IPv6 Prefix for Overlay Routable Cryptographic Hash Identifiers (ORCHID), April 2007 [4] IETF RFC 3775, Mobility Support in IPv6, June 2004 [5] IETF RFC 5213, Proxy Mobile IPv6, August 2008 [6] Linux netfilter Hacking HOWTO, July 2002 17