wheezy向けの旧ページはこちら

6.SAMBAサーバーの立て方(Windowsファイル共有サーバー)(NAS化) - RaspberryPiで各種サーバー作り! - ある阪大生の物置小屋

「SAMBA」はWindows共有で用いられるSMBプロトコルに対応したファイルサーバーです。
これをRaspbianにインストールし、USBHDD等と組み合わせれば、きっちりとしたファイルサーバーが出来上がります。
ここでは、そんな「SAMBA」を利用して、ファイル共有サーバ(NAS)を立てる方法について説明します。

6.1.「SAMBA」をインストールする前に(前準備)

「SAMBA」をインストールする前に、SAMBA用のユーザーを作成し、USBHDDを起動時にマウントするようにしておきましょう。
USBHDDはあらかじめ「FAT32」でフォーマットしておいてください。
(4GB以上のファイルを扱いたい場合は「ext4」など他のファイルシステムでフォーマットしておいてください。)

  1. 以下のコマンドで、SAMBA用のユーザーを作成します。
    sudo useradd -s /bin/false (任意のユーザ名)
    
  2. 以下のコマンドで、SAMBA用のユーザーのパスワードを変更します。
    sudo passwd (先程のユーザ名)
    
  3. USBHDDをRaspberyPiに差し込み、以下のコマンドでデバイス名を確認します。
    sudo fdisk -l
    
    大体は、「sda1」・「sdb1」といった名前になっていると思います。
  4. 以下のコマンドで、USBHDDをマウントします。
    #マウントポイント作成
    sudo mkdir /mnt/HDD
    
    #USBメモリーをマウント
    sudo mount /dev/(デバイス名) /mnt/HDD
    
  5. 以下のコマンドで、USBHDDのUUIDを確認します。
    sudo blkid /dev/(デバイス名)
    
  6. 起動時のマウントの仕方を記載している「/etc/fstab」を以下のように編集します。
    (追加)
    UUID="(USBHDDのUUID)" /mnt/hdd      vfat    auto,nodev,async,rw,nouser,noexec,iocharset=utf8,codepage=932,uid=(SAMBA用のユーザーのユーザーID),gid=(SAMBA用のユーザーのグループID),nofail 0 0
    
    (HDDを「ext4」など他のファイルシステムでフォーマットした場合は、「vfat」→「ext4」に変更し、「iocharset=utf8,codepage=932」の記述を削除する。)
    SAMBA用のユーザーのユーザーID・グループIDを確認するには、以下のコマンドで。
    id (SAMBA用のユーザー名)
    
  7. 以下のコマンドで、再起動して、USBHDDがマウントされていることを確認する。
    #再起動
    sudo reboot
    
    #マウント確認
    df
    #「Mounted on」を確認し正しくマウントされていることを確認する。
    

6.2.「SAMBA」のインストール

「SAMBA」をインストールするには、以下のコマンドでインストールできます。

sudo apt-get install samba

