Páginas

Mostrando entradas con la etiqueta VPN. Mostrar todas las entradas
Mostrando entradas con la etiqueta VPN. Mostrar todas las entradas

viernes, 4 de septiembre de 2026

Conectar Surfshark VPN protocolo WireGuard FreeBSD 14.4

2. FreeBSD 14.4 Wireguard VPN Surfshark
Surfshark (Países Bajos)no ofrece port forwarding Varias fuentes coinciden (incluida la propia respuesta de Surfshark a sus usuarios): Surfshark VPN no soporta "port forwarding". Split tunneling (Bypasser de Surfshark): saca qBittorrent de la VPN para que use tu IP real directamente. Si lo que buscas es privacidad + port forwarding, la solución no está en el split tunneling ni en el jail, sino en un proveedor de VPN que sí ofrezca reenvío de puertos (por ejemplo, ProtonVPN)
Países de los Catorce Ojos La alianza de vigilancia de los Catorce Ojos son servicios de inteligencia estatales que vigilan y comparten la actividad de las personas en Internet. Estados Unidos, Reino Unido, Canadá, Nueva Zelanda, Australia, Dinamarca, Francia, Países Bajos, Noruega, Alemania, Bélgica, Italia, Suecia y España forman parte de esta alianza.
Elegir una ubicación y descargar el archivo de configuración. Asegurarse de generar el par de claves con anticipación de modo que la clave privada se agregue al archivo de configuración.

Descargar el archivo de configuración

Archivo /etc/rc.conf

wireguard_enable="YES"
wireguard_interface="wg0"

Copiar el archivo de configuración descargado y renombrado como wg0

cp fr-par.conf /usr/local/etc/wireguard/wg0.conf

Luego ejecutar

wg-quick up wg0

comprobar dirección IP VPN

 curl ifconfig.me
 82.102.18.210
FreeBSD es genial!.

jueves, 3 de septiembre de 2026

FreeBSD 14.4 WireGuard VPN Surfshark

1. Conectar Surfshark VPN WireGuard FreeBSD 14.4
Análisis de la tabla de rutas

ifconfig

  em0: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=4e524bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,LRO,WOL_MAGIC,VLAN_HWFILTER,VLAN_HWTSO,RXCSUM_IPV6,TXCSUM_IPV6,HWSTATS,MEXTPG>
	ether e4:b9:7a:6b:96:cd
	media: Ethernet autoselect
	status: no carrier
	nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
lo0: flags=1008049<UP,LOOPBACK,RUNNING,MULTICAST,LOWER_UP> metric 0 mtu 16384
	options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
	inet 127.0.0.1 netmask 0xff000000
	inet6 ::1 prefixlen 128
	inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
	groups: lo
	nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=0
	ether 18:56:80:f8:98:e6
	inet 192.168.88.51 netmask 0xffffff00 broadcast 192.168.88.255
	groups: wlan
	ssid MikroTik-39F9C0 channel 1 (2412 MHz 11g) bssid c4:ad:34:39:f9:c0
	regdomain FCC country US authmode WPA2/802.11i privacy ON
	deftxkey UNDEF AES-CCM 2:128-bit AES-CCM 3:128-bit
	AES-CCM ucast:128-bit txpower 30 bmiss 10 scanvalid 60 protmode CTS
	wme roaming MANUAL
	parent interface: iwm0
	media: IEEE 802.11 Wireless Ethernet OFDM/54Mbps mode 11g
	status: associated
	nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
pflog0: flags=1000141<UP,RUNNING,PROMISC,LOWER_UP> metric 0 mtu 33152
	options=0
	groups: pflog
wg0: flags=10080c1<UP,RUNNING,NOARP,MULTICAST,LOWER_UP> metric 0 mtu 1420
	options=80000<LINKSTATE>
	inet 10.14.0.2 netmask 0xffff0000
	groups: wg
	nd6 options=109<PERFORMNUD,IFDISABLED,NO_DAD>
tailscale0: flags=1008003<UP,BROADCAST,MULTICAST,LOWER_UP> metric 0 mtu 1280
	options=4080000<LINKSTATE,MEXTPG>
	groups: tun
	nd6 options=109<PERFORMNUD,IFDISABLED,NO_DAD>
	Opened by PID 1452

netstat -rn

Routing tables

Internet:
Destination        Gateway            Flags         Netif Expire
0.0.0.0/1          link#5             US              wg0
default            192.168.88.1       UGS           wlan0
10.14.0.2          link#2             UH              lo0
85.204.70.87       192.168.88.1       UGHS          wlan0
128.0.0.0/1        link#5             US              wg0
192.168.88.0/24    link#3             U             wlan0
192.168.88.51      link#2             UHS             lo0

Ruta por defecto

Ruta por defecto (default) 192.168.88.1 por wlan0 es la ruta genérica, pero no es la que se usa para la mayoría del tráfico.

Rutas VPN (Wireguard)
0.0.0.0/1 y 128.0.0.0/1 ambas apuntan a wg0

Estas dos rutas cubren todo el rango IPv4 (0.0.0.0/1 y 128.0.0.0/1 = 0.0.0.0/0).

Como son más específicas que default, todo el tráfico (excepto las excepciones) se envía por wg0, es decir, por la VPN

Excepción para el servidor VPN

85.204.70.87 va directamente por wlan0 (gateway local)

