Reverse Proxy (Ngins Proxy Manager) + Hairpin NAT + Servicios NAS Synology

Buenas tardes compañeros,

Me gustaría comentar con vosotros un reto que estoy llevando a cabo para ver si podéis echarme un cable con los problemas que me estoy encontrando.

Hasta la fecha he tenido un ecosistema con Mikrotik RB4011 + NAS Synology con docker para servicios esenciales tipo pi-hole, plex, tautulli, home assistant, etc. De estos servicios el único que tenía publicado a internet hasta la fecha era Home Assistant así que creé una regla para el Hairpin NAT en la que apuntaba el 443 directamente al puerto 8123 que era donde se ejecutaba Home Assistant (allí configuraba los certificados para SSL).

1658410941986.png


Esto ha ido creciendo y tengo otros servicios que quería exponer a internet por lo que no me ha quedado más remedio que tirar de un Reverse Proxy (NPM) y dirigir el 443 de Mikrotik a este proxy (al 1443 en este caso). Así que ya es el NPM el que este gestiona los hosts de subdominio (homeassistant.midominio.com, drive.midominio.com, plex.midominio.com, etc.) Hasta aquí todo genial porque he conseguido que una petición tanto interna como externa a mi red por HTTPS, al 443 la capture esta regla de Mikrotik y me la envíe al NPM...y éste me redirige correctamente a cada uno de estos servicios ya por HTTP.

La duda que me ha surgido ha sido al utilizar el navegador para acceder a alguno de esos servicios, ya sabemos cómo se comportan y dependiendo sus cacheados y demás a veces te lanzan por HTTP y otra por HTTPS si no les escribes el protocolo pertinente de prefijo. Entonces...empieza el bacalao.

Lo que quiero es poder redirigir las peticiones internas por HTTP a HTTPS, esto sería sencillo si hiciera la misma regla de Hairpin NAT para el 80 pero no quiero abrirlo a internet. La idea sería hacer la redirección del 80 al 1443 (NPM) sin abrir dicho puerto a internet.

Leyendo un post de @pokoyo para prescindir del Hairpin a través del DNS se me había iluminado, he tratado de configurar estos subdominios en el DNS pero cuando me redirige a la IP interna que devuelve el DNS me arranca la interfaz del Synology NAS (DSM), parece como que no hace la redirección al 1443 del NPM si no que me lo manda directamente al 80 del NAS.

No sé si lo que estoy queriendo hacer es fumarme un canuto pero la verdad es que sería muy útil y creo que no vulneraría la seguridad puesto que hacia fuera, sólo tendría el 443 expuesto.

¿Qué me estoy dejando? ¿qué posibilidades o forma correcta de hacerlo hay?

Saludos,
 
Buenas tardes compañeros,

Me gustaría comentar con vosotros un reto que estoy llevando a cabo para ver si podéis echarme un cable con los problemas que me estoy encontrando.

Hasta la fecha he tenido un ecosistema con Mikrotik RB4011 + NAS Synology con docker para servicios esenciales tipo pi-hole, plex, tautulli, home assistant, etc. De estos servicios el único que tenía publicado a internet hasta la fecha era Home Assistant así que creé una regla para el Hairpin NAT en la que apuntaba el 443 directamente al puerto 8123 que era donde se ejecutaba Home Assistant (allí configuraba los certificados para SSL).

Ver el adjunto 97089

Esto ha ido creciendo y tengo otros servicios que quería exponer a internet por lo que no me ha quedado más remedio que tirar de un Reverse Proxy (NPM) y dirigir el 443 de Mikrotik a este proxy (al 1443 en este caso). Así que ya es el NPM el que este gestiona los hosts de subdominio (homeassistant.midominio.com, drive.midominio.com, plex.midominio.com, etc.) Hasta aquí todo genial porque he conseguido que una petición tanto interna como externa a mi red por HTTPS, al 443 la capture esta regla de Mikrotik y me la envíe al NPM...y éste me redirige correctamente a cada uno de estos servicios ya por HTTP.

La duda que me ha surgido ha sido al utilizar el navegador para acceder a alguno de esos servicios, ya sabemos cómo se comportan y dependiendo sus cacheados y demás a veces te lanzan por HTTP y otra por HTTPS si no les escribes el protocolo pertinente de prefijo. Entonces...empieza el bacalao.

