feat: config Samba + mDNS para Termux Android
- smb.conf: SMB2/SMB3, cifrado, signing, 6 shares, puerto 4450 - mdns-publish.py: publica SSH + SMB via Zeroconf (movil.local) - README.md: documentacion completa de uso y troubleshooting - Compatible con Windows 11, Kubuntu 24 y macOS Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
commit
efc0e2f47f
|
|
@ -0,0 +1,229 @@
|
||||||
|
# Samba en Termux - Documentacion
|
||||||
|
|
||||||
|
> Actualizado: 2026-03-24
|
||||||
|
|
||||||
|
## Resumen
|
||||||
|
|
||||||
|
Samba 4.20.8 corriendo en Termux (Android) con descubrimiento automatico en red local via mDNS. Compatible con Windows 11, Kubuntu 24 y macOS.
|
||||||
|
|
||||||
|
- **Nombre en red:** MOVIL
|
||||||
|
- **Puerto:** 4450 (445 requiere root, no disponible en Termux)
|
||||||
|
- **Protocolo:** SMB2/SMB3 con cifrado y signing
|
||||||
|
- **Usuario:** andres
|
||||||
|
- **Autostart:** Via `.bashrc` al abrir Termux
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Archivos de configuracion
|
||||||
|
|
||||||
|
| Archivo | Proposito |
|
||||||
|
|---------|-----------|
|
||||||
|
| `~/.config/samba/smb.conf` | Config principal de Samba |
|
||||||
|
| `~/.config/samba/private/` | Base de datos de usuarios (tdbsam) |
|
||||||
|
| `~/.config/samba/samba.log` | Log de actividad |
|
||||||
|
| `~/.config/samba/lock/` | Lock files para browsing |
|
||||||
|
| `~/.config/samba/state/` | Estado interno |
|
||||||
|
| `~/.config/samba/cache/` | Cache |
|
||||||
|
| `~/.local/bin/mdns-publish.py` | Script que publica SSH + SMB via mDNS |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Shares disponibles
|
||||||
|
|
||||||
|
| Share | Ruta Android | Contenido |
|
||||||
|
|-------|-------------|-----------|
|
||||||
|
| Archivos | `/storage/emulated/0/Archivos` | Desarrollo, documentos de trabajo |
|
||||||
|
| Home | `$HOME` | Home de Termux (configs, scripts) |
|
||||||
|
| Downloads | `/storage/emulated/0/Download` | Descargas del navegador/apps |
|
||||||
|
| Documents | `/storage/emulated/0/Documents` | Documentos Android |
|
||||||
|
| DCIM | `/storage/emulated/0/DCIM` | Fotos y videos de camara |
|
||||||
|
| Movies | `/storage/emulated/0/Movies` | Peliculas |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Conexion desde otros equipos
|
||||||
|
|
||||||
|
### Kubuntu 24 / KDE Dolphin
|
||||||
|
|
||||||
|
El dispositivo aparece automaticamente en **Red** del panel lateral como **"movil"** gracias al servicio mDNS `_smb._tcp`.
|
||||||
|
|
||||||
|
Tambien se puede acceder manualmente:
|
||||||
|
|
||||||
|
```
|
||||||
|
smb://movil.local:4450/
|
||||||
|
smb://movil.local:4450/Archivos
|
||||||
|
```
|
||||||
|
|
||||||
|
Credenciales: `andres` / `asde71.4`
|
||||||
|
|
||||||
|
### Kubuntu 24 / Terminal
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Descubrir el servicio
|
||||||
|
avahi-browse -rt _smb._tcp
|
||||||
|
|
||||||
|
# Listar shares
|
||||||
|
smbclient -L movil.local -p 4450 -U andres
|
||||||
|
|
||||||
|
# Acceder a un share
|
||||||
|
smbclient //movil.local/Archivos -p 4450 -U andres
|
||||||
|
|
||||||
|
# Montar como filesystem
|
||||||
|
sudo mount -t cifs //movil.local/Archivos /mnt/movil \
|
||||||
|
-o port=4450,username=andres,password=asde71.4,vers=3.0
|
||||||
|
```
|
||||||
|
|
||||||
|
### Windows 11
|
||||||
|
|
||||||
|
Windows no soporta puertos SMB alternativos de forma nativa. Opciones:
|
||||||
|
|
||||||
|
**Opcion A - Mapear con netsh (requiere admin):**
|
||||||
|
```cmd
|
||||||
|
netsh interface portproxy add v4tov4 listenport=445 listenaddress=127.0.0.1 connectport=4450 connectaddress=192.168.1.108
|
||||||
|
net use Z: \\127.0.0.1\Archivos /user:andres asde71.4
|
||||||
|
```
|
||||||
|
|
||||||
|
**Opcion B - Usar la IP directa desde Explorador:**
|
||||||
|
```
|
||||||
|
\\192.168.1.108:4450\Archivos
|
||||||
|
```
|
||||||
|
(Nota: no todos los builds de Win11 soportan esta sintaxis)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Descubrimiento en red (mDNS / DNS-SD)
|
||||||
|
|
||||||
|
### Como funciona
|
||||||
|
|
||||||
|
El script `~/.local/bin/mdns-publish.py` publica dos servicios via Zeroconf (mDNS):
|
||||||
|
|
||||||
|
| Servicio | Tipo DNS-SD | Puerto | Proposito |
|
||||||
|
|----------|------------|--------|-----------|
|
||||||
|
| SSH | `_ssh._tcp.local.` | 8022 | Acceso remoto por SSH |
|
||||||
|
| Samba | `_smb._tcp.local.` | 4450 | Compartir archivos SMB |
|
||||||
|
|
||||||
|
Ambos se publican bajo el hostname **movil.local**.
|
||||||
|
|
||||||
|
### Script: mdns-publish.py
|
||||||
|
|
||||||
|
**Ubicacion:** `~/.local/bin/mdns-publish.py`
|
||||||
|
**Dependencia:** `pip install zeroconf`
|
||||||
|
**Autostart:** Via `.bashrc` (lineas 34-37)
|
||||||
|
|
||||||
|
El script:
|
||||||
|
1. Detecta la IP local del dispositivo
|
||||||
|
2. Registra los servicios SSH y SMB en la red multicast mDNS
|
||||||
|
3. Se mantiene corriendo en background (daemon)
|
||||||
|
4. Limpia los registros al recibir SIGINT/SIGTERM
|
||||||
|
|
||||||
|
### Verificar que esta publicando
|
||||||
|
|
||||||
|
Desde Termux:
|
||||||
|
```bash
|
||||||
|
python3 -c "
|
||||||
|
from zeroconf import Zeroconf, ServiceBrowser
|
||||||
|
import time
|
||||||
|
class L:
|
||||||
|
def add_service(self, zc, t, n):
|
||||||
|
info = zc.get_service_info(t, n)
|
||||||
|
if info:
|
||||||
|
a = '.'.join(str(b) for b in info.addresses[0])
|
||||||
|
print(f'{n} -> {a}:{info.port}')
|
||||||
|
def remove_service(self, *a): pass
|
||||||
|
def update_service(self, *a): pass
|
||||||
|
zc = Zeroconf()
|
||||||
|
ServiceBrowser(zc, '_smb._tcp.local.', L())
|
||||||
|
ServiceBrowser(zc, '_ssh._tcp.local.', L())
|
||||||
|
time.sleep(3)
|
||||||
|
zc.close()
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
Desde Kubuntu:
|
||||||
|
```bash
|
||||||
|
avahi-browse -rt _smb._tcp
|
||||||
|
```
|
||||||
|
|
||||||
|
Resultado esperado:
|
||||||
|
```
|
||||||
|
movil → movil.local → 192.168.1.x:4450
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Autostart en .bashrc
|
||||||
|
|
||||||
|
Samba y mDNS se inician automaticamente al abrir Termux. Extracto relevante de `~/.bashrc`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Iniciar Samba si no esta corriendo
|
||||||
|
if ! pgrep -x smbd > /dev/null; then
|
||||||
|
smbd -D -s ~/.config/samba/smb.conf 2>/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Iniciar mDNS (movil.local) si no esta corriendo
|
||||||
|
if ! pgrep -f mdns-publish.py > /dev/null; then
|
||||||
|
nohup python ~/.local/bin/mdns-publish.py > /dev/null 2>&1 &
|
||||||
|
disown
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
No se usa Termux:Boot (no funciona). Se inicia al abrir la primera sesion de Termux.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Aliases de gestion
|
||||||
|
|
||||||
|
| Alias | Accion |
|
||||||
|
|-------|--------|
|
||||||
|
| `smb-start` | Iniciar Samba |
|
||||||
|
| `smb-stop` | Detener Samba |
|
||||||
|
| `smb-restart` | Reiniciar Samba |
|
||||||
|
| `smb-status` | Ver si esta corriendo |
|
||||||
|
| `smb-log` | Ver ultimas 50 lineas del log |
|
||||||
|
| `mdns-status` | Ver si mDNS esta corriendo |
|
||||||
|
| `mdns-restart` | Reiniciar mDNS |
|
||||||
|
| `mdns-stop` | Detener mDNS |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Parametros de compatibilidad
|
||||||
|
|
||||||
|
| Parametro | Valor | Motivo |
|
||||||
|
|-----------|-------|--------|
|
||||||
|
| `server min protocol` | SMB2 | Win11 y Kubuntu 24 ya no usan SMB1 |
|
||||||
|
| `server max protocol` | SMB3 | Maximo rendimiento y cifrado |
|
||||||
|
| `smb encrypt` | desired | Win11 lo prefiere, negocia automaticamente |
|
||||||
|
| `server signing` | desired | Win11 lo exige desde 2024 |
|
||||||
|
| `unix charset` | UTF-8 | Acentos en nombres de archivo |
|
||||||
|
| `dos charset` | CP850 | Compatibilidad Windows |
|
||||||
|
| `use sendfile` | yes | Rendimiento en transferencias |
|
||||||
|
| `aio read/write size` | 16384 | I/O asincrono para archivos grandes |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### "Connection refused" desde otro equipo
|
||||||
|
|
||||||
|
1. Verificar que smbd corre: `smb-status`
|
||||||
|
2. Verificar puerto: `ss -tlnp | grep 4450`
|
||||||
|
3. Verificar firewall Android: Abrir ajustes WiFi, verificar que no hay restricciones
|
||||||
|
|
||||||
|
### No aparece en Dolphin (Red)
|
||||||
|
|
||||||
|
1. Verificar mDNS: `mdns-status`
|
||||||
|
2. Desde Kubuntu: `avahi-browse -rt _smb._tcp` (debe mostrar "movil")
|
||||||
|
3. Si no aparece, reiniciar: `mdns-restart`
|
||||||
|
4. Acceso manual: `smb://movil.local:4450/` en barra de Dolphin
|
||||||
|
|
||||||
|
### "NT_STATUS_LOGON_FAILURE"
|
||||||
|
|
||||||
|
Resetear password:
|
||||||
|
```bash
|
||||||
|
printf 'asde71.4\nasde71.4\n' | smbpasswd -L -s -c ~/.config/samba/smb.conf andres
|
||||||
|
```
|
||||||
|
|
||||||
|
### Acentos se ven mal
|
||||||
|
|
||||||
|
Verificar que `unix charset = UTF-8` esta en `smb.conf` seccion `[global]`.
|
||||||
|
|
@ -0,0 +1,73 @@
|
||||||
|
#!/data/data/com.termux/files/usr/bin/python
|
||||||
|
"""Publica servicios via mDNS/Zeroconf: SSH + Samba"""
|
||||||
|
import socket
|
||||||
|
import signal
|
||||||
|
import sys
|
||||||
|
from zeroconf import ServiceInfo, Zeroconf, IPVersion
|
||||||
|
|
||||||
|
HOSTNAME = 'movil'
|
||||||
|
|
||||||
|
SERVICES = [
|
||||||
|
{
|
||||||
|
'type': '_ssh._tcp.local.',
|
||||||
|
'port': 8022,
|
||||||
|
'props': {'description': 'Termux SSH'},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'type': '_smb._tcp.local.',
|
||||||
|
'port': 4450,
|
||||||
|
'props': {'description': 'Termux Samba', 'path': '/'},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def get_local_ip():
|
||||||
|
try:
|
||||||
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
s.connect(('8.8.8.8', 80))
|
||||||
|
ip = s.getsockname()[0]
|
||||||
|
s.close()
|
||||||
|
return ip
|
||||||
|
except Exception:
|
||||||
|
return '127.0.0.1'
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
ip = get_local_ip()
|
||||||
|
addr = socket.inet_aton(ip)
|
||||||
|
zc = Zeroconf(ip_version=IPVersion.V4Only)
|
||||||
|
infos = []
|
||||||
|
|
||||||
|
for svc in SERVICES:
|
||||||
|
info = ServiceInfo(
|
||||||
|
svc['type'],
|
||||||
|
f'{HOSTNAME}.{svc["type"]}',
|
||||||
|
addresses=[addr],
|
||||||
|
port=svc['port'],
|
||||||
|
properties=svc['props'],
|
||||||
|
server=f'{HOSTNAME}.local.',
|
||||||
|
)
|
||||||
|
zc.register_service(info)
|
||||||
|
infos.append(info)
|
||||||
|
print(f'Publicando {HOSTNAME}.local {svc["type"]} -> {ip}:{svc["port"]}')
|
||||||
|
|
||||||
|
def cleanup(sig, frame):
|
||||||
|
print('Deteniendo mDNS...')
|
||||||
|
for info in infos:
|
||||||
|
zc.unregister_service(info)
|
||||||
|
zc.close()
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
signal.signal(signal.SIGINT, cleanup)
|
||||||
|
signal.signal(signal.SIGTERM, cleanup)
|
||||||
|
|
||||||
|
try:
|
||||||
|
signal.pause()
|
||||||
|
except AttributeError:
|
||||||
|
import time
|
||||||
|
while True:
|
||||||
|
time.sleep(3600)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
|
|
@ -0,0 +1,111 @@
|
||||||
|
# Samba config para Termux
|
||||||
|
# Compatible: Windows 11 + Kubuntu 24 + macOS
|
||||||
|
# Puerto: 4450 (445 requiere root)
|
||||||
|
# Windows: \\IP:4450\ o net use Z: \\IP\Archivos /user:andres
|
||||||
|
# Linux: smb://IP:4450/Archivos
|
||||||
|
|
||||||
|
[global]
|
||||||
|
workgroup = WORKGROUP
|
||||||
|
server string = Termux Mobile
|
||||||
|
netbios name = MOVIL
|
||||||
|
|
||||||
|
# Puerto alternativo (445 requiere root)
|
||||||
|
smb ports = 4450
|
||||||
|
|
||||||
|
# Seguridad
|
||||||
|
security = user
|
||||||
|
map to guest = never
|
||||||
|
passdb backend = tdbsam
|
||||||
|
|
||||||
|
# Protocolos - Max compatibilidad Win11 + Kubuntu 24
|
||||||
|
client min protocol = SMB2
|
||||||
|
server min protocol = SMB2
|
||||||
|
server max protocol = SMB3
|
||||||
|
client max protocol = SMB3
|
||||||
|
|
||||||
|
# Cifrado (Win11 lo prefiere, Kubuntu 24 lo soporta)
|
||||||
|
smb encrypt = desired
|
||||||
|
|
||||||
|
# Signing (Win11 lo exige por defecto desde 2024)
|
||||||
|
server signing = desired
|
||||||
|
client signing = desired
|
||||||
|
|
||||||
|
# Rutas Termux
|
||||||
|
private dir = /data/data/com.termux/files/home/.config/samba/private
|
||||||
|
lock directory = /data/data/com.termux/files/home/.config/samba/lock
|
||||||
|
state directory = /data/data/com.termux/files/home/.config/samba/state
|
||||||
|
cache directory = /data/data/com.termux/files/home/.config/samba/cache
|
||||||
|
pid directory = /data/data/com.termux/files/home/.config/samba
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
log file = /data/data/com.termux/files/home/.config/samba/samba.log
|
||||||
|
max log size = 500
|
||||||
|
log level = 1
|
||||||
|
|
||||||
|
# Rendimiento
|
||||||
|
socket options = TCP_NODELAY IPTOS_LOWDELAY
|
||||||
|
use sendfile = yes
|
||||||
|
aio read size = 16384
|
||||||
|
aio write size = 16384
|
||||||
|
|
||||||
|
# Charset (acentos y caracteres especiales)
|
||||||
|
unix charset = UTF-8
|
||||||
|
dos charset = CP850
|
||||||
|
|
||||||
|
# Descubrimiento de red
|
||||||
|
server multi channel support = yes
|
||||||
|
mdns name = mdns
|
||||||
|
|
||||||
|
[Archivos]
|
||||||
|
comment = Archivos de trabajo
|
||||||
|
path = /storage/emulated/0/Archivos
|
||||||
|
browseable = yes
|
||||||
|
writable = yes
|
||||||
|
valid users = andres
|
||||||
|
create mask = 0644
|
||||||
|
directory mask = 0755
|
||||||
|
|
||||||
|
[Home]
|
||||||
|
comment = Home Termux
|
||||||
|
path = /data/data/com.termux/files/home
|
||||||
|
browseable = yes
|
||||||
|
writable = yes
|
||||||
|
valid users = andres
|
||||||
|
create mask = 0644
|
||||||
|
directory mask = 0755
|
||||||
|
|
||||||
|
[Downloads]
|
||||||
|
comment = Descargas Android
|
||||||
|
path = /storage/emulated/0/Download
|
||||||
|
browseable = yes
|
||||||
|
writable = yes
|
||||||
|
valid users = andres
|
||||||
|
create mask = 0644
|
||||||
|
directory mask = 0755
|
||||||
|
|
||||||
|
[Documents]
|
||||||
|
comment = Documentos Android
|
||||||
|
path = /storage/emulated/0/Documents
|
||||||
|
browseable = yes
|
||||||
|
writable = yes
|
||||||
|
valid users = andres
|
||||||
|
create mask = 0644
|
||||||
|
directory mask = 0755
|
||||||
|
|
||||||
|
[DCIM]
|
||||||
|
comment = Fotos y Videos
|
||||||
|
path = /storage/emulated/0/DCIM
|
||||||
|
browseable = yes
|
||||||
|
writable = yes
|
||||||
|
valid users = andres
|
||||||
|
create mask = 0644
|
||||||
|
directory mask = 0755
|
||||||
|
|
||||||
|
[Movies]
|
||||||
|
comment = Peliculas
|
||||||
|
path = /storage/emulated/0/Movies
|
||||||
|
browseable = yes
|
||||||
|
writable = yes
|
||||||
|
valid users = andres
|
||||||
|
create mask = 0644
|
||||||
|
directory mask = 0755
|
||||||
Loading…
Reference in New Issue