直接WANに繋がずにラズパイのaptをアップデートする話

# 動機

LANでラズパイをたくさん繋げて遊んでたら他にもパッケージが欲しくなったestis．
ラズパイを外部に出してあげるにはWiFiを使うしかなかったが，認証に必要な情報をラズパイに渡したくなかったので仕方なくProxyを使うことに．
道行く道に立ちはだかるよくわからないエラー．
estisは解決して目的を達成できるのか！（できました）

あくまで成功事例の一つです．ご注意ください．


# マシンとネットワークの構成

![proxy_real.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494471/6d325839-0c8c-b7d8-7ea0-7003c4d777e1.png)


プロキシを入れるマシン: 192.168.13.1
ラズパイ: 192.168.12.4

IPアドレスの振り方が気持ち悪かったり，ネットワークがこんなことになってることには目を瞑りましょう．

# 手法

## squidの準備

1: squidをインストールする
```bash
sudo apt install squid -y
```

2:  squidの設定ファイル（/etc/squid/squid.conf）をいじる
```
# line 1197
# 2022-05-12 added for raspi
acl localnet src 192.168.12.0/24
acl localnet src 192.168.13.0/24
```

```
# line 1415
# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
# http_access allow localhost
```

3: squidの起動
```bash
sudo systemctl start squid
```

4: 動作確認
サーバのマシンで
```bash
curl -x 192.168.13.1:3128 -sS https://www.yahoo.co.jp | head -n 10
```
を叩いて返ってきたらok!


以下はラズパイ側の設定

1: aptでproxyを使うように設定ファイル（/etc/apt/apt.conf/80proxy）を作成していじる．
```
# line 1
Acquire::http::proxy "http://192.168.13.1:3128/";
Acquire::https::proxy "https://192.168.13.1:3128/";
Acquire::ftp::proxy "ftp://192.168.13.1:3128/";
Acquire::socks::proxy "socks://192.168.13.1:3128/";
```

### 詰まった点

1. squidのデフォルト設定でlocal**host**しかhttp_accessが許可されてなかったのでうまく通信できなかった．
1197行付近で設定されているのはlocal**net**に関するものなので，それを許可してあげないといけない．
    - /var/log/squid/access.logにログがあるので，ここにあるエラーから調べて原因を探った．
2. proxyだけだとDNSがうまくいかないので，ラズパイでは4.のコマンドがうまくいかない．次に進む．


## DNSサーバ（bind）の準備

