본문 바로가기

개발자/Raspberry Pi3

라즈베리파이를 Access Point 로 만들기 - AP Mode 사용

 

 

 

라즈베리 파이를 AP Access Point로 만들기

 

무선 액세스 포인트(wireless access point, WAP)는 컴퓨터 네트워크에서 와이파이를 이용한 관련 표준을 이용하여 무선 장치들을 유선 장치에 연결할 수 있게 하는 장치를 가리킨다. WAP는 일반적으로 유선망을 거치는 라우터에 연결되며 컴퓨터, 프린터와 같은 무선 장치와 네트워크 상의 유선 장치 간 데이터를 중계할 수 있다. 그리고 무선 장비 연결중 블루투스 를 이용할때는 일반적으로 1:1로 연결을 하게 되므로 이때는 무선 액서스 포인트라고 하기보다는, 1:1 근거리 무선 통신 장비라고 한다. 이유는 일반적인 무선 액서스 포인트의 용도는 1:다수가 접속을 하는데 사용하기 때문이다. ( 위키백과 https://ko.wikipedia.org/wiki/%EB%AC%B4%EC%84%A0_%EC%95%A1%EC%84%B8%EC%8A%A4_%ED%8F%AC%EC%9D%B8%ED%8A%B8 )

 

그냥 쉽게 인터넷 기기들이 접속할 수 있는 무선/유선 포인트라고 생각하면 된다. 집에 있는 무선 공유기, 라우터, 아니면 스마트 폰 핫 스팟 기능이라고 이해하길 바란다. 

이렇게 설정하는 게 왜 좋은가? 왜 필요한가? 이것을 이해하면 아래는 할 필요가 없다.

 

바로 독립적인 무선 기기로 만들 수가 있다. 인터넷이 되든 안되는 상관없이 말이다. 실내에 있는 라즈베리 파이에 무선으로 접속할 수 있다는 말이 된다. 즉, AP 모드로 설정한 라즈베리 파이는 부팅을 하게 되면 AP 장치가 된다. 그래서 스마트 폰이든 노트북에서 접속이 가능하다. 파일을 실행 시킬 수 있고, 로봇으로 동작시킬 수 있고, 몰래 카메라 같은 기능을 실행하게 할 수 있다는 말이다. 무엇보다 네트워크 환경에서 해야 하는 개발이나 테스트가 아주 쉽게 할 수 있다는 말이다.  

 

라즈베리파이3 보드에 내장된 BCM43438 칩이 AP Mode 를 진원합니다. AP 란 Access Point 로 라우터나 공유기 같은 기능을 지원한다는 말입니다. 

 

SSH로 접속하고 로그인 하는 과정은 생략하도록 하겠습니다.

 

1. 업데이트 & 업그레이드

 

1
2
3
4
 
$sudo apt-get update
$sudo apt-get upgrade -y
 
cs

 

2. 패키지 설치

 

1
2
3
4
 
$sudo apt-get install hostapd -y
$sudo apt-get install dnsmasq -y
 
cs

 

여기서 hostapd는 wifi ap mode로 설정할 때 사용하며

 

dnsmasq 는 DHCP나 DNS를 설정할 때 사용합니다.

 

 

3. 자동실행 설정

 

1
2
3
4
 
$sudo systemctl disable hostapd
$sudo systemctl disable dnsmasq
 
cs

 

여기서 바로 넘어가면 설정이 되지 않은채로 실행되므로 이를 정지시켜 줍니다.

 

4. hostapd 설정

 

나노 에디터를 열어 아래 내용을 추가해 주시면 됩니다. 편집을 마치고 빠져 나올때는 ctrl-x 누르시고 저장할거냐 ? 물어오니 Y 누르시고 엔터 누르시면 빠져 나옵니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
$sudo nano /etc/hostapd/hostapd.conf 
 
interface=wlan0
driver=nl80211
ssid=RPI3wifi
hw_mode=g
channel=6
wmm_enabled=0
macaddr_acl=0
auth_algs=1
wpa=2
wpa_passphrase=1234567890
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
 
cs

 

편집을 마치고 빠져 나올때는 ctrl-x 누르시고 저장할거냐 ? 물어오니 Y 누르시고 엔터 누르시면 빠져 나옵니다.

 

대충 보자면 wlan0을 설정하고 ssid를 설정하고 뭐라뭐라 되있는데 솔직히 2개만 신경썼습니다.

 

ssid랑 wpa_passphrase

 

ssid는 우리가 와이파이를 켰을 때 보이는 이름이며

 

wpa_passphrase는 비밀번호입니다.

 

다른건 드라이버나 채널 암호화 방식등등 입니다.

 

완료되었다면 저장 후 종료를 해줍니다.

 

nano 에디터 기준으로 Ctrl + x, y, enter 를 하면 저장 후 종료하게 됩니다.

 

다음 파일을 열어서 

 

$sudo nano /etc/default/hostapd

 

#demon_conf=""

부분을

 

demon_conf="/etc/hostapd/hostapd.conf"

로 바꾸어 줍니다.

 

5. dnsmasq 설정

아패 파일을 열어서 아래 방향키를 사용하여 맨 아래로 이동하여 그대로 입력합니다.

 

1
2
3
4
5
6
7
8
9
10
11
 
$sudo nano /etc/dnsmasq.conf
 
#Pi3Hotspot Config
#stop DNSmasq from using resolv.conf
no-resolv
#Interface to use
interface=wlan0
bind-interfaces
dhcp-range=10.0.0.3,10.0.0.20,12h
 
cs

 

저장-종료를 해줍니다. ctrl-x 누르고 y 누르고 엔터쳐서 빠져나옵니다.

 

6. network 설정

 

1
2
3
4
5
6
7
8
 
$sudo nano /etc/network/interfaces
 
allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
 
 
cs

 

3번째 줄에 #을 추가하여 아래와 같이 바꿔줍니다.

 

1
2
3
4
5
6
 
allow-hotplug wlan0
iface wlan0 inet manual
#wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
 
 
cs

 

이제 스크립트를 수정해 주어야 합니다.

 

왜 수정하느냐?

 

라즈베리파이를 켰을 때 일일이 연결해서(이더넷같은 방법으로) ap mode 켜주고 할 순 없으니까요

 

7. rc.local 설정

 

rc.local은 라즈베리파이가 부팅할 때 실행되는 프로그램이나 커맨드에 관한 부분입니다. 자세한 내용은 아래 링크를 참조해 주시기 바랍니다.

 

https://www.raspberrypi.org/documentation/linux/usage/rc-local.md

 

#sudo nano /etc/rc.local  

 

명령으로 파일을 엽니다.

 

#!/bin/sh -e

위와같이 되어있는 맨 윗줄을

 

#!/bin/bash -e

로 바꾸어 줍니다.

 

그리고 fi (printf ~~ 바로 아래) 와 exit 0 사이에 아래 스크립트를 추가해 줍니다. 

에러가 나면 그대로 입력되어 있나 확인해야 합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#Wifi config - if no prefered Wifi generate a hotspot
#RPi Network Conf Bootstrapper
 
createAdHocNetwork()
{
    echo "Creating RPI Hotspot network"
    ifconfig wlan0 down
    ifconfig wlan0 10.0.0.5 netmask 255.255.255.0 up
    service dnsmasq start
    service hostapd start
    echo " "
    echo "Hotspot network created"
    echo " "
}
 
echo "================================="
echo "RPi Network Conf Bootstrapper"
echo "================================="
echo "Scanning for known WiFi networks"
ssids='mySSID1','mySSID2' )
connected=false
for ssid in "${ssids[@]}"
do
    echo " "
    echo "checking if ssid available:" $ssid
    echo " "
    if iwlist wlan0 scan | grep $ssid > /dev/null
    then
        echo "First WiFi in range has SSID:" $ssid
        echo "Starting supplicant for WPA/WPA2"
        wpa_supplicant --i wlan0 -/etc/wpa_supplicant/wpa_supplicant.conf > /dev/null 2>&1
        echo "Obtaining IP from DHCP"
        if dhclient -1 wlan0
        then
            echo "Connected to WiFi"
            connected=true
            break
        else
            echo "DHCP server did not respond with an IP lease (DHCPOFFER)"
            wpa_cli terminate
            break
        fi
    else
        echo "Not in range, WiFi with SSID:" $ssid
    fi