Esa IP es el endpoint de WireGuard de Surfshark. Sin esta ruta, el tráfico del túnel intetaría pasar por el propio túnel (bucle) y fallaría.

Red local

192.168.88.0/24 por wlan0. Así puedes acceder a tu router, impresoras, etc., sin pasar por la VPN.

IP propia (loopback)

192.168.88.51 y 10.14.0.2 están en lo0 como direcciones locales (para evitar enrutamiento externo).

¿Qué significa esto en la práctica?

Tu IP pública (la que ven los sitios web) es la de Surfshark, no la de tu router.

El tráfico de navegación (HTTP/HTTPS, DNS, etc.) pasa por el túnel WireGuard.

El tráfico local (a tu router, otros PCs en 192.168.88.x) no pasa por la VPN.

El servidor VPN se alcanza directamente por WiFi, sin pasar por el túnel (para evitar bucles).

Tailscale está presente pero no parece estar enrutando tráfico por defecto (quizás solo para acceso a otros nodos).

Destruir lagg0 y limpiar wlan0

sudo ifconfig lagg0 destroy
sudo ifconfig wlan0 destroy

Crear wlan0 limpio con la configuración correcta

sudo ifconfig wlan0 create wlandev iwm0 country ES
sudo ifconfig wlan0 up

Archivo /etc/wpa_supplicant

 
/etc/wpa_supplicant.conf written by wifimgr(8)
ctrl_interface=/var/run/wpa_supplicant
eapol_version=2
fast_reauth=1

network={
	ssid="MikroTik-39F9C0"
	psk=755862a5b1a4ef59e9e62590977a75f5317193637a8629dccb18c40e8638a68e
}

Iniciar wpa_supplicant (si no está corriendo)

sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf

Esperar a que se asocie (opcional, pero recomendado)

sleep 5
ifconfig wlan0 | grep status

Asignar IP fija y ruta por defecto

sudo ifconfig wlan0 inet 192.168.88.51 netmask 255.255.255.0
sudo route add default 192.168.88.1

Reiniciar WireGuard para que use la nueva interfaz

sudo wg-quick down wg0 && wg-quick up wg0 # 0 sudo service wireguard restart

Archivo /etc/pf.conf

/etc/pf.conf
ext_if="wlan0"
torrent="53541"
vpn_if="wg0"
wireguard="51820"
lan_net="192.168.88.0/24"

set block-policy return
set skip on lo

scrub in on $ext_if all fragment reassemble

table <jails> persist

nat on $ext_if from <jails> to any -> ($ext_if:0)
rdr-anchor "rdr/*"

block in all

antispoof for $ext_if inet

# Salida: todo el tráfico local permitido y trackeado
pass out quick keep state

# Entrada SSH
pass in quick inet proto tcp from $lan_net to any port ssh flags S/SA keep state

# Entrada VPN WireGuard (túnel Surfshark)
pass in quick on $vpn_if all keep state
pass out quick on $vpn_if all keep state

# Entrada qBittorrent
pass in quick on $ext_if inet proto { tcp } to port $torrent

# Entrada ICMP básico (diagnóstico)
pass in quick on $ext_if inet proto { icmp } all icmp-type { echoreq, unreach }

Verificar

¿La ruta por defecto apunta a wlan0 y las rutas VPN cubren el resto?

netstat -rn | grep -E "(default|wg0|wlan0)"

¿WireGuard está activo?

wg show 
interface: wg0
  public key: pkpZvkWaVDd6DmEb3cl9DEvsnOKl9dvZVAP+KMJLZCs=
  private key: (hidden)
  listening port: 58461

peer: AsvLuvKKAGdc67aA/vHA3vb61S6YnDGx2Pd4aP4wal8=
  endpoint: 82.102.18.179:51820
  allowed ips: 0.0.0.0/0
  latest handshake: 1 minute, 14 seconds ago
  transfer: 1.39 MiB received, 1.51 MiB sent

ping -c 8.8.8.8

Mostrar la IP pública (la IP de Surfshark)

curl -s ifconfig.me
FreeBSD es genial!.

martes, 16 de diciembre de 2025

Cifrado por Envoltorio (túnel) del tráfico NFSv4 con Wireguard FreeBSD 14.3

Implementar cifrado por envoltorio (Wireguard) y proteger conexiones NFS entre un servidor y su(s) cliente(s).

Objetivos:

NFSv4 puro y limpio (solo puerto 2049).
Acceso exclusivo a través del túnel WireGuard (cifrado punto a punto).
Imposible acceder a los recursos desde la LAN física (bloqueado por PF).
Montajes persistentes y estables en el cliente.
Todo seguro, mínimo y sin componentes innecesarios corriendo.

Cómo implementar el cifrado por envoltorio: WireGuard

El servidor NFSv4 corre FreeBSD 14.3 ZFS, red 192.168.88.0/24, dominio local.com, nombre de host tormenta.local.com, dirección IP 192.168.88.160, interfaz re0, cortafuegos PF.

El cliente es un portátil con sistema operativo FreeBSD 14.3 ZFS, dirección IP 192.168.88.51, nombre de host solaris.local.com, interfaz de red em0. El archivo /etc/exports actual

