Este documento está escrito para una audiencia de desarrolladores de software. Para obtener información sobre el uso de ZeroTier, consulte: sitio web, sitio de documentación y foro de discusión.
ZeroTier es un conmutador Ethernet programable inteligente para el planeta Tierra. Permite que todos los dispositivos, máquinas virtuales, contenedores y aplicaciones en red se comuniquen como si todos residieran en el mismo centro de datos físico o región de la nube.
Esto se logra combinando una red punto a punto segura y direccionada criptográficamente (denominada VL1) con una capa de emulación de Ethernet algo similar a VXLAN (denominada VL2). Nuestra capa de virtualización Ethernet VL2 incluye funciones SDN empresariales avanzadas, como reglas de control de acceso detalladas para la microsegmentación de la red y el monitoreo de seguridad.
Todo el tráfico de ZeroTier se cifra de extremo a extremo mediante claves secretas que solo usted controla. La mayor parte del tráfico fluye de igual a igual, aunque ofrecemos retransmisión gratuita (pero lenta) para los usuarios que no pueden establecer conexiones de igual a igual.
Los objetivos y principios de diseño de ZeroTier están inspirados, entre otras cosas, en el documento original de Google BeyondCorp y el Jericho Forum con su noción de "desperimetrización".
Visite el sitio de ZeroTier para obtener más información y paquetes binarios prediseñados. Las aplicaciones para Android e iOS están disponibles de forma gratuita en las tiendas de aplicaciones de Google Play y Apple.
ZeroTier tiene licencia BSL versión 1.1. Consulte LICENSE.txt y la página de precios de ZeroTier para obtener más detalles. ZeroTier se puede utilizar de forma gratuita internamente en empresas e instituciones académicas y para fines no comerciales. Ciertos tipos de uso comercial, como crear aplicaciones y dispositivos de código cerrado basados en ZeroTier u ofrecer controladores de red ZeroTier y administración de red como un servicio SaaS, requieren una licencia comercial.
ZeroTier también incluye una pequeña cantidad de código de terceros y no está sujeta a nuestra licencia BSL. Consulte AUTHORS.md para obtener una lista del código de terceros, dónde se incluye y las licencias que se le aplican. Todo el código de terceros en ZeroTier tiene licencia liberal (MIT, BSD, Apache, dominio público, etc.).
Todo en el mundo ZeroTier está controlado por dos tipos de identificadores: direcciones ZeroTier de 40 bits/10 dígitos e ID de red de 64 bits/16 dígitos. Estos identificadores se distinguen fácilmente por su longitud. Una dirección ZeroTier identifica un nodo o "dispositivo" (computadora portátil, teléfono, servidor, VM, aplicación, etc.), mientras que una ID de red identifica una red Ethernet virtual a la que se pueden unir dispositivos.
Las direcciones ZeroTier pueden considerarse como números de puerto en un enorme conmutador inteligente Ethernet empresarial en todo el planeta que admite VLAN. Los ID de red son ID de VLAN a los que se pueden asignar estos puertos. Se puede asignar un solo puerto a más de una VLAN.
Una dirección ZeroTier parece 8056c2e21c
y una ID de red parece 8056c2e21c000001
. Los ID de red se componen de la dirección ZeroTier del controlador principal de esa red y un ID arbitrario de 24 bits que identifica la red en este controlador. Los controladores de red son más o menos análogos a los controladores SDN en protocolos SDN como OpenFlow, aunque al igual que con la analogía entre VXLAN y VL2, esto no debe interpretarse como que implica que los protocolos o el diseño son los mismos. Puede utilizar nuestros convenientes y económicos controladores alojados en SaaS en my.zerotier.com o ejecutar su propio controlador si no le importa trastear con archivos de configuración JSON o escribir scripts para hacerlo.
La ruta base contiene el punto de entrada principal del servicio ZeroTier One ( one.cpp
), código de autoprueba, archivos MAKE, etc.
artwork/
: iconos, logotipos, etc.attic/
: material antiguo y código experimental que queremos conservar como referencia.controller/
: la implementación del controlador de red de referencia, que se crea e incluye de forma predeterminada en los destinos de compilación de escritorio y servidor.debian/
: archivos para crear paquetes de Debian en Linux.doc/
: páginas de manual y otra documentación.ext/
: bibliotecas de terceros, archivos binarios que enviamos para mayor comodidad en algunas plataformas (Mac y Windows) y archivos de soporte de instalación.include/
: incluye archivos para el núcleo ZeroTier.java/
: un contenedor JNI utilizado con nuestra aplicación móvil de Android. (Toda la aplicación de Android no es de código abierto, pero es posible que lo sea en el futuro).node/
: el núcleo del conmutador Ethernet virtual ZeroTier, que está diseñado para estar completamente separado del resto del código y puede construirse como una biblioteca independiente del sistema operativo. Nota para los desarrolladores: no utilicen funciones de C++11 aquí, ya que queremos que esto se base en plataformas integradas antiguas que carecen de compatibilidad con C++11. C++ 11 se puede utilizar en otros lugares.osdep/
: código para admitir e integrar con sistemas operativos, incluido material específico de la plataforma creado solo para ciertos objetivos.rule-compiler/
: compilador de lenguaje de reglas JavaScript para definir reglas a nivel de red.service/
: el servicio ZeroTier One, que envuelve el núcleo ZeroTier y proporciona conectividad similar a VPN a redes virtuales para computadoras de escritorio, portátiles, servidores, máquinas virtuales y contenedores.windows/
: archivos de la solución de Visual Studio, código de servicio de Windows y la interfaz de usuario de la aplicación de la barra de tareas de Windows.zeroidc/
: implementación de OIDC utilizada por el servicio ZeroTier para iniciar sesión en redes habilitadas para SSO. (Esta parte está escrita en Rust y aparecerán más Rust en este repositorio en el futuro). Retire las solicitudes de la rama dev
.
Los lanzamientos se realizan fusionando dev
con main
y luego etiquetando y realizando compilaciones.
Para compilar en Mac y Linux, simplemente escriba make
. En FreeBSD y OpenBSD se requiere gmake
(marca GNU) y se puede instalar desde paquetes o puertos. Para Windows existe una solución de Visual Studio en windows/
.
gmake
para compilar.binutils
. Escriba pkg install binutils
para instalar./dev/tap0
a /dev/tap3
).gmake
para compilar. Al escribir make selftest
se creará un binario de autoprueba de nivel cero que prueba varias partes internas e informa sobre algunos aspectos del entorno de compilación. Es una buena idea probar esto en plataformas o arquitecturas novedosas.
Ejecutar zerotier-one con la opción -h
mostrará ayuda.
En Linux y BSD, si compiló desde el código fuente, puede iniciar el servicio con:
sudo ./zerotier-one -d
En la mayoría de las distribuciones, macOS y Windows, el instalador iniciará el servicio y lo configurará para que se inicie al arrancar.
Se creará automáticamente una carpeta de inicio para su sistema.
El servicio se controla a través de la API JSON, que de forma predeterminada está disponible en 127.0.0.1:9993
. También escucha en 0.0.0.0:9993
, que solo se puede utilizar si allowManagementFrom
está configurado correctamente en local.conf
. Incluimos una utilidad de línea de comandos zerotier-cli para realizar llamadas API para cosas estándar como unirse y salir de redes. El archivo authtoken.secret en la carpeta de inicio contiene el token secreto para acceder a esta API. Consulte service/README.md para obtener documentación de API.
Aquí es donde se encuentran las carpetas de inicio (de forma predeterminada) en cada sistema operativo:
/var/lib/zerotier-one
/var/db/zerotier-one
/Library/Application Support/ZeroTier/One
ProgramDataZeroTierOne
(Ese es el valor predeterminado. La carpeta base de 'datos de aplicaciones compartidas' puede ser diferente si Windows está instalado con una asignación o diseño de letra de unidad no estándar).Para la mayoría de los usuarios, simplemente funciona.
Si está ejecutando un firewall de sistema local, le recomendamos agregar reglas que permitan el nivel cero. Si instaló binarios para Windows, esto debería hacerse automáticamente. Es posible que otras plataformas requieran la edición manual de las reglas del firewall local según su configuración.
Consulte el sitio de documentación para obtener más información.
El firewall de Mac se puede encontrar en "Seguridad" en Preferencias del Sistema. Linux tiene una variedad de sistemas y herramientas de configuración de firewall.
En CentOS, consulte /etc/sysconfig/iptables
para conocer las reglas de IPTables. Para otras distribuciones consulte la documentación de su distribución. También deberá consultar las interfaces de usuario o la documentación de aplicaciones comerciales de firewall de terceros como Little Snitch (Mac), McAfee Firewall Enterprise (Windows), etc., si está ejecutando alguna de ellas. Es posible que algunos entornos corporativos tengan un software de firewall administrado de forma centralizada, por lo que es posible que también deba comunicarse con el departamento de TI.
Los pares ZeroTier One se ubicarán automáticamente entre sí y se comunicarán directamente a través de una LAN cableada local si el puerto UDP 9993 de entrada está abierto . Si ese puerto se filtra, no podrán ver los paquetes de anuncios LAN de los demás. Si experimenta un rendimiento deficiente entre dispositivos en la misma red física, verifique la configuración del firewall. Sin la ubicación automática de LAN, los pares deben intentar el recorrido NAT de "bucle invertido", lo que a veces falla y en cualquier caso requiere que cada paquete atraviese su enrutador externo dos veces.
Es posible que los usuarios detrás de ciertos tipos de firewalls y dispositivos NAT "simétricos" no puedan conectarse directamente a pares externos. ZeroTier tiene soporte limitado para la predicción de puertos e intentará atravesar NAT simétricas, pero esto no siempre funciona. Si falla la conectividad P2P, los paquetes UDP rebotarán en nuestros servidores de retransmisión, lo que provocará un rendimiento más lento. Algunos enrutadores NAT tienen un modo NAT configurable y configurarlo en "cono lleno" eliminará este problema. Si hace esto, también podrá ver una mejora mágica para cosas como teléfonos VoIP, Skype, BitTorrent, WebRTC, ciertos juegos, etc., ya que todos ellos utilizan técnicas transversales de NAT similares a las nuestras.
Si un firewall entre usted e Internet bloquea el tráfico UDP de ZeroTier, recurrirá al túnel TCP de último recurso hacia los servidores raíz a través del puerto 443 (suplantación de https). Esto funcionará en casi cualquier lugar, pero es muy lento en comparación con UDP o la conectividad directa de igual a igual.
Puede encontrar ayuda adicional en nuestra base de conocimientos.
Las métricas de Prometheus están disponibles en el punto final API /metrics
. Este punto final está protegido por una clave API almacenada en metricstoken.secret
para evitar la fuga de información no deseada. La información que se podría obtener de las métricas incluye las redes unidas y los pares con los que está hablando su instancia.
El control de acceso se realiza a través de la propia interfaz de control ZeroTier y metricstoken.secret
. Esto puede enviarse como un token de autenticación de portador, a través del campo de encabezado HTTP X-ZT1-Auth
, o agregarse a la URL como ?auth=<token>
. Puede ver las métricas actuales a través de cURL
con el siguiente comando:
// Linux
curl -H "X-ZT1-Auth: $(sudo cat /var/lib/zerotier-one/metricstoken.secret)" http://localhost:9993/metrics
// macOS
curl -H "X-ZT1-Auth: $(sudo cat /Library/Application Support/ZeroTier/One/metricstoken.secret)" http://localhost:9993/metrics
// Windows PowerShell (Admin)
Invoke-RestMethod -Headers @{'X-ZT1-Auth' = "$(Get-Content C:ProgramDataZeroTierOnemetricstoken.secret)"; } -Uri http://localhost:9993/metrics
Para configurar un trabajo de raspado en Prometheus en la máquina en la que se ejecuta ZeroTier, agregue esto a su scrape_config
de Prometheus:
- job_name: zerotier-one
honor_labels: true
scrape_interval: 15s
metrics_path: /metrics
static_configs:
- targets:
- 127.0.0.1:9993
labels:
group: zerotier-one
node_id: $YOUR_10_CHARACTER_NODE_ID
authorization:
credentials: $YOUR_METRICS_TOKEN_SECRET
Si ninguno de estos métodos es deseable, probablemente sea posible distribuir métricas a través de Prometheus Proxy o alguna otra herramienta. Nota: No hemos probado esto internamente, pero probablemente funcione con la configuración correcta.
Las métricas también están disponibles en el disco del directorio de trabajo de ZeroTier:
// Linux /var/lib/zerotier-one/metrics.prom
// macOS /Biblioteca/Aplicación Support/ZeroTier/One/metrics.prom
//Windows C:ProgramDataZeroTierOnemetrics.prom
Nombre de la métrica | Etiquetas | Tipo de métrica | Descripción |
---|---|---|---|
zt_paquete | tipo_paquete, dirección | Encimera | Recuentos de tipos de paquetes ZeroTier |
zt_packet_error | tipo_error, dirección | Encimera | Errores de paquetes ZeroTier |
datos_zt | protocolo, dirección | Encimera | número de bytes que ZeroTier ha transmitido o recibido |
zt_num_redes | Indicador | Número de redes a las que está unida esta instancia. | |
zt_network_multicast_groups_subscribed | id_red | Indicador | Número de grupos de multidifusión a los que están suscritas las redes. |
zt_network_packets | network_id, dirección | Encimera | número de paquetes entrantes/salientes por red |
zt_peer_latency | nodo_id | histograma | latencia entre pares (ms) |
zt_peer_path_count | nodo_id, estado | Indicador | número de caminos para peer |
zt_peer_packets | nodo_id, dirección | Encimera | número de paquetes hacia/desde un par |
zt_peer_packet_errors | nodo_id | Encimera | número de errores de paquetes entrantes de un par |
Si hay otras métricas que le gustaría que se realicen un seguimiento, ¡consúltenos en un Issue o envíenos una solicitud de extracción!
Hay un servidor de archivos http estático adecuado para alojar aplicaciones de una sola página en http://localhost:9993/app/
Utilice zerotier-cli info -j
para encontrar el directorio de inicio de su servicio zerotier-one
cd $ZT_HOME
sudo mkdir -p app/app1
sudo mkdir -p app/appB
echo ' <html><meta charset=utf-8><title>appA</title><body><h1>hello world A ' | sudo tee app/appA/index.html
echo ' <html><meta charset=utf-8><title>app2</title><body><h1>hello world 2 ' | sudo tee app/app2/index.html
curl -sL http://localhost:9993/app/appA http://localhost:9993/app/app2
Luego visite http://localhost:9993/app/app1/ y http://localhost:9993/app/appB/
Las solicitudes de rutas que no existen devuelven la raíz de la aplicación index.html, como es habitual en los SPA. Si lo desea, puede escribir algún javascript que se comunique con la API del servicio o del controlador.