VyOS con un MiniPC
Hace tiempo que utilizo VyOS (router como software) en el trabajo. Quise probarlo también en casa.
Adquirí en AliExpress un mini PC con 6 puertos gigabit ethernet para instalarlo.
Bridge
Lo primero que hice fue crear un bridge entre 5 de los 6 puertos para red local, reservando el sexto para «WAN», que iría conectado al módem.
La red elegida, para que no se solapase con la red de mi empresa, fue 172.19.192.0/24, asignando 172.19.192.1 al propio bridge:
interfaces {
bridge br0 {
address 172.19.192.1/24
aging 300
hello-time 2
max-age 20
priority 32768
stp false
}
Añadí las interfaces eth1 a eth5 al bridge br0.
interfaces {
ethernet eth1 {
bridge-group {
bridge br0
}
duplex auto
hw-id XX:XX:XX:XX:XX:XX
smp-affinity auto
speed auto
}
Las últimas 4 líneas son automáticas. La configuración es igual de eth2 a eth5.
DHCP
A continuación habilité DHCP para obtener direcciones IP automáticamente.
service {
dhcp-server {
disabled false
hostfile-update disable
shared-network-name dhcpexample {
authoritative enable
subnet 172.19.192.0/24 {
default-router 172.19.192.1
dns-server 172.19.192.1
lease 86400
start 172.19.192.33 {
stop 172.19.192.200
}
static-mapping escritorio-trabajo {
ip-address 172.19.192.33
mac-address XX:XX:XX:XX:XX:XX
}
static-mapping nuc {
ip-address 172.19.192.34
mac-address XX:XX:XX:XX:XX:XX
}
}
}
}
...
Puse como OPTIONS del DHCP el router y DNS a la IP 172.19.192.1. El pool empieza a partir de 172.19.192.33. Tengo un par de máquinas con Ip reservada (por medio de MAC).
WAN e Internet
El puerto WAN está directamente conectado al módem de fibra óptica, no al router. Para que esto funcione, necesitamos emplear el protocolo PPPoE. Necesitamos unos datos importantes particulares de MoviStar:
- PPPoE va encapsulado en VLAN, con ID 6.
- Las credecial de PPPoE es: usuario «adslppp@telefonicanetpa» y contraseña «adslppp». Éstas son las mismas credenciales que utilizaba MoviStar para el ADSL. y siguen siendo las mismas para fibra óptica.
La interfaz del miniPC es eth0, con uns subinterfaz lógica «pppoe1»:
interfaces {
ethernet eth0 {
duplex auto
hw-id XX:XX:XX:XX:XX:XX
smp-affinity auto
speed auto
vif 6 {
pppoe 1 {
default-route auto
mtu 1492
name-server auto
password adslppp
policy {
}
user-id adslppp@telefonicanetpa
}
}
}
Una configuración esencial es el MTU para PPPoE. Sin él, podía hacer ping a Internet y acceder a ciertas páginas webs, pero la mayoría funcionaban con increíble lentitud, no llegando a cargar completamente. Ver https://wiki.vyos.net/wiki/Ethernet#TCP_MSS_Clamping:
policy {
route pppoe-out {
description "PPPoE TCPMSS clamping"
rule 100 {
protocol tcp
set {
tcp-mss 1452
}
tcp {
flags SYN
}
}
}
}
Tenemos que aplicar esta política del lado de LAN:
The TCP MSS Clamping policy have to be applied to the LAN interface (eth0).
En nuestro caso no es eth0, sino br0.
interfaces {
bridge br0 {
...
policy {
route pppoe-out
}
...
DNS
En la configuración de DHCP pusimos como DNS la IP del bridge:
dns-server 172.19.192.1
Sin embargo, necesitamos un servidor DNS real. Utilizo los de MoviStar:
system {
name-server 80.58.61.250
name-server 80.58.61.254
NAT
Aplicaremos NAT (concretamente source NAT, masquerade) a todo el tráfico saliente por la interfaz pppoe1:
nat {
source {
rule 100 {
log disable
outbound-interface pppoe1
translation {
address masquerade
}
}
}
}
A partir de este momento, ya pude navegar por internet desde cualquiera de las interfaces conectadas al bridge.
Aparte de esto, hago port forwarding «abrir puertos»:
- Puerto 4000 (software de escritorio remoto) a dirección 172.19.192.33.
- Puerto 5900 (VNC) a dirección 172.19.192.34
Estas dos direcciones son las que pusimos como DHCP reservado anteriormente.
nat {
destination {
rule 10 {
description "Port Forward: NoMachine to escritorio de trabajo"
destination {
port 4000
}
inbound-interface pppoe1
protocol tcp_udp
translation {
address 172.19.192.33
}
}
rule 11 {
description "Port forward: VNC a player Intel NUC"
destination {
port 5900
}
inbound-interface pppoe1
protocol tcp_udp
translation {
address 172.19.192.34
}
}
}
DNS dinámico
Otra mis motivaciones para utilizar VyOS es la posibilidad de utilizarlo como cliente para DNS dinámico. Me creé una cuenta con no-ip y lo configuré:
service {
dynamic {
interface pppoe1 {
service noip {
host-name <hostname>
login <usuario>
password <contraseña>
}
}
}
Para el hostname, no-ip me daba a opción e elegir entre varios TLDs (Top-level domains). Elegí ddns.net, quedando nombre.ddns.net
Forwarding DNS
Tengo contratado un servicio para saltar restricciones de geolocalización por IP para servicios de streaming mediante DNS, https://www.smartdnsproxy.com. Lo utilizo para crunchyroll.com. Podría poner el DNS que me proporcionan globalmente, pero prefiero evitarlo porque:
- Probablemente los DNS de mi ISP sean mejores
- Puede que MoviStar tenga acuerdos con CDNs (Amazon, Akamai) y aloje internamente servidores de estas empresas. Si cambio el DNS, iré siempre a Internet.
service {
dns {
forwarding {
domain crunchyroll.com {
server 192.162.27.100
}
listen-address 172.19.192.1
negative-ttl 3
system
}
192.162.27.100 es la IP de uno de los DNS de SmartDNS. Sin embargo, esto no funcionó. VyOS configura el forwarding DNS suponiendo que el servidor indicado es autoritativo, es decir, sin el bit de recursión al hacer la petición. Esto me devolvía las mismas IPs que eran públicas en Internet, no la IP «falsa» que proporciona SmartDNS. El workaround es evitar que VyOS configure PowerDNS, y lo hagamos nosotros de forma manual. Lo que pongamos en la configuración de service { dns { forwarding
será por tanto ignorado.
Edité /lib/systemd/system/pdns-recursor.service. Lo único que cambia es –config-dir:
[Unit]
Description=PowerDNS Recursor
Documentation=man:pdns_recursor(1) man:rec_control(1)
Documentation=https://doc.powerdns.com
Wants=network-online.target nss-lookup.target
Before=nss-lookup.target
After=network-online.target
[Service]
Type=notify
ExecStart=/usr/sbin/pdns_recursor --daemon=no --write-pid=no --disable-syslog --config-dir=/etc/powerdns_smartdnsproxy.com
Restart=on-failure
StartLimitInterval=0
PrivateTmp=true
PrivateDevices=true
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_SETGID CAP_SETUID CAP_CHOWN CAP_SYS_CHROOT
NoNewPrivileges=true
ProtectSystem=full
ProtectHome=true
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
LimitNOFILE=4200
[Install]
WantedBy=multi-user.target
El fichero de configuración era /etc/powerdns_smartdnsproxy.com/recursor.conf, donde separamos martdnsproxy.com y crunchyroll.com en la opción forward-zones-recurse (no forward-zones a secas):
### Autogenerated by dns_forwarding.py ###
# Non-configurable defaults
daemon=yes
threads=1
allow-from=0.0.0.0/0
log-common-errors=yes
non-local-bind=yes
# cache-size
max-cache-entries=10000
# negative TTL for NXDOMAIN
max-negative-ttl=3
# ignore-hosts-file
export-etc-hosts=yes
# listen-on
local-address=172.19.192.1
forward-zones=sys.miempresa.com=192.168.0.202,dev.miempresa.com=192.168.0.202,jdev.miempresa.com=192.168.0.202,prod.miempresa.com=192.168.0.202,temizuya.miempresa.com=192.168.0.202
# domain ... server ...
forward-zones-recurse=.=80.58.61.250;80.58.61.254,smartdnsproxy.com=192.162.27.100;95.141.39.236,crunchyroll.com=192.162.27.100
# name-server
# forward-zones-recurse=.=80.58.61.250;80.58.61.254
Finalmente:
sudo systemctl daemon-reload
systemctl restart pdns-recursor