Ubuntu22.04Serverでアクセスポイントを作る

# 背景

巷ではUbuntuのアクセスポイント化する方法を紹介しているサイトがいくつもありますが，それでもなお躓き易いアクセスポイント化．

2023年12月4日，古いノートPCにUbuntu22.04 Serverを入れ，有線とWifiアダプタを刺し，アクセスポイントを作ろうとしたのが始まりでした．Ubuntu22.04ではGUIを使って簡単にアクセスポイントを作成できます．しかし，これがGUI無しとなるとかなり大変．いくつものサイトを巡っては試し失敗するの繰り返し．

このような経緯の末，なんとかGUIに頼らずアクセスポイントを作成することに成功しました．同じように迷える人の参考になれば幸いです．

## 環境

+ Ubuntu 22.04 LTS Server（ただしminimumインストールではない）
+ Wifiアダプタは[Realtek Semiconductor Corp. RTL88x2bu [AC1200 Techkey]](https://www.amazon.co.jp/gp/product/B0C6HYSWT8/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1)

## 目標

+ GUI無しの環境でアクセスポイントを作成する
+ Wifiアダプタを通してアクセスポイントを作り，グローバルネットとは有線を介して通信する

# 手法

## ポイント

アクセスポイントには接続してきた端末にIPアドレスを割り振る機能が必須です．つまりDHCPサーバーが必要です．そのために，多くのサイトでは「isc-dhcp-server」か「dnsmasq」をインストールします．

しかし，この２つのアプリケーションの設定やインストールで躓くことが多々あります．

そこで，本記事では「systemd-networkd」を使います．これは名前からもわかるとおりsystemdパッケージの一部であり，基本的にはUbuntu22.04になら最初から入っており比較的設定が容易と思われます．

## やり方

本記事でのアクセスポイント化では「hostapd」をインストールしないといけません．「hostapd」，「systemd-networkd」の順に説明します．

### hostapd

インストール

```
sudo apt install hostapd
sudo systemctl unmask hostapd
sudo systemctl enable hostapd
```

設定例

まずはアクセスポイント化したいwifiアダプタのインターフェイス名を見つけます．

```
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp12s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether b8:88:e3:e9:c3:70 brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.101/24 brd 192.168.11.255 scope global enp12s0
       valid_lft forever preferred_lft forever
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 20:16:d8:70:7b:43 brd ff:ff:ff:ff:ff:ff
    inet 10.1.1.1/24 brd 10.1.1.255 scope global wlp3s0
       valid_lft forever preferred_lft forever
```

今回は「wlp3s0」がアクセスポイント化した対象である．hostapd.confファイルをいじりますが自分の環境では存在しなかったため作成しました．たぶん無いのが仕様なのかと．

```/etc/hostapd/hostapd.conf
interface=wlp3s0                             # wifiのアダプタのインターフェイス名
ssid=$(設定したいSSID)
wpa_passphrase=$(アクセスポイントのパスワード)
wpa=2                                        # wpa1とwpa2のどちらを使うかを指定
hw_mode=g                                    # ハードウェアのモード．大抵aかb，gを選択する．
channel=1                                    # チャネル数．詳しくないからわからない．1か11にしとけば大抵OKって書いてあった．
auth_algs=1                                  # 認証方式．1ならOpen System認証，2なら共有キー，3なら両方
wpa_key_mgmt=WPA-PSK                         # 認証に使うキーの管理方法の選択
rsn_pairwise=CCMP                            # 暗号方式の指定
```

各項目の説明は[ドキュメント](https://wireless.wiki.kernel.org/en/users/Documentation/hostapd)を参考にしました．

設定の適応は次の通りです．

```
sudo systemctl restart hostapd CCMP encryption 
```

この段階でアクセスポイントが出来上がってるのが確認できます．しかし接続を試みても失敗します．IPアドレスが配られないからです．ということでDHCPサーバーの設定を続けて行います．

## systemd-network

systemd-networkさん，DHCPサーバーとしても頑張ってくれるんですよ．詳細は[このArchのwiki](https://man.archlinux.org/man/systemd.network.5.en#%5BNETWORK%5D_SECTION_OPTIONS)に書かれてます．

すごく参考になったのが[このArchの日本語wiki](https://wiki.archlinux.jp/index.php/Systemd-networkd)．ありがたいことにサンプルがありました．

設定は/etc/systemd/network下に「$(wifiアダプタのインターフェイス名).network」で作成します．この記事では「wlp3s0.network」となります．

```/etc/systemd/network/wlp3s0.network
[Match]
Name=wlp3s0

[Network]
Address=192.168.1.1/24   # アクセスポイントのIPアドレス
DHCPServer=true          # DHCPサーバーの有効化
Gateway=192.168.11.1
DNS=192.168.11.1
IPMasquerade=ipv4　　　　　# NATの設定をやってくれる

[DHCPServer]
PoolOffset=5             # 割り当てるipアドレスの開始のオフセット
PoolSize=5               # 割り当てるipアドレスの最大個数
EmitDNS=yes              # 接続してきたデバイスにDNSの情報を渡すかどうか
DNS=192.168.11.1         # 渡すのであれば，何を渡すか
```

あとは設定を適応するとアクセスポイントが無事使えるようになります．

```
sudo systemctl restart systemd-networkd.service
```

「IPmasquerade=ipv4」のとき，設定適応時にnftablesの設定をいじってNATの設定を作ってくれます．そのため予めnftablesに何か設定してる人は，適応後に永続化し直したほうがいいかもしれません．