樹莓派 Raspberry Pi 設定無線網路 WiFi AP,打造無線 IP 分享器

這裡介紹如何使用樹莓派架設一個無線網路 AP,讓各種無線網路設備透過樹莓派上網。

樹莓派在插上一張 USB 無線網路卡之後,可以透過無線網路上網,而除了讓樹莓派上網之外,我們也可以使用同樣一張 USB 無線網路卡將樹莓派打造成無線網路基地台(AP,Access Point),當作 IP 分享器使用。


以下是用樹莓派打造無線 IP 分享器所需要準備的設備:

這裡要注意一點,並不是每一張 USB 網路卡都支援 AP 模式,在選擇 USB 網路卡時要先確認一下,有支援 AP 模式的網路卡可以參考 Embedded Linux Wiki

以下是整個安裝與設定過程。

基本 Linux 系統

將樹莓派安裝好基本的 Linux 系統,若是新手建議使用 NOOBS 安裝。

安裝好 Linux 系統之後,將 USB 無線網路卡插上樹莓派。

setup-raspberry-pi-as-wireless-access-point-2

樹莓派與 USB 無線網路卡

網路設定

這裡我規劃使用樹莓派的有線以太網路(eth0)對外,而 USB 無線網路卡(wlan0)則對內,在開始設定之前請先確認自己的樹莓派基本環境是可以正常上網的(也就是 eth0 要先設定好),接著再調整無線網路卡的網路設定。

首先關閉無線網路卡 wlan0

sudo ifdown wlan0

編輯 /etc/network/interfaces 設定檔:

auto eth0
iface eth0 inet static
  address 192.168.0.200
  network 255.255.255.0
  broadcast 192.168.0.255
  gateway 192.168.0.1
  dns-nameservers 192.168.0.1 168.95.192.1 168.95.1.1

auto wlan0
iface wlan0 inet static
  address 192.168.2.1
  netmask 255.255.255.0

這裡需要更改的是 wlan0 的部份,要選定一個新的虛擬網段,並且指定一個固定的 IP 位址。

eth0 的部份就要看自己的環境是怎麼設定,我這裡的 eth0 是設定為靜態的固定 IP 位址,使用 DHCP 動態取得應該也是可以。

啟用無線網路卡 wlan0

sudo ifup wlan0

DHCP 伺服器

樹莓派對內的區域網路(wlan0)中需要一台 DHCP 伺服器來配發上網設備的 IP 位址,這樣才能上內部的設備自動取的 IP 上網。

在樹莓派上安裝 DHCP 伺服器:

sudo apt-get install isc-dhcp-server

編輯 /etc/dhcp/dhcpd.conf 設定檔,將 domain name 的全域設定拿掉:

# option definitions common to all supported networks...
# option domain-name "example.org";
# option domain-name-servers ns1.example.org, ns2.example.org;

設定這個 DHCP 伺服器為官方(authoritative)伺服器:

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;

設定要給 DHCP 伺服器配發的 IP 網段,這裡的網段要跟上面無線網路卡的網段相同:

subnet 192.168.2.0 netmask 255.255.255.0 {
  range 192.168.2.10 192.168.2.50;
  option broadcast-address 192.168.2.255;
  option routers 192.168.2.1;
  default-lease-time 600;
  max-lease-time 7200;
  option domain-name "local";
  option domain-name-servers 168.95.192.1, 168.95.1.1;
}

編輯 /etc/default/isc-dhcp-server 設定檔,設定 INTERFACES

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
# Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES="wlan0"

設定好之後,重新啟動 DHCP 伺服器:

service isc-dhcp-server restart

並檢查是否有錯誤訊息。

Packet Forwarding

封包轉送(packet forwarding)的作用在於將內部 wlan0 區域網路的封包轉送至 eth0,讓內部的設備可以連線至外部網路。

編輯 /etc/sysctl.conf 設定檔,設定 packet forwarding:

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

若要讓 packet forwarding 馬上生效,可以執行:

sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

設定 NAT:

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 的設定:

sudo iptables -t nat -S
sudo iptables -S

接著要讓 NAT 的設定可以在每次開機都自動設定,我們將 iptables 的設定儲存在 /etc/iptables.ipv4.nat 中:

sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

編輯 /etc/network/interfaces,加入:

up iptables-restore < /etc/iptables.ipv4.nat

這樣在網路啟動時就會自動設定 NAT。

樹莓派, 物聯網

