2019年8月17日土曜日

RaspberryPi をモバイルルータの拡張アクセスポイントとして構築する

概要

モバイルルータは端末の同時接続数に制限が設定されていることが多いです
ルータに接続できる端末の上限に達した場合などは新たにアクセスポイントを作成する必要があります
今回は RaspberryPi を使ってモバイルルータ用のアクセスポイントを増設してみました
なお Zero を使っていますが Zero でなくても問題ないです

環境

ドングル接続

まずは RaspberryPi に USB ドングルを 2 つ接続しましょう
すでに wlan0 を使っている場合は wlan1 が追加されます
wlan0 と wlan1 で使いたいドングルが異なる場合は接続する順番を調整してインタフェースとドングルを合わせてください

wlan1 の IP 固定化

wlan0 はこれまで通りモバイルルータに接続してインターネットに接続します
wlan0 のみモバイルルータに接続するように wpa_supplicant-wlan0.conf を作成しておきます

そしてアクセスポイントとなる wlan1 の IP を固定化します

  • sudo vim /etc/network/interfaces
allow-hotplug wlan1
iface wlan1 inet manual

自動で IP が振られないように iface wlan1 inet manual を設定します

  • sudo vim /etc/dhcpcd.conf
interface wlan1
static ip_address=192.168.130.1/24
static routers=192.168.130.1
static domain_name_servers=192.168.130.1
static broadcast 192.168.130.255

wlan1 配下にぶら下がったデバイスには 192.168.130.0/24 のネットワーク帯から IP が振られるようにします

hostapd のインストールと設定

  • sudo apt install -y hostapd

インストールできたら設定ファイルを作成します

  • sudo vim /etc/hostapd/hostapd.conf
interface=wlan1
driver=nl80211
ssid=ap1
hw_mode=g
channel=7
wmm_enabled=1
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=hogefuga
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0

interfacewlan1 にしましょう
ssidwpa_passphrase 好きなものを設定しましょう
wpa_passphrase は平文のパスワードを設定します
他も基本的にはそのままで OK です
channel あたりは各自の環境に合わせて適宜変更しても良いかもしれません
ctrl_interface に関しては hostapd_cli を使うための設定です

  • sudo vim /etc/default/hostapd
DAEMON_CONF="/etc/hostapd/hostapd.conf"
DAEMON_OPTS="-dd -t -f /home/pi/hostapd.log"

設定ファイルのパスを記載します
またログをファイルに出力するようにしておきます

  • sudo systemctl unmask hostapd
  • sudo systemctl enable hostapd
  • sudo systemctl start hostapd
  • sudo systemctl status hostapd

これでアクセスポイントが見えるようになっていれば成功です
この状態では接続まではできないのでルーティングと dhcp の設定をします

ルーティング設定

wlan0 経由でちゃんとモバイルルータを使ってインターネットに出れるようにします

  • sudo vim /etc/sysctl.conf
net.ipv4.ip_forward=1
  • sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
  • sudo iptables -A FORWARD -i wlan0 -o wlan1 -m state --state RELATED,ESTABLISHED -j ACCEPT
  • sudo iptables -A FORWARD -i wlan1 -o wlan0 -j ACCEPT

確認は sudo iptables -t nat -n -L で行います
RaspberryPi が再起動した場合でも自動でルーティング情報が適用されるように rc.local に記載しておきます

  • sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
  • sudo vim /etc/rc.local
iptables-restore < /etc/iptables.ipv4.nat

dhcp サーバのインストールと設定

  • sudo apt install -y isc-dhcp-server

dnsmasq でもできるなのでここはお好みでも良いかもしれません
あとは wlan1 に設定した固定 IP の範囲から IP を払い出す設定を記載します

  • sudo vim /etc/dhcp/dhcpd.conf
subnet 192.168.130.0 netmask 255.255.255.0 {
  range 192.168.130.10 192.168.130.100;
  option broadcast-address 192.168.130.255;
  option routers 192.168.130.1;
  default-lease-time 600;
  max-lease-time 7200;
  option domain-name "local";
  option domain-name-servers 8.8.8.8, 8.8.4.4;
}
log-facility local7;

