capsula-gemini/source/notes/nebula.gmi

374 lines
11 KiB
Plaintext

## Nebula
=> https://github.com/slackhq/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.
=> https://github.com/slackhq/nebula/releases/ 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.
=> gemini://elmau.net/chuletas.gmi Regresar el índice
=> gemini://elmau.net Regresar el inicio