16 Comments

  1. EricZhang

    請問一下 我在
    service isc-dhcp-server restart
    出現failed to restart isc-dhcp-server.service:access denied
    的錯誤 請問是什麼意思?

    • G. T. Wang

      有用 root 權限執行嗎?

      • EricZhang

        不好意思 該怎麼設定root權限 因為我是照這篇教學 練習設定

  2. EricZhang

    我有找到資料 使用sudo passwd root 去設定
    但是當我使用sudo passwd -u root 時出現
    passwd password expiry information changed

    • EricZhang

      我剛剛重新跑一次教學 發現到
      # On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
      # Separate multiple interfaces with spaces, e.g. “eth0 eth1”.
      INTERFACES=”wlan0″
      這個設定 您的有#on……這類的註解
      但我的是空白頁面 只有我自己輸入的INTERFACES=”wlan0″
      是不是我的/etc/default/isc-dhcp-server設定檔有問題 缺少了什麼導致無法start
      是不是我的

      • EricZhang

        我剛剛重新將rpi重新安裝後 發現問題源頭
        我在spt-get那邊就錯誤了
        正在預先設定套件 …
        選取了原先未選的套件 isc-dhcp-server。
        (讀取資料庫 … 目前共安裝了 125576 個檔案和目錄。)
        Preparing to unpack …/isc-dhcp-server_4.3.1-6+deb8u2_armhf.deb …
        Unpacking isc-dhcp-server (4.3.1-6+deb8u2) …
        Processing triggers for man-db (2.7.0.2-5) …
        Processing triggers for systemd (215-17+deb8u4) …
        設定 isc-dhcp-server (4.3.1-6+deb8u2) …
        –>Generating /etc/default/isc-dhcp-server…
        Job for isc-dhcp-server.service failed. See ‘systemctl status isc-dhcp-server.service’ and ‘journalctl -xn’ for details.
        invoke-rc.d: initscript isc-dhcp-server, action “start” failed.
        Processing triggers for systemd (215-17+deb8u4) …
        想請問是什麼原因嗎 我試過用sudo su root 安裝也一樣

  3. ANDY

    編輯 /etc/dhcp/dhcpd.conf 設定檔,將 domain name 的全域設定拿掉:

    # option definitions common to all supported networks…
    # option domain-name “example.org”;
    # option domain-name-servers ns1.example.org, ns2.example.org;

    請問只要改成這樣而已嗎

    # option definitions common to all supported networks…
    option domain-name “example.org”;
    # option domain-name-servers ns1.example.org, ns2.example.org;

  4. ANDY

    請問這段要加在哪呢~?
    subnet 192.168.2.0 netmask 255.255.255.0 {
    range 192.168.2.10 192.168.2.50;
    option broadcast-address 192.168.2.255;
    option routers 192.168.2.1;
    default-lease-time 600;
    max-lease-time 7200;
    option domain-name “local”;
    option domain-name-servers 168.95.192.1, 168.95.1.1;
    }

  5. ANDY

    挖!!

    我成功了

    感謝大大~

    請問可以用甚麼方式聯絡您嗎?

  6. ANDY

    請問您的做法應該是會讓

    內部有網路 ,
    但是顯示不了網頁 吃不到wifi嗎?

    • G. T. Wang

      抱歉,這裡的網路設定我沒有寫得很清楚。

      這裡的做法是用 wlan0 對內提供無線網路,而 eth0 對外連上網際網路,正常來說設定好之後是可以正常上網的。

      當然網路的設定有很多方式,這只是常用設定的其中一種。

  7. 謝謝你的分享
    蠻希望 RaspberryPi 之後也能支援 5GHz 的頻段

  8. zetacat

    請問:
    開啟hostapd時,出現
    rfkill: Cannot open RFKILL control device
    nl80211: Could not re-add multicast membership for vendor events: -2 (No such file or directory)
    是甚麼出錯?如何解決?
    目前狀況是手機偵測的到AP但顯示不需要密碼
    但我有設wpa_passphrase
    而且連的時候一直卡在obtaining ip address
    求解惑,感激不盡~

    • zetacat

      #備註 我是使用orangepi ubuntu 16.04.2LTS 而非raspberrypi

  9. maxhu

    您好,關於這篇網誌受益匪淺
    但想請教,當我們設定好 網路轉發 wifi ap mode,要如何變回來?
    不曉得有什麼文章或關鍵字可以參考

Leave a Reply