有線LANポートしか無い機器を、無線LANアクセスポイントに接続します。
ホテルの部屋に有線LANポートが備わっていて、そこに、スマートフォンやポータブルゲーム機などを接続したい場合は、「ポータブル無線LANルータ」あるいは「ポータブルWi-Fiルータ」といった名称で、様々な製品が販売されていますので、そういった機器を使用します。
最近のホテルの部屋では、むしろ有線LANポートは付いておらず、宿泊者が自由に使える無線LANアクセスポイントが用意されていることの方が多いかもしれません。そういう状況で、有線LANしか使えない機器を、無線LANアクセスポイントに接続するには、「イーサネットコンバータ」という機器を使用します。
こういった接続形態が必要になるのは、実際にはホテルなどではなくて、既に自宅に無線LANルータが設置されていて、有線LANしか使えない機器を無線で接続したいという場合です。最近のネット対応テレビや衛星放送チューナー、据置型ゲーム機のように、有線LANポートが付いていて、これらを無線LANでインターネットにつなぎたいという例が該当します。
市販品では、以下のようなものがあります。
これと似たようなものをRaspberry Piで作ります。
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に接続します。
eth0に接続された機器に、IPアドレスを割り当てるため、DHCPサーバをインストールします。
# aptitude install isc-dhcp-server
DHCPの払い出し先をeth0に限定します。
INTERFACES=""
↓
INTERFACES="eth0"
ドメイン、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で両方まとめて実行してしまいます。
#!/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
インターフェースの設定をします。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に書いておきます。
#!/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 の行は削除しています。