VPN クライアントはファイルサーバーに ping を通し、名前も解決できるのに、共有を開けません。Samba のホストポリシーは、その接続を拒否しうる四つの層のひとつであり、人が最後に編集する層でもあります。許可リストは、smbd が実際に受け取る送信元アドレスに対して評価され、そのアドレスはクライアントが自分にあると思っているアドレスとは限りません。この送信元を正しく特定できれば、曖昧な権限問題は一行の設定変更になります。

同じメッセージで失敗する四つの層

拒否は、ルート、ホストのファイアウォール、Samba のホストポリシー、SMB の ID のいずれかから来ます。どの層もクライアントにはほぼ同じ内容のメッセージを返すため、当て推量で半日が消えます。確認をネットワークから内側へと並べれば、当て推量の大半は不要になります。

まず転送から始め、ポート 445 がサーバーに届かなければ Samba の設定は意味を持たず、サーバーのインターフェースでのキャプチャが数秒で決着をつけます。次に、サーバー自身のホストファイアウォールがあり、許可された送信元でも smbd が見る前に落とすことがあります。この二つを通過して初めて、許可リストが候補になります。認証は最後です。ログイン失敗とホスト拒否は、クライアント側ではどちらもアクセス拒否と表示されても、サーバーログでは別物に見えるからです。順序は道具よりも重要で、どの層にもそれを答え合わせするコマンドがあります。

smbd が実際に見る送信元アドレスを見つける

ルーティング経由のアクセスでは、サーバーは通常 VPN プールのクライアントアドレスを見ます。ゲートウェイで送信元変換があると、代わりにゲートウェイの LAN アドレスを見るため、そのゲートウェイの背後にあるクライアントは区別できなくなります。

この違いが、許可リストの項目がポリシーなのか穴なのかを決めます。変換されたゲートウェイアドレスを許可すると、その背後の全員を受け入れることになり、クライアント単位のルールが意図することはほとんどありません。送信元はクライアントの思い込みではなく、サーバー側で読み取ります。サーバーのインターフェースでのキャプチャが最も安価な確認方法で、同じキャプチャがパケットが届いたかどうかも証明します。キャプチャはパケット数で制限し、追跡するクライアントが分かったらホストフィルタを追加します。Samba のセッションテーブルは答えのもう半分で、smbstatus -b の出力では各セッション行のクライアント列が smbd が記録した相手であり、サービスに実際に到達したアドレスの最速の確認になります。

sudo tcpdump -ni any -c 20 'tcp port 445'
sudo smbstatus -b
ss -tnp | grep ':445'

許可リストを Samba が読むとおりに読む

hosts allow 設定はアドレス、ネットワーク、名前のリストを取り、グローバルにも共有の中にも置けます。あなたにとって同等に見える二つの項目が、パーサーにとって同等とは限らないため、調べるべきは実効設定です。つまり、たまたま編集したファイルではなく、統合された表示です。

説明的な二つのプレフィックスの組は下の行のようになり、これは例であって既存の項目の置き換えではありません。現在正当に接続している管理用とアプリケーション用のクライアントは残し、拒否リストがあるなら同じ手順で読みます。ホストが受け入れられるかはポリシー全体で決まるため、優先順位を論じるのではなく、そのクライアントで試します。ホストの許可は、共有の権限やファイルシステムのモードという別の関門については何も語りません。テストツールの成功は、ホストポリシーがその送信元を許可したという意味だけで、それ以上ではありません。

hosts allow = 192.168.50.0/24 10.90.0.0/24
testparm -s
testparm -s /etc/samba/smb.conf client.example 10.90.0.14

再起動後も残るファイルを変更する

通常の Linux ホストでは設定パスは固定で再起動時にサービスが読み直しますが、ルーターやアプライアンスでは実行中の smb.conf が起動時に生成されることが多く、手作業の編集は次の再起動で消えます。アプライアンスがサポートするカスタマイズ手段を使います。多くの場合、独自の設定ファイルです。

この段階での誘惑は、あるスレッドがうまくいったと報告したからといって代替ファームウェアを書き込むことです。小さなポリシー問題に対して大きな変更であり、機器をサポート対象外の状態に移します。まず、ほとんどのアプライアンスが独自の画面で許可リストを公開しているので、サポートされた制御を特定します。本当にそれがなければ、その制限は別のハードウェアを選ぶ理由であり、非サポートのビルドを選ぶ理由ではありません。

どのファイルを変更したか、何がそれを再生成するかを記録し、次の人が同じ診断を繰り返さないようにします。

許可するクライアントと除外するクライアントを一台ずつ試す

望んだ結果だけでなく、両方の結果を試します。接続できる許可クライアントは変更が機能することを示し、拒否され続ける除外クライアントはルールが単に全部を開けたわけではないことを示します。

smbclient -L //fileserver -U alice
sudo testparm -s /etc/samba/smb.conf alice-laptop 10.90.0.14
sudo tail -n 40 /var/log/samba/log.smbd

接続が smbd に届かない場合、答えはルーティングかサーバーのファイアウォールにあります。ホストが許可されていてログインが失敗するなら、問題は ID であり、許可リストをさらに広げても役に立ちません。詳細な Samba ログは共有パスやアカウント名を露出することがあるため、診断出力は非公開にしてください。そうしないと次の結果から何も分からないため、試行ごとに一層だけ変えてください。

関連記事