Lo que quiero es poder redirigir las peticiones internas por HTTP a HTTPS, esto sería sencillo si hiciera la misma regla de Hairpin NAT para el 80 pero no quiero abrirlo a internet. La idea sería hacer la redirección del 80 al 1443 (NPM) sin abrir dicho puerto a internet.

Leyendo un post de @pokoyo para prescindir del Hairpin a través del DNS se me había iluminado, he tratado de configurar estos subdominios en el DNS pero cuando me redirige a la IP interna que devuelve el DNS me arranca la interfaz del Synology NAS (DSM), parece como que no hace la redirección al 1443 del NPM si no que me lo manda directamente al 80 del NAS.

No sé si lo que estoy queriendo hacer es fumarme un canuto pero la verdad es que sería muy útil y creo que no vulneraría la seguridad puesto que hacia fuera, sólo tendría el 443 expuesto.

¿Qué me estoy dejando? ¿qué posibilidades o forma correcta de hacerlo hay?

Saludos,
No te líes. O accedes a todo vía https+hairpin nat, o internamente accedes por http (no necesitas cifrar el tráfico para nada). Metes entradas estáticas en el dns que apunten a las IPs internas de los servicios, sin pasar por el proxy reverso, y andando. Lo que sí que puedes hacer es forzar que el proxy reverso no acepte http, y redirija toda petición que reciba al puerto https.

Saludos!
 
No te líes. O accedes a todo vía https+hairpin nat, o internamente accedes por http (no necesitas cifrar el tráfico para nada). Metes entradas estáticas en el dns que apunten a las IPs internas de los servicios, sin pasar por el proxy reverso, y andando. Lo que sí que puedes hacer es forzar que el proxy reverso no acepte http, y redirija toda petición que reciba al puerto https.

Saludos!

Qué bueno leerte maestro.

Sí, estoy en eso, sólo que hay algo que se me complica. Me explico:

- Los servicios tipo pihole.midominio.com los tengo "dentro" del NAS por lo que la IP a la que debe apuntar el DNS es la propia del NAS y cuando lo pongo en el Static DNS de Mikrotik...me abre la interfaz de Synology. Es decir, necesitaría añadirle "el sufijo" del puerto a la petición por lo que pierde el sentido el proxy inverso para la LAN.

Creo que lo que tengo complicado es que los servicios de la LAN no tienen su propia IP.

¿Es correcto?
 
Qué bueno leerte maestro.

Sí, estoy en eso, sólo que hay algo que se me complica. Me explico:

- Los servicios tipo pihole.midominio.com los tengo "dentro" del NAS por lo que la IP a la que debe apuntar el DNS es la propia del NAS y cuando lo pongo en el Static DNS de Mikrotik...me abre la interfaz de Synology. Es decir, necesitaría añadirle "el sufijo" del puerto a la petición por lo que pierde el sentido el proxy inverso para la LAN.

Creo que lo que tengo complicado es que los servicios de la LAN no tienen su propia IP.

¿Es correcto?
En ese caso: hairpin, y accede por prefijo dns a los chismes, vía el proxy reverso. Al igual que puedes configurar nombre de dominio externo para acceder desde fuera, de igual forma puedes hacerlo con un dominio interno, no expuesto a internet.

Saludos!
 
Efectivamente, esto es lo que no acaba de funcionarme.

Meto subdominio en DNS de Mikrotik (a la IP del NAS), el subdominio está creado en Reverse Proxy pero me genera dudas si debo hacer algún cambio en la regla hairpin para que una vez me resuelva el dns la IP interna...me redirija al puerto correcto del Proxy...
 
Efectivamente, esto es lo que no acaba de funcionarme.

Meto subdominio en DNS de Mikrotik (a la IP del NAS), el subdominio está creado en Reverse Proxy pero me genera dudas si debo hacer algún cambio en la regla hairpin para que una vez me resuelva el dns la IP interna...me redirija al puerto correcto del Proxy...
Mándame lo que tienes y lo que no te funciona.

Saludos!
 
Hola @pokoyo

Te pego mi config, quito lo que creo que no es relevante y remarco lo que estamos comentando:

Configuración básica de interfaces e IP:

