作業メモ:Samba構築してwindows7とMacからssh経由での接続

# 前提

特定ユーザにより samba over ssh でのみ利用する。

## 環境
* サーバ：CentOS 6.5 (Samba 3.6.9)
* クライアント：Windows 7
* クライアント：Mac OS X 10.9

# Sambaのインストール

```zsh
$ yum -y install samba
```

## Samba用ユーザの追加

* UNIXアカウントとしても存在する必要がある
* パスワードはSamba独自で管理される

```zsh
# グループ作成
% groupadd sambauser
# ログインの必要ないユーザを作成(Samba接続でのみ使用する)
% adduser -g sambauser -s /bin/false sambasan
# Samba用ユーザを作成
% pdbedit -a -u sambasan
# パスワードを入力
```

ちなみに`adduser`に`-M`をつけるとホームディレクトリも作成されない。
UNIXアカウントのパスワード設定は以下。不要だが。

```zsh
% passwd sambasan
```

### [メモ] pdbedit コマンド

```zsh
# ユーザ作成
% pdbedit -a <user name>
# ユーザ削除
% pdbedit -x <user name>
# ユーザ表示
% pdbedit -L
% pdbedit -L -v <user name>
```

## 共有フォルダの設定

* アクセス権を適切に与える必要がある

```zsh
# 今回は所有者でしか利用しないので700
% chmod -v 700 /home/sambasan
```

## Sambaの設定

* `/etc/samba/smb.conf`を編集する
* セクション名が共有リソース名となる
* ただし[global]、[homes]、[printers]は特殊セクション