V4: /nfsv4 -tls
/nfsv4/dellhome     -maproot=root -network 192.168.88.0/24 
/nfsv4/poolrecovery -maproot=root -network 192.168.88.0/24 
/nfsv4/docs         -maproot=root -network 192.168.88.0/24 
/nfsv4/confsolaris  -maproot=root -network 192.168.88.0/24 
/nfsv4/conftormenta -maproot=root -network 192.168.88.0/24
root@tormenta:~ # zfs list | grep /nfsv4 
zroot/nfsv4 103G 212G 7.80G /nfsv4 
zroot/nfsv4/confsolaris 283M 212G 4.76M /nfsv4/confsolaris 
zroot/nfsv4/conftormenta 916K 212G 852K /nfsv4/conftormenta 
zroot/nfsv4/dellhome 56.6G 212G 56.6G /nfsv4/dellhome 
zroot/nfsv4/docs 7.80G 212G 7.80G /nfsv4/docs 
zroot/nfsv4/poolrecovery 1.88G 212G 1.88G /nfsv4/poolrecovery 

La idea es crear un túnel VPN punto a punto entre el servidor (tormenta.local.com, 192.168.88.160) y el cliente (solaris.local.com, 192.168.88.51). De esta forma, el tráfico NFS se enruta exclusivamente a través del túnel encriptado de WireGuard, y configurar el servidor NFS para que solo escuche en la IP del túnel (evitando accesos directos por la LAN).

Forzar el cifrado para NFS, ya que ambos hosts están en la misma red LAN (192.168.88.0/24). Usar IPs privadas para el túnel: 10.66.66.1/32 para el servidor y 10.66.66.2/32 para el cliente. No es necesario forwarding ni NAT, ya que es un túnel simple para cifrar el tráfico local.

Verificar que no haya conflictos con reglas PF existentes. Si se usa NFSv4 puro, no se necesita rpcbind ni mountd, lo que simplifica las cosas


Detener servicios TLS

root@tormenta:/home/carlos # service tlsservd status
tlsservd is running as pid 1278.
root@tormenta:/home/carlos # service tlsservd stop
Stopping tlsservd.
Waiting for PIDS: 1278.

root@solaris:~# service tlsclntd status
tlsclntd is running as pid 1596.
root@solaris:~# service tlsclntd stop
Stopping tlsclntd.
Waiting for PIDS: 1596, 1596.

Desactivar TLS

root@tormenta:/home/carlos # sysrc tlsservd_enable="NO"
tlsservd_enable: YES -> NO

root@solaris:~# sysrc tlsclntd_enable="NO"
tlsclntd_enable: YES -> NO

Instalar wireguard-tools en el servidor tormenta y el cliente solaris

pkg install wireguard-tools
sysrc wireguard_enable="YES"
sysrc wireguard_interfaces="wg0"

En el servidor tormenta Generar claves privadas y públicas

mkdir /usr/local/etc/wireguard
cd /usr/local/etc/wireguard

umask 077
wg genkey | tee server_priv.key | wg pubkey > server_pub.key
wg genkey | tee client_priv.key | wg pubkey > client_pub.key

ls -l /usr/local/etc/wireguard
-rw-------  1 root wheel  45 Dec 11 18:28 client_priv.key
-rw-r--r--  1 root wheel  45 Dec 11 18:28 client_pub.key
-rw-------  1 root wheel  45 Dec 11 18:27 server_priv.key
-rw-r--r--  1 root wheel  45 Dec 11 18:27 server_pub.key

Esto genera claves para servidor y cliente

Transferir las claves al cliente solaris (IP 192.168.88.51), usando scp

scp root@tormenta:/usr/local/etc/wireguard/client_priv.key /usr/local/etc/wireguard/client_priv.key
scp root@tormenta:/usr/local/etc/wireguard/client_pub.key /usr/local/etc/wireguard/client_pub.key

Asegurar permisos estrictos (chmod 600 *.key)

cd /usr/local/etc/wireguard/
chmod 600 *.key

ls -l /usr/local/etc/wireguard/
-rw-------  1 root wheel  45 Dec 11 18:30 client_priv.key
-rw-------  1 root wheel  45 Dec 11 18:31 client_pub.key

Configurar WireGuard en el servidor tormenta

Archivo /usr/local/etc/wireguard/wg0.conf

###########################################
[Interface]
Address = 10.66.66.1/32
PrivateKey = <contenido de server_priv.key>
ListenPort = 51820

[Peer]
PublicKey = <contenido de client_pub.key>
AllowedIPs = 10.66.66.2/32

Reemplazar las claves por las claves reales

[Interface]
Address = 10.66.66.1/32
PrivateKey = oPtSkHSk8zNe9d3Z6gExZro9Cf8BELoahgZDsrc/7mk=
ListenPort = 51820

# conexion con clientes
[Peer]
PublicKey = tuu6a6EAPrQTC0tPatWJx2qcS6fEPcg4Z0u/8vY1pTs= 
AllowedIPs = 10.66.66.2/32
###########################################

Habilitar e iniciar el servicio

sysrc wireguard_interfaces="wg0"
sysrc wireguard_enable="YES"
service wireguard start
|

Acvitar desactivar interfaz wg0

wg-quick up wg0
wg-quick down wg0

Comprobar con wg show, debería mostrar la interfaz wg0 levantada

root@tormenta:/home/carlos # wg show
interface: wg0
  public key: UYbDhuNsq0geqJdsVKThSnNLzdc2oHWgUT8Gb0G3VXU=
  private key: (hidden)
  listening port: 51820

