💾 Archived View for elmau.net › notes › nebula.gmi captured on 2023-11-04 at 11:30:00. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2021-11-30)
-=-=-=-=-=-=-
Nebula es una VPN Mesh (en malla), su principal característica y ventaja es que una vez comunicados los nodos, esta es directa entre ellos, aún se requiere un nodo central pero su único trabajo es poner en comunicación los clientes y monitorear que estén en comunicación por lo que los requerimientos para este nodo central son mínimos.
En la terminología de Nebula, a este nodo central se le conoce como "faro" (ligthouse) y es el único que necesita una IP fija.
El "faro solo pone en contacto los clientes" por lo que "NO sabe que se transmite entre ellos" y dado que los certificados se pueden generar en un cliente, el mismo "faro" nunca podrá generar certificados para otros clientes.
Nebula esta hecho en Go por lo que solo se requiere un binario para el faro y los clientes y uno más para generar los certificados. Asegurate de descargar la versión correcta para la arquitectura del servidor y los clientes.
Todo el procedimiento se puede realizar tanto el servidor como en algunos de los clientes, para este ejemplo todo se genera en un cliente y solo se suben los archivos necesarios al servidor.
Una vez descargado, descomprimelo y deberás ver dos archivos:
.rwxr-xr-x 17M mau 10 May 20:27 nebula .rwxr-xr-x 6.6M mau 10 May 20:27 nebula-cert
1] Primero generamos los certificados CA (Certificate Authorities)
./nebula-cert ca -name "Nebula para Cuates"
Ahora debes de tener.
.rw------- 255 mau 4 Jun 22:14 ca.crt .rw------- 174 mau 4 Jun 22:14 ca.key .rwxr-xr-x 17M mau 10 May 20:27 nebula .rwxr-xr-x 6.6M mau 10 May 20:27 nebula-cert
2] Generamos los certificados para el faro y para los clientes, en este paso debes de decidir que subred vas utilizar, para este ejemplo usaré: 10.10.1.0/24
Certificados para el faro.
./nebula-cert sign -name "faro" -ip "10.10.1.1/24"
Certificados para los clientes.
./nebula-cert sign -name "oficina" -ip "10.10.1.2/24" ./nebula-cert sign -name "casa" -ip "10.10.1.3/24"
Cada uno de estos certificados, es firmado por los certificados CA del primer paso. Guarda el ca.key en un lugar seguro después de generar todos los certificados de cliente que necesites.
Ahora debes de tener.
.rw------- 255 mau 4 Jun 22:14 ca.crt .rw------- 174 mau 4 Jun 22:14 ca.key .rw------- 292 mau 4 Jun 22:26 casa.crt .rw------- 127 mau 4 Jun 22:26 casa.key .rw------- 292 mau 4 Jun 22:26 faro.crt .rw------- 127 mau 4 Jun 22:26 faro.key .rwxr-xr-x 17M mau 10 May 20:27 nebula .rwxr-xr-x 6.6M mau 10 May 20:27 nebula-cert .rw------- 296 mau 4 Jun 22:26 oficina.crt .rw------- 127 mau 4 Jun 22:26 oficina.key
3] Configuración
Nebula utiliza el formato YAML para su archivo de configuración, es muy importante respetar correctamente la sintaxis de este formato.
Primero configuramos el servidor. Sube el archivo "nebula" al servidor o descargalo de nuevo si usa una arquitectura diferente a tu cliente. En el servidor solo requerimos el binario "nebula" por lo que si lo descargas puedes borrar el binario "nebula-cert". También debes subir el "ca.crt" y los certificados del "faro", estos son los archivos que deberás de subir a tu servidor.
ca.crt faro.crt faro.key nebula
IMPORTANTE: Asegurate de NO subir el archivo ca.key, recuerda, este guárdalo en un lugar privado y seguro.
Puedes ver el archivo de configuración de ejemplo en:
https://github.com/slackhq/nebula/blob/master/examples/config.yml
Este es el archivo de configuración (config.yml) para nuestro servidor.
IMPORTANTE: NO intentes usar esta IP, debes de usar la real de servidor y, asegurate de abrir el puerto usado en tu firewall.
pki: # Cada nodo necesita una copia del certificados público CA # y sus propios certificados. Asegurate de usar solo rutas absolutas ca: /home/mau/ca.crt cert: /home/mau/faro.crt key: /home/mau/faro.key static_host_map: # La direccion del faro # formato "Nebula IP": ["IP pública o hostname:port"] "10.10.1.1": ["165.69.125.144:4242"] lighthouse: interval: 60 # true = si es faro, false = si es cliente am_lighthouse: true hosts: # Si es faro esta sección debe ir vacía o comentada # Si es cliente va la dirección de uno o más faros. # formato: # # - "192.168.98.1" listen: # 0.0.0.0 significa "todas las interfaces," # host: 0.0.0.0 port: 4242 # "punchy" básicamente significa "enviar paquetes keepalive frecuentes" # para que tu router no expire y cierre los túneles NAT. # punchy: true # "punch_back" allows the other node to try punching out to you, # if you're having trouble punching out to it. Useful for stubborn # networks with symmetric NAT, etc. # punch_back: true tun: # sensible defaults. don't monkey with these unless # you're CERTAIN you know what you're doing. # dev: nebula1 drop_local_broadcast: false drop_multicast: false tx_queue: 500 mtu: 1300 routes: logging: level: info format: text # you NEED this firewall section. # # Nebula has its own firewall in addition to anything # your system has in place, and it's all default deny. # # So if you don't specify some rules here, you'll drop # all traffic, and curse and wonder why you can't ping # one node from another. # firewall: conntrack: tcp_timeout: 120h udp_timeout: 3m default_timeout: 10m max_connections: 100000 # since everything is default deny, all rules you # actually SPECIFY here are allow rules. # outbound: - port: any proto: any host: any inbound: - port: any proto: any host: any
Ejecuta en el servidor.
sudo ./nebula -config config.yml
Debes de ver.
INFO[0000] Firewall rule added firewallRule="map[caName: caSha: direction:outgoing endPort:0 groups:[] host:any ip: proto:0 startPort:0]" INFO[0000] Firewall rule added firewallRule="map[caName: caSha: direction:incoming endPort:0 groups:[] host:any ip: proto:0 startPort:0]" INFO[0000] Firewall started firewallHash=21716b47a7a140e448077fe66c31b4b42f232e996818d7dd1c6c4991e066dbdb INFO[0000] Main HostMap created network=10.10.1.1/24 preferredRanges="[]" INFO[0000] UDP hole punching enabled INFO[0000] Nebula interface is active build=1.4.0 interface=nebula1 network=10.10.1.1/24 udpAddr="0.0.0.0:4242"
Ahora configuramos el cliente (config.yml), asegurate de hacer los cambios correctamente.
pki: # Cada nodo necesita una copia del certificados público CA # y sus propios certificados. Asegurate de usar solo rutas absolutas ca: /home/mau/ca.crt cert: /home/mau/oficina.crt key: /home/mau/oficina.key static_host_map: # La direccion del faro # formato "Nebula IP": ["IP pública o hostname:port"] "10.10.1.1": ["165.69.125.144:4242"] lighthouse: interval: 60 # true = si es faro, false = si es cliente am_lighthouse: false hosts: # Si es faro esta sección debe ir vacía o comentada # Si es cliente va la dirección de uno o más faros. # formato: # # - "192.168.98.1" - "10.10.1.1" listen: # 0.0.0.0 significa "todas las interfaces," # host: 0.0.0.0 port: 4242 # "punchy" básicamente significa "enviar paquetes keepalive frecuentes" # para que tu router no expire y cierre los túneles NAT. # punchy: true # "punch_back" allows the other node to try punching out to you, # if you're having trouble punching out to it. Useful for stubborn # networks with symmetric NAT, etc. # punch_back: true tun: # sensible defaults. don't monkey with these unless # you're CERTAIN you know what you're doing. # dev: nebula0 drop_local_broadcast: false drop_multicast: false tx_queue: 500 mtu: 1300 routes: logging: level: info format: text # you NEED this firewall section. # # Nebula has its own firewall in addition to anything # your system has in place, and it's all default deny. # # So if you don't specify some rules here, you'll drop # all traffic, and curse and wonder why you can't ping # one node from another. # firewall: conntrack: tcp_timeout: 120h udp_timeout: 3m default_timeout: 10m max_connections: 100000 # since everything is default deny, all rules you # actually SPECIFY here are allow rules. # outbound: - port: any proto: any host: any inbound: - port: any proto: any host: any
Y ejecutamos.
sudo ./nebula -config config.yml
Debes de ver.
INFO[0000] Firewall rule added firewallRule="map[caName: caSha: direction:outgoing endPort:0 groups:[] host:any ip: proto:0 startPort:0]" INFO[0000] Firewall rule added firewallRule="map[caName: caSha: direction:incoming endPort:0 groups:[] host:any ip: proto:0 startPort:0]" INFO[0000] Firewall started firewallHash=21716b47a7a140e448077fe66c31b4b42f232e996818d7dd1c6c4991e066dbdb INFO[0000] Main HostMap created network=10.10.1.2/24 preferredRanges="[]" INFO[0000] UDP hole punching enabled INFO[0000] Nebula interface is active build=1.4.0 interface=nebula0 network=10.10.1.2/24 udpAddr="0.0.0.0:4252"
En una nueva ventana de tu terminal, prueba la conexión con un simple "ping".
ping -c 3 10.10.1.1 PING 10.10.1.1 (10.10.1.1) 56(84) bytes of data. 64 bytes from 10.10.1.1: icmp_seq=1 ttl=64 time=150 ms 64 bytes from 10.10.1.1: icmp_seq=2 ttl=64 time=151 ms 64 bytes from 10.10.1.1: icmp_seq=3 ttl=64 time=150 ms --- 10.10.1.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 149.650/150.172/150.638/0.405 ms
Presiona CTRL+C en cada terminal para terminar la ejecución de nebula.
4] Crear el servicio
Por ultimo, podemos mover los archivos, el binario, los certificados y el archivo de configuración a una mejor ubicación y crear el servicio correspondiente para su fácil control, para este ejemplo movemos todo a "/opt/nebula"
Creamos el servicio.
sudo vim /etc/systemd/system/nebula.service
Con el siguiente contenido.
[Unit] Description=nebula Wants=basic.target network-online.target After=basic.target network.target network-online.target Before=sshd.service [Service] SyslogIdentifier=nebula ExecReload=/bin/kill -HUP $MAINPID ExecStart=/opt/nebula/nebula -config /opt/nebula/config.yml Restart=always [Install] WantedBy=multi-user.target
Activamos e iniciamos.
sudo systemctl enable nebula sudo systemctl start nebula
Esto es todo, disfruta.
Un abrazo desde México.
PD: Si eres parte de un colectivo y quieres tener tu propia red Nebula, cuentame lo que hacen, es probable que podamos apoyarles.