Cómo usar UNIX sockets para control remoto de bitcoind
En este artículo se describe paso a paso cómo configurar y emplear UNIX sockets para controlar de forma remota una instancia de bitcoind. Usar sockets de dominio UNIX frente a conexiones TCP ofrece ventajas en seguridad y rendimiento cuando el cliente y el demonio RPC residen en la misma máquina.
1. Ventajas de UNIX sockets
Seguridad reforzada: no se abre ningún puerto de red, reduciendo la superficie de ataque.
Rendimiento: elimina la pila TCP/IP local y sus costes de contexto.
Permisos de archivos: se controla el acceso mediante permisos del sistema de archivos (usuario/grupo).
2. Configuración de bitcoind
2.1 Parámetros básicos
Abra o cree el fichero bitcoin.conf (normalmente en ~/.bitcoin/bitcoin.conf) e incluya:
rpcbind=/ruta/al/socket/bitcoin.sock
server=1
disablewallet=1
rpcuser=usuariorpc y rpcpassword=passwordrpc
rpccookiefile=/ruta/al/socket/.cookie
2.2 Permisos y propiedad del socket
Asegúrese de que el directorio donde vive el socket existe y tiene permisos adecuados (por ejemplo, chmod 755).
bitcoind creará el archivo bitcoin.sock con permisos basados en umask. Ajuste umask o cambie permisos tras el arranque (chmod 660 bitcoin.sock) si varios usuarios o servicios deben acceder.
3. Autenticación mediante cookie
La forma recomendada de autenticarse es usando la cookie RPC. Tras arrancar bitcoind con el parámetro rpccookiefile, se genera un archivo con contenido usuario:secreto. El cliente simplemente lee ese archivo para sus credenciales.
4. Conexión desde la línea de comandos
Puede usar curl para enviar peticiones JSON-RPC vía UNIX socket. Ejemplo para obtener información de la cadena:
curl –unix-socket /ruta/al/socket/bitcoin.sock -H content-type:text/plain –data {jsonrpc:1.0,id:1,method:getblockchaininfo,params:[]} http://127.0.0.1/
5. Conexión mediante Python
Para Python es recomendable la biblioteca requests_unixsocket. Primero instálela:
pip install requests requests_unixsocket
Ejemplo de script:
import requests_unixsocket
import json
socket_path = /ruta/al/socket/bitcoin.sock
url = http unix:// socket_path.replace(/, /) /
session = requests_unixsocket.Session()
# Leer credenciales de la cookie
user, password = open(/ruta/al/socket/.cookie).read().strip().split(:)
payload = {jsonrpc:1.0,id:py,method:getnetworkinfo,params:[]}
response = session.post(url, auth=(user,password), json=payload)
print(json.dumps(response.json(), indent=2))
6. Conexión mediante Go
En Go puede usar la biblioteca estándar junto con el paquete net/http y dial personalizado:
import (
encoding/json
fmt
net
net/http
net/url
os
)
func main() {
socket := /ruta/al/socket/bitcoin.sock
transport := http.Transport{
DialContext: func(_, _ string) (net.Conn, error) {
return net.Dial(unix, socket)
},
}
client := http.Client{Transport: transport}
u := url.URL{Scheme: http, Host: 127.0.0.1}
reqBody := map[string]interface{}{
jsonrpc: 1.0, id: go, method: getwalletinfo, params: []interface{}{},
}
data, _ := json.Marshal(reqBody)
req, _ := http.NewRequest(POST, u.String(), bytes.NewReader(data))
// Autenticación básica con cookie
cookie := strings.Split(string(os.ReadFile(/ruta/al/socket/.cookie)), 🙂
req.SetBasicAuth(cookie[0], cookie[1])
req.Header.Set(Content-Type, application/json)
resp, err := client.Do(req)
if err != nil { panic(err) }
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(result)
fmt.Printf(% vn, result)
}
7. Solución de problemas comunes
Permiso denegado: verifique la propiedad y permisos del socket y la cookie.
Archivo no encontrado: confirme que bitcoind arrancó sin errores y que rpcbind apunta a la ruta correcta.
Autenticación fallida: asegúrese de usar las credenciales exactas del archivo .cookie o usuario/password configurado.
8. Seguridad y buenas prácticas
Ejecute bitcoind bajo un usuario específico (bitcoin) y limite permisos del socket a ese usuario o a un grupo dedicado.
No monte el directorio del socket en sistemas compartidos ni use NFS para almacenaje remoto.
Monitorice los logs de bitcoind para detectar accesos no autorizados o errores de RPC.
Con esta guía ya dispone de los conocimientos necesarios para configurar, conectar y asegurar un canal RPC basado en UNIX sockets en bitcoind. Esta forma de comunicación es ideal cuando su aplicación cliente reside en el mismo servidor, garantizando eficiencia y menor exposición de red.
