【2019年12月版】ラズパイ奮戦記。Macbook経由でネットにつなぐには

# ラズパイに限ったことではないが、MacとLANケーブルで直接繋いだPCがインターネットに繋がりたい場合の話

まぁ、落ち着いて考えたらLANケーブルで直接、繋がってようがハブ経由で繋がっていようが関係なく、自分をゲートウェイにしたいと思ったら、Macの場合は`インターネット共有`を使うってことですよね。。。
それに気づくまでの奮戦記をメモとして残しておきます。

## スマホのAP作戦はうまくいった。しかし…

[前回の記事でラズパイとスマホのWifi-AP経由で接続できました](https://qiita.com/koinori/items/8fdf5e753e10e840b02b)が、スマホをアクセスポイントにするってことは、スマホのモバイル回線からインターネットに繋ぐ、と言うことで…モバイル回線のデータ量=電話代が増えちゃうじゃないか！そして`apt update && apt upgrade -y`するとちょいちょい固まるし…なんだか遅いし不安定なんだよね。。。
(実際、`apt upgrade`してみたところ、多分モバイル回線ではとんでもないことになります。Ubuntuでの初回の`apt update && apt upgrade`を思い出してください。)
と言うわけで急遽、USBのLANアダプタとLANケーブルを調達してまいりました！

## LANケーブルで直で繋ぐ

まずは前回の手順でスマホAP経由でssh接続をしておきます。そして、このスマホのAP経由のSSH接続を保持したまま、LANケーブルを直で差して相手のIPアドレスを `ip address show` してみました。
`eth0` に `169.254.xx.xx` のようなIPアドレスが設定されていたので、別のターミナルを開いて、`ssh pi@169.254.xx.xx` で接続いたしました。
もちろん、ログインできます。

すっかり、Mac経由で名前解決できるしインターネットにつながるだろうと**思い込んでいた**私はここでスマホのテザリングを切りました。
最初の ssh はもちろん切断しておきます。LANケーブル経由のsshで問題なくやり取りはできています。
念の為、`curl http://www.google.com` とやると…

```shell
$ curl http://www.google.com
curl: (6) Could not resolve host: www.google.com
```
と出て、ホスト名が解決できない、とあります。。。
"ま、まぁアレだよね。急に経路が変わってびっくりしたよね？！"と、意味不明な言い訳を考えて、**ラズパイを再起動**いたしました。

```shell
$ sudo shutdown -r now
Connection to 169.254.xxx.xxx closed by remote host.
Connection to 169.254.xxx.xxx closed.
```
で…しばらく待ちます。しかしいくら経っても先ほどのIPアドレスでは繋がらないのです。(適当なアドレスだからそりゃそうだろう。)
仕方なくスマホのテザリングをオンにします。
数秒でテザリングには繋がってきます。(ホントこの反応はかなり早いです。)

再び、最初のスマホ経由のIPアドレスにて、`ssh pi@192.168.1.xxx` で接続し、IPアドレスを取得します。
もちろん、先ほどとは違うアドレスとなっております。別ターミナルを開き、`ssh pi@169.254.xxx.xxx` で接続いたします。

接続はできましたがさて、ここで `curl` をやっても先ほどと同じです。ゲートウェイをMac側に強制的に向けるか…？ う〜ん。。。

しかしMacのネットワーク設定の画面を見てふと思います。

<img width="647" alt="スクリーンショット 2019-12-20 0.33.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335150/a63d2d72-58c7-e992-a2ba-ead054df081f.png">

> 自己割り当てIPアドレスが設定されているためインターネットに接続できません。

いや、そうなんですよね。Macにゲートウェイ向けたところでこのUSBのネットワークアダプタのネットワークは外には出れないのですよ。と言うか…あれ？なんかそういう**`ブリッジ的な機能`なかったっけ？**

## インターネット共有の有効化！

はい、今更のおさらいですが異なる経路でもWAN側に出れる=インターネットに繋がるようにブリッジしてくれる機能が`インターネット共有`ですよね〜！
今回は以下のように設定いたしました。

<img width="663" alt="スクリーンショット 2019-12-20 0.06.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335150/81702758-705b-008b-bb4c-c668a4b5382c.png">

ラズパイが繋がっているUSBアダプタのネットワークを、**MacのWifi経由して**インターネットに繋ぎます。

これで無事にラズパイからインターネットに繋がる〜！と`curl`してみようとしたら…

**ターミナルから応答がない。。。**

えっと、もしかして、インターネット共有入れたら**IPアドレス変わった？**

…

再び、スマホのテザリングをオンにします。数秒でラズパイは繋がってきます。

Macも**Wifiのインターネット共有をオンにしたまま**、一旦、スマホのWifiに接続します。
sshで、無事にログインできたら先ほどと同様、`ip address show`でIPアドレスを調べます。

めでたく、`192.168.2.xxx`という新しいアドレスが割り当てられておりました。。。

別のターミナルを開き、`ssh pi@192.168.2.xxx` でログインし、MacのWifiを切り替え、スマホのテザリングをオフにして、`curl`してみます。

```shell
$ curl http://www.google.com
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta content="&#19990;&#30028;&#20013;&#12398;&#12354;&#12425;&#12422;&#12427;&#24773;&#22577;&#12434;&#26908;&#32034;&#12377;&#12427;&#12383;&#12417;&#12398;&#12484;&#12540;&#12523;&#12434;&#2...
```
おホォ〜。。。やっとMacのWifi経由で外に出れたようです。。。~~(一気に疲れが…)~~

## 正しい手順としては？

結局のところ、どうやるのが正しい手順だったのでしょうか？以下にまとめたいと思います。

1. LANケーブルでラズパイとMacを接続。まだラズパイの電源は入れちゃダメ。
2. インタネット共有を有効化。`USBアダプタ`から接続して`Wifi`を共有する。
3. スマホのテザリングをオンにする。
4. ラズパイの電源を入れる
5. Macの Wifi をスマホのAPにつなぐ。
5. スマホのテザリングしたIPアドレスでssh接続。
6. `ip address show` で`eth0`のIPアドレスを調べる
7. 別ターミナルで `eth0`のIPアドレスに ssh で接続
8. 元のスマホAP経由のsshは `exit` して切断
8. Macの Wifiをインターネットにつながるネットワークにつなぎ変える
9. スマホのテザリングをOFF

これでLANケーブルで繋がったラズパイが無事に外に出れます。
インターネット共有をあらかじめ仕掛けてからラズパイの電源を入れてIPアドレスが変わらないようにする、と言うのが肝心なポイントですね。

ふぅ〜！それでは早速、`apt update`してみたいと思います！

今回は以上です！

~~(なぜ、こんなめんどくさい事をするかって？ここがスタバだからなのだよ！)~~