수요일, 11월 20

Mobile seamless Handover on WIFI with hostapd, freeradius and SDN #3 SDN handover flow




Mobile seamless Handover on WIFI


 이번 글에서는 SDN을 통해 핸드오버, interworking을 구현해보고자 한다.
 전 글과 망 구성 및 이론은 동일하다.




 전 글에서는 동일 IP를 할당해줌을 통해서 접속 지점인 AP는 바꼈지만 실제 네트워크의 구성은 바뀌지 않은 상태였기 때문에 추가적인 처리 없이도 인터넷 스트리밍이 잠시의 끊길뿐 연결이 지속되는 것을 볼 수 있었다. 만약 다른 IP를 할당받더라도 같은 네트워크에 속해있다면 라우터 혹은 스위치가 RARP프로토콜을 통해 등록된 MAC을 보고 IP를 연결해줄 수 있기 때문에 동일한 효과를 볼 수 있다. 


 그러므로, SDN을 통한 handover를 구현 및 테스트해보고자 한다면 
 1. 서로 다른 네트워크로 구성된 AP 
 2. 이 둘을 컨트롤 할 수 있는 SDN Controller 

 두 가지 조건이 갖춰져아 한다는 점을 기억해야 한다. 
 미리 밝혔듯 앞선 조건을 미리 인지하지 못했기에 아직까지 이론만 갖춰져 있을뿐, 실제로 테스트를 하여 결과를 확인한 것은 아니다. 


 x86 base switch에는 내장 랜카드 외에 두 개의 추가 랜카드를 설치하고 Raspberry AP들을 연결시킨 후에 openvswitch를 통해 하나의 스위치처럼 묶어야 한다. 

ovs-vsctl add-br my-switch 
ovs-vsctl add-port my-switch eth1 
ovs-vsctl add-port my-switch eth2

 위와 같은 명령을 치면 openvswitch의 가상 스위치인  my-switch에 eth1과 eth2가 등록된다.

 ovs-vsctl show 

 위의 명령을 통해 이를 확인할 수 있다. 

 이제 SDN controller에 이 스위치를 연결해주는데, 필자는 floodlight를 사용했다. 

 ovs-vsctl set-controller my-switch tcp:<controller-ip>:6633

 6633은 floodlight의 기본 설정 포트이다. 제대로 등록됐다면 ovs-vsctl show 명령을 통해 컨트롤러가 연결되었음을 확인할 수 있을 것이고 floodlight web-ui를 통해 관련 정보를 쉽게 파악할 수 있을 것이다. 


 SDN 을 통해 handover를 구현하기 위한 시나리오를 생각해보면,  Raspberry AP 1 에서 Raspberry AP 2로 기기가 연결 지점을 바꾸는 것이 SDN Controller의 입장에서 보면  Raspberry AP1이 연결된 포트에서 Raspberry AP2가 연결된 포트로 패킷을 보내주게 바뀌는 것이다. 

 디바이스가 AP1 --> AP2 로 연결 변경
 Flow는   AP1 Port --> AP2 Port 로 변경

 여기서 필요한 것은 디바이스에게 오는 패킷을 식별할 값인데 MAC을 사용하면 된다. 이제 시나리오는 MAC 값을 기반으로 디바이스가 연결 지점을 바꾸면 들어오는 패킷을 바뀐 연결 지점으로 보내주는 것이다. 

 MAC값을 기반으로 패킷의 output을 변경. 


 추가적으로 더 처리해줄 것이 있는데, IP값이다. 디바이스가 연결지점을 바꾸며 동시에 IP를 재 할당받기 때문에(DHCP) 이에 관련된 제어가 필요하게 된다. 그러므로 패킷의 output 변경 외에 Destination IP 또한 연결을 바꾼 기기의 현재 IP에 맞게끔 바꿔줘야 한다. 


 MAC값을 기반으로 패킷의 output과 디바이스의 현재 IP로 Dst.IP를 변경


 이것이 handover의 최종 시나리오이다. 


 이에 따른 코드는 github를 통해 찾을 수 있다. 

 https://github.com/Bhb2011/floodlight-for-study/blob/master/src/main/java/net/floodlightcontroller/mactracker/MACTracker.java


 테스트


 이렇게 작성한 코드로 테스트를 해보면 디바이스가 AP를 이동할 시에 floodlight UI에 아래 그림과 같은 flow가 자동으로 등록된다.






 아래의 flow가 handover시에 등록되는 플로우이다.
