Ubuntu18.04 や RaspberryPi ホストから 同一 LAN 上の RaspberryPi のIPアドレスを検索する  

XSHELLさんの書かれた「同じLAN内に接続したRaspberry PiのIPアドレスを調べる」の記事
https://qiita.com/xshell/items/af4e2ef8d804cd29e38e
では、Mac/Linux/Windowsでのそれぞれの調査方法を記してます。

しかしUbuntu18.04においては、arp-scan で検出しづらくなっっている模様。なのでそういった場合に代わりの方法。

# 環境

この記事の内容は Ubuntu18.04 および Raspbian Buster Lite2019-07-10版でチェックしました。

Raspbian からでも同様に操作でき、ログオンできるRaspberryPiが1台あったらそこから別のRaspberryPiを調べていくことができる。


# arp-scan の問題の確認 on Ubuntu 18.04

18.04 では ネットワークコマンド関係が一新されたのに関係しているのかな？

## インストール

Ubuntu 18.04 には元々、arp や arp-scan コマンドは標準ではインストールされていない。

arp インストール：sudo apt install net-tools で入る
arp-scan インストール：sudo apt install arp-scan で入る

## arp-scan

```

$ sudo arp-scan -l --interface wlp3s0
Interface: wlp3s0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.9 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
192.168.43.1	06:d4:c4:2b:d7:2b	(Unknown)
192.168.43.112	6c:88:14:3f:f1:b4	Intel Corporate
192.168.43.209	a4:4e:31:0c:bd:f4	Intel Corporate (DUP: 1)

3 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.9: 256 hosts scanned in 2.262 seconds (113.17 hosts/sec). 3 responded
```

本来はこれ↓が表示されるはずであるが出ていない。

```

192.168.43.38	b8:27:eb:6d:f7:54	Raspberry Pi Foundation
192.168.43.116	b8:27:eb:a8:a9:6d	Raspberry Pi Foundation
```

## arp キャッシュの表示

```

$ arp -a
_gateway (192.168.43.1) at 06:d4:c4:2b:d7:2b [ether] on wlp3s0
```
うーむ

# 代わりの方法

## ip コマンド

arp コマンドの代わりに用意されているのが ip neigh show コマンド。

```

$ ip neigh show
192.168.43.1 dev wlp3s0 lladdr 06:d4:c4:2b:d7:2b REACHABLE
```
これも、表示されていないですね。

## ping を使ったスクリプト

時間かかる方法
「LAN内で使われているIPアドレスを調べる6つの方法(Linux/Windows)」
https://orebibou.com/2015/05/lan%E5%86%85%E3%81%A7%E4%BD%BF%E3%82%8F%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8Bip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E8%AA%BF%E3%81%B9%E3%82%8B6%E3%81%A4%E3%81%AE%E6%96%B9%E6%B3%95linuxwindows/

こちらを元にして、RaspberryPi用に直したものが以下。

```

 for a in `seq 1 255`; do echo -n "$a " ; ping -c 1 -w 0.5 192.168.43.$a > /dev/null && arp -a 192.168.43.$a | grep -B 3 b8:27:eb ; done
```
実行結果

```

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 raspberrypi (192.168.43.38) at b8:27:eb:6d:f7:54 [ether] on wlp3s0
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 raspberrypi (192.168.43.116) at b8:27:eb:a8:a9:6d [ether] on wlp3s0
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 Do you want to ping broadcast? Then -b. If not, check your local firewall rules.

```

時間かかるので進行状況も表示するようにしています。
Ctrl+Cが効かないのでCtrl+Zで停止 その場合プロセスは残るのでexitで抜ける

## fping を使う

インストール

```

$ sudo apt install fping
```

実行

```

$ fping -s -g 192.168.43.1/24 &> /dev/null
```

これで高速にPINGが行えるが、表示が長いので表示を抑制して実行。その後に、arpテーブルをチェック。

```

$ ip neigh show | grep b8:27:eb
192.168.43.116 dev wlp3s0 lladdr b8:27:eb:a8:a9:6d STALE
192.168.43.39 dev wlp3s0 lladdr b8:27:eb:6d:f7:54 PERMANENT
192.168.43.38 dev wlp3s0 lladdr b8:27:eb:6d:f7:54 STALE

```

または

```

$ arp -a | grep b8:27:eb
? (192.168.43.116) at b8:27:eb:a8:a9:6d [ether] on wlp3s0
? (192.168.43.39) at b8:27:eb:6d:f7:54 [ether] PERM on wlp3s0
raspberrypi (192.168.43.38) at b8:27:eb:6d:f7:54 [ether] on wlp3s0
```



## nmap を使う

ポートスキャンなどにつかう定番ツールを使ってみます。

```

$ sudo apt install nmap
```

でインストール

### 単純に実行する場合


