2015-07-19

Raspberry Piでイーサネットコンバータを作る

有線LANポートしか無い機器を、無線LANアクセスポイントに接続します。

逆のパターン

ホテルの部屋に有線LANポートが備わっていて、そこに、スマートフォンやポータブルゲーム機などを接続したい場合は、「ポータブル無線LANルータ」あるいは「ポータブルWi-Fiルータ」といった名称で、様々な製品が販売されていますので、そういった機器を使用します。

イーサネットコンバータ

最近のホテルの部屋では、むしろ有線LANポートは付いておらず、宿泊者が自由に使える無線LANアクセスポイントが用意されていることの方が多いかもしれません。そういう状況で、有線LANしか使えない機器を、無線LANアクセスポイントに接続するには、「イーサネットコンバータ」という機器を使用します。

こういった接続形態が必要になるのは、実際にはホテルなどではなくて、既に自宅に無線LANルータが設置されていて、有線LANしか使えない機器を無線で接続したいという場合です。最近のネット対応テレビや衛星放送チューナー、据置型ゲーム機のように、有線LANポートが付いていて、これらを無線LANでインターネットにつなぎたいという例が該当します。

市販品では、以下のようなものがあります。

これと似たようなものをRaspberry Piで作ります。

まず作ってみよう

インターフェースを定義する

/etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 192.168.9.1
        network 192.168.9.0
        netmask 255.255.255.0
        broadcast 192.168.9.255
        gateway 192.168.0.1

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-driver wext
wpa-scan-ssid 1
wpa-key-mgmt WPA-PSK
wpa-proto WPA2
wpa-pairwise CCMP
wpa-group CCMP
wpa-ssid "MySSID"
wpa-psk "MyPassPhrase"

iface default inet dhcp

eth0は、空いているプライベートアドレス空間(筆者の場合192.168.9.xxx)の先頭アドレス(192.168.9.1)を指定します。

wlan0は、先日書いた記事を参考にして、無線LANに接続します。

DHCPサーバを構築

eth0に接続された機器に、IPアドレスを割り当てるため、DHCPサーバをインストールします。

# aptitude install isc-dhcp-server

/etc/default/isc-dhcp-server

DHCPの払い出し先をeth0に限定します。

INTERFACES=""

INTERFACES="eth0"

/etc/dhcp/dhcpd.conf

ドメイン、DNSサーバ、払い出しアドレスの範囲を定義します。

option domain-name "raspberry.local";
option domain-name-servers 192.168.0.1;
authoritative;
subnet 192.168.9.0 netmask 255.255.255.0 {
        option routers 192.168.9.1;
        option subnet-mask 255.255.255.0;
        range dynamic-bootp 192.168.9.2 192.168.9.254;
}

ドメイン名は適当です。

192.168.0.1というのは、無線LAN親機(アクセスポイント)のアドレスです。親機が正しくインターネットに接続できていれば、DNSをリレーしてくれるはずですので、親機のアドレスをDNSサーバアドレスとします。

有線LAN側のアドレスは192.168.9.0/24としました。必ずこれと同じである必要はありません。192.168.9.1はRaspberry Pi自身(eth0)が使用しますので、空いている範囲(192.168.9.2~192.168.9.254)をDHCPの払い出しアドレスとします。

ルーティングの設定

以下の2行を実行する必要があります。

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

ルーティングの設定方法としては /etc/sysctl.conf に net.ipv4.ip_forward=1 と書くのが正当かとは思いますが、natの設定も同時に行うため、rc.localで両方まとめて実行してしまいます。

/etc/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
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

exit 0
ここで再起動して、動作を確認します。
# reboot

ブリッジ接続

今までは、wlan0が192.168.0.0/24(親機からもらったアドレス)、eth0が192.168.9.0/24という構成でした。ネットワークセグメントが異なっていたので、nat(napt / IPマスカレード)する設定になっていました。ですが、wlan0もeth0も同じネットワークセグメントで使いたい場合もあります。そのような接続をブリッジといいます。

DHCPは無線LANルータ親機に任せますので、Raspberry PiのDHCPサーバは使わないようにします。

# update-rc.d isc-dhcp-server remove 

DHCPクライアントを無効にします。

# update-rc.d dhcpcd remove 

bridge-utilsをインストールします

# aptitude install bridge-utils 

/etc/network/interfaces

インターフェースの設定をします。DHCPは後回しで、とりあえず inet manual と書いておきます。

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual
wpa-driver wext
wpa-scan-ssid 1
wpa-key-mgmt WPA-PSK
wpa-proto WPA2
wpa-pairwise CCMP
wpa-group CCMP
wpa-ssid "MySSID"
wpa-psk "MyPassPhrase"

ここで再起動します。

# reboot

インターフェースの状態を見てみます。

root@raspberrypi:/home/pi# ifconfig
eth0      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:30 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1928 (1.8 KiB)  TX bytes:0 (0.0 B)
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
wlan0     Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:14 errors:0 dropped:2 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2182 (2.1 KiB)  TX bytes:288 (288.0 B)

manualにしたので、アドレスは割り当てられていません。

ここで、eth0とwlan0を一括りにして、ブリッジ(br0)を作ります。最後にDHCPでbr0にアドレスを割り当てます。

root@raspberrypi:/home/pi# brctl addbr br0
root@raspberrypi:/home/pi# brctl addif br0 eth0
root@raspberrypi:/home/pi# brctl addif br0 wlan0
root@raspberrypi:/home/pi# dhclient br0

改めて、インターフェースの状態を見てみます。

br0       Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:192.168.0.241  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::222:cfff:fe45:d22d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:27 errors:0 dropped:0 overruns:0 frame:0
          TX packets:34 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:4002 (3.9 KiB)  TX bytes:5632 (5.5 KiB)
eth0      Link encap:Ethernet  HWaddr b8:27:eb:34:51:b5
          inet6 addr: fe80::ba27:ebff:fe34:51b5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:273 errors:0 dropped:0 overruns:0 frame:0
          TX packets:245 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:40089 (39.1 KiB)  TX bytes:131945 (128.8 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:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1104 (1.0 KiB)  TX bytes:1104 (1.0 KiB)
wlan0     Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet6 addr: fe80::222:cfff:fe45:d22d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:268 errors:0 dropped:8 overruns:0 frame:0
          TX packets:228 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:140738 (137.4 KiB)  TX bytes:50137 (48.9 KiB)

以上で、eth0に接続された有線LAN機器に、wlan0を経由して、親ルータからDHCPでアドレスが割り当てられるようになるはずです。

このコマンドを、起動時に自動実行されるように、rc.localに書いておきます。

/etc/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

brctl addbr br0
brctl addif br0 eth0
brctl addif br0 wlan0
dhclient br0

exit 0

ブリッジ接続では、IPマスカレードは行いませんので、 iptables ~~ MASQUERADE の行は削除しています。