/interface bridge
add admin-mac=08:55:31:6D:24:37 auto-mac=no comment=defconf name=bridge \
protocol-mode=none
/interface ethernet
set [ find default-name=ether10 ] poe-out=forced-on
set [ find default-name=sfp-sfpplus1 ] disabled=yes
/interface wireless
set [ find default-name=wlan1 ] band=5ghz-a/n/ac channel-width=\
20/40/80mhz-XXXX country=spain distance=indoors frequency=auto \
installation=indoor mode=ap-bridge secondary-frequency=auto ssid=\
MikroTik-6D2441 station-roaming=enabled wireless-protocol=802.11
set [ find default-name=wlan2 ] band=2ghz-b/g/n channel-width=20/40mhz-XX \
country=spain distance=indoors frequency=auto installation=indoor mode=\
ap-bridge ssid=MikroTik-F6069F station-roaming=enabled wireless-protocol=\
802.11
/interface vlan
add disabled=yes interface=ether10 name=vlan3 vlan-id=3
add interface=ether10 name=vlan6 vlan-id=6
/interface pppoe-client
add add-default-route=yes disabled=no interface=vlan6 max-mru=1492 max-mtu=\
1492 name=pppoe-out1 service-name=pppoe-out1 user=adslppp@telefonicanetpa
/interface list
add comment=defconf name=WAN
add comment=defconf name=LAN
/interface lte apn
set [ find default=yes ] ip-type=ipv4 use-network-apn=no
/interface wireless security-profiles
set [ find default=yes ] supplicant-identity=MikroTik
/ip pool
add name=dhcp ranges=192.168.1.121-192.168.1.201
add name=vpn ranges=192.168.89.2-192.168.89.255
/ip dhcp-server
add address-pool=dhcp interface=bridge name=defconf
/port
set 0 name=serial0
set 1 name=serial1
/ppp profile
set *FFFFFFFE interface-list=LAN local-address=vpn remote-address=vpn
/routing bgp template
set default disabled=no output.network=bgp-networks
/routing ospf instance
add disabled=no name=default-v2
/routing ospf area
add disabled=yes instance=default-v2 name=backbone-v2
/user group
set full policy="local,telnet,ssh,ftp,reboot,read,write,policy,test,winbox,pas\
sword,web,sniff,sensitive,api,romon,dude,rest-api"
/interface bridge port
add bridge=bridge comment=defconf ingress-filtering=no interface=ether2
add bridge=bridge comment=defconf ingress-filtering=no interface=ether3
add bridge=bridge comment=defconf ingress-filtering=no interface=ether4
add bridge=bridge comment=defconf ingress-filtering=no interface=ether5
add bridge=bridge comment=defconf ingress-filtering=no interface=ether6
add bridge=bridge comment=defconf ingress-filtering=no interface=ether7
add bridge=bridge comment=defconf ingress-filtering=no interface=ether8
add bridge=bridge comment=defconf ingress-filtering=no interface=ether9
add bridge=bridge comment=defconf ingress-filtering=no interface=ether1
add bridge=bridge comment=defconf disabled=yes ingress-filtering=no \
interface=sfp-sfpplus1
add bridge=bridge comment=defconf disabled=yes ingress-filtering=no \
interface=wlan1
add bridge=bridge comment=defconf disabled=yes ingress-filtering=no \
interface=wlan2
/ip neighbor discovery-settings
set discover-interface-list=LAN
/ip settings
set max-neighbor-entries=8192
/ipv6 settings
set disable-ipv6=yes max-neighbor-entries=8192
/interface detect-internet
set detect-interface-list=all
/interface l2tp-server server
set enabled=yes use-ipsec=yes
/interface list member
add comment=defconf interface=bridge list=LAN
add interface=pppoe-out1 list=WAN
add comment="Acceso a la ONT Ubiquiti Nano G" interface=ether10 list=WAN
/interface ovpn-server server
set auth=sha1,md5
/interface sstp-server server
set default-profile=default-encryption
/ip address
add address=192.168.1.1/24 comment=defconf interface=ether2 network=\
192.168.1.0
add address=192.168.10.2/24 comment="Acceso a la ONT Nano G" interface=\
ether10 network=192.168.10.0
/ip cloud
set ddns-enabled=yes
/ip dhcp-client
add comment=defconf disabled=yes interface=ether1
add add-default-route=no disabled=yes interface=vlan3 use-peer-ntp=no
/ip dhcp-server lease
add address=192.168.1.123 client-id=1:de:53:f9:a5:74:1e comment=\
"SAMSUNG GALAXY S22+" mac-address=DE:53:F9:A5:74:1A server=defconf
/ip dhcp-server network
add address=192.168.1.0/24 comment=defconf dns-server=192.168.1.1 domain=lan \
gateway=192.168.1.1 netmask=24
/ip dns
set allow-remote-requests=yes servers=8.8.8.8,8.8.4.4