**[参考] [smb.conf](http://www.samba.gr.jp/project/translation/3.5/htmldocs/manpages-3/smb.conf.5.html)**

コメントも参考に適宜設定し、`testsparm`で設定内容を確認する。
以下はプリンタを無効にして、接続先をループバックアドレスのみにしてみた場合。

```zsh
% testparm
[global]
        workgroup = MYGROUP
        server string = Samba Server Version %v
        log file = /var/log/samba/log.%m
        max log size = 50
        idmap config * : backend = tdb
        cups options = raw
        load printers = No        
        disable spoolss = Yes
        hosts allow = 127.0.0.1
        hosts deny = all

[homes]
        comment = Home Directories
        read only = No
        browseable = No
```

## デーモン起動

### smbd

こちらだけ起動すればファイル共有は可能。

```zsh
% /etc/rc.d/init.d/smb start
```

### nmbd

NetBIOSによる名前解決を利用したい場合はこちらも。（今回は不要）

```zsh
% /etc/rc.d/init.d/nmb start
```

### 起動時にサービス開始させる

```zsh
% chkconfig smb on　
% chkconfig nmb on
# 確認
% chkconfig

# 445がLISTENされている
% netstat -anpt | grep 445
tcp        0      0 0.0.0.0:445    0.0.0.0:*   LISTEN 1603/smbd
tcp        0      0 :::445         :::*        LISTEN 1603/smbd
```

ちなみに`0.0.0.0`と`::`は、IPv4とIPv6の違い。

## ファイアウォールの設定

Windows7から繋ぐだけなら445だけ開けておけば良い。

No     | ポート | プロトコル  | デーモン    | 通信目的                  | 
:----: | :----- | :-----      | :-----------| :-------                  | 
1      | 137    | UDP         | nmdb        | NetBIOS Name Service              | 
2      | 138    | UDP         | nmdb        | NetBIOS Datagram          | 
3      | 139    | TCP         | smbd        | NetBIOS Session | 
4      | 445    | TCP         | smbd        | SMB over TCP | 

ただし今回はssh経由でしか利用しないため、以下条件を満たしていれば特に設定は不要。

* sshサービスは公開されている
* ループバックアドレスからの送受信が許可されている

## SELinuxの設定

SELinuxが有効になっている場合は、`/etc/samba/smb.conf`にも書かれているように設定が必要。

```/etc/samba/smb.conf
# If you want to share home directories via samba pl
# setsebool -P samba_enable_home_dirs on
```

これを受けて

```zsh
# コメントの指示通り設定
% setsebool -P samba_enable_home_dirs 1 
# 設定内容を確認(onになっていればＯＫ）
% getsebool samba_enable_home_dirs
samba_enable_home_dirs --> on 
```

正直なところこの設定に気づかなかったが、SELinuxを無効にすると接続できたので後になってこいつが原因だと判明。

```zsh
% setenforce 1
# => この状態だと接続できない
% setenforce 0
# => この状態だと接続できたのでSELinuxが原因だと判明
```

# Windows7側のセットアップ

こちらの記載通りに設定させてもらった。

**[参考] [CIFS-over-SSH for Windows Vista](http://www.nikhef.nl/~janjust/CifsOverSSH/VistaLoopback.html)**

簡単に手順だけだけ並べるが上記サイトを見たほうがわかりやすい。

```zsh
# ループバックアダプタ追加
> hdwwiz.exe
# 画面にてアダプタのIPを10.255.255.1(任意)に設定

# システムに占有された445ポートを奪う
# サービス起動を「手動」に変更
> sc config smb start= demand
# portproxy を設定
> netsh interface portproxy add v4tov4 listenaddress=10.255.255.1 listenport=445 connectaddress=10.255.255.1 connectport=44445
# 設定内容を確認
> netsh interface portproxy show v4tov4
Address         Port        Address         Port
--------------- ----------  --------------- -------
10.255.255.1    445         10.255.255.1    44445

# smbサービスをタスク起動させる
> Taskschd.msc
# タスクスケジューラにてログオン時にサービス起動するようにタスク作成

# OS再起動

# smbサービスが起動していることを確認
> sc query smb
# 445ポートが占有されていないことを確認
> netstat -an | grep 445
  TCP    10.255.255.1:445       0.0.0.0:0              LISTENING
  TCP    10.255.255.1:44445     0.0.0.0:0              LISTENING
```

ちなみにこの手順通り設定せず、システムに445ポートを握られている状態では、ポート転送時で以下のエラーが発生する。

```dos
bind: Not owner
channel_setup_fwd_listener: cannot listen to port: 445
```

なおPuTTYではなくOpneSSHを利用する場合のポート転送のconfigは以下のようにすればOK。

```.ssh/config
Host remote
  Hostname     <Sambaサーバのアドレス>
  Port         <sshのポート>
  User         hoge
  IdentityFile ~/.ssh/id_rsa
  LocalForward 10.255.255.1:44445 127.0.0.1:445
```

## 接続

あとはエクスプローラなどで`¥¥10.255.255.1`へ接続すると、ユーザ認証画面が開いて接続可能となる。
ssh接続が切れると当然ファイル共有も切断される。

# Mac

Windows同様にループバックアダプタを作成して接続する。
以下で可能だがこの設定は一時的なもの。

```zsh
$ sudo ifconfig lo0 inet 10.255.255.1 netmask 255.255.255.255 alias
```

## launchdにより起動時実行

起動時に自動的に設定されるようにする。
以下のような`my.lo-alias.plist`を作成して、`/Library/LaunchDaemons`に放り込む。
権限の問題があるので、既存のplistをコピーして作成するのが確実。

```/Library/LaunchDaemons/my.lo-alias.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>my.lo-alias</string>
	<key>ProgramArguments</key>
	<array>
		<string>/sbin/ifconfig</string>
		<string>lo0</string>
		<string>inet</string>
		<string>10.255.255.1</string>
		<string>netmask</string>
		<string>255.255.255.255</string>
		<string>alias</string>
	</array>
	<key>OnDemand</key>
	<false/>
	<key>RunAtLoad</key>
	<true/>
</dict>
</plist>
```

`launchctl`コマンドを利用して登録する。

```zsh
$ sudo launchctl load /Library/LaunchDaemons/my.lo-alias.plist
# 確認
$ launchctl list | grep lo-alias
```

## 接続

Finderから`smb://10.255.255.1:44445`へ接続する。
Windowsとは異なり接続時にポート番号も指定してやる。

# 接続状況の確認

## 現在のSambaへの接続を表示

```zsh
% smbstatus
```

## 接続履歴の表示

あらかじめutmpに情報追加するように記述すると

```/etc/samba/smb.conf
[global]
  utmp = yes
```

接続履歴が確認できる。

```zsh
% last | grep smb
```

# パフォーマンス

アップロードがもう少し速くならないかといろいろ関連する項目をいじるも、
私の環境ではいずれも特に効果は出ないとの結論に達して、深入りせずに終わり。

* max protocol
* strict allocate
* read raw
* write raw
* socket options
* use sendfile
* aio read size
* aio write size