CONTENTS
ENVIRONMENTS
- Raspberry Pi 3 Model B
- Raspbian Buster Lite : 2019-09-26 : 4.19
なんでこんなことをするのか
開発環境として Intel NUC に CoreOS を入れている。 CoreOS は有線接続しかできないので、Intel NUC は有線接続でつないでいる。
この開発環境を外に持ち出す場合、Intel NUC と ThinkPad は同じネットワークにある必要がある。 Intel NUC の CoreOS では、開発中の Web アプリケーションが見える状態だ。 なのでこのネットワークは外部のネットワークとは隔離されていてほしい。 以前は Intel NUC に Wi-Fi できるやつをつけて、スマホのテザリングでつないでいた。
今年の4月末に開発合宿をする機会があったのだが、参加人数が30人近かった。 このため、個人でテザリングする運用だとなかなか厳しい。 それで、なるべく無線を使用しない方向で考えてみた。
この図の「スマホ」の部分は、利用可能な Wi-Fi ネットワークに置き換えられる。 これで、不必要な無線接続をなくすことができる。
バッテリーは Intel NUC のために、65W 出力できるでかいやつがある。 スイッチングハブは持ち運びを考えて、USB 給電できるものを用意した。 これなら電源が無くても、4時間程度ならすべてまかなえる。
ネットワークの知識が貧弱なので、この構成で動かしていいものか、あまり自信はない。 ただ、この構成で動かすのは、以下の場合くらいなのでまあ問題はないかな。
- 開発合宿なんかで長期間開発するとき : メンバーのなかに攻撃を仕掛けてくる人はいないでしょう
- 移動中や、出先で緊急対応するとき : ラズパイはテザリングネットワークの内側だし、短時間の利用なので平気かな
ラズパイを Wi-Fi に接続する
まずは Wi-Fi に接続する。
この記事を参考に設定した。
以下のスクリプトで設定できる。
#!/bin/bash SSID="Wi-Fi の SSID" PASS="パスフレーズ" wpa_passphrase "$SSID" "$PASS" >> /etc/wpa_supplicant/wpa_supplicant.conf
このスクリプトを root 権限で実行することで /etc/wpa_supplicant/wpa_supplicant.conf
が更新される。
設定が間違っていなければ、reboot
すれば Wi-Fi に接続できるはず。
ip addr
で wlan0
的な名前のインターフェイスに IP アドレスが割り当たっていれば OK。
適当なドメインに ping
して通れば確実だ。
接続できない場合は以下のことを確認してみる。
- SSID と PASS に Typo はないか
- ほかの機器で接続できるか
- Wi-Fi ネットワーク側でアクセス拒否していないか
DHCP サーバーの設定
Ethernet 側のネットワークに対して DHCP サービスを提供する。
この記事を参考に設定した。
eth0
に static IP を設定する。
ネットワークは 192.168.100.0/24
にした。
Wi-Fi 側のネットワークが同じなら、設定を変更する必要がある。
# /etc/dhcpcd.conf ...(中略) interface eth0 static ip_address=192.168.100.1/24
/etc/dhcpcd.conf
ファイルで設定する。
あとで /etc/dhcp/dhcpd.conf
ファイルも出てくるので紛らわしいが、こちらはデフォルトで存在するのでこっちから設定すれば間違わない。
設定する内容はこの2行で OK。
reboot
して、設定が反映されていることを確認する。
このあと、DHCP サーバーである isc-dhcp-server
をインストールする。
sudo apt-get update sudo apt-get install isc-dhcp-server
こちらの設定は /etc/dhcp/dhcpd.conf
ファイルで行う。
まず、authoritative
のコメントアウトを外す。
authoritative;
このネットワークの公式な DHCP サーバーならアンコメントする、と書いてあるのでそうした。 実際に何が起こるのかは理解していない。 man page によると、クライアントとの通信の際に確認を行うようになるようだ。
あと、先に設定したネットワークのサブネット設定を書く。
subnet 192.168.100.0 netmask 255.255.255.0 { range 192.168.100.100 192.168.100.200; option broadcast-address 192.168.100.255; option routers 192.168.100.1; option domain-name-servers 8.8.8.8, 1.1.1.1; }
range 192.168.100.100 192.168.100.200;
には、割り当てる IP の範囲を設定する。
とりあえず 100 から 200 にした。
特に理由はない。
option domain-name-servers 8.8.8.8, 1.1.1.1;
には参照するネームサーバーを列挙する。
このネットワークにつないだクライアントが名前解決できない場合はここを確認する。
さらに、/etc/default/isc-dhcp-server
に対象のインターフェイスを設定する。
INTERFACESv4="eth0"
設定が完了したら、LAN ケーブルをハブまでつないで、isc-dhcp-server
を起動する。
(インストール時の起動には失敗しているので、start
でよい)
sudo systemctl start isc-dhcp-server
起動に失敗した場合は systemctl status isc-dhcp-server
や /var/log/syslog
にログがあるのでトラブルシューティングする。
上記のように、LAN ケーブルをハブまでつないでないとサービスの起動が失敗した。
配線を済ませてからサービスを起動すること。
iptables の設定
ルーターとして機能させるためには、パケットをうまく流す必要がある。 このため、iptables の設定を行う。
この記事を参考に設定した。
まず、ip forward の設定を行う。
net.ipv4.ip_forward = 1
ipv4.ip_forward
に 1
を設定することで、wlan0
と eth0
の間でパケットのやり取りができるようになる。
さらに、iptables の設定を行うことで、パケットがうまく流れるようにする。
#!/bin/bash WAN=wlan0 LAN=eth0 # Flush & Reset iptables -F iptables -t nat -F iptables -X # Default Rule iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP iptables -P INPUT DROP iptables -A INPUT -i $LAN -j ACCEPT # Filter out packets with private IP addresses from the Internet iptables -A INPUT -i $WAN -s 192.168.0.0/16 -j DROP iptables -A INPUT -i $WAN -s 172.16.0.0/12 -j DROP iptables -A INPUT -i $WAN -s 10.0.0.0 -j DROP iptables -A FORWARD -i $WAN -s 192.168.0.0/16 -j DROP iptables -A FORWARD -i $WAN -s 172.16.0.0/12 -j DROP iptables -A FORWARD -i $WAN -s 10.0.0.0 -j DROP # Established iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # Forward iptables -A FORWARD -i $LAN -j ACCEPT iptables -A FORWARD -i $WAN -m state --state RELATED,ESTABLISHERD -j ACCEPT # Loopback iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # SNAT iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE
正直詳しく説明できない。 とにかくこれで iptables の設定ができる。
iptables の設定は再起動すると失われるので、起動時にこのスクリプトを実行する必要がある。
このため、/etc/rc.local
にこのスクリプトの実行を追加した。
ここまで設定すると、reboot
で LAN でつながっているクライアントがインターネットに接続できる。
まとめ
外で開発するときにラズパイを使用して環境を構築できるようにした。 必要なら無線をなるべく使用しないような構成にできた。
最近の記事では、ラズパイをルーターにするという内容のものがなかったので、あまり良い方法ではない可能性がある。 ネットワークの知識もあまりないので、このあたりの勉強もしないとなぁ。