303 lines
8.1 KiB
Markdown
303 lines
8.1 KiB
Markdown
# Termux Network Toolkit: Samba + mDNS + SSH
|
|
|
|
> Actualizado: 2026-03-25
|
|
|
|
Samba + descubrimiento mDNS + scripts de resolucion DNS para Termux (Android). Compatible con Windows 11, Kubuntu 24 y macOS.
|
|
|
|
## Instalacion rapida
|
|
|
|
```bash
|
|
git clone https://devops.ingeniumcodex.com/andresgarcia0313/termux-samba.git
|
|
cd termux-samba
|
|
bash install.sh
|
|
```
|
|
|
|
El instalador:
|
|
1. Instala `samba` y `python-zeroconf`
|
|
2. Crea directorios de config
|
|
3. Copia `smb.conf` y los 4 scripts de red a `~/.local/bin/`
|
|
4. Crea usuario Samba (pide usuario y contrasena)
|
|
5. Agrega autostart y aliases a `.bashrc`
|
|
6. Inicia Samba + mDNS
|
|
|
|
## Estructura del repo
|
|
|
|
```
|
|
termux-samba/
|
|
├── smb.conf # Config Samba (SMB3, puerto 4450)
|
|
├── install.sh # Instalador automatico
|
|
├── bashrc-snippet.sh # Autostart + aliases para .bashrc
|
|
├── .gitignore # Excluye datos runtime
|
|
└── scripts/
|
|
├── mdns-publish.py # Publica SSH + SMB via mDNS (Zeroconf)
|
|
├── mdns-resolve # Resuelve hostnames .local (multicast UDP)
|
|
├── ssh-mdns-proxy # ProxyCommand SSH: mDNS → Tailscale → cache
|
|
└── ssh-fallback # ProxyCommand SSH: Tailscale → LAN
|
|
```
|
|
|
|
---
|
|
|
|
## Samba
|
|
|
|
### Resumen
|
|
|
|
- **Nombre en red:** MOVIL
|
|
- **Puerto:** 4450 (445 requiere root, no disponible en Termux)
|
|
- **Protocolo:** SMB2/SMB3 con cifrado y signing
|
|
- **Autostart:** Via `.bashrc` al abrir Termux
|
|
|
|
### Shares
|
|
|
|
| Share | Ruta | Contenido |
|
|
|-------|------|-----------|
|
|
| Almacenamiento | `/storage/emulated/0` | Toda la memoria interna Android |
|
|
| Termux | `$HOME` | Home de Termux (configs, scripts, desarrollo) |
|
|
|
|
### Archivos en disco
|
|
|
|
| Archivo | Proposito |
|
|
|---------|-----------|
|
|
| `~/.config/samba/smb.conf` | Config principal |
|
|
| `~/.config/samba/private/` | Base de datos de usuarios (tdbsam) |
|
|
| `~/.config/samba/samba.log` | Log de actividad |
|
|
|
|
### 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 |
|
|
|
|
---
|
|
|
|
## 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`.
|
|
|
|
Acceso manual en barra de direcciones:
|
|
|
|
```
|
|
smb://movil.local:4450/
|
|
smb://movil.local:4450/Almacenamiento
|
|
```
|
|
|
|
### 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/Almacenamiento -p 4450 -U andres
|
|
|
|
# Montar como filesystem
|
|
sudo mount -t cifs //movil.local/Almacenamiento /mnt/movil \
|
|
-o port=4450,username=andres,password=PASS,vers=3.0
|
|
```
|
|
|
|
### Windows 11
|
|
|
|
Windows no soporta puertos SMB alternativos de forma nativa. Opciones:
|
|
|
|
**Opcion A - Port proxy (requiere admin):**
|
|
```cmd
|
|
netsh interface portproxy add v4tov4 listenport=445 listenaddress=127.0.0.1 connectport=4450 connectaddress=IP_MOVIL
|
|
net use Z: \\127.0.0.1\Almacenamiento /user:andres
|
|
```
|
|
|
|
**Opcion B - Desde Explorador (algunos builds):**
|
|
```
|
|
\\IP_MOVIL:4450\Almacenamiento
|
|
```
|
|
|
|
### Android (mismo dispositivo)
|
|
|
|
Instalar [SambaLite](https://play.google.com/store/apps/details?id=de.schliweb.sambalite) (open source, sin ads).
|
|
Conectar a `127.0.0.1:4450` con usuario y contrasena.
|
|
|
|
---
|
|
|
|
## Scripts de red (mDNS / DNS)
|
|
|
|
Todos se instalan en `~/.local/bin/`. Requieren `PATH="$HOME/.local/bin:$PATH"`.
|
|
|
|
### mdns-publish.py — Publicar servicios en la red
|
|
|
|
Publica el dispositivo como `movil.local` via mDNS multicast (Zeroconf).
|
|
|
|
**Servicios publicados:**
|
|
|
|
| Servicio | Tipo DNS-SD | Puerto |
|
|
|----------|------------|--------|
|
|
| SSH | `_ssh._tcp.local.` | 8022 |
|
|
| Samba | `_smb._tcp.local.` | 4450 |
|
|
|
|
**Dependencia:** `pip install zeroconf`
|
|
|
|
**Uso:** Se ejecuta como daemon en background (autostart via `.bashrc`).
|
|
|
|
**Verificar desde Kubuntu:**
|
|
```bash
|
|
avahi-browse -rt _smb._tcp
|
|
# Debe mostrar: movil → movil.local → IP:4450
|
|
```
|
|
|
|
**Verificar 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()
|
|
"
|
|
```
|
|
|
|
### mdns-resolve — Resolver hostnames .local
|
|
|
|
Resuelve hostnames `.local` via multicast UDP puro (sin Avahi, sin dependencias externas).
|
|
|
|
**Por que existe:** Termux no puede resolver `.local` nativamente (usa su propia libc, no la de Android).
|
|
|
|
**Uso:**
|
|
```bash
|
|
# Resolver un hostname
|
|
mdns-resolve lenovo-ideapad.local
|
|
# Output: 192.168.1.112
|
|
|
|
# Con timeout personalizado (segundos)
|
|
mdns-resolve hp62a.local 5
|
|
```
|
|
|
|
**Como funciona:**
|
|
1. Construye query DNS tipo A para el hostname
|
|
2. Envia al grupo multicast 224.0.0.251:5353
|
|
3. Parsea la respuesta y extrae la IP
|
|
4. Exit 0 con IP en stdout, o exit 1 si no resuelve
|
|
|
|
**Sin dependencias externas** — usa solo stdlib de Python (socket, struct, select).
|
|
|
|
### ssh-mdns-proxy — ProxyCommand SSH inteligente
|
|
|
|
ProxyCommand para `~/.ssh/config` que resuelve hostnames con fallback en cascada.
|
|
|
|
**Cadena de resolucion:**
|
|
1. mDNS (via `mdns-resolve`) — red local
|
|
2. Tailscale DNS (`*.tailb0bb74.ts.net`) — fuera de LAN
|
|
3. Cache local (`~/.ssh/mdns-cache`) — si todo falla
|
|
|
|
**Aliases soportados:**
|
|
- `dell` → `dell-latitude3400`
|
|
- `lenovo` → `lenovo-ideapad`
|
|
|
|
**Uso en `~/.ssh/config`:**
|
|
```
|
|
Host lenovo-ideapad
|
|
User andres
|
|
ProxyCommand ~/.local/bin/ssh-mdns-proxy %h %p
|
|
|
|
Host dell
|
|
User andres
|
|
ProxyCommand ~/.local/bin/ssh-mdns-proxy %h %p
|
|
|
|
Host hp62a
|
|
User andres
|
|
ProxyCommand ~/.local/bin/ssh-mdns-proxy %h %p
|
|
```
|
|
|
|
**Cache:** Guarda la ultima IP resuelta en `~/.ssh/mdns-cache` para reconexion rapida si mDNS y Tailscale fallan.
|
|
|
|
### ssh-fallback — ProxyCommand Tailscale + LAN
|
|
|
|
ProxyCommand simple con fallback de Tailscale a IP LAN.
|
|
|
|
**Cadena de resolucion:**
|
|
1. Ping al host Tailscale (1s timeout)
|
|
2. Si falla, ping a IP LAN (1s timeout)
|
|
3. Si ambos fallan, intenta Tailscale sin verificar
|
|
|
|
**Uso en `~/.ssh/config`:**
|
|
```
|
|
Host hp62a
|
|
ProxyCommand ~/.local/bin/ssh-fallback hp62a.tailb0bb74.ts.net 192.168.1.16 %p
|
|
```
|
|
|
|
**Nota:** `ssh-mdns-proxy` es mas completo (mDNS + Tailscale + cache). `ssh-fallback` es mas simple (solo Tailscale + LAN con IPs fijas).
|
|
|
|
---
|
|
|
|
## Autostart en .bashrc
|
|
|
|
Samba y mDNS se inician al abrir Termux. Ver `bashrc-snippet.sh` para el codigo exacto.
|
|
|
|
No se usa Termux:Boot (no funciona en este dispositivo).
|
|
|
|
### 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 |
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### "Connection refused" desde otro equipo
|
|
|
|
1. Verificar que smbd corre: `smb-status`
|
|
2. Verificar puerto: `ss -tlnp | grep 4450`
|
|
3. Verificar firewall Android: Ajustes WiFi, sin restricciones
|
|
|
|
### No aparece en Dolphin (Red)
|
|
|
|
1. Verificar mDNS: `mdns-status`
|
|
2. Desde Kubuntu: `avahi-browse -rt _smb._tcp`
|
|
3. Si no aparece: `mdns-restart`
|
|
4. Acceso manual: `smb://movil.local:4450/`
|
|
|
|
### "NT_STATUS_LOGON_FAILURE"
|
|
|
|
```bash
|
|
printf 'PASS\nPASS\n' | smbpasswd -L -s -c ~/.config/samba/smb.conf USUARIO
|
|
```
|
|
|
|
### mDNS no resuelve .local en Termux
|
|
|
|
Termux usa su propia libc, no la de Android. Por eso `.local` no resuelve con `ping` o `getent`. Usar `mdns-resolve` en su lugar:
|
|
```bash
|
|
mdns-resolve hostname.local
|
|
```
|
|
|
|
### SSH no conecta por nombre
|
|
|
|
Verificar que `~/.ssh/config` usa `ProxyCommand` con `ssh-mdns-proxy`:
|
|
```bash
|
|
ssh -v hostname # Ver que proxy se usa
|
|
```
|