ラズパイを使ってwifiのアクセスポイントを作成し、インターネットに接続する話
おはこんばんちわ。
自宅にどうしても無線のアクセスが悪い部屋があり、少し困っていました。丁度持て余しているラズベリーパイがあったため、こいつを中継地点に改造して使うことにしました。
せっかくなので備忘録として構築記事を載せておきます。
設定確認
ラズパイの4 ModelB 4GBを使います。
$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 11 (bullseye)"
NAME="Raspbian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
構成
構成はこんな感じ。ラズパイをAP+クライアントモードで動かします。
目標はラズパイ経由でのインターネット接続までです。
では早速作っていきましょう!
仮想インターフェースの作成
まずは、アクセスポイントとして使う仮想インターフェースを設定します。
現在の設定をiw devで確認します。
iw dev は、Linux の無線ネットワークインターフェースに関する情報を表示するコマンドです。このコマンドは、無線インターフェースの状態や設定、接続情報を確認するために使用されます。
$ iw dev
phy#0
Unnamed/non-netdev interface
wdev 0x2
addr da:3a:dd:7f:8c:48
type P2P-device
txpower 31.00 dBm
Interface wlan0
ifindex 3
wdev 0x1
addr d8:3a:dd:7f:8c:48
ssid Buffalo-A-0C8A
type managed
channel 36 (5180 MHz), width: 80 MHz, center1: 5210 MHz
txpower 31.00 dBm
wlan0というインターフェースがあることが確認できます。
このwlan0はwifiにつながるインターフェースなので、アクセスポイントとして使う仮想インターフェースを作成し、仮想インターフェースにはwlan0と同じMACアドレスを設定します。
$ sudo iw phy phy0 interface add ap0 type __ap
$ sudo ip link set ap0 address d8:3a:dd:7f:8c:48
設定を確認します。
$ iw dev
phy#0
Interface ap0
ifindex 4
wdev 0x3
addr d8:3a:dd:7f:8c:48
type AP
channel 36 (5180 MHz), width: 80 MHz, center1: 5210 MHz
txpower 31.00 dBm
Unnamed/non-netdev interface
wdev 0x2
addr da:3a:dd:7f:8c:48
type P2P-device
txpower 31.00 dBm
Interface wlan0
ifindex 3
wdev 0x1
addr d8:3a:dd:7f:8c:48
ssid Buffalo-A-0C8A
type managed
channel 36 (5180 MHz), width: 80 MHz, center1: 5210 MHz
txpower 31.00 dBm
ap0というインターフェースが作成されていることが確認できます。
次は、再起動後もap0が使えるように起動時設定を行っていきます。
$ sudo vim /etc/udev/rules.d/99-ap0.rules
中身は下記。MACアドレスは書く環境にて合わせてください。
SUBSYSTEM=="ieee80211", ACTION=="add|change", ATTR{macaddress}=="d8:3a:dd:7f:8c:48", KERNEL=="phy0", \
RUN+="/sbin/iw phy phy0 interface add ap0 type __ap", \
RUN+="/bin/ip link set ap0 address d8:3a:dd:7f:8c:48"
設定ができたら、リブートして、ap0の設定ができているか確認しましょう。
パッケージのインストール
次にhostapdとdnsmasqをインストールします。
$ sudo apt install hostapd dnsmasq
DHCPの設定
DHCPサーバ側の設定をします。
dnsmasqの設定ファイルを編集します。
$ sudo vim /etc/dnsmasq.conf
/etc/dnsmasq.confに以下を追記します。
ここにDHCPで配布したいIP範囲を記載します。有効期間は12時間までなら同じ接続に同じIPを振る設定になっています。
また、dhcp-optionにてゲートウェイとDNSサーバ(ここではGoogle)を指定しています。
interface=ap0
dhcp-range=192.168.12.16,192.168.12.32,255.255.255.0,12h
dhcp-option=3,192.168.12.1
dhcp-option=6,8.8.8.8,8.8.4.4
次に自身のIPアドレスを固定するために、DHCPクライアントの設定ファイルを編集します。
$ sudo vim /etc/dhcpcd.conf
設定ファイルに以下追記します。
interface ap0
static ip_address=192.168.12.1/24
nohook wpa_supplicant
hostapdの設定
hostapd は、Linux 上で Wi-Fi アクセスポイント を作成するためのデーモン(サービス)です。これを使うことで、Wi-Fi インターフェースをアクセスポイントとして設定し、クライアントデバイス(例えば、スマートフォンやPC)に無線接続を提供することができます。
/etc/hostapd/hostapd.conf というファイルを作成します。
$ sudo vim /etc/hostapd/hostapd.conf
以下のように設定を記述します。
SSIDとパスワードは任意の値を設定してください。
チャネルは1~13までが利用できるようです。
ctrl_interface=/var/run/hostapd # hostapd の制御インターフェースのソケットのパス
ctrl_interface_group=0 # 制御インターフェースにアクセスできるグループ(0 は root)
interface=ap0 # 使用する無線インターフェース
driver=nl80211 # 使用するドライバ
ssid=RASPI_NO_SSID # ネットワーク名(SSID)
hw_mode=g # 無線規格 (g は 802.11g)
country_code=JP # 国コード(JP は日本)
channel=11 # チャンネル番号
ieee80211d=1 # 802.11d(国別規制)の有効化
wmm_enabled=0 # WMM(Wi-Fi Multimedia)機能の無効化
macaddr_acl=0 # MAC アドレス制限なし(制限をかける場合は 1)
auth_algs=1 # 使用する認証方式 (1 は WPA)
wpa=2 # WPA2 を使用
wpa_key_mgmt=WPA-PSK # PSK(Pre-Shared Key)による認証
wpa_passphrase=RASPI_NO_PASSWORD # Wi-Fi パスワード
rsn_pairwise=CCMP # 暗号化方式(CCMP は AES を使用)
hostapdはaptでインストールしても自動では有効にならないようなので、 以下のコマンドで起動時に自動でhostapdが立ち上がるように設定します。
$ sudo systemctl unmask hostapd.service
$ sudo systemctl enable hostapd.service
設定の有効化
以下のコマンドで各サービスを起動します。
$ sudo systemctl restart dhcpcd.service
$ sudo systemctl restart hostapd.service
$ sudo systemctl restart dnsmasq.service
ここまで設定すれば、ラズパイにアクセスすることができます。
ただし、IP転送設定を行っていないため、インターネットに出ることはできません。
IP転送設定
ラズパイ経由でインターネットを利用できるようにするために、IP転送設定を行います。
$ sudo vim /etc/sysctl.conf
ファイル内で、以下の行を検索し、#コメントアウトを外して 1 に設定します。
net.ipv4.ip_forward=1
設定を即座に適用するためには、以下のコマンドを実行します。
$ sudo sysctl -p
次に、iptablesの設定を変更します。
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
sudo iptables -A FORWARD -i wlan0 -o ap0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i ap0 -o wlan0 -j ACCEPT
-t nat は NAT テーブルに対して操作を行うオプションです。
-A POSTROUTING はパケットが転送された後に適用するルールを追加するオプションです。
-o wlan0 は wlan0 インターフェースを通してパケットを送信することを意味します。
-j MASQUERADE は送信元アドレスを変更(マスカレード)して転送することを意味します。
iptables の設定は再起動後にリセットされるため、永続化させる必要があります。
$ sudo apt-get install iptables-persistent
$ sudo netfilter-persistent save
これで、/etc/iptables/以下に設定が保存され、起動時に自動的に読み込まれます。
接続確認
携帯でもPCでも何でもよいのですが、上記で設定したネットワークIDとパスワードで接続できることを確認。インターネットに接続できていれば無事構築完了です。
ミスったこと
当初この構築で「ap0-クライアント端末(構成図で言う192.168.12.0/24の部分)」のNWと「wlan0-上位ルーター(192.168.11.0/24)」のNW範囲を被せて設計してしまっており、ルーティング部分がうまくいかずつまずきました。
やはりネットワークは難しい、初期設計が大事ですね…。APとしてローカル接続(「設定の有効化」ステップ)まではサクサク進むのでそんなに難しくはないと思います。