Raspberry Pi3を無線LANコンバータにする

珍しく連投してる るーふぁす ですw単に記事の下書きがあったから連投出来ただけって話だったりするんですがwww

さて、今回は前回の予告通りRaspberry Pi3 ModelB無線LANコンバータにして有線接続しか接続手段がない或いは、無線の規格が合わず接続出来ない機器をインターネットないしネットワークに接続してみようという話です。

ちなみにこちらの場合、以前の投稿で書いたのですが部屋の無線をWPA2-EAPにした関係で、TVやゲーム機(据え置き)での無線接続が出来なくなり、それらEAPに非対応の機器を接続する為にわざわざWPA-PSKの電波も飛ばしているという状況が、いくら複数の電波を飛ばせる無線APだからといっても無駄でしかなく、『それだったらラズパイあたりを使って有線と無線をブリッジさせれば良いんじゃないか?』と思ったのが動機だったりしますw(このブリッジが有線と無線間であるが故に良く紹介されているbrctlでは動かなくて苦戦させられることになるとは… orz)

環境と前提条件

こちらが実際に設定を行った環境の構成は以下の通りです。

ハード Raspberry Pi3 ModelB
OS raspbian jessie lite
(2016-05-27)
無線LANアダプタ BUFFALO WLI-UC-GNM2

なお、無線LANアダプタに関しては、試していないのではっきりとは言えませんが、恐らく内蔵のものでも問題ないかと思います(後日試して報告したいと思います)。

また、前提としてOSのインストール並びに無線LANへの接続は既に済んでいるものとして話を進めます。

目的

raspberrypi3_wirelessconverter_thumbnail

図の様なネットワークにおいて、Raspberry Piの有線LANインターフェースに接続した機器をRaspberry Piの無線LANを経由させて同一のネットワークセグメントで無線APの先のネットワークへの接続並びにインターネットへの接続が可能となる様Raspberry Piを設定することが今回の目的です。

ちなみに、ここでは他サイトでよく見かけるbrctlを用いずに前述の内容を実現する方法を説明します。

概要

Proxy ARPによるブリッジの構築。

/etc/network/interfacesの編集

転送に関わる設定を行う前に、Raspberry Piの起動時に無線LANを自動的に接続出来る様、また有線LANの方は設定を手動で行える様に/etc/network/interfacesを編集します。

auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet manual

auto wlan1
allow-hotplug wlan1
iface wlan1 inet dhcp
        wpa-conf  /etc/wpa_supplicant/wpa_supplicant.conf

有線/無線インターフェース間の転送処理を設定する

さて、先ほどまでの無線LAN接続は何というか…前振りでwここからが本題です。

当初、Raspberry Piを無線コンバータにしようと考えた際に真っ先に浮かんだのが有線LANと無線LANとのブリッジだったので、多くの解説サイトで言われているbrctlを用いて設定をしてみたのですが―

# brctl addbr br0
# brctl addif br0 eth0
# brctl addif br0 wlan1
can't add wlan1 to bridge br0: Operation not supported

とエラーとなり、途方に暮れるハメに陥りました orz まぁRaspberry Piで有線LAN側のみにIPアドレスを割り当てるDHCPサーバを立ててルーティングを設定すれば基本的に問題なく動くのですが、無線AP先のネットワーク上にあるDLNAサーバを利用したかったので、この方法は取り止めました。今になって考えてみればOpenVPNを使えば何とかなった気もしますがw愚痴はこのぐらいにして設定をしていきましょう。

IP forwardの設定

では、転送の設定1発目としてw IP forwardを有効にします。

いくつか方法がありますが、起動時に有効になれば良いので /etc/rc.local に1行追記して次の様にします。

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

echo 1 > /proc/sys/net/ipv4/ip_forward

exit 0

DHCPリレーエージェントのインストール/設定

今回は、無線APの先のルータの(もしくは無線LANルータの)DHCPサーバ機能を利用して、Raspberry Piの有線LANインターフェースに繋げた機器にIPアドレスを取得させるわけですが、そのためにはDHCPクライアント(ラズパイに有線LAN接続している機器)からブロードキャストで送信されるDHCPサーバを探すメッセージ(DHCPDISCOVER メッセージ)等をRaspberry Piの有線LANインターフェスから無線LANインターフェースへと中継させる必要があります。

こちらでは、このDHCPの通信の中継を行うのにDHCPリレーエージェントのdhcp-helperを用いて次の様に設定しました。

dhcp-helperをインストール

# apt-get install dhcp-helper
/etc/default/dhcp-helper を編集
# Option flags used to start dhcp-helper.
#
# You will need at least "-s " or
# "-b  so that dhcp-helper knows where
# to relay DHCP requests.
#
# See "man 8 dhcp-helper" for more details.

DHCPHELPER_OPTS="-b wlan1"
 

/etc/default/dhcp-helperでの設定は、コメントにもあるようにdhcp-helperにDHCPリクエストのリレー先を設定するもので、DHCPHELPER_OPTS="-b wlan1"はインターフェースwlan1を介してリレーさせるといった内容です。

Proxy ARPブリッジのインストール/設定

今回は無線と有線間のブリッジなので、通常のブリッジ(L2ブリッジ)ではブリッジを作成することが出来ません(802.11にブリッジに関する仕様が無いのが原因?らしい?)。そこで用いるのがProxy ARPブリッジです。

そして、raspbianというよりDebianでこのProxy ARPブリッジを使うには parprouted というデーモンを使うのが一般的なようなので、まずはparproutedをインストールします。

# apt-get install parprouted
これで準備は整ったので、後は起動時にProxy ARPブリッジが動作する様にrc.localに次の内容を追記します。
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

echo 1 > /proc/sys/net/ipv4/ip_forward
ip addr add 192.168.1.203 dev eth0
parprouted wlan1 eth0
exit 0

21行目は、parprouted はサブネットマスク/32に対するルーティングを自動的に作り使用するので、有線LANインターフェースであるeth0にサブネットマスクが/32のIPアドレスを手動で付けています。

そして22行目でparproutedを起動させます。

ここまで出来たら、rebootさせます。

# reboot

問題が無ければ、Raspberry Piの有線LANに機器を接続すれば、DHCPでIPアドレスを取得することが出来るはずです。お疲れ様でした~(;^^)/

なお、Debian WikiなどではmDNSの為に /etc/avahi/avahi-daemon.conf 内のenable-reflectorをyesにするとなっていますが、こちらの環境では設定をしなくても問題なく動いたので省略しています。

また、今回紹介した設定だけでは、マルチキャストのルーティングがされていないので、無線AP先のDLNAサーバなどへのアクセスは出来ません。DLNAサーバへのアクセスに関しては次回に書いてみたいと思います。