peer: tuu6a6EAPrPTC0tPatWJx2qcS6fEPcg4Z0u/8vY1pTs=
  allowed ips: 10.66.66.2/32

Configurar WireGuard en el cliente (solaris)

Archivo /usr/local/etc/wireguard/wg0.conf
###########################################
[Interface]
Address = 10.66.66.2/32
PrivateKey = <contenido de client_priv.key>

[Peer]
PublicKey = <contenido de server_pub.key>
AllowedIPs = 10.66.66.1/32
Endpoint = 192.168.88.160:51820

Reemplazar con las claves reales

[Interface]
Address = 10.66.66.2/32
PrivateKey = sAvZnwh/8xrLLNTxBu75UfvUPB/AhFQTJsUGqYTfUU0=

[Peer]
PublicKey = UYbDhuNsq0geqWdsVKXhSnNLzdc2oHWgUT8Zb0G3VXU=
AllowedIPs = 10.66.66.1/32
Endpoint = 192.168.88.160:51820
###########################################
sysrc wireguard_interfaces="wg0"
sysrc wireguard_enable="YES"
service wireguard start

Levantar interfaz wg0

# wg-quick up wg0
[#] ifconfig wg create name wg0
[#] wg setconf wg0 /dev/stdin
[#] ifconfig wg0 inet 10.66.66.2/32 alias
[#] ifconfig wg0 mtu 1420
[#] ifconfig wg0 up
[#] route -q -n add -inet 10.66.66.1/32 -interface wg0
[+] Backgrounding route monitor

Comprobar wg show debería mostrar el peer conectado.

wg show
interface: wg0
  public key: tuu6a6EAPrPTC0tPatWJx2qcS6fEPcg4Z0u/8vY1pTs=
  listening port: 26481

peer: UYbDhuNsq0geqWdsVKThSnNLzdc2oHWgUT8Gb0G3VXU=
  endpoint: 192.168.88.160:51820
  allowed ips: 10.66.66.1/32
  

Reglas cortafuegos PF (tormenta)

# Regla PF Wireguard antes Anti-spoofing + bogons - permite solo desde el cliente
pass in quick on $lan_if proto udp from 192.168.88.51 to 192.168.88.160 port 51820 keep state
# permite todo dentro del tunel
pass in quick on wg0 keep state # <-- esta es la importante <-p>

Recargar PF

service pf reload 
pfctl -f /etc/pf.conf

Verificar ping, desde el cliente solaris

root@solaris:~# ping 10.66.66.1
PING 10.66.66.1 (10.66.66.1): 56 data bytes
64 bytes from 10.66.66.1: icmp_seq=0 ttl=64 time=0.463 ms
64 bytes from 10.66.66.1: icmp_seq=1 ttl=64 time=0.524 ms

--- 10.66.66.1 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.463/0.494/0.524/0.031 ms

Verificar ping, desde el servidor tormenta

root@tormenta:~# ping -c2 10.66.66.2
PING 10.66.66.2 (10.66.66.2): 56 data bytes
64 bytes from 10.66.66.2: icmp_seq=0 ttl=64 time=0.429 ms
64 bytes from 10.66.66.2: icmp_seq=1 ttl=64 time=0.526 ms

--- 10.66.66.2 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.429/0.478/0.526/0.049 ms

ping bidireccional exitoso.

Configurar el cortafuegos PF en el servidor (tormenta)

Para permitir el tráfico WireGuard (UDP puerto 51820), agregar reglas a /etc/pf.conf. Asume que ya tienes PF configurado.

pass in quick on re0 proto udp from 192.168.88.51 to 192.168.88.160 port 51820 keep state

Recargar PF

service pf reload
pfctl -p /etc/pf.conf

Configurar NFSv4 para que solo escuche en la IP del túnel


En el servidor (tormenta), asegurar NFSv4 puro en /etc/rc.conf

nsf_server_enable="YES"
nfsv4_server_enable="YES"
nfs_server_flags="-h 10.66.66.1" # Bind sólo a la IP del túnel
nfsuserd_enable="YES" # necesario si se usa dominio

Iniciar servicios

service nfsd start
service nfsuserd start

Es es para que nfsd sólo escuche en 10.66.66.1, (no en 192.168.88.160).

Deshabilitar rpcbind_enable y mountd_enable, no son necesarios para NFSv4 puro.

Realizar los cambios en /etc/exports para restringir accesos sólo al cliente del túnel
(cambiar de red a host -network a -host).

############################################
V4: /nfsv4
/nfsv4/dellhome -maproot=root 10.66.66.2
/nfsv4/poolrecovery -maproot=root 10.66.66.2
/nfsv4/docs -maproot=root 10.66.66.2
/nfsv4/confsolaris -maproot=root 10.66.66.2
/nfsv4/conftormenta -maproot=root 10.66.66.2
############################################

Esto permite solo desde 10.66.66.2 (el cliente vía túnel).

Reiniciar NFS y nfsuserd

service nfsd restart
service nfsuserd restart

Montar NFS en el cliente (solaris) a través del tŕunel


En el cliente montar usando la IP del túnel del servidor, por ejemplo:

mount -t nfs -o nfsv4 10.66.66.1:/docs /mnt/docs

Para montajes persistentes, se utiliza /etc/fstab

10.66.66.1:/poolrecovery     /nisc4    nfs     rw,nfsv4,noatime,bg    0  	0
10.66.66.1:/confsolaris      /nics4    nfs     rw,nfsv4,noatime,bg	  0  	0
10.66.66.1:/conftormenta     /nits4    nfs     rw,nfsv4,noatime,bg	  0  	0
10.66.66.1:/docs             /nids4    nfs     rw,nfsv4,noatime,bg    0  	0
10.66.66.1:/dellhome 	     /nihs4    nfs     ro,nfsv4,noatime,bg	  0  	0

Consideraciones adicionales

Asi queda el archivo /etc/rc.conf (solaris)

$ gsed -e '/^#/d' -e '/^\s*$/d'

syslogd_flags="-ss"
clear_tmp_enable="YES"
hostname="solaris.local.com"
gateway_enable="NO"
ifconfig_em0="inet 192.168.88.51 netmask 255.255.255.0"
defaultrouter="192.168.88.1"
background_dhclient=YES
defaultroute_delay=3
defaultroute_carrier_delay=3
sshd_enable="NO"
ntpd_enable="YES"
ntpd_sync_on_start="YES"
powerd_enable="YES"
powerd_flags="-n hadp"
loader_conf_files="/boot/loader.conf /boot/loader.conf.local"
boot_efi_enable="YES"
webcamd_enable="YES"
moused_port=/dev/ums0
moused_enable="YES"
dumpdev="NO"
zfs_enable="YES"
dbus_enable="YES"
kld_list="i915kms"
nfs_client_enable="YES"
nfsuserd_enable="YES"
nfsv4_client_enable="YES"
nfsv4_domain="local.com"
tlsclntd_enable="NO"
hostid_enable="YES"
hostid_file="/etc/hostid"
autofs_enable="YES"
devd_enable="YES"
devfs_system_ruleset="system"
pf_enable="NO"
pf_rules="/etc/pf.conf"
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""
wireguard_enable="YES"
wireguard_interface="wg0"
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
lightdm_enable="YES"
zerotier_enable="YES"
vm_dir="zfs:zroot/vm"
vm_list=""
vm_delay="3"
poudriered_enable="YES"
nginx_enable="YES"
memcached_enable="YES"
memcached_flags="-l localhost -m 8192"
jackett_enable="YES"
linux_enable="NO"
ubuntu_enable="YES"
Asi queda /etc/pf.conf
lan_if   = "re0"
lan_net  = "192.168.88.0/24"
lan_ip   = "192.168.88.160"  
ssh_port     = "{ 22 }"
vpn_if="wg0"

set block-policy return         # responde ICMP/TCP-RST a paquetes bloqueados
set ruleset-optimization none   # en FreeBSD 14 no usa "basic" ni "high-latency"
set skip on lo0

match in all scrub (no-df random-id max-mss 1440)
table <bruteforce> persist       # aquí meterá sshguard, pf-badhost, etc.

pass in quick on $lan_if from $lan_net to $lan_ip keep state
pass in quick on $lan_if proto udp from 192.168.88.51 to 192.168.88.160 port 51820 keep state
pass in quick on wg0 keep state # <-- esta es la importante

block in quick on ! $lan_if from $lan_net to any
block in quick on ! $lan_if from 192.168.0.0/16 to any
block in quick on ! $lan_if from 172.16.0.0/12 to any
block in quick on ! $lan_if from 10.0.0.0/8 to any
block in quick from any to { 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, ::/128, 0.0.0.0/8 }
block in quick from <bruteforce>

pass quick on lo0all
pass out quick inet keep state
pass in on $lan_if inet proto icmp from $lan_net to $lan_ip icmp-type echoreq keep state
pass out on $lan_if inet proto icmp from $lan_ip to $lan_net icmp-type echorep keep state
pass in on $lan_if proto tcp from $lan_net to $lan_ip port $ssh_port flags S/SFRA keep state
pass quick on $lan_if proto { tcp udp } from $lan_net to $lan_ip port 53
pass out proto udp from any to port 123 keep state
block log all

Asi queda /etc/exports

$ gsed -e '/^#/d' -e '/^\s*$/d' /etc/exports
V4: /nfsv4
/nfsv4/dellhome		-maproot=root 10.66.66.2
/nfsv4/poolrecovery 	-maproot=root 10.66.66.2
/nfsv4/docs 		-maproot=root 10.66.66.2
/nfsv4/confsolaris 	-maproot=root 10.66.66.2
/nfsv4/conftormenta 	-maproot=root 10.66.66.2

Commprobaciones finales En el servidor tormenta no debe aparecer rpcbind ni statd

root@tormenta:/etc # ps aux | grep -E "(statd|rpcbind|nfs)"
root    1192   0.0  0.0 14140  2380  -  Is   09:34      0:00.00 nfsuserd: master (nfsuserd)
root    1194   0.0  0.0 14140  2384  -  I    09:34      0:00.02 nfsuserd: server (nfsuserd)
root    1195   0.0  0.0 14140  2384  -  S    09:34      0:00.02 nfsuserd: server (nfsuserd)
root    1196   0.0  0.0 14140  2380  -  I    09:34      0:00.00 nfsuserd: server (nfsuserd)
root    1197   0.0  0.0 14140  2384  -  I    09:34      0:00.01 nfsuserd: server (nfsuserd)
root    2398   0.0  0.0 13756  2472  -  Ss   12:23      0:00.01 nfsd: master (nfsd)
root    2399   0.0  0.0 13756  2756  -  S    12:23      0:00.08 nfsd: server (nfsd)

En el cliente solaris remontar directorios

root@solaris:~# umount /nisc4 /nics4 /nits4 /nids4 /nihs4
root@solaris:~# mount -a

root@solaris:~# mount | grep 10.66.66.1
10.66.66.1:/poolrecovery on /nisc4 (nfs, noatime, nfsv4acls)
10.66.66.1:/confsolaris on /nics4 (nfs, noatime, nfsv4acls)
10.66.66.1:/conftormenta on /nits4 (nfs, noatime, nfsv4acls)
10.66.66.1:/docs on /nids4 (nfs, noatime, nfsv4acls)

NFSv4 puro, solo puerto 2049 a través del túnel WireGuard, sin dependencias de rpcbind ni demonios extra.

FreeBSD es genial!.

martes, 11 de julio de 2023

Servidor VPN con ZeroTier FreeBSD Raspberry Pi

Para crear una VPN se necesita:

1.- Un Servidor VPN
2.- Configuración de los clientes VPN
3.- Servicio DDNS (para conocer la IP pública de nuestro servidor)
4.- Abrir los puertos en el Router y poder acceder desde el exterior al servidor VPN
5.- No estar detrás de un CG-NAT.

Como acceder a nuestra red de una manera segura, cifrada (cifrado de 256 bits), saltándonos el CG-NAT en caso de que nuestro proveedor de Internet lo utilice, sin abrir puertos y sin servicio DDNS?.

La respuesta es el servicio ZeroTier, (SD-WAN), gratuito para uso personal (25 dispositivos). Con ZeroTier podremos unir equipos, unir redes, tanto si están dentro de la red como fuera de la misma. Podremos acceder desde cualquier ordenador, teléfono, cualquer dispositivo que tengamos dentro de nuestra red pero desde fuera de la red.

Para conseguirlo utilizaremos una raspberrypi (Raspberry Pi 3B) y la convertimos en un servidor VPN. Instalamos el sistema operativo raspbian en un disco externo SSD Intel de 40GB. No es necesario configurar una dirección estática porque no se usa el reenvío de puertos en el Router. Y sí, necesitamos el acceso vía SSH por lo que lo habilitaremos.

La red virtual asignada por ZeroTier es la 192.168.192.0/24, también puede crear su propia red o elegir otra red de las ofrecidas por ZeroTier desde su panel dec control. Debe ser una subred diferente a la subred que tenemos. Por ejemplo, yo tengo la subred 192.168.88.0/24 que no coincide con la red virtual de ZeroTier, la 192.168.192.0/24.

La dirección IP de mi servidor VPN es 192.168.8.12 accedemos a través de un portátil FreeBSD a la Raspberry Pi a través de la red.

% ssh carlos@192.168.88.12

ifconfig servidor VPN

ifconfig solaris FreeBSD

Como utilizaremos Zerotier para construir nuestro propio servidor VPN nos vamos a la página principal de ZeroTier, nos registramos (gratuito para uso personal y menos de 25 computadoras), habilitamos 2 factor authentication, creamos una Red y utilizamos el Network ID o identificador de red para conectar los clientes a esa red.


 

ZeroTier permite enrutar entre una red física y una red privada virtual para que los dispositivos remotos puedan acceder a los recursos locales a través de Internet.

Instalar Zerotier

carlos@raspberrypi3:~ $ sudo apt install zerotier-one

Unirse a la red

carlos@raspberrypi3:~ $ sudo zerotier-cli join 565799d8f6259736
	
carlos@raspberrypi3:~ $ sudo zerotier-cli status
200 info 7dd6...... 1.10.6 ONLINE

Listar redes

carlos@raspberrypi3:~ $ sudo zerotier-cli listnetworks
200 listnetworks <nwid> <name> <mac> <status> <type> <dev> <ZT assigned ips>
200 listnetworks 565799d8f6259736 home_arpa 4e:0c:37:66:55:d8 OK PRIVATE zt2lrsbp44 fccc:d2b0:827d:d6b6:9b19::1/40,192.168.192.119/24

Mostrar información de estado

carlos@raspberrypi3:~ $ sudo zerotier-cli info
200 info 7dd....... 1.10.6 ONLINE

Conexión peer to peer listar peers

carlos@raspberrypi3:~ $ sudo zerotier-cli listpeers

A continuación vamos a la página de Zerotier nos logueamos y permitimos que esa computadora se una a la red de zerotier (autorizar - Auth?) y le ponemos un nombre para identificarlo. Repetimos lo mismo para los demás dispositivos (teléfono móvil, iPads, PC, etc.).

Instalar ZeroTier en FreeBSD 13.1

# pkg install zerotier
# sysrc zerotier_enable=YES

Iniciar el servicio

# service zerotier start

Unirse a la red

# zerotier-cli join 565799d8f6259736

Comprobar estado

# zerotier-cli status
200 info 6a58..... 1.10.2 ONLINE

Salir de la red

# zerotier-cli leave 565799d8f6259736

Para configuración adicional consulte la página de zerotier

https://www.zerotier.com/manual.shtml

Crear las rutas

A continuación enrute entre las dos redes; física y red virtual zerotier para que las computadoras remotas puedan acceder a la red local utilizando la computadora de destino.

Rango de mi red local 192.168.88.0/24

192.168.88.0/24 a través de la ip asignada a la raspberrypi3 (VPN) por ZetoTier -> 192.168.192.119

Add Routes 
Destination		    Via
192.168.88.0/24		192.168.192.119

FIGURA zerotier-rutas-4.png 

 


Ahora se configura el reenvío de puertos en la raspberrypi3 y activar el reenvío de tráfico entre las dos interfaces de red, la interface eth0 y la interfaz de red de Zerotier. Para ello:

Habilitar el reenvio de paquetes entre dos interfaces (IP forwarding), la interfaz de red fisica y la interfaz de zerotier

echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf

$ sudo sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

Y finalmente estos comandos para permitir el paso de tráfico entre las dos interfaces

https://zerotier.atlassian.net/wiki/spaces/SD/pages/224395274/Route+between+ZeroTier+and+Physical+Networks
PHY_IFACE=eth0; ZT_IFACE=zt2lrsbp44

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o zt2lrsbp44 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i zt2lrsbp44 -o eth0 -j ACCEPT

sudo apt install iptables-persistent
# bash -c iptables-save > /etc/iptables/rules.v4

1.- Apague el wifi en tu teléfono
2.- Únase a la red zerotier, autorízalo
3.- Intente acceder a algo en la LAN física

Desde mi iPhone descargo las App Zerotier y Termius: Terminal & SSH client

Estoy conectado a Internet a través de la VPN que acabo de crear, también puedo entrar vía SSH a los dispositivos configurados para ese fin.










 

 

Reglas del Firewall PF FreeBSD

###################################################################
int_if = "em0"
lan_net = "192.168.88.0/24"

rfc1918 = "{ 127.0.0.0/8, 172.16.0.0/12, \
169.254.0.0/16, 192.0.2.0/24, \
0.0.0.0/8, 240.0.0.0/4, 224.0.0.0/3 }"

#tcp_pass="{ 22 53  80 123 111 443 832 1110 1651 2049 3000 8000 8080 20049 }"
#udp_pass="{ 53 111 832 1110 1651 2049 20049 }"
#tcp_pass="{ 22 53  80 123 111 443 1110 3000 8000 8080 }"
#udp_pass="{ 53 111 1110 9993}"

# scrub incoming packets
scrub in all

# setup a default deny policy
block in all
block out all

# pass traffic on the loopback interface in either direction
pass quick on lo0 all

# activate spoofing protection for the internal interface.
antispoof quick for $int_if inet

############
block drop in quick on $int_if from $rfc1918 to any
block drop out quick on $int_if from any to $rfc1918
############

# only allow ssh connections from the local network if it‘s from the
# trusted computer, 192.168.0.15. use "block return" so that a TCP RST is
# sent to close blocked connections right away. use "quick" so that this
# rule is not overridden by the "pass" rules below.
# block return in quick on $int_if proto tcp from ! 192.168.0.15 \
# to $int_if port ssh flags S/SA
block return in quick proto tcp from ! 192.168.192.0/24 port ssh flags S/SA

# pass all traffic to and from the local network
pass in on $int_if from $lan_net to any
pass out on $int_if from any to $lan_net

# pass out on se refiere al trafico de salida
#pass out quick on $int_if proto tcp to any port $tcp_pass keep state
#pass out quick on $int_if proto udp to any port $udp_pass keep state

# pass tcp, udp, and icmp out on the external (Internet) interface.
# keep state on udp and icmp and modulate state on tcp.
pass out on $int_if proto tcp all modulate state flags S/SA
pass out on $int_if proto { udp, icmp } all keep state

# allow ssh connections in on the external interface as long as they‘re
# NOT destined for the firewall (i.e., they‘re destined for a machine on
# the local network). log the initial packet so that we can later tell
# who is trying to connect. use the tcp syn proxy to proxy the connection.
#pass in log on $ext_if proto tcp from any to { !$ext_if, !$int_if } \
#port ssh flags S/SA synproxy state
pass in log proto tcp from any to { !$int_if } port ssh flags S/SA synproxy state
#################################################################################
FreeBSD es genial!.

martes, 3 de noviembre de 2020

Configurar VPN Acceso Remoto Mikrotik BGP


Configurar VPN para Acceso Remoto

Necesitamos un VPS (Cloud Compute), un servidor básico, por ejemplo, un chr de Mikrotik cuyo proceso de instalación detallamos en un vídeo anterior.

Para conseguirlo haremos un túnel VPN y enrutamiento BGP (configuración básica) y declarar las redes para que todo funcione. Lo ideal es tener una red ruteada (OSPF) para que conectando al core principal toda la red sea accesible. Hetzner nos otorgará a través del servidor cloud chr una dirección IP pública accesible desde Internet.

La prueba la haremos conectandonos desde un teléfono móvil hacia el cloud.

Abrimos el Winbox y accedemos a nuestro cloud chr Mikrotik que habíamos configurado en la nube de Hetzner. 


Una vez en nuestro cloud chr activamos el PPTP Server (Protocolo inseguro, creado solo para realizar el laboratorio. Para equipos en producción usaremos VPN SSTP. 


En el firewall vamos a agregar una regla NAT que hará NAT a todo lo que llegue al router -> IP -> Firewall -> Nat




En IP DNS no hace falta cambiar nada, las DNS vienen configuradas por defecto.


Vamos a crear un Profile Name: userpptp, encriptación obligarotira, Local Address 4.1.1.1, Remote Address 4.1.1.2 y un Secret con contraseña, Service pptp y el Profile userpptp.




Ahora vamos a nuestro Router de Borde (BordeRouter) y creamos el cliente pptp con los datos del servidor pptp y la IP pública del chr.




Una vez levantado el túnel VPN podemos proceder con el enrutamiento a nivel de BGP para acceder a nuestro router de manera transparente.

En nuestro cloud chr vamos a crear nuestra intefaz lógica Loopback.



Le asignamos una dirección IP a la interfaz Loopback con el que identificaremos al router chr.


Entramos en Routing BGP y le asignamos para crear una Instance, el AS lo identificamos con un número, por ejemplo, 150 y Router ID 1.1.5.3, que es la IP que hemos asignado a la interfáz lógica Loopback.


En el otro router BordeRouter, creamos la Instance BGP, al AS le asignamos un número, por ejemplo 900:


Regresamos al chr y creamos un Peer, la instancia default y la dirección remota 4.1.1.2.


Volvemos a nuestro BordeRouter y creamos el BGP Peer, donde la IP remota es 4.1.1.1 que es la dirección IP del túnel pptp y el AS del chr que es 450.





En este punto nuestros dos routers son accesibles, nuestro router en la nube chr y nuestro BordeRouter, pueden comunicarse y comparten rutas e ips.


Router list BordeRouter


En la pestaña BGP Networks se agregan todas las subredes detrás del router a las que queremos tener acceso. Por ejemplo:


Vamos a crear nueva credencial para conectar un teléfono móvil a nuestro router en la nube.

PPP -> Secrets -> PPP Secret

Name: phone
Password: **********
Service: pptp
profile: default
Local Address: 4.1.1.3
Remote Address: 4.1.1.4

Apply y OK


Para establecer la conexión, lógicamente desde fuera de la red, utilizo los datos de mi proveedor de telefonía (Simyo), creando una nueva conexión VPN del tipo PPTP.




Conexión establecida:



Desactivar BtServer


Implementando reglas básicas de seguridad en el Firewall

/ip firewall filter printFlags: X - disabled, I - invalid, D - dynamic 0 ;;; Aceptar tr·fico SSTP que vaya a cualquier lugar, protocolo TCP, puerto 443. chain=input action=accept protocol=tcp port=443 log=no log-prefix="" 1 ;;; Permitir conexiones nuevas desde mi LAN chain=input action=accept connection-state=new src-address=192.168.88.0/24 log=no log-prefix="" 2 ;;; Permitir trafico establecido. chain=input action=accept connection-state=established log=no log-prefix="" 3 ;;; Permitir trafico relacionado chain=input action=accept connection-state=related log=no log-prefix="" 5 ;;; Permitir trafico SSH VPN destinado al puerto 2222. chain=input action=accept protocol=tcp dst-port=2222 log=no log-prefix="" 6 ;;; Permitir trafico Loopback-BGP. Puerto por defecto BGP 179 TCP chain=input action=accept protocol=tcp dst-port=179 log=no log-prefix="" 7 ;;; Permitir trafico ppptp-userpptp.Puerto por defecto 1723 en TCP. chain=input action=accept protocol=tcp dst-port=1723 log=no log-prefix="" 8 ;;; Permitir puerto 8291 Winbox chain=input action=accept protocol=tcp in-interface=ether1 dst-port=8291 log=no log-prefix="" 9 ;;; Denegar todo lo demas. chain=input action=drop log=no log-prefix="" 10 chain=forward action=jump jump-target=tcp protocol=tcp log=no log-prefix="" 11 ;;; Denegar conexiones invalidas chain=forward action=drop connection-state=invalid log=no log-prefix="" 12 ;;; Denegar conexiones NBT a los puertos 137-139 chain=tcp action=drop protocol=tcp dst-port=137-139 log=no log-prefix="" 13 ;;; Denegar conexiones cifs al puerto 445 chain=tcp action=drop protocol=tcp dst-port=445 log=no log-prefix="" 14 ;;; Denegar conexiones RPC portmapper al puerto 135 chain=tcp action=drop protocol=tcp dst-port=135 log=no log-prefix="" 15 ;;; Denegar conexionex TFTP al puerto 69. chain=tcp action=drop protocol=tcp dst-port=69 log=no log-prefix="" 16 ;;; Permitir conexionex establecidas chain=forward action=accept connection-state=established log=no log-prefix="" 17 ;;; Permitir conexiones relacionadas chain=forward action=accept connection-state=related log=no log-prefix=""  18 chain=forward action=drop log=no log-prefix="" Flags: X - disabled, I - invalid, D - dynamic 0 ;;; Hacer NAT a todo chain=srcnat action=masquerade log=no log-prefix="" > ip firewall raw print Flags: X - disabled, I - invalid, D - dynamic 0 ;;; Denegar consultas DNS desde WAN protocolo udp. chain=prerouting action=drop in-interface=ether1 dst-port=53 log=no log-prefix="" protocol=udp 1 ;;; Denegar consultas DNS desde WAN protocolo tcp. chain=prerouting action=drop in-interface=ether1 dst-port=53 log=no log-prefix="" protocol=tcp 2 ;;; Denegar conexiones entrantes al puerto SSH chain=prerouting action=drop in-interface=ether1 dst-port=22 log=no log-prefix="" protocol=tcp

Mikrotik es genial!