done
 
if ! $connected; then
    createAdHocNetwork
fi
 
cs

 

제일 처음 고쳤던 sh를 bash로 바꾸는 부분을 잘 몰라서 검색을 해보았습니다.

 

키워드 : sh vs bash

 

얻은 링크 : http://stackoverflow.com/questions/5725296/difference-between-sh-and-bash

 

다음으로 스크립트에 관한 내용입니다.

 

여기서 신경쓸 부분은

 

ssids=( ‘ssid1’, ‘ssid2’ )

 

부분입니다.

 

이 부분은 주변에 와이파이를 스캔해본 뒤 일치하는 ssid가 있으면 wpa_supplicant.conf 에 설정되어 있는데로 연결을 시도하며 그게 아니라면 ap mode로 진입합니다.

 

위처럼 ‘,’ 를 이용하여 여러개를 넣을 수 있으며 1개만 넣어주어도 됩니다.

 

일치하는 ssid가 있으면 ap mode로 바뀌지 않으므로 일부러 틀린 ssid를 넣어 와이파이가 공유기에 접속하지 못하게 하였습니다.

 

저장-종료 후 재부팅을 해줍니다.

 

$sudo reboot

이까지 되었다면 라즈베리파이를 ap mode로 사용할 수 있습니다.

 

wifi

 