Aquí es donde tengo (de momento comentadas porque no logro que funcione) las estáticas para los subdominios de Plex y BItwarden que quiero acceder. Ahora mismo accedo yéndome al DNS de Cloudflare y entrando por el 443...para redireccionarlo finalmente al 1443 del Proxy.
/ip dns static

add address=192.168.1.100 disabled=yes name=plex.midominio.es

Con esta address list es con la que gestiono el Hairpin NAT.
/ip firewall address-list
add address=dominiocloudmikrotik.net list=public-ip

Filtros Firewall:

/ip firewall filter
add action=accept chain=input comment=\
"defconf: accept established,related,untracked" connection-state=\
established,related,untracked
add action=accept chain=input comment="allow IPsec NAT" dst-port=4500 \
protocol=udp
add action=accept chain=input comment="allow IKE" dst-port=500 protocol=udp
add action=accept chain=input comment="allow l2tp" dst-port=1701 protocol=udp
add action=accept chain=input comment=\
"Acepta el trafico de la vlan del telefono" disabled=yes in-interface=\
vlan3 src-address=10.0.0.0/8
add action=drop chain=input comment="defconf: drop invalid" connection-state=\
invalid
add action=accept chain=input comment="defconf: accept ICMP" protocol=icmp
add action=accept chain=input comment=\
"defconf: accept to local loopback (for CAPsMAN)" dst-address=127.0.0.1
add action=drop chain=input comment="defconf: drop all not coming from LAN" \
in-interface-list=!LAN
add action=fasttrack-connection chain=forward comment="defconf: fasttrack" \
connection-state=established,related hw-offload=yes
add action=accept chain=forward comment="defconf: accept in ipsec policy" \
ipsec-policy=in,ipsec
add action=accept chain=forward comment="defconf: accept out ipsec policy" \
ipsec-policy=out,ipsec
add action=accept chain=forward comment=\
"defconf: accept established,related, untracked" connection-state=\
established,related,untracked
add action=drop chain=forward comment="defconf: drop invalid" \
connection-state=invalid
add action=drop chain=forward comment=\
"defconf: drop all from WAN not DSTNATed" connection-nat-state=!dstnat \
connection-state=new in-interface-list=WAN
/ip firewall mangle
add action=set-priority chain=postrouting disabled=yes new-priority=4 \
out-interface=vlan3 passthrough=yes
add action=set-priority chain=postrouting new-priority=1 out-interface=\
pppoe-out1

Aquí tenemos el NAT, básicamente por resumir:

- Hago el Hairpin NAT del 443 al 1443 (puerto HTTPs donde tengo el Proxy Reverso), esto funciona perfectamente.
- NOTA: Tengo comentada la regla del 80 porque no quiero exponerlo a Internet.

/ip firewall nat
add action=masquerade chain=srcnat comment="HAIRPIN NAT" dst-address=\
192.168.1.0/24 src-address=192.168.1.0/24
add action=masquerade chain=srcnat comment="defconf: masquerade" \
ipsec-policy=out,none out-interface-list=WAN
add action=masquerade chain=srcnat comment="default configuration" disabled=\
yes out-interface=vlan3
add action=masquerade chain=srcnat comment="masq. vpn traffic" src-address=\
192.168.89.0/24
add action=dst-nat chain=dstnat comment="HAIRPIN 443 para PROXY" disabled=yes \
dst-address-list=public-ip dst-address-type=local dst-port=80 protocol=\
tcp to-addresses=192.168.1.100 to-ports=180
add action=dst-nat chain=dstnat comment="HAIRPIN 443 para PROXY - NPM" \
dst-address-list=public-ip dst-address-type=local dst-port=443 protocol=\
tcp to-addresses=192.168.1.100 to-ports=1443

Esto creo que ya no es relevante:

/ip firewall service-port
set ftp disabled=yes
set tftp disabled=yes
set irc disabled=yes
set h323 disabled=yes
set sip disabled=yes ports=5060,5070
set pptp disabled=yes
set udplite disabled=yes
set dccp disabled=yes
set sctp disabled=yes
/ip service
set telnet disabled=yes
set ftp disabled=yes
set www disabled=yes
set ssh disabled=yes
set api-ssl disabled=yes

/routing rip interface-template
add instance=*1 interfaces=vlan3 mode=passive
/system clock
set time-zone-autodetect=no time-zone-name=Europe/Madrid
/system clock manual
set time-zone=+01:00
/system identity
set name=RouterName

