집에서 사용하는 무선랜이 벽과 벽을 통과하면서 정작 내방에서는 거의 잡히지 않게 되었다.

그동안 유선으로만 쓰고 있었는데.. 이번에 새롭게 태블릿과 휴대폰을 구입하면서 너무나 불편하게 되었다.
그래서 젠투에 Wifi 공유기 설정을 하게 되었다.

AP 지원 모드 확인
먼저 현재 사용중인 무선랜 카드가 AP 모드를 지원하는지를 확인해야 한다.

$ sudo emerge iw
$ iw list
Wiphy phy0
	max # scan SSIDs: 4
	max scan IEs length: 2257 bytes
	RTS threshold: 2347
	Coverage class: 0 (up to 0m)
	Device supports RSN-IBSS.
	Supported Ciphers:
		* WEP40 (00-0f-ac:1)
		* WEP104 (00-0f-ac:5)
		* TKIP (00-0f-ac:2)
		* CCMP (00-0f-ac:4)
		* CMAC (00-0f-ac:6)
	Available Antennas: TX 0 RX 0
	Supported interface modes:
		 * IBSS
		 * managed
		 * AP
		 * AP/VLAN
		 * monitor
		 * mesh point
		 * P2P-client
		 * P2P-GO

위와 같이 iw list 명령어로 확인했을 때, Supported interface modes: 항목에 AP 항목이 표시가 되어야한다. 꼭 확인하도록 하자.

필요 패키지
다음의 패키지들을 설치해주자.

$ sudo emerge hostapd
$ sudo emerge dhcp

dhcp 설정

생성된(곧 생성할..) 무선 AP에 Client가 접속했을 때, 자동으로 사용가능한 IP 를 할당해주어야 한다. 그러기 위해서는 dhcp 설정이 필요하다. 이 예제에서는 임의로 10.10.0.0/24 대역의 IP 주소를 사용하기로 한다.

dhcp 설정을 위해서 다음의 내용을 /etc/dhcp/dhcpd.conf 파일에 입력한다.

subnet 10.10.0.0 netmask 255.255.255.0 {
        range 10.10.0.25 10.10.0.50;
        option domain-name-servers 8.8.8.8;
        option routers 10.10.0.1;
}

hostapd 설정

hostapd 는 실제로 wifi ap를 생성해주는 유틸이다. /etc/hostapd/hostapd.conf 파일에 아래의 내용을 입력하도록 하자.

interface=wlan0
driver=nl80211
ssid=pchero_gentoo
hw_mode=g
channel=1
macaddr_acl=0
auth_algs=3

wpa=3
wpa_passphrase=yourpassword
wpa_psk_radius=0
wpa_key_mgmt=WPA-PSK WPA-EAP
wpa_pairwise=CCMP
wpa_ptk_rekey=600

간혹 설정 내용이 잘 안 맞아서 안되는 인증이 경우가 있다. 이런 경우, 어느 부분에서 문제가 생기는지 알기 어려울 수 있다. 때문에 처음에는 가급적 암호화 없는 Open 으로 설정한 뒤, 정상작동하는 것을 확인하고 하나씩 수정하는 것을 권한다. 아래 내용은 암호화를 하지 않은 Open 방식 설정 예제이다.

interface=wlan0
driver=nl80211
ssid=pchero_gentoo
hw_mode=g
channel=11

Ip masquerade

wifi ap 생성 후, 패킷을 포워딩해주어야 하기 때문에 masquerade 설정을 해야한다. 아래 명령은 root 로 su 한 다음에 진행해야 한다.

$ sudo su -
$ echo "1" > /proc/sys/net/ipv4/ip_forward
$ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

NetworkManager

고생했던 부분이다….. 여기까지 진행하면서 문제가 없었는데, 이상하게 hostapd 를 시작하면 이상한 오류를 내면서 죽는 현상이 나타났다. 아래는 그 오류 내용이다.

pchero@localhost ~ $ sudo hostapd -dd /etc/hostapd/hostapd.conf
random: Trying to read entropy from /dev/random
Configuration file: /etc/hostapd/hostapd.conf
ctrl_interface_group=10 (from group name 'wheel')
nl80211: Could not add multicast membership for vendor events: -2 (No such file or directory)
rfkill: initial event: idx=0 type=1 op=0 soft=0 hard=0
nl80211: Supported cipher 00-0f-ac:1
nl80211: Supported cipher 00-0f-ac:5
nl80211: Supported cipher 00-0f-ac:2
nl80211: Supported cipher 00-0f-ac:4
nl80211: Supported cipher 00-0f-ac:6
nl80211: Using driver-based off-channel TX
nl80211: interface wlan0 in phy phy0
nl80211: Set mode ifindex 6 iftype 3 (AP)
nl80211: Setup AP(wlan0) - device_ap_sme=0 use_monitor=0
nl80211: Subscribe to mgmt frames with AP handle 0x1c6d390
nl80211: Register frame type=0xb0 nl_handle=0x1c6d390 match=
nl80211: Register frame type=0x0 nl_handle=0x1c6d390 match=
nl80211: Register frame type=0x20 nl_handle=0x1c6d390 match=
nl80211: Register frame type=0xa0 nl_handle=0x1c6d390 match=
nl80211: Register frame type=0xc0 nl_handle=0x1c6d390 match=
nl80211: Register frame type=0xd0 nl_handle=0x1c6d390 match=
nl80211: Register frame command failed (type=208): ret=-114 (Operation already in progress)
nl80211: Register frame match - hexdump(len=0): [NULL]
nl80211: Could not configure driver mode
nl80211: Remove monitor interface: refcount=0
nl80211: Remove beacon (ifindex=6)
netlink: Operstate: ifindex=6 linkmode=0 (kernel-control), operstate=6 (IF_OPER_UP)
nl80211: Set mode ifindex 6 iftype 2 (STATION)
nl80211: Teardown AP(wlan0) - device_ap_sme=0 use_monitor=0
nl80211 driver initialization failed.
hostapd_interface_deinit_free(0x1c6c990)
hostapd_interface_deinit_free: num_bss=1 conf->num_bss=1
hostapd_interface_deinit(0x1c6c990)
hostapd_bss_deinit: deinit bss wlan0
hostapd_cleanup(hapd=0x1c70370 (wlan0))
hostapd_free_hapd_data: Interface wlan0 wasn't started
hostapd_interface_deinit_free: driver=(nil) drv_priv=(nil) -> hapd_deinit
hostapd_interface_free(0x1c6c990)
hostapd_interface_free: free hapd 0x1c70370
hostapd_cleanup_iface(0x1c6c990)
hostapd_cleanup_iface_partial(0x1c6c990)
hostapd_cleanup_iface: free iface=0x1c6c990

결론은 NetworkManager 때문이었다. hostapd 와 NetworkManager 는 같이 실행시킬 수 없다. 즉, hostapd 를 실행시키기 위해서는 NetworkManager 를 종료 시켜야 한다.

sudo /etc/init.d/NetworkManager stop

Set wlan0

이제 wlan0 의 IP 를 설정해주자. 기본적으로 dhcpd.conf 의 설정 내용과 맞춰야 하므로 10.10.0.1 로 설정하도록 하자.

ifconfig wlan0 10.10.0.1 netmask 255.255.255.0

Start hostapd

다 끝났다. dhcp 와 hostapd 를 시작하도록 하자. dhcp 시작시, wlan0 에 대해서만 dhcp 서비스를 하도록 명시해 주어야 한다. 주의하자.
만약 interface를 명시하지 않을 경우, eth0 까지도 dhcp 서비스를 하려고 한다. 그렇게 되면 eth0에 설정되어 있는 IP 정보가 날아가게 되고, 결론적으로는 AP 로써 정상작동하지 않게 된다.

# dhcp
$ sudo dhcpd -cf /etc/dhcp/dhcpd.conf wlan0 start

# hostapd
$ sudo hostapd -dd /etc/hostapd/hostapd.conf

Miscellaneous

매번 ap 를 구동하기 위해 위의 명령어를 입력할 수는 없다. 간단히 스크립트를 만들도록 하자.

#!/bin/bash

# stop Network Manager
#service NetworkManager stop
/etc/init.d/NetworkManager stop

# Set wlan0 IP
ifconfig wlan0 10.10.0.1 netmask 255.255.255.0

# Ip forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# dhcp
dhcpd -cf /etc/dhcp/dhcpd.conf wlan0 start

# hostapd
hostapd -B /etc/hostapd/hostapd.conf

참고
http://exain.wordpress.com/2011/03/31/making-a-wifi-hotspot-access-point-using-linux-wifi-lan-cardusb-adapter
http://www.sentabi.com/how-to-fix-hostapd-nl80211driver-initialization

 

Tags: , , , ,

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.