```

sudo nmap -sP 192.168.43.0/24  | grep B8:27:EB -B 2
Nmap scan report for 192.168.43.38
Host is up (-0.066s latency).
MAC Address: B8:27:EB:6D:F7:54 (Raspberry Pi Foundation)
--
Nmap scan report for raspberrypi (192.168.43.116)
Host is up (-0.048s latency).
MAC Address: B8:27:EB:A8:A9:6D (Raspberry Pi Foundation)

```

なお、実験中うまく行かない場合がありました。


```
$ nmap -sT  192.168.43.0/24 

$ sudo nmap -sP 192.168.43.0/24  | grep B8:27:EB -B 3
MAC Address: 64:80:99:6C:D8:EC (Intel Corporate)
Nmap scan report for raspberrypi (192.168.43.116)
Host is up (0.013s latency).
MAC Address: B8:27:EB:A8:A9:6D (Raspberry Pi Foundation)


```

これはgrepのオプションに間違って -B 3 としているため、Intelの余計な表示が出ているが、RaspberryPiに該当するものは1つしか出ていない。その後再現していないが、要注意。


### sshを有効にしておいて、nmapで検索する場合


```

$ sudo nmap -sT -p 22 192.168.43.0/24

Starting Nmap 7.60 ( https://nmap.org ) at 2019-07-30 17:11 JST
Nmap scan report for _gateway (192.168.43.1)
Host is up (0.0079s latency).

PORT   STATE    SERVICE
22/tcp filtered ssh
MAC Address: 06:D4:C4:2B:D7:2B (Unknown)

Nmap scan report for raspberrypi (192.168.43.38)
Host is up (0.010s latency).

PORT   STATE SERVICE
22/tcp open  ssh
MAC Address: B8:27:EB:6D:F7:54 (Raspberry Pi Foundation)

Nmap scan report for nanbuwks-ThinkPad-X230 (192.168.43.91)
Host is up (0.081s latency).

PORT   STATE  SERVICE
22/tcp closed ssh
MAC Address: 64:80:99:6C:D8:EC (Intel Corporate)

Nmap scan report for 192.168.43.116
Host is up (-0.057s latency).

PORT   STATE SERVICE
22/tcp open  ssh
MAC Address: B8:27:EB:A8:A9:6D (Raspberry Pi Foundation)

Nmap scan report for nanbuwks-ThinkPad-X230-Tablet (192.168.43.112)
Host is up (0.000071s latency).

PORT   STATE  SERVICE
22/tcp closed ssh

Nmap done: 256 IP addresses (5 hosts up) scanned in 4.87 seconds

```



### 見やすいようにフィルタをかける

```

$ sudo nmap -sT -p 22 192.168.43.0/24 | grep B8:27:EB -B 2
PORT   STATE SERVICE
22/tcp open  ssh
MAC Address: B8:27:EB:6D:F7:54 (Raspberry Pi Foundation)
--
PORT   STATE SERVICE
22/tcp open  ssh
MAC Address: B8:27:EB:A8:A9:6D (Raspberry Pi Foundation)

```

### ハマりポイント
nmapは以前はrootでないと動かなかったけど、いまはなんか一般ユーザーで動いてるよね〜ということで、それで試してました。
しかし一般ユーザでnmapを実行するとICMP疎通確認が行われないとかなんとかで（未理解みが高い）、以下のように結果表示が不十分でした。

```
$ nmap -sT  192.168.43.0/24 | grep -i raspberry  
Nmap scan report for raspberrypi (192.168.43.38)
```
下記のようにホスト種別が出ていない（192.168.43.116）
```
$ nmap -sT  192.168.43.0/24 

Starting Nmap 7.60 ( https://nmap.org ) at 2019-07-30 15:27 JST
Nmap scan report for _gateway (192.168.43.1)
Host is up (0.012s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
53/tcp open  domain

Nmap scan report for raspberrypi (192.168.43.38)
Host is up (0.025s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
22/tcp open  ssh

Nmap scan report for nanbuwks-ThinkPad-X230-Tablet (192.168.43.112)
Host is up (0.00017s latency).
All 1000 scanned ports on nanbuwks-ThinkPad-X230-Tablet (192.168.43.112) are closed

Nmap scan report for 192.168.43.116
Host is up (0.066s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
22/tcp open  ssh

Nmap scan report for HUAWEI_P20_lite-8fa53b859 (192.168.43.199)
Host is up (0.013s latency).
All 1000 scanned ports on HUAWEI_P20_lite-8fa53b859 (192.168.43.199) are closed

Nmap scan report for LATITUDE (192.168.43.209)
Host is up (0.014s latency).
Not shown: 995 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
22/tcp   open  ssh
80/tcp   open  http
3389/tcp open  ms-wbt-server
5900/tcp open  vnc

Nmap done: 256 IP addresses (6 hosts up) scanned in 26.81 seconds
```

あれれー？ まぢかよnmap最低だなと一瞬あらぬ濡れ衣を被せかけました。nmapはrootで行うのが無難そう。
また、先に書きましたが実験中うまく行かない場合が1回あったので、要注意。