/system ntp client servers
add address=216.239.35.0
add address=216.239.35.4
/system resource irq rps
set sfp-sfpplus1 disabled=no

/tool mac-server
set allowed-interface-list=LAN
/tool mac-server mac-winbox
set allowed-interfa

Por aclarar, la IP 192.168.1.100 es el NAS Synology que hace de Host para docker. El Proxy manda a esta IP todos los subdominios pero al puerto que corresponde para cada servicio. Esto está funcionando perfectamente. La idea es que desde la Lan pueda acceder a http://plex.midominio.es como lo hago por httpz://plex.dominio.es y si no hiciera falta salir al dns público...mejor.

En definitiva, no sé qué confi me faltaría para conseguir ese Hairpin + DNS para local.

Saludos,


 
Última edición:
La historia la tienes mal a nivel de NAT, y de concepto: lo único que tienes que exponer cara al exterior es el 443 y, opcionalmente, el 80. Dichos puertos los mandas al 80 y al 443 del proxy reverso. Y es a nivel de proxy reverso donde montas los subdominios, no a nivel mikrotik.

Es decir, tú mandas el tráfico https (opcionalmente también el http, aunque ese ni lo tienes que abrir en el NAT, lo puedes dejar únicamente para uso interno) a la IP del proxy reverso. Y es en el proxy reverso donde montas el mapeo de sub-dominio -> IP: puerto

Ejemplo:

plex.midominio.com -> 192.168.1.x:443 (siendo esa X el proxy reverso): apunta en el proxy reverso a 192.168.1.100: puerto_donde_corre_plex.


Si quieres acceder de manera interna, basta con usar IP: puerto del servicio en cuestión. Ahí sí puedes usar el DNS interno del mikrotik, pero sólo necesitas una entrada tipo nas.lan -> 192.168.1.00. Y luego irías haciendo
nas.local: puerto_plex
nas.local: puerto_servicioX
... etc

Además de lo anterior, te recomiendo usar un proxy reverso conocido. No cojas el primer paquete npm que encuentres y lo corras, especialmente si tiene cuatro descargas... Usa un nginx, que es un buen servidor de proxy reverso y muy conocido. Si tienes un synology, no tienes ni que instalar nada, lo llevas a nivel de sistema: la opción "Portal de inicio de sesión" es un NGINX con una interfaz muy facilita.

1658504172671.png


Saludos!
 
Hola @pokoyo

Efectivamente, así es como tengo montado todo.

Precisamente lo que buscaba era poder acceder con el subdominio tanto desde fuera como desde dentro para evitar tener que recordar el puerto de cada uno de los servicios, son numerosos los contenedores que tengo. Actualmente hago lo que me indicas, expongo el 443 y lo apunto al 1443 del PRoxy Inverso que es quien maneja todo el tráfico.

Si la única opción es recordar el puerto, no tendré más remedio. Es tal cual comentas. Mi idea era que las peticiones internas del estilo http://plex.midominio.com (nada de SSL para dentro) pudieran ser recogidas por el Proxy Inverso sin indicar puerto. Si no te he entendido mal, tendría el mismo problema con plex.lan porque debería indicarle el puerto del proxy.

Saludos,
 
Si se puede hacer pero es lo que te dice el compañero @pokoyo . En el router solo expones los puertos y los rediriges hacia tu servidor web. Luego desde el servidor web (nginx supongo) haces el resto de la configuracion
subdominio1.dominio.com -> hacia el servicio plex en el puerto zz
subdominio2.dominio.com -> hacia el servicio tal en el pueto yy
etc...
 
Hola,

Pues no consigo hacerlo funcionar. Estoy funcionando con nginx y lo que tengo es:

- app.midominio.com
- app2.midominio.com

Todo esto me entra por el 443, con su certificado y la regla que me envía todo lo que entra por el 443 al 1443 que es donde tengo el nginx. Ahora bien, si pongo las entradas DNS, que me apuntan todas a la misma IP porque es la IP del NAS donde tengo el contenedor docker de nginx corriendo...me lanza la interfaz de Synology.

Lo que he hecho básicamente es añadir esas 2 entradas en en DNS de Mikrotik y quitarle el destination address de la regla del 443 que tenía con la address list de mi IP pública, para hacer que cualquier cosa por el 443 me vaya al 1443 para que me lo gestione el nginx pero no hay manera...
 
Llegaste a usar el nginx del synology, en lugar de un contenedor?

Saludos!
 
Arriba