설명하자면, MAC이 84:38:35:5f:04:94이면 3번 포트로 내보내고 dst.IP를 -1408211540으로 바꾸라는 뜻이고, 대충 172.16.101.XXX를 뜻한다. 그 뒤에 해당 플로우와 일치하는 패킷 수, 바이트 등의 정보가 표시되는데 업데이트가 일정 시점 이후에는 되지 않는 버그가 있다. 




 이론 상으로는 동적 Flow할당을 통해 AP를 변경한 디바이스의 맥 주소를 기준으로 디바이스의 현 IP로 바꾼 패킷을 그대로 전달해주므로 핸드오버의 구현이 되었다고 보이나, 실제 망에서 테스트하기 위해서는 빠른 IP할당 등의 여러가지 갖춰져야할 조건들이 있고 이들이 실제 handover의 테스트에 미치는 영향이 크기 때문에 실제 테스트 결과는 보지 못했다.










































화요일, 11월 5

Mobile seamless Handover on WIFI with hostapd, freeradius and SDN #2 802.11u interworking



Mobile seamless Handover on WIFI


1편에서는 잡담과 함께 기존의 이통사의 망을 살펴보고 이를 통해 핸드오버가 가능하게 하는 요소들에 대해서 정리를 했었다. 이를 다시 한번 살펴보면,

1. 핸드오버가 될 때 이를 중계할 수 있는 S-GW와 같은 장치가 있어야 하고
2. 같은 클라이언트 기기라는 것을 알 수 있는 어떤 인증 혹은 장치 관리 기법이 있어야하고
3. 클라이언트를 연결시켜줄 AP가 필요하다.

이를 와이파이 환경에서 구축하기 위해 필요한 툴 들을 정리해보면 다음과 같다.

1. S-GW = SDN
2. 인증장치 = Freeradius
3. AP = hostapd
4. Client = hotspot2 && 802.11u interworking

Client & Handover

 전 글에서는 다루지 않았지만 Client가 추가되었는데 이유는 이통사들의 핸드오버 기술은 3G이상의 망에서 다룬 것으로 Client에는 당연히 해당 통신망에 따른 장치와 제어 기술이 들어 있는것이 당연하기 때문이다.

 부연설명을 조금 더 하자면, 클라이언트가 아무런 알림 없이 기지국을 변경한다면 어떻게 될까? 이런 상황에서도 끊김없는 핸드오버가 가능할 것인가? 그렇지 않다고 본다. 왜냐하면 기존 wifi 처럼 연결을 끊고 새로 연결을 맺는데 몇 초씩 소모되지 않더라도 분명히 연결이 끊겨있는 시간이 있기 때문이다.

 때문에 클라이언트는 이런 특징을 가지고 있어야 한다.
 현재 AP에서 다른 AP를 검색 후 적합한 곳인지 판단되어 핸드오버를 할 시에 이를 미리 알리는 것인데 이에 대해 정해진 확정 프로토콜이나 기법은 무선랜에는 아직 존재하지 않는다.

 대신 802.11u spec은 핸드오버를 위한 표준을 제공을 제공해준다.
 (이제부터는 핸드오버 대신 네트웍 간 이동이라는 의미로 interworking이라는 용어를 사용)

 interworking을 위하여 클라이언트는 이동할 AP를 탐색해야 하고, 해당 AP를 이용할 수 있는지 등 여러 정보가 필요한데 이를 GAS/ANQP 라는 이름으로 정립해놨다. 또한 802.11u에 따르면 preauth기능등 여러가지 측면에서 핸드오버시 지연 요소들을 최소한으로 하기 위한 요소들을 만들었음을 알 수 있다.

  필자는 interworking을 구현하기 위해 wpa_supplicant 개발 버전 2.1-devel을 사용했는데 interworking을 지원하는 어떤 다른 방법이 있다면 사용해도 괜찮을 것 같다. 참고로 현재 Samsung Galaxy S3가 hotspot 2.0이란 이름으로 지원하므로 interworking 관련 기능을 사용할 수 있을 것이지만 지원하는 인증수단이 EAP-TLS 뿐이므로 인증서 관련 작업을 해줘야하는 번거로움이 있다.





