Beagle Bone Black + Ubuntu 18.04 + dnsmasq セットアップ手順

# 自宅にセカンダリDNSを作った話

社長が言う。

> 東京都知事も言ってるし、明日から基本テレワークな！

そうと決まればさっさと家に帰る。
しばらく自宅作業なので、ネームサーバーが家に必要(嘘)だよね・・・ってことで、この間作ったセカンダリDNSを作った手順をまとめる。

- 知識の薄い自分でも色んな方が公開している情報を参考に Ubuntu + dnsmasq のセットアップできたから自分もその情報を公開（還元）しないとな・・・と思ったし。
- Ubuntu の話だから Raspbian（Raspberry Pi）にも応用できるし。
- 本音は自分用のメモ。
- そもそも、Beagle Bone Black 持ってる人ってどれだけいるんだろ？

以降、Beagle Bone Black は BBBと略。

## 事前準備

### Ubuntu 18.04 LTS を BBB にインストール

#### イメージファイルの入手

以下のサイトをブラウザで開き、eMMC に書き込むための OS イメージを取得。

<https://rcn-ee.com/rootfs/>

上記のサイトを開いた後で、 ```任意の日付/flasher/``` とたどるとイメージの一覧が表示される。

今回ダウンロードしたのはこれ。
<https://rcn-ee.com/rootfs/2020-03-12/flasher/bone-eMMC-flasher-ubuntu-18.04.4-console-armhf-2020-03-12-2gb.img.xz>

#### イメージファイルをマイクロSDに書き込む