log-facility はどちらでも良いです
これを記載すれば dhcpd のログが /var/log/messages に出力されるようになります

あとはインタフェースの設定をしてプロセスを起動しましょう

  • sudo vim /etc/default/isc-dhcp-server
INTERFACESv4="wlan1"
  • sudo systemctl start isc-dhcp-server

ここまでで wlan1 に固定 IP が振られていてアクセスポイントが見えるようになっていて dhcp サーバが起動していれば動作するはずです

動作確認

  • sudo reboot -h now

とりあえずこれまでの設定を反映させるために再起動しましょう
hostapdisc-dhcp-server も自動で起動するはずです
ただ isc-dhcp-server だけは wlan1 に IP が振られていないと起動してくれません
wlan1 に IP が振られるのは hostapd が起動してからです
なので hostapd が起動する前に isc-dhcp-server が起動してしまうと dhcpd がうまく起動していないのでその場合は手動で起動しましょう

  • sudo systemctl start isc-dhcp-server

あとは iPhone などからアクセスポイントを探して設定したパスフレーズで接続できることを確認しましょう
接続できない場合はルーティングや dhcpd の設定がおかしい場合が多いようです
対策としては /etc/rc.local に以下の記載します

/bin/sleep 30 && /etc/init.d/isc-dhcp-server start

そして isc-dhcp-server を自動起動しないようにしておけば大丈夫だと思います

  • sudo systemctl disable isc-dhcp-server

おまけ: WLI-UC-GNM2S は RaspberryPi では動作しなかった

今回使用した Wifi の USB ドングルは「BUFFALO 無線LAN子機 コンパクトモデル 11n技術・11g/b対応 WLI-UC-GNM」というドングルです
実はこれもう生産自体が終了しており Amazon などでは手に入るようですが少しお値段が張ります
後継機として WLI-UC-GNM2 や WLI-UC-GNME などがあるようですが WLI-UC-GNM2S というのが最新の後継機としてあるようです

これでも使えるかなと思って購入してみたのですが自分の RaspberryPi 環境では動作しませんでした
アクセスポイントを張ることはできるのですが接続することができませんでした
ドライバは RT3070 でこのドライバ自体は Raspbian 10.0 や 9.0 には問題なくインストールされているので lsusb などで認識はするのですが iwlist wlan0 scan などでアクセスポイントを見つけようとして見つかりません
せっかく購入したので何とか解決できないが頑張りましたがダメでした、、

おまけ: hostapd.conf を変更した場合は dhcp サーバも再起動しましょう

  • sudo systemctl restart hostapd
  • sudo /etc/init.d/isc-dhcp-server restart

おまけ: 速度について

個人的にですが直接モバイルルータに接続している状態と RaspberryPi のアクセスポイントに接続している状態では回線速度は 1/8 から 1/10 くらいに下がります
RaspberryPi のスペックや Wifi ドングルの熱の状態にもよりますが基本的には RaspberryPi を経由したほうが遅くなるので注意しましょう

最後に

RaspberryPi を使ってモバイルルータのためのアクセスポイントを作成してみました
大抵のモバイルルータは同時接続に制限があるのでその場合は役に立つかなと思います
まだ運用して間もないのでこれから問題が出てくるかもしれません
とりあえず一番気になるのはドングルの発熱かなと思います
2 つドングルを接続すると USB ポートの部分が結構な熱さになるので熱暴走したり破損したりしないか心配です

あとは単純に RaspberryPi Zero のスペックが低いので大量のデバイスを接続してしまうと通信が重くなってしまうかなと思います
この辺のモバイルルータか RaspberryPi かどちらに接続するかのバランスも大事になってくるかなと思います

いろいろわかったらまた別記事で紹介したいと思います

参考サイト

0 件のコメント:

コメントを投稿