네트워크 구성도

 interworking(=핸드오버)를 위한 네트워크 구성은 아래와 같다.
 RaspberryPi ( hostapd, Freeradis, openvswitch ) 2대
 x86 Linux Desktop ( SDN-Controller Floodlight, INTEL Lan-card x2 ) 1대

 2대의 RaspberryPi를 AP로 두고 디바이스가 AP를 이동 시에 SDN Controller가 디바이스의 MAC을 식별값으로 삼아 패킷을 전달해주는 방식이다.






Raspberry AP


 필자는 seamless handover를 구현해보기 위해 Raspberry pi 2대와 hostapd를 지원하는 무선랜카드 2종을 구입하였다.


 hostapd.handover.conf
====================================
# Lose the comment after its line

ssid=RaspberryAP_2
interface=wlan0
# The interface name of the card
driver=nl80211
bridge=br0
macaddr_acl=0
hw_mode=g
channel=1
#accept_mac_file=/etc/hostapd.accept
#deny_mac_file=/etc/hostapd.deny
ieee8021x=1    # Use 802.1X authentication
#wep_key_len_broadcast=13
#wep_key_len_unicast=13
#wep_rekey_period=300   # WEP rekeying interval
own_ip_addr=127.0.0.1  # The interface IP
nas_identifier=localhost
auth_server_addr=127.0.0.1 # Where is the radius server
auth_server_port=1812      # The port the radius server runs on
auth_server_shared_secret=password
# This is used to authenticate the hostapd to the radius server so none can use your raduis server
#acct_server_addr=127.0.0.1 # Where is the radius server
#acct_server_port=1813      # Where the accounting port is (I think)
#acct_server_shared_secret="password" # Same as above
wpa=2
wpa_key_mgmt=WPA-EAP
wpa_pairwise=CCMP
wpa_pairwise=CCMP

interworking=1
access_network_type=14
internet=1
asra=0
esr=0
uesa=0
venue_group=2
venue_type=0
roaming_consortium=2233445566
venue_name=P"eng:Example\nvenue"
domain_name=example.com
nai_realm=0,example.com,13[5:6],21[2:4][5:7]

