昨日・今日といろいろ調べながら作業をしたけど、何が悪いのかわからない。もう Docker を使うのは諦めて、Ubuntu に直接 Samba サーバをインストールすることにしようと思うが、記録だけ残しておく。あ、「外部」ってのはローカルネットワーク上の別の PC のこと。
環境
ホストはこの間インストールした Ubuntu Server 22.04 だ。マシン自体は古いけど、いま Samba サーバになってるマシン(これは CentOS 7)はもっと古いので、これを置きかえるつもり。
- Ubuntu Server 22.04 LTS
- Docker version 20.10.14, build a224086349
- docker-compose version 1.29.2, build unknown
- dperson/samba (Samba の Docker イメージ)
Docker と docker-compose は Ubuntu のインストール時に一緒にインストールしたもの。Samba には公式の Docker イメージがないらしく、ググるとこの dperson/samba がよく使われてるようなのでこれにした。
Samba サーバをたてる
あちこちのページを参考にして、docker-compose.yml ファイルはこうした。
version: "3" services: samba: image: dperson/samba container_name: samba restart: always ports: - "137:137" - "138:138" - "139:139" - "445:445" volumes: - "/mnt/data/samba:/mnt/public" command: [ "-r", "-S", "-w", "PANICBLANKET", "-s", "public;/mnt/public;yes;no;yes;all" ]
これで Docker コンテナを起動してやる。
takatoh@wplj:~$ docker-compose up -d Creating network "takatoh_default" with the default driver Creating samba ... done takatoh@wplj:~$ docker-compose ps Name Command State Ports -------------------------------------------------------------------------------- samba /sbin/tini -- /usr/bin/sam Up (healthy) 0.0.0.0:137->137/tcp,:::137 ... ->137/tcp, 137/udp, 0.0.0.0 :138->138/tcp,:::138->138/t cp, 138/udp, 0.0.0.0:139->1 39/tcp,:::139->139/tcp, 0.0 .0.0:445->445/tcp,:::445->4 45/tcp
次に、外部から接続できるようにホスト側のファイアウォールを設定する。Samba に関連するポートは、137、138、139、445 だ。ufw
コマンドで接続を許可する。
akatoh@wplj:~$ sudo ufw allow 137 Rule added Rule added (v6) takatoh@wplj:~$ sudo ufw allow 138 Rule added Rule added (v6) takatoh@wplj:~$ sudo ufw allow 139 Rule added Rule added (v6) takatoh@wplj:~$ sudo ufw allow 445 Rule added Rule added (v6)
そして、ファイアウォールを有効化。
takatoh@wplj:~$ sudo ufw enable Command may disrupt existing ssh connections. Proceed with operation (y|n)? y Firewall is active and enabled on system startup
次のような状態になった。
akatoh@wplj:~$ sudo ufw status Status: active To Action From -- ------ ---- 22/tcp ALLOW Anywhere 137 ALLOW Anywhere 138 ALLOW Anywhere 139 ALLOW Anywhere 445 ALLOW Anywhere 22/tcp (v6) ALLOW Anywhere (v6) 137 (v6) ALLOW Anywhere (v6) 138 (v6) ALLOW Anywhere (v6) 139 (v6) ALLOW Anywhere (v6) 445 (v6) ALLOW Anywhere (v6)
これで完了(のはず)。
Windows から接続テスト
Samba サーバは出来上がったはずなので、Windows マシンから接続できるかテストしてみたところ、つながらない。共有フォルダどころか、コンピュータ(ホスト名は wplj)さえも見つからないと言われる。困った。
ネットワークの確認
Samba サーバをたてた wplj とは別の Ubuntu マシン(ホスト名は apostrophe)から、ネットワーク越しに接続できるのかを確認してみた。
まずは ping
。
takatoh@apostrophe:~$ ping wplj PING wplj (192.168.2.12) 56(84) バイトのデータ 64 バイト応答 送信元 wplj (192.168.2.12): icmp_seq=1 ttl=64 時間=0.619ミリ秒 64 バイト応答 送信元 wplj (192.168.2.12): icmp_seq=2 ttl=64 時間=0.538ミリ秒 64 バイト応答 送信元 wplj (192.168.2.12): icmp_seq=3 ttl=64 時間=1.15ミリ秒 64 バイト応答 送信元 wplj (192.168.2.12): icmp_seq=4 ttl=64 時間=0.694ミリ秒 ^C --- wplj ping 統計 --- 送信パケット数 4, 受信パケット数 4, パケット損失 0%, 時間 3057ミリ秒 rtt 最小/平均/最大/mdev = 0.538/0.750/1.150/0.237ミリ秒
OK。そりゃそうだ、SSH で接続できてんだから。
なら、ポートが使えるかどうかを確認する nc
コマンド。繋がるのがわかっている 22 番ポート(SSH)で試してみるとこうなる。
takatoh@apostrophe:~$ nc -vz wplj 22 Connection to wplj 22 port [tcp/ssh] succeeded!
では、Samba の使っている(はず)のポートではどうか。
akatoh@apostrophe:~$ nc -vz -u wplj 137 takatoh@apostrophe:~$ nc -vz -u wplj 138 takatoh@apostrophe:~$ nc -vz wplj 139 nc: connect to wplj port 139 (tcp) failed: Connection refused takatoh@apostrophe:~$ nc -vz wplj 445 nc: connect to wplj port 445 (tcp) failed: Connection refused
137 番と 138 番で -u
オプションを指定してるのは udp だから。何も出力されてないのは、接続できないからだ。tcp をつかう 139 番と 445 番は「失敗した」と明快に出力されてる。
一方のサーバ(wplj)側ではどうだろう。ss
コマンドを使う。
takatoh@wplj:~$ ss -natu Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* udp UNCONN 0 0 192.168.2.12%enp1s0:68 0.0.0.0:* udp UNCONN 0 0 [fe80::cad3:ffff:fe9d:2f5f]%enp1s0:546 [::]:* tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* tcp ESTAB 0 0 192.168.2.12:22 192.168.2.14:58570 tcp LISTEN 0 128 [::]:22 [::]:*
Status の UNCONN
と LISTEN
はそれぞれ udp、tcp の待受状態を表す。一つだけある ESTAB
はつながっていることを表していて、これは SSH(22番ポート)だ。見事に Samba 関連のポートがない。
[追記]
いまためしたら、Samba のコンテナが起動してなかった。起動した上で ss コマンドを試すとこうなった。
takatoh@wplj:~$ ss -natu Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* udp UNCONN 0 0 192.168.2.12%enp1s0:68 0.0.0.0:* udp UNCONN 0 0 [fe80::cad3:ffff:fe9d:2f5f]%enp1s0:546 [::]:* tcp LISTEN 0 4096 0.0.0.0:137 0.0.0.0:* tcp LISTEN 0 4096 0.0.0.0:138 0.0.0.0:* tcp LISTEN 0 4096 0.0.0.0:139 0.0.0.0:* tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* tcp LISTEN 0 4096 0.0.0.0:445 0.0.0.0:* tcp ESTAB 0 0 192.168.2.12:22 192.168.2.14:58570 tcp LISTEN 0 4096 [::]:137 [::]:* tcp LISTEN 0 4096 [::]:138 [::]:* tcp LISTEN 0 4096 [::]:139 [::]:* tcp LISTEN 0 128 [::]:22 [::]:* tcp LISTEN 0 4096 [::]:445 [::]:*
Samba 関連のポートを待受けるようになった。けど、やっぱり他のコンピュータからはつながらない。
takatoh@apostrophe:~$ nc -u -vz wplj 137 takatoh@apostrophe:~$ nc -u -vz wplj 138 takatoh@apostrophe:~$ nc -vz wplj 139 nc: connect to wplj port 139 (tcp) failed: Connection timed out takatoh@apostrophe:~$ nc -vz wplj 445 nc: connect to wplj port 445 (tcp) failed: Connection timed out
[追記ここまで]
まとめ
というわけで、どうやら Docker でたてた Samba のせいじゃなく、コンピュータ間で通信できてないように見える。SSH は問題なくつながってるのに何が違うんだ?