Raspberry Pi 3 ModelB で外付けHDDをファイルサーバー化する

## 目的
Raspberry Pi 3 ModelBにマウントした外付けHDDを外部PCからR/Wできるようにファイルサーバー化する

## 環境
+ Raspberry Pi 3 ModelB
+ 外付けHDD：EC-PHU3W1(IO-DATA)
+ Raspberry Pi用電源：[アイトランク iTrunk Raspberry Pi 3用 USB電源アダプター](https://www.amazon.co.jp/iTrunk-Raspberry-USB%E9%9B%BB%E6%BA%90%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%83%BC-%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%AD%E3%83%83%E3%83%88-%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A4/dp/B074H5RXM2)(地味にハマったので記載)

## 作業メモ

### 外付けHDDをマウント

<b>参考サイト</b>
https://qiita.com/Cinosura/items/6ab435331ea2b3671a1d

+ 外付けHDDをRaspberry PiにUSB接続して起動
+ fdiskしてHDDが認識されればマウントはOK

```
$ sudo fdisk -l
...中略
Device     Boot Start        End    Sectors   Size Id Type
/dev/sda1        2048 1953520064 1953518017 931.5G  7 HPFS/NTFS/exFAT
```

+ 再起動時に自動的にマウントされるように設定

```
$ sudo blkid /dev/sda1
/dev/sda1: LABEL="EC-PHU3" UUID="A6761F43761F13A1" TYPE="ntfs" PARTUUID="7a469053-01"
```

`/etc/fstab` に以下を追記
ここでは適当に作った /mnt/hdd にマウントする

```
UUID="A6761F43761F13A1" /mnt/hdd ntfs-3g defaults,nofail 0       0
```

最後に再起動して /mnt/hdd にマウントされているのが確認できればOK

外付けHDDを接続する時は使用する電源に注意！*[^1]
[^1]: わざわざ環境に「Raspberry Pi用電源」を書いたのはここでハマったため。平たく書くと、HDDが認識されなかったので電源を変えてみたら認識してくれました、という話

### 外付けHDDをファイルサーバー化する
<b>参考サイト</b>
https://qiita.com/ARBALEST000/items/78f459567e1e90de99e5

+ ファイルサーバー化するためにsambaをインストールする

```
$ sudo apt-get update
$ sudo apt-get install samba
```
+ smb.confの設定

```
$ sudo vi /etc/samba/smb.conf
```

[global]に以下を追記

```smb.conf
interfaces 192.168.0. 127.0.0.1/8 wlan0
bind interfaces only = yes
hosts allow = 192.168.0. fe80::/10
security = user
```
`interfaces`のIP(`192.168.0.`)およびIF名(`wlan0`)は環境によって異なる

次にsmb.confの末尾に以下を追記

```smb.conf
[public]
  comment = Public
  path = /mnt/hdd
  public = yes
  read only = no
  browsable = yes
  force user = pi
```
`force user`のユーザーはRaspberry Piで使用しているログインユーザー名を指定
`path`はマウントされたHDDのpathを指定

<2018/4/29追記>
その後、[こちらの投稿](https://qiita.com/marumen/items/4f9ca20392c021c4f897)で少しセキュリティ面を強化

ここまで設定したら`testparm`コマンドで設定が反映されているかを確認

```
$ testparm
```

+ sambaの再起動
 
```
$ sudo systemctl restart smbd
$ sudo systemctl restart nmbd
```

+ ネットワーク上で RASPBERRYPI が見えるか確認

エクスプローラーで `\\RASPBERRYPI` と選択して見えればOK
適当にファイル作成できることも確認(書き込みできることの確認)

### セキュリティ関連の設定

ファイアウォール(iptables)の設定を行う
ローカルなネットワーク内のファイルサーバーなので、正直なところ必要性は微妙
ただ、せっかくなので設定をしてみる

<b>参考サイト</b>
https://knowledge.sakura.ad.jp/4048/
http://wiki.samba.gr.jp/mediawiki/index.php?title=Samba_%E3%82%92%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB%E8%B6%8A%E3%81%97%E3%81%AB%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B

+ iptablesを使用する準備

```
$ sudo apt-get install iptables-persistent
```

+ 現在の設定を確認

```
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
```

全て`ACCEPT`、つまり何も制限していない状態になっている

+ <b>参考サイト</b>の内容を参考にiptablesのルールを設定する*[^2]

[^2]: iptablesの作法についてはここでは説明しないので、他サイトを参照ください。`INPUT`,`FORWARD`を`DROP`にしているので、全く制限してないよりは効果があるはず

```
$ sudo vi /etc/iptables/rules.v4
```

```/etc/iptables/rules.v4
*filter
:INPUT   DROP   [0:0]
:FORWARD DROP   [0:0]
:OUTPUT  ACCEPT [0:0]

# loopback
-A INPUT -i lo -j ACCEPT

# for established connection
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

# DNS
-A INPUT -p udp --sport 53 -j ACCEPT

# SSH
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

# HTTP/HTTPS
-A INPUT -p tcp --dport 80   -j ACCEPT
-A INPUT -p tcp --dport 443  -j ACCEPT

# SAMBA
-A INPUT -p tcp --dport 139 -j ACCEPT
-A INPUT -p udp --dport 137 -j ACCEPT
-A INPUT -p udp --dport 138 -j ACCEPT
-A INPUT -p tcp --dport 445 -j ACCEPT
```

<dl>
この設定で少なくとも以下はできることを確認済み
<dd>TeraTermでのSSH接続<dd>
<dd>Windows PCからのファイルサーバーのR/W</dd>
</dl>

+ 新しいルールをiptablesに適用する

```
$ sudo iptables-apply /etc/iptables/rules.v4
Applying new iptables rules from '/etc/iptables/rules.v4'... done.
Can you establish NEW connections to the machine? (y/N) y
... then my job is done. See you next time.
```

適用してOKならば、途中で`y`を押す

+ 設定が適用されたか確認

```
$ sudo iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     udp  --  anywhere             anywhere             udp spt:domain
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:netbios-ssn
ACCEPT     udp  --  anywhere             anywhere             udp dpt:netbios-ns
ACCEPT     udp  --  anywhere             anywhere             udp dpt:netbios-dgm
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:microsoft-ds

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
```

`INPUT`,`FORWARD` に設定が適用されている

## まとめ
当初の目的は達成！
> Raspberry Pi 3 ModelBにマウントした外付けHDDを外部PCからR/Wできるようにファイルサーバー化する

ただ、sambaのアクセス制限には課題あり
今の設定だとローカルネットワーク内とはいえ guest ユーザーなら誰でもR/Wできてしまうので

***