💾 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

View Raw

More Information

⬅️ Previous capture (2021-11-30)

-=-=-=-=-=-=-

Nebula

Nebula en Github

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.

Descargar Nebula

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.

Regresar el índice

Regresar el inicio