詳細は割愛。
自分は、『[balenaEtcher](https://www.balena.io/etcher/)』というソフトウェアを使用。

#### マイクロSDの内容を書き込む

BBBにマイクロSDを差し込み、通電。
（「マイクロSD裏面のボタン押しながら」って記事も散見するけど、押さなくてもマイクロSDからブートした。）

しばらくすると青色LEDが点滅し始め、インストールが終わると電源が自動で切れる。
この時点で、Ubuntu のインストールは終了。
（LEDが消えない時は、インストールに失敗している時とか。BBBとディスプレイをマイクロHDMIでつないで確認すれば、エラーログとか見えるかも。）

## セットアップ

### IPアドレス固定

参考URL <https://linuxpropaganda.wordpress.com/2018/07/02/static-ip-address-in-ubuntu-18-04-on-beaglebone-black/>

BBB起動時は、DHCPサーバからIPを自動取得する。
以下の方法で、IPアドレスを固定化。

まずは、どうにかして BBB の IP アドレスを調査。（DHCPサーバのリース情報とか。）

判明したら、```ssh ubuntu@xxx.xxx.xxx.xxx``` で接続。（パスワードは```temppwd```）
接続後、以下を実行。（例：IPアドレス=192.168.0.100、サブネットマスク=255.255.255.0、デフォルトゲートウェイ=192.168.0.1）

```bash
$ sudo connmanctl
connmanctl> services
*AO Wired                ethernet_d0c5bd5144db_cable
connmanctl> config ethernet_d0c5bd5144db_cable ipv4 manual 192.168.0.100 255.255.255.0 192.168.0.1
```

ここで切断されるので、再接続（```ssh ubuntu@192.168.0.100```）後、以下を実行。

```bash
$ sudo connmanctl
connmanctl> config ethernet_9059af5cc6c4_cable --nameservers 8.8.8.8 8.8.4.4
connmanctl> quit
```

以下で確認。

```bash
$ cat /etc/resolv.conf 
# Generated by Connection Manager
nameserver 8.8.8.8
nameserver 8.8.4.4
```

後で dnsmasq 入れるからこの段階では上のでよいけど、このまま Google パブリック DNS で行く＆IPv6も使うなら、ネームサーバ指定のコマンドは以下で良いかも。（未検証）

```bash
$ sudo connmanctl
connmanctl> config ethernet_9059af5cc6c4_cable --nameservers 8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844
connmanctl> quit
```

### デフォルトユーザーの名前変更

デフォルトユーザー＆パスワードのままだと、セキュリティ的にどうなの？って思うので、変更。

参考URL <https://jyn.jp/raspberrypi-username-change/>
（参考というか、ほぼそのままです。）

```bash
# 仮のユーザ(tmp)を作成する
sudo useradd -M tmp
# tmpユーザをsudoグループに追加(そうしないとsudoが使えない)
sudo gpasswd -a tmp sudo
# tmpユーザのパスワードを設定
sudo passwd tmp
# ログアウトする
exit
```

tmpユーザーで再接続後、以下。

```bash
# usermod -lでユーザ名をubuntuからoreに変更
sudo usermod -l ore ubuntu
# usermod -dでホームディレクトリを/home/ubuntuから/home/oreに変更
sudo usermod -d /home/ore -m ore
# groupmod -nでubuntuグループをoreグループに変更
sudo groupmod -n ore ubuntu
# ログアウト
exit
```

newpiユーザーで再接続後、以下。

```bash
# 仮ユーザを削除(警告的なのが出るかと思いますが、構わず削除して下さい)
sudo userdel tmp
# oreユーザのパスワードを変更
sudo passwd ore
```

### ソフトウェアアップデート

参考URL <https://jyn.jp/raspbian-setup/>

```bash
$ sudo apt update && sudo apt -y dist-upgrade && sudo apt -y autoremove && sudo apt autoclean
```

※日本国内のサーバに接続だと、BBB用のパッケージが無い？感じなので、ミラーサーバ設定はしない。

### sudoedit エディタ変更

この後、設定ファイルを変更する操作が多いので、自分の使いやすいエディタでsudoeditできるようにする。
nano好きな方は、デフォルトの sudoedit で nano 起動するから、何も変える必要なし。
Emacs派の方は、vim 個所を emacs に読み替えれば、たぶん大丈夫。（未検証）

#### Vim インストール

```bash
$ sudo apt -y install vim
```

#### sudoedit エディタを Vim に変更

参考URL <https://linuxfan.info/sudoedit>

```bash
$ sudo update-alternatives --config editor
alternative editor (/usr/bin/editor を提供) には 3 個の選択肢があります。

  選択肢    パス              優先度  状態
------------------------------------------------------------
* 0            /bin/nano            40        自動モード
  1            /bin/nano            40        手動モード
  2            /usr/bin/vim.basic   30        手動モード
  3            /usr/bin/vim.tiny    15        手動モード

現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください: 2
```

### 自動更新

参考URL <https://jyn.jp/raspbian-setup/>

```bash
$ sudo apt install -y unattended-upgrades
```

### 日本語化

参考URL <https://www.atmarkit.co.jp/ait/articles/1806/28/news043.html>

```bash
# 日本語言語パックのインストール
$ sudo apt -y install language-pack-ja
# ロケールを日本語に設定
$ sudo update-locale LANG=ja_JP.UTF8
# タイムゾーンをJSTに設定
$ sudo dpkg-reconfigure tzdata
# 日本語マニュアルのインストール
$ sudo apt -y install manpages-ja manpages-ja-dev
# 再起動
$ sudo reboot now
```

### 時計同期

参考URL <https://qiita.com/tukiyo3/items/c847d443a6d977083de9>

```bash
$ sudoedit /etc/systemd/timesyncd.conf
```

以下を入力。

```conf
[Time]
NTP=ntp.nict.jp
FallbackNTP=ntp1.jst.mfeed.ad.jp ntp2.jst.mfeed.ad.jp ntp3.jst.mfeed.ad.jp
```

入力後、サービス再起動。

```bash
$ sudo systemctl restart systemd-timesyncd
```

## その他ソフトインストール

仕事で使うものとか、念のため入れておく。

### dig インストール

```bash
$ sudo apt -y install dnsutils
```

他にも使うものあるだろうけど、思い出したら追加しよう。
（BBB の内臓 eMMC の容量に余裕ないから、たぶん何も足さないけど。） 

## dnsmasq インストール

既にインストール済みなので、使用可能な状態に設定変更。

### SoftAp0 の自動生成を停止

BBBは、USBでPC（macも？）に接続すると、USBにIPアドレスを割り当てる。
この辺の設定が ```/etc/dnsmasq.d/SoftAp0``` にあるけれど、邪魔だから無効化する。

参考URL <https://groups.google.com/forum/#!topic/beagleboard/H1rFzlj6rV0>

```bash
# /etc/dnsmasq.dREADME に書いてあるけど、特定の拡張子だと dnsmasq は無視する。
$ sudo mv /etc/dnsmasq.d/SoftAp0 /etc/dnsmasq.d/SoftAp0.dpkg-dist
# 上だけだと、再起動時に SoftAp0 が再生成されるので、以下ファイルを修正する。
$ vim /opt/scripts/boot/am335x_evm.sh
```

以下（732行目付近のIF文内）を全てコメント化

```text
wfile="/etc/dnsmasq.d/SoftAp0"
echo "interface=usb0" > ${wfile}

if [ "x${USB1_ENABLE}" = "xenable" ] ; then
        echo "interface=usb1" >> ${wfile}
fi

echo "port=53" >> ${wfile}
echo "dhcp-authoritative" >> ${wfile}
echo "domain-needed" >> ${wfile}
echo "bogus-priv" >> ${wfile}
echo "expand-hosts" >> ${wfile}
echo "cache-size=2048" >> ${wfile}
echo "dhcp-range=usb0,${USB0_SUBNET}.1,${USB0_SUBNET}.1,2m" >> ${wfile}

if [ "x${USB1_ENABLE}" = "xenable" ] ; then
        echo "dhcp-range=usb1,${USB1_SUBNET}.1,${USB1_SUBNET}.1,2m" >> ${wfile}
fi

echo "listen-address=127.0.0.1" >> ${wfile}
echo "listen-address=${USB0_ADDRESS}" >> ${wfile}

if [ "x${USB1_ENABLE}" = "xenable" ] ; then
        echo "listen-address=${USB1_ADDRESS}" >> ${wfile}
fi

echo "dhcp-option=usb0,3" >> ${wfile}
echo "dhcp-option=usb0,6" >> ${wfile}

if [ "x${USB1_ENABLE}" = "xenable" ] ; then
        echo "dhcp-option=usb1,3" >> ${wfile}
        echo "dhcp-option=usb1,6" >> ${wfile}
fi

echo "dhcp-leasefile=/var/run/dnsmasq.leases" >> ${wfile}
```

上記変更後、再起動。

```bash
$ sudo reboot now
```

再起動後、自動生成されていないことを確認。

```bash
$ ls -l /etc/dnsmasq.d/
合計 8
-rw-r--r-- 1 root root 211  2月 17  2018 README
-rw-r--r-- 1 root root 391  3月 26 20:42 SoftAp0.dpkg-dist
```

### systemd-resolvedのスタブDNS使用を停止

これをやらないと、dnsmasq がDNSサーバとして外部からの問い合わせに応答しないので、設定変更。

参考URL <http://moguno.hatenablog.jp/entry/2018/06/17/155921>

```bash
$ sudoedit /etc/systemd/resolved.conf
```

以下に変更。

```conf
#DNSStubListener=yes
DNSStubListener=no
```

修正後、サービス再起動。

```bash
$ sudo systemctl restart systemd-resolved
```

### hostsファイル作成

dnsmasq 用に hosts ファイルを作成。

```bash
$ sudoedit /etc/hosts.dnsmasq
```

以下を入力。

```text
192.168.0.1     server1
192.168.0.2     server2
192.168.0.3     server3
```

### dnsmasq設定

#### *.confファイルのみを設定ファイルと定義

```bash
$ sudoedit /etc/dnsmasq.conf
```

最終行の以下を有効化

```conf
# Include all files in a directory which end in .conf
conf-dir=/etc/dnsmasq.d/,*.conf
```

#### 設定ファイル作成

```bash
sudoedit /etc/dnsmasq.d/custom.conf
```

以下を入力。

```conf
interface=eth0
domain-needed
bogus-priv
strict-order
no-resolv
no-poll
server=/jitaku.local/192.168.0.99
server=8.8.8.8
server=8.8.4.4
server=2001:4860:4860::8888
server=2001:4860:4860::8844
local=/jitaku.local/
no-hosts
addn-hosts=/etc/hosts.dnsmasq
listen-address=127.0.0.1
listen-address=192.168.0.100
expand-hosts
domain=jitaku.local
cache-size=1024
```

以前に作ったプライマリDNSのIPアドレスは ```192.168.0.99``` で、そいつがDHCPサーバも兼ねているから、ローカルの名前解決はそっちに向けてる。

設定確認

```bash
$ sudo dnsmasq --test
dnsmasq: syntax check OK.
```

サービス再起動

```bash
$ sudo systemctl restart dnsmasq
```

## ネームサーバ変更

ローカルの名前解決できるように＆自分自身のDNS参照するように、設定変更。

```bash
$ sudo connmanctl
connmanctl> services
*AO Wired                ethernet_d0c5bd5144db_cable
connmanctl> config ethernet_9059af5cc6c4_cable --nameservers 127.0.0.1
connmanctl> quit
```

### ホスト名変更

タイミング的にここじゃない気もするけど、ホスト名の変更。

参考URL <https://linuxpropaganda.wordpress.com/2018/10/10/beaglebone-black-rename-server-in-ubuntu-server/>

#### hostname 変更

```bash
$ sudoedit /etc/hostname
```

ホスト名を入力する。

```text
dns2
```

#### hosts 変更

```bash
$ sudoedit /etc/hosts
```

ホスト名を入力する。

```text
127.0.0.1       localhost
127.0.0.1       dns2 dns2.jitaku.local

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
```

再起動。

```bash
$ sudo reboot now
```

## 最後に

BBB は、青色LED x4 が派手で夜中うるさいから、起動時に消えるように細工。

参考URL <https://www.limemo.net/blog/2013/11/%E3%83%93%E3%83%BC%E3%82%B0%E3%83%AB%E3%83%9C%E3%83%BC%E3%83%B3%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B-%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6.html>

エディタを開いて

```bash
$ sudoesit /etc/rc.local
```

「LEDを消す」内容を追加して

```bash
#!/bin/sh -e

echo none > /sys/class/leds/beaglebone:green:usr0/trigger
echo none > /sys/class/leds/beaglebone:green:usr1/trigger
echo none > /sys/class/leds/beaglebone:green:usr2/trigger
echo none > /sys/class/leds/beaglebone:green:usr3/trigger

exit 0
```

実行権限付けて再起動！

```bash
$ sudo chmod +x /etc/rc.local
$ sudo reboot now
```

以上で、今回のお話終わり。