hs20=1
rsn_preauth=1
#rsn_preauth_interfaces=wlan0
==========================================

 interworking 스펙상WPA-PSK 인증은 지원하지 않고, 반드시 EAP(=Extended Authorize Protocol  : 확장인증규약 )을 사용해야 한다. 왜냐하면 interworking은 단순히 한 AP에서 다른 AP로 넘어가는 것을 의미하는 것이 아니기 때문이다.

 interworking은 사용자가 거대한 네트워크 집합체에서 현재 접근 지점을 바꾸는 것을 의미하는 것이며, 더 이상 디바이스가 인증했떤 AP들의 인증 정보를 저장하고 있는 것이 아닌, 하나의 인증 정보를 가지고 이를 활용할 수 있는 불특정 다수의 AP를 찾아 접속지점을 바꾼다는 개념이다. 이를 Hotspot 2.0이라고 부르는데 검색해보면 마케팅의 선두주자 Apple이 얼마나 입을 털고 있는지 알 수 있다.

 어쨌든 EAP 인증 수단을 사용하기 위해서는 인증 서버를 만들어야 한다.
 만약 전 글에서 통신사들이 구축하고 있는 통신망의 핸드오버 정보를 자세히 보고 왔다면 AAA서버라는 것을 알게 되었을텐데 이는 Authorization, Accounting, Authentication의 약자로 통합 인증서버를 뜻한다. 통신사 망에서는 중계기들이 접속되는 디바이스들의 정보를 AAA서버를 통해 등록, 관리하고 인증시켜주게 된다.

 EAP 인증 수단은 TLS, TTLS, PEAP 등 엄청 다양하게 존재하고 Hotspot 2.0 에서는 TLS만을 지원하는데 이는 인증서 기반의 인증 수단이고 미리 발급받아야 한다. 참고로 현재 이통사들의 WIFI망은 sim값을 기반으로 인증하는데 이는 EAP-AKA라고 부른다. 어쨌든 AAA서버를 구축해야 되므로 Freeradius 서버를 설치하고 PEAP/MSCHAPV2 를 통해 인증할 수 있도록 설정을 한다.  ( PEAP/MSCHAPV2를 사용하는 이유는 id/password 인증이라 매우 간단하기 때문이다! )


 꼭 하나 위의 설정에서 집고 넘어가야 할 것이 바로

 roaming_consortium

 으로, 이 값이 동일하면 interworking 할 수 있는 AP로 인식하게 된다.


 AP의 hostapd+freeradius 설정이 끝났다면 간단히 핸드폰 등을 이용해서 접속이 원활이 되는지 테스트 해보도록 한다. 설정이 제대로 되었다면 AP 접속시 우측과 같은 화면이 보이며 인증 정보를 넣도록 되어 있다.

 우측과 같은 화면이 보이는지, 인증이 되는지, IP를 제대로 할당받아 오는지를 모두 확인해서 이상없이 네트워크를 사용할 수 있다면 다음 단계로 넘어가면 된다.

 만약, Galaxy S3 이상 Hotspot 2.0 지원 기종이라면 Freeradius 설정에서 TLS를 사용하도록 하고 인증서를 만들어서 핸드폰에 넣은 후, Hotspot 옵션을 활성화하고 EAP-TLS 설정에 들어가 인증서를 등록해주면 된다.

 참고로 필자는 안해봤다.









 테스트

 테스트 환경
 VirtualBox on mac
 linux 3.X kernel, ubuntu with Gnome-GUI
 Chrome Browser for linux
 wpa_supplicant 2.1-devel
 Ralink 3072 WLAN


 테스트를 위해 wpa_supplicant를 사용한 이유는 Galaxy S3가 없기도 하고 자유롭게 클라이언트를 제어할 수 있기 때문이다. 만약 Galaxy S3와 같은 디바이스를 사용한다면 interworking을 강제할 수 없기 때문에 AP간 이동이 가능한 환경을 구축해야 할 것이다.


( 주의 : 설정은 유동적이므로 자신의 환경에 맞게끔 실행해야 한다. )


AP
==========================================
brctl로 bridge를 등록하고 이를 기본 네트워크로 삼는다.


==========================================
ifconfig eth0 0
brctl addbr br0
brctl addif eth0
dhclient br0




==========================================
hostapd를 구동한다. 

==========================================
hostapd <path>/hostapd.conf


Client

==========================================
wpa_supplicant를 구동시키고 wpa_cli를 통해 콘솔에서 무선랜을 제어할 수 있다.


==========================================
wpa_supplicant -Dnl80211 -iwlan0 -C/var/wpa

==========================================
wpa_cli 를 실행한다.
==========================================
wpa_cli -p /var/wpa

==========================================
wpa_cli에서 다음의 명령을 통해 credential을 동록한다.
==========================================
add_cred
set_cred 0 username "user"
set_cred 0 password "password"
set_cred 0 eap PEAP
set_cred 0 phase2 "auth=MSCHAPV2"
set_cred 0 roaming_consortium 2233445566


앞서 말했듯 클라이언트가 interworking여부를 결정짓는 값은 roaming_consortium 이다.
============================
interworking 가능한 AP 지점을 찾는 명령
============================
interworking_select


============================
interworking 명령
============================
interworking_connect <bssid>


============================
TEST동영상
============================




 위의 테스트는 SDN은 아직 적용되지 않은, DHCP를 통해 강제로 동일 IP를 할당받게끔 설정한 환경에서의 테스트이다. twitch.tv 라는 온라인 스트리밍 사이트를 열어놓고 AP 간 이동 테스트를 했으며 결과는 보이는 바와 같다.


 다음 글에서는 SDN을 활용하는 방법에 대해서 알아보도록 하겠다...