8. 추가사항(필수)

 

이대로 진행해보니 에러가 하나 발생하였습니다.

 

pip를 설치하려는데 에러가 나길레

 

$ping google.com

을 해보니 알 수 없는 주소라는 에러가 출력되었습니다.

 

그런데

 

$ping 8.8.8.8 은 잘됩니다.

 

dns 문제인가 싶어 dnsmasq를 먼저 수정해 보았습니다.

 

하지만 뭘 수정해야 할지 모르므로 구글링

 

키워드 : dnsmasq raspberry pi

 

얻은 링크 : https://www.raspberrypi.org/forums/viewtopic.php?t=46154

 

중간에  server=8.8.8.8 이라는 부분이 보였습니다.

 

이를 dnsmasq.conf에 추가해 줍니다.

 

$sudo nano /etc/dnsmasq.conf

 

server=8.8.8.8

를 맨 마지막에 추가해 주었습니다.

 

저장-종료 후 재부팅을 해줍니다.

 

$sudo reboot

설정이 잘 되었는지 확인하기 위해 ifconfig 명령을 사용해 wlan0 가 셋팅되어 있음을 확인한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
pi@raspberrypi:~ $ ifconfig
eth0      Link encap:Ethernet  HWaddr b8:27:eb:7f:d0:79
          inet addr:192.168.1.239  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::b9ce:c93b:7972:2869/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:408 errors:0 dropped:2 overruns:0 frame:0
          TX packets:155 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:34505 (33.6 KiB)  TX bytes:24505 (23.9 KiB)
 
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:358 errors:0 dropped:0 overruns:0 frame:0
          TX packets:358 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:26825 (26.1 KiB)  TX bytes:26825 (26.1 KiB)
 
wlan0     Link encap:Ethernet  HWaddr b8:27:eb:2a:85:2c
          inet addr:10.0.0.5  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::4b59:6b44:6e1b:a9a5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:369 errors:0 dropped:369 overruns:0 frame:0
          TX packets:117 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:69521 (67.8 KiB)  TX bytes:20521 (20.0 KiB)
 
pi@raspberrypi:~ $
 
cs

 

위 화면은 이더넷 케이블로 IP 주소를 받고, AP 모드로 설정된 상태이다. 즉 무선 AP 로 설정된 상태다. SSID는 RPI3wifi 이고 주소는 10.0.0.5 임을 알 수 있다.

 

$ping google.com

참고자료 목록

 

http://www.raspberryconnect.com/network/item/315-rpi3-auto-wifi-hotspot-if-no-internet http://elinux.org/RPi_Setting_up_a_static_IP_in_Debian https://frillip.com/using-your-raspberry-pi-3-as-a-wifi-access-point-with-hostapd/

 

내용 참고 : https://blog.psangwoo.com/rpi/2016/08/20/rpi-connect_wifi.html

 

 

 

If you are always trying to be normal you will never know how amazing you can be.

 

 

 

 

 

 

더욱 좋은 정보를 제공하겠습니다.~ ^^

이 글 공유하기

facebook twitter kakaoTalk kakaostory naver band
  • 이규민 2019.02.27 09:27 댓글주소 수정/삭제 댓글쓰기

    글 잘 읽었습니다!

    몇가지 이해가 잘 되지 않는 부분이 있어 댓글로 남깁니다.

    1. 6번 과정중 wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
    상기된 스크립트의 역할이 뭔지 알 수 있을까요?

    2. /etc/network/interfaces 내에 삽입되는 스크립트는 네트워크 인터페이스를 지정하는 곳으로 알고 있습니다.
    여기다가 새롭게 설정하는 wlan0의 경우 단순히 DHCP를 위한 정보를 세팅하는 거라고 봐도 무방한가요?

    3. 저같은 경우에는 마지막에 다음과 같은 코드를 추가하는 방식으로 와이파이를 연결시켰습니다.
    sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

    iptables를 이용하는 방식은 제가 이해하기로는, wlan을 eth쪽으로 포워딩 시키는 역할이라고 이해하고 있는데 이게 맞는 이해방식인가요..??

    적지 않은 고민을 하고 낸 질문들인데 너무 초보스러운 질문이면 죄송합니다..
    답변 부탁드리겠습니다.

    감사합니다

  • 비밀댓글입니다

  • 성표 2019.07.06 01:45 댓글주소 수정/삭제 댓글쓰기

    그대로 복사 붙여넣기로 만들었는데 error code 라고 나오는데 어떻게 해야할까요

  • ㅇㅇ 2020.03.28 03:58 댓글주소 수정/삭제 댓글쓰기

    network/interface에 뭐 쓰면 안됩니다 랜포트까지 죽어요