Вопрос или проблема
У меня есть небольшая плата на aarch64 с embedded Linux, работающая под управлением ядра 5.15, и машина под управлением Windows 11. У меня нет возможности устанавливать samba
нативно на этом устройстве. Однако у меня есть движок Docker и возможность загружать и запускать контейнеры.
Я хочу открыть каталог samba
с Linux-машины для моей локально подключенной машины с Windows 11.
Я нашел образ контейнера на Docker Hub: https://hub.docker.com/r/crazymax/samba.
Согласно документации, я настроил файл конфигурации следующим образом:
cat config.yml
auth:
- user: foo
group: foo
uid: 1000
gid: 1000
password: bar
global:
- "force user = foo"
- "force group = foo"
sambashare:
- name: foo
path: /samba/foo
browsable: yes
readonly: no
guestok: no
validusers: foo
writelist: foo
veto: no
hidefiles: /_*/
recycle: yes
Я убедился, что необходимые порты открыты, и запустил контейнер с помощью следующих команд:
iptables -A INPUT -m state --state NEW -p udp --dport 137 -j ACCEPT
iptables -A INPUT -m state --state NEW -p udp --dport 138 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 445 -j ACCEPT
docker run -d --network host --privileged -v "/data/data:/data" --name samba crazymax/samba
Логи Docker выглядят следующим образом:
docker logs -f samba
[s6-init] making user provided files available at /var/run/s6/etc...exited 0.
[s6-init] ensuring user provided files have correct perms...exited 0.
[fix-attrs.d] applying ownership & permissions fixes...
[fix-attrs.d] done.
[cont-init.d] executing container initialization scripts...
[cont-init.d] 01-config.sh: executing...
Setting timezone to UTC
Initializing files and folders
Setting global configuration
Creating user foo/foo (1000:1000)
Add global option: force user = foo
Add global option: force group = foo
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Weak crypto is allowed by GnuTLS (e.g. NTLM as a compatibility fallback)
WARNING: The 'netbios name' is too long (max. 15 chars).
# Global parameters
[global]
Server role: ROLE_STANDALONE
disable netbios = Yes
disable spoolss = Yes
dns proxy = No
local master = No
map to guest = Bad User
pam password change = Yes
printcap name = /dev/null
security = USER
server role = standalone server
server services = s3fs, rpc, wrepl, ldap, cldap, kdc, drepl, winbindd, ntp_signd, kcc, dnsupdate
server string = Docker Samba Server
smb1 unix extensions = No
smb ports = 445
usershare allow guests = Yes
winbind scan trusted domains = Yes
fruit:time machine = yes
fruit:delete_empty_adfiles = yes
fruit:wipe_intentionally_left_blank_rfork = yes
fruit:veto_appledouble = no
fruit:posix_rename = yes
fruit:model = MacSamba
fruit:metadata = stream
idmap config * : backend = tdb
create mask = 0664
directory mask = 0775
force create mode = 0664
force directory mode = 0775
force group = foo
force user = foo
hosts allow = 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
hosts deny = 0.0.0.0/0
printing = bsd
strict locking = No
vfs objects = fruit streams_xattr
wide links = Yes
[cont-init.d] 01-config.sh: exited 0.
[cont-init.d] 02-svc-smbd.sh: executing...
[cont-init.d] 02-svc-smbd.sh: exited 0.
[cont-init.d] 03-svc-wsdd2.sh: executing...
[cont-init.d] 03-svc-wsdd2.sh: exited 0.
[cont-init.d] ~-socklog: executing...
[cont-init.d] ~-socklog: exited 0.
[cont-init.d] done.
[services.d] starting services
[services.d] done.
smbd version 4.19.6 started.
Copyright Andrew Tridgell and the Samba Team 1992-2023
Denied connection from 172.1.17.3 (172.1.17.3)
Denied connection from 172.1.17.3 (172.1.17.3)
Denied connection from 172.1.17.3 (172.1.17.3)
Denied connection from 172.1.17.3 (172.1.17.3)
Затем я установил Ubuntu на Windows 11 WSL. Я убедился, что установил необходимые пакеты cifs
/samba
и убедился, что могу успешно пинговать Linux-машину (расположенную по адресу 172.1.17.1).
Ошибка возникает, когда я пытаюсь смонтировать общий ресурс samba
с Linux из Windows WSL. Я вижу в логах Docker, что он видит входящее соединение, но ‘отказывает’ в нем (обратите внимание на это сообщение выше: Denied connection from 172.1.17.3).
Я не могу понять, как правильно смонтировать, или почему соединение отклонено. Ниже приведены некоторые команды, которые я пробовал. Что я могу сделать, чтобы это монтирование работало?
sudo mount -t cifs -o rw,vers=3.0 //172.1.17.1/sambashare /media/share
sudo mount -t cifs -o rw,vers=1.0 //172.1.17.1/sambashare /media/share
sudo mount -t cifs //172.1.17.1/sambashare /media/share
sudo mount -t cifs guest //172.1.17.1/sambashare /media/share
sudo mount.cifs --options guest //172.1.17.1/sambashare /media/share/
sudo mount.cifs --options user=foo,pass=foo //172.1.17.1/sambashare /media/share/
sudo mount.cifs --options vers=1.0,user=foo,pass=foo //172.1.17.1/sambashare /media/share/
Это монтирование также будет неудачным, если я попытаюсь использовать саму Windows для монтирования диска:
Ваши логи говорят:
hosts allow = 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
Denied connection from 172.1.17.3 (172.1.17.3)
То есть, Docker-контейнер предварительно настраивает Samba так, чтобы разрешать подключения только от ‘приватных’ IP-адресов, и адрес вашего клиента 172.1.17.3 не находится в ни одном из этих диапазонов.
На самом деле это публичный адрес, принадлежащий AT&T и назначенный кому-то в Техасе, США, так что, если вы не этот человек, вам не следует использовать такие адреса для вашей локальной сети. (Если вы являетесь этим человеком, вы можете изменить опцию hosts allow =
в smb.conf.)
Для справки, диапазон 172.16.0.0/12 начинается с 172.16.0.0 и заканчивается на 172.31.255.255.
Ответ или решение
Для решения проблемы с подключением к Samba-серверу из Windows 11, вам необходимо изменить конфигурацию вашего Docker-контейнера Samba, чтобы он мог принимать подключения от клиента с IP-адресом 172.1.17.3. Ошибка "Denied connection" в логах Samba указывает на то, что адрес клиента не попадает в список разрешённых адресов.
-
Измените настройку
hosts allow
:В вашем конфигурационном файле
config.yml
, который вы передаёте в контейнер, вам нужно добавить IP-адрес клиента (или изменить диапазон IP-адресов, чтобы он его включал):global: - "force user = foo" - "force group = foo" - "hosts allow = 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 172.1.17.3"
Либо вы можете добавить разрешение для целого диапазона, если это необходимо:
global: - "hosts allow = 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 172.1.17.0/24"
Имейте в виду, что указанная вами сеть (172.1.17.0/24) может представлять собой область, используемую вашим провайдером. Возможность работы с такими адресами в частных сетях должна быть проверена.
-
Перезапустите контейнер:
После внесения изменений вам нужно перезапустить контейнер Samba, чтобы изменения вступили в силу:
docker restart samba
-
Проверьте, может ли клиент подключиться:
После перезапуска контейнера попробуйте снова подключиться к Samba-шару с Windows 11 или WSL (Windows Subsystem for Linux). Используйте команду
mount
или соответствующие команды из Windows для подключения. -
Дополнительные рекомендации:
- Убедитесь, что ваш клиент действительно имеет доступ к сети и что на нём нет блокировок (например, брандмауэра Windows), которые могут помешать подключению.
- Проверьте, что заданные учетные данные (пользователь и пароль) совпадают с теми, которые были указаны в конфигурационном файле для Samba.
- Если проблема не решалась добавлением IP-адреса, проверьте наличие других ограничений, которые могли бы быть установлены в конфигурации Samba.
С учётом этих шагов и изменений в конфигурации должна решиться проблема с подключением к Samba-серверу из вашей сети. Если у вас возникнут дальнейшие вопросы или проблемы, не стесняйтесь задавать их.