6.3.「SAMBA」の設定

  1. 以下のコマンドで、SAMBAのユーザーデータベースに、「SAMBA用ユーザ」を登録する。
    sudo pdbedit -a -u (SAMBA用のユーザー名)
    
  2. SAMBAの設定ファイル「/etc/samba/smb.conf」を以下のように編集する。
    ([global]に追加)
    hosts allow = (ファイル共有したいネットワークアドレス)/(サブネットマスク) localhost
    interfaces = (ファイル共有したいネットワークアドレス)/(サブネットマスク) localhost
    bind interfaces only = yes
    deadtime = 60
    max connections = 100
    guest ok = no
    invalid users = root pi @sudo
    
    (ファイルの最後に追加)
    [hdd]
     comment = hdd
     path = /mnt/hdd
     read only = no
     guest ok = no
     valid users = sharehdd
    
    (変更)
    workgroup = WORKGROUP
    ↓
    workgroup = (自身のワークグループ)
    
    map to guest = Bad User
    ↓
    map to guest = Never
    
    obey pam restrictions = no
    ↓
    #obey pam restrictions = no
    
    unix password sync = yes
    ↓
    #unix password sync = yes
    
    pam password change = yes
    ↓
    #pam password change = yes
    
    usershare allow guests = yes
    ↓
    #usershare allow guests = yes
    
    (更にホームディレクトリを共有しない場合、[homes]以下をコメントアウトしてもらえればOKです。)
    
  3. 以下のコマンドで、SAMBAの設定ファイル「/etc/samba/smb.conf」が正しく書かれているか確認する。
    testparm
    
  4. 以下のコマンドで、iptablesの設定を書き換え、SAMBAの通信が通るようにする。
    sudo iptables -A INPUT -j ACCEPT -s (ファイル共有したいネットワークアドレス)/(サブネットマスク) --protocol udp --destination-port 137:138
    sudo iptables -A INPUT -j ACCEPT -s (ファイル共有したいネットワークアドレス)/(サブネットマスク) --protocol tcp --destination-port 139
    sudo iptables -A INPUT -j ACCEPT -s (ファイル共有したいネットワークアドレス)/(サブネットマスク) --protocol tcp --destination-port 445
    
    #WindowsがWebDAV優先で接続しようとすることに対する対策(Webサーバーを立てているなどの場合は追加しない)
    sudo iptables -A INPUT -j REJECT -s (ファイル共有したいネットワークアドレス)/(サブネットマスク) -p tcp --destination-port 80 --reject-with tcp-reset
    ( sudo iptables -A OUTPUT -j ACCEPT -p tcp --tcp-flags FIN,SYN,RST RST -m state --state RELATED,ESTABLISHED )
    
    2.5.の通り、iptablesの設定の変更後は以下のコマンドで設定を記録しておくこと。
    sudo iptables-save | sudo tee /etc/iptables/rules.v4
    
    一見SAMBAとは関係のない80番(http)ポートですが、Windowsでは接続の際に、まずSAMBAではなく、WebDAVというプロトコルで接続しようとします。
    これにより、サーバ接続後、右クリック等でファイル情報を取得しようとすると、WebDAVの応答待ちでエクスプローラーがフリーズします。
    これを防ぐために、80番(http)ポートに接続があった場合に、RSTパケットを返すことで、応答待ちをさせないようにしています。
  5. 以下のコマンドで、SAMBAに設定を読み直しさせます。
    sudo systemctl reload smbd
    
  6. 外部からサーバを見てみる。
    Windowsの場合は、「ネットワーク」から見れます。
    中へアクセスする際には、設定したSAMBA用ユーザー名とパスワードでログインしてください。

    Linuxの場合は、以下のコマンドでどうぞ。
    sudo mount -t cifs -o username=(ユーザ名),password=(パスワード),domain=(ワークグループ名),uid=(利用したいユーザのユーザID),gid=(利用したいユーザのグループID),defaults //(sambaサーバのホスト名 OR IPアドレス) (マウント先)
    
    また、起動時に自動マウントしたい場合は、まず、「root権限」で以下の内容を「/root/sambacredential」に保存します。
    username=(ユーザ名)
    password=(パスワード)
    domain=(ワークグループ名)
    
    次に、以下のコマンドを実行します。
    chmod 600 /root/sambacredential
    
    そして、「/etc/fstab」に以下の内容を追記します。
    //(sambaサーバのホスト名 OR IPアドレス) (マウント先) cifs credentials=/root/sambacredential,_netdev,uid=(利用したいユーザのユーザID),gid=(利用したいユーザのグループID),defaults 0 0
    
    その他のOSから見る方法は、ネット等で調べてください。(^^;)

6.参考サイト

製品紹介(Amazonアフィリエイト)



2016/06/22 iptablesの設定の書き換えと、WebDAVの説明追加
2017/04/23 「/etc/fstab」内のマウントオプションに「nofail」が抜けていたので追加。(「nofail」がないと起動時にHDDを認識しない場合、緊急シェル(emergency.target)に移行するので不便)