[いつものサイト](https://www.server-world.info/query?os=Ubuntu_20.04&p=dns&f=1)を参考に設定．
動くことを目標にしたので設定の最小性は保証できません．

1: bindのインストール

```bash
sudo apt -y install bind9 bind9utils
```

2: bindの設定ファイルの一つ（/etc/bind/named.conf.options）をいじる

```
# line 1
acl internal-network {
        192.168.12.0/24;
        192.168.13.0/24;
};
```
```
    # line 30
    allow-query { localhost; internal-network; };
    allow-transfer { localhost; };
    recursion yes;
```

3: 実行

```bash
sudo systemctl restart named
```

以下はラズパイ側の設定

1: DHCPの設定ファイル（/etc/dhcpcd.conf）をいじる．

```
# line 55
static domain_name_servers = 192.168.13.1
```

2: dhcpcdの再起動

```bash 
sudo systemctl restart dhcpcd
```

3: 動作確認
ラズパイで
```bash
curl -x 192.168.13.1:3128 -sS https://www.yahoo.co.jp | head -n 10
```
を叩いて返ってきたらok!

### 詰まった点

そろそろapt-updateするか，と思ってしたら以下のエラーが出た．

```
raspi2@raspberrypi:~ $ sudo apt update
Get:1 http://archive.raspberrypi.org/debian bullseye InRelease [23.7 kB]
Get:2 http://raspbian.raspberrypi.org/raspbian bullseye InRelease [15.0 kB]
Reading package lists... Done     
E: Release file for http://archive.raspberrypi.org/debian/dists/bullseye/InRelease is not valid yet (invalid for another 34d 17h 39min 8s). Updates for this repository will not be applied.
E: Release file for http://raspbian.raspberrypi.org/raspbian/dists/bullseye/InRelease is not valid yet (invalid for another 37d 11h 38min 19s). Updates for this repository will not be applied.

```

dateコマンドを叩くと時間がえらいことになってるのでNTPが必要とわかったが，どうやらproxy下では簡単に解決できるいい方法はなさそう．
仕方ないのでNTPサーバも立てた．次に進む．

## NTPサーバの準備

[いつものサイト2](https://www.server-world.info/query?os=Ubuntu_20.04&p=ntp&f=1)を参考に設定．

1: ntpdのインストール

```bash
sudo apt -y install ntp
```

2: ntpdの設定ファイル（/etc/ntp.conf
）をいじる
```
# line 16
# Specify one or more NTP servers.

# Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board
# on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for
# more information.
# pool 0.ubuntu.pool.ntp.org iburst
# pool 1.ubuntu.pool.ntp.org iburst
# pool 2.ubuntu.pool.ntp.org iburst
# pool 3.ubuntu.pool.ntp.org iburst

# Use Ubuntu's ntp server as a fallback.
# pool ntp.ubuntu.com
pool ntp.nict.jp iburst
```

3: ntpdの起動

```bash
sudo systemctl start ntp
```

以下はラズパイ側の設定

1: timesyncedの設定ファイル（/etc/systemd/timesyncd.conf）をいじる．

```
# line 15
NTP=192.168.13.1
```

2: NTPの設定の有効化

```bash
sudo timedatectl set-ntp true
sudo systemctl daemon-reload
sudo systemctl restart systemd-timesyncd.service
sudo systemctl status systemd-timesyncd
```

dateコマンドを叩いて正しい時間になってたらok!
なってない場合はtimezoneを確認するといいかもしれない．

 

# 参考文献

- [Ubuntuでプロキシサーバを使えるようにする](https://blackbird-blog.com/ubuntu-ftp-squid)
- [Squidでプロキシーサーバー (Proxy) を構築、設定 (CentOS 7, Windows Server 2008)](https://urashita.com/archives/18784)
- [RaspberryPiをプロキシ環境で使う（#2ネットワーク設定）](https://sites.google.com/site/jglabo701/raspberrypiwopurokishi-huan-jingde-shiu-2nettowaku-she-ding)
- [BIND : 内部ネットワーク向けの設定](https://www.server-world.info/query?os=Ubuntu_20.04&p=dns&f=1)
- [Raspberry Pi：DNSサーバー設定](https://tutorialcrawler.com/linux/raspberry-pi%EF%BC%9Adns%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E8%A8%AD%E5%AE%9A/)
- [Raspberry Pi 再開](https://doremi047.hatenablog.com/entry/2019/11/20/122138)
- [NTP サーバー : NTPd の設定](https://www.server-world.info/query?os=Ubuntu_20.04&p=ntp&f=1)
- [Raspberry Pi 4 デジタル時計の時刻を合わせる](https://arakoki70.com/?p=5691#:~:text=Raspberry%20Pi%E3%81%AE%E6%99%82%E9%96%93%E3%82%92%E5%90%88%E3%82%8F%E3%81%9B%E3%82%8B%E3%81%AB%E3%81%AF&text=Raspbian%E3%81%AB%E3%81%AFNTP%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)
- [Raspbianの時刻・タイムゾーン設定](https://udon.little-pear.net/raspbian-ntp-timezone/)

# 疑問点

reverse shellというのがあるけど，あれってこういう問題をなんとか踏み倒せたりしないのかな

# ノート

ラズパイにはdhcpでipアドレスを配ってるので，配る時にdnsサーバのipアドレスも渡しといて上げると楽になって良い．