2013-10-06

Raspberry Pi를 3g tethering한 뒤, WiFi 공유기로 만들기

사용방식

3G Tethering을 이용해서 라즈베리 파이를 WiFi공유기로 만들자! 

주의! 설명에 // 라고 나온 것은 코드를 강조하기 위해 들어간 것이므로 입력하지 않는다!

----

준비물:
1. 라즈베리파이 모델B
2. 3G모뎀 혹은 안드로이드 스마트폰
3. USB WiFi 어댑터 (iptime은 드라이버 찾기가 안되서 포기)
http://www.amazon.de/EDIMAX-EW-7811UN-Wireless-Adapter-IEEE802-11b/dp/B003MTTJOY/ref=sr_1_5?ie=UTF8&qid=1381024377&sr=8-5&keywords=raspberry+wifi

----

1. 하드웨어 셋업

USB WiFi Adaptor를 끼우기 전에 라즈베리 파이('파이'라고 줄여 쓰겠음) 전원을 꺼야한다.
//
sudo shutdown -h now
//
다시 파이 전원을 킨다.

ifconfig -a

wlan0 이라는 항목이 보여야 한다.

----

2. 프로그램 설치하기

hostapd와 isc-dhcp-server라는 두 개의 프로그램을 설치한다.
//
sudo apt-get install hostapd isc-dhcp-server
//

----

3.1 DHCP 서버 설정하기 - dhcpd.conf 수정하기

dhcpd.conf 파일을 수정해야 한다.
//
sudo nano /etc/dhcp/dhcpd.conf 
//

이렇게 생긴 줄을 찾아서...
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;

앞에다가 #을 붙여준다. #을 붙이면 주석처리되서 실행이 안된다.
//
#option domain-name "example.org";
#option domain-name-servers ns1.example.org, ns2.example.org;
//

이렇게 생긴 줄을 찾아서...
# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
#authoritative;

앞에 붙은 #을 지워준다. 즉 실행하게 해 주는 것이다. 마지막 줄 authoriative;를 실행한다.
//
# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;
//
그리고 밑으로 내려서 마지막에 이것들을 추가한다. (팁: nano에서 Ctrl+V를 누르면 뒤로 넘어간다.)
//
subnet 192.168.42.0 netmask 255.255.255.0 {
range 192.168.42.10 192.168.42.50;
option broadcast-address 192.168.42.255;
option routers 192.168.42.1;
default-lease-time 600;
max-lease-time 7200;
option domain-name "local";
option domain-name-servers 8.8.8.8, 8.8.4.4;
}
//
Ctrl+X를 누르고 y를 눌러 저장하고 빠져나온다. 

----

3.2 DHCP 서버 설정하기 - isc-dhcp-server 수정하기

isc-dhcp-server를 수정해야 한다.
//
sudo nano /etc/default/isc-dhcp-server 
//
맨 밑으로 내리면 INTERFACES=""항목이 보인다. 이것을
INTERFACES="wlan0"
으로 바꿔준다.

----

4. wlan0을 정적 IP로 바꿔주기

공유기의 ip로 사용할 것이기에 바뀌면 안된다. 그래서 수동으로 설정해 준다.
//
sudo nano /etc/network/interfaces
//
auto wlan0 이라는 항목이 보이면 앞에 #을 붙여주어 비활성화 한다. 만약 없다면 관계없다.

이것을 추가한다.
//
iface wlan0 inet static
address 192.168.42.1
netmask 255.255.255.0
//
저장하고 나온다.(Ctrl-X, y 엔터)

실행한다.
//
sudo ifconfig wlan0 192.168.42.1
//

----

5. WiFi 공유기 AP 설정하기

공유기를 설정한다. 패스워드를 치고 들어오게 설정할 것이다.
//
sudo nano /etc/hostapd/hostapd.conf
//

다음을 입력해 준다.
//
interface=wlan0
driver=rtl871xdrv
ssid=공유기이름(영어로)
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=비밀번호(영어나숫자로)
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
//
ssid와 wpa_passphrase는 공유기 이름이고 그 비밀번호다. 각자 알아서 설정한다.

만약 driver를 못 찾는다고 하면, 위의 내용 중 driver=rtl871xdrv 를 driver=nl80211 으로 바꿔준다. 만약 그래도 못 찾으면 각자 알아내야 하는데, 필자는 찾지 못하고, 그냥 커뮤니티에서 추천하는 usb를 구입했다. EDIMAX EW-7811UN을 추천한다. 싸진 않지만 뭐 쓸만하다.

설정한 값을 파이가 인식하게 만들자.
//
sudo nano /etc/default/hostapd
//
이 것을 찾아서
#DAEMON_CONF=""
다음과 같이 고친다.
//
DAEMON_CONF="/etc/hostapd/hostapd.conf"
//
앞에 #을 빼는 것을 잊지말것!

----

6. 3G 테더링 설정하기

안드로이드폰 혹은 3g모뎀 테더링 설정하기. 먼저 핸드폰에서 테더링 설정을 한다.
//
sudo nano /etc/network/interfaces
//
usb로 연결된 장치를 dhcp로 분배하기를 설정한다. 이 것을 추가한다.
//
iface usb0 inet dhcp
//
저장하고 나온 뒤(Ctrl-X, y 엔터), 그리고 이 명령어를 친다.
//
sudo ifup usb0
//
재부팅 한다. sudo reboot
재부팅 한 뒤 스마트폰이나 모뎀에서 테더링을 다시 켜 준다. 켜져 있으면 안해도 
----

7. 네트워크 포트포워딩 설정하기

실행한다.
//
sudo nano /etc/sysctl.conf
//

맨 밑에 이것을 추가한다.
//
net.ipv4.ip_forward=1
//

저장하고 나와서(Ctrl-X, y 엔터) 실행한다.
//
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
//

3G로 받아오는 정보를 WiFi로 쏴주는 작업을 해야한다. usb0에서 받아온 것을 wlan0으로 포워딩 해주기. 아래 3개의 코드를 순서대로 실행한다.
//
sudo iptables -t nat -A POSTROUTING -o usb0 -j MASQUERADE

sudo iptables -A FORWARD -i usb0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT

sudo iptables -A FORWARD -i wlan0 -o usb0 -j ACCEPT
//

사실 이 한줄만 있어도 동작한다.
//
sudo iptables -t nat -A POSTROUTING -o usb0 -j MASQUERADE
//

실행여부는 sudo iptables -t nat -S 그리고 sudo iptables -S로 확인해 볼 수 있다.

재부팅 해서도 계속 실행되게 해 주기. 실행한다.
//
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
//

인터페이스에 다시 추가해 준다. 실행한다.
//
sudo nano /etc/network/interfaces 
//

이 것을 마지막에 추가한다.
//
up iptables-restore < /etc/iptables.ipv4.nat
//

----

8. 거의 다 끝났다. hostapd 업데이트하기

필요한 파일을 받는다.
//
wget http://www.adafruit.com/downloads/adafruit_hostapd.zip 
//

압축을 푼다.
//
unzip adafruit_hostapd.zip 
//

원래 있던 파일을 안전을 위해 백업한다.
//
sudo mv /usr/sbin/hostapd /usr/sbin/hostapd.bak 
//

실행을 위해 폴더 위치를 옮긴다.
//
sudo mv hostapd /usr/sbin
//

실행할 수 있게 chmod를 실행한다.
//
sudo chmod 755 /usr/sbin/hostapd
//

----

9. 마지막 테스트

----
무선 와이파이를 시험 가동해 보자! 실행한다.
//
sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf
//
여러분이 설정한 SSID가 보이면 성공이다. 접속은 되지만 아직 파일 송수신은 안된다.

----

10. 마무리

----

서버를 시작해 보자.
//
sudo service hostapd start 
sudo service isc-dhcp-server start
//
시작이 될 것이다. 그리고 start 대신에 status로 상황을 확인할 수 있다.

시작프로그램에 등록해 주자.
//
sudo update-rc.d hostapd enable 
sudo update-rc.d isc-dhcp-server enable
//
그리고 혹시 모르니 키체인을 홈폴더에 복사해 준다.
//
sudo mv /usr/share/dbus-1/system-services/fi.epitest.hostap.WPASupplicant.service ~/
//

끝났다. 재부팅 해보자.
----

문제점: 파이 내에서 ping이나 apt-get, 즉 외부에서 받아 오는 것이 안된다. 아무리 뒤져봐도 이유를 모르겠음.
그래서 발견한 방법. 외부 wifi usb동글을 하나 더 꼽고, wlan1로 인식한 다음에 Pi_AP에서 다시 받아옴.

다음을 /etc/networt/interfaces에 추가:
### wlan0 to wlan1
allow-hotplug wlan1
iface wlan1 inet dhcp
        wpa-ssid "공유기이름"
        wpa-psk "비밀번호"


완성된 파일:









참고문헌:
http://learn.adafruit.com/setting-up-a-raspberry-pi-as-a-wifi-access-point/install-software
http://elinux.org/RPI-Wireless-Hotspot
http://xsatria.wordpress.com/2013/07/09/usb-tethering-from-android-to-raspberry-pi/


No comments:

Post a Comment