Notas sobre cómo configurar un proxy inverso con un servidor doméstico (Devuan + Apache) + WireGuard + VPS (FreeBSD + NGINX)

13 min

language: ja bn en es hi pt ru zh-cn zh-tw

FzwZOZbaQAAEGS3.jpeg

Dibujando solo con el ratón.

-—

Quiero alojar mi propio sitio desde mi servidor doméstico, pero me da un poco de miedo que mi dirección IP quede expuesta.
Además, no pude acceder directamente desde casa, desde la LAN o desde el dominio, y llegué a la conclusión de que esto era imposible porque mi router doméstico no tiene funcionalidad NAT.
El acceso desde casa es a través de la dirección IP, y desde fuera a través del dominio. Esto es inconveniente, así que pensé: '¿No podría resolver esto configurando una VPN a través de IP?' Había dos ventajas, así que lo intenté.

Al final, como soy un completo aficionado, fue difícil, pero usar un proxy inverso también parece distribuir la carga del servidor, lo que acelera el procesamiento, y estoy muy satisfecho con el resultado.

¡Entonces, Suwako actualizó su artículo!
[Autonomía Digital] Cómo alojar desde un servidor doméstico usando WireGuard

Ya había hecho conexiones SSH en el pasado, y como hay información sobre WireGuard en la Arch Wiki, pude hacerlo sin muchos problemas, pero registraré las partes con las que tuve problemas y los cambios que hice como respaldo en caso de que me mueva a otro VPS.
Para más detalles, por favor, consulte la página de Suwako.
Es casi idéntico al de Suwako, así que cumpliré con cualquier solicitud de eliminación por su parte.

Esto es para mis notas en el entorno actual. Es probable que olvide nginx, así que lo dejaré en la web para mi referencia personal.

Configuración del lado del VPS

Configuración del firewall

/etc/pf.conf

set skip on lo
exsrv1 = Dirección IP global asignada a la máquina VPS
insrv1 = 192.168.10.101 #¿IP privada en el VPS para Wireguard?
#insrv2 = 192.168.10.102 #¿IP privada en el VPS para Wireguard? Añadir si hay otras cosas que conectar

block return
pass

#Wireguard usa el puerto 51820/UDP, así que ábrelo
pass in on wg0
pass in inet proto udp from any to any port 51820

# Para conexión SSHWireGuard SSH
pass in on wg0 proto tcp from 192.168.10.0/24 to any port 22
block in on egress proto tcp from any to any port 22

/etc/wireguard/wg0.conf

[Interface]
Address = 192.168.10.1/24
PrivateKey = Introducir la generada por wg genkey en el VPS
ListenPort = 51820

[Peer]
PublicKey = Introducir la generada por wg genkey en el servidor doméstico
PreSharedKey = Igual que arriba
AllowedIPs = 192.168.10.101/32
PersistentKeepalive = 25

*/nginx.conf
Probablemente es un desastre, ¡pero funciona, así que está bien!

worker_processes  1;

events {
    worker_connections  4096;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile on;
    tcp_nopush on;
    keepalive_timeout  300;
    
proxy_buffering on;
proxy_buffer_size     8k;
proxy_buffers         100 8k;
   proxy_cache_path              /var/cache/nginx/cache/zone1 levels=1:2 keys_zone=zone1:64m inactive=7d max_size=2048m;
    proxy_cache_path              /var/cache/nginx/cache/zone2 levels=1:2 keys_zone=zone2:64m inactive=7d max_size=2048m;
        proxy_cache_path              /var/cache/nginx/cache/zone3 levels=1:2 keys_zone=zone3:64m inactive=7d max_size=2048m;
            proxy_cache_path              /var/cache/nginx/cache/zone4 levels=1:2 keys_zone=zone4:64m inactive=7d max_size=2048m;
  proxy_temp_path               /var/cache/nginx/temp;


server {
    listen 80;
    server_name #Nombre de dominio;
        client_max_body_size 10240M;

    location / {
        proxy_pass http://192.168.10.101/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
         # Almacenar en caché solo contenido estático
                if ($uri ~* "\.(jpg|jpeg|png|webp|gif|mp4|css|js|ico|woff2)$") {
                    set $do_not_cache 0;
                }

                proxy_no_cache          $do_not_cache;
                proxy_cache_bypass      $do_not_cache;

                proxy_cache             zone1;
                proxy_cache_key         $scheme$proxy_host$uri$is_args$args;
                proxy_cache_valid       200 201 6h;
                proxy_cache_valid       302 3h;
                proxy_cache_valid       301 1d;
                proxy_cache_valid       404 5m;
                proxy_cache_lock        on;
                proxy_buffering         on;
        
    }
}

server {
    listen 443 ssl;
    server_name ドメイン名;
        client_max_body_size 10240M;


    ssl_certificate # Certificado SSL;
    ssl_certificate_key #Igual que arriba

    location / {
        proxy_pass http://192.168.10.101;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
                        # Almacenar en caché solo contenido estático
                if ($uri ~* "\.(jpg|jpeg|png|webp|gif|mp4|css|js|ico|woff2)$") {
                    set $do_not_cache 0;
                }

                proxy_no_cache          $do_not_cache;
                proxy_cache_bypass      $do_not_cache;

                proxy_cache             zone2;
                proxy_cache_key         $mobile$scheme$proxy_host$uri$is_args$args;
                proxy_cache_valid       200 201 6h;
                proxy_cache_valid       302 3h;
                proxy_cache_valid       301 1d;
                proxy_cache_valid       404 5m;
                proxy_cache_lock        on;
                proxy_buffering         on;
    }
}



server {
    listen 80;
    server_name soulminingrig.com;
    client_max_body_size 500M;

    location / {
        proxy_pass http://192.168.10.101;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
                        # Almacenar en caché solo contenido estático
                if ($uri ~* "\.(jpg|jpeg|png|webp|gif|mp4|css|js|ico|woff2)$") {
                    set $do_not_cache 0;
                }

                proxy_no_cache          $do_not_cache;
                proxy_cache_bypass      $do_not_cache;

                proxy_cache             zone3;
                proxy_cache_key         $mobile$scheme$proxy_host$uri$is_args$args;
                proxy_cache_valid       200 201 6h;
                proxy_cache_valid       302 3h;
                proxy_cache_valid       301 1d;
                proxy_cache_valid       404 5m;
                proxy_cache_lock        on;
                proxy_buffering         on;
    }
}


server {
    listen 443 ssl;
    server_name soulminingrig.com www.soulminingrig.com;
    
        client_max_body_size 500M;

    ssl_certificate # Certificado SSL;
    ssl_certificate_key #Igual que arriba
    

    location / {
        proxy_pass http://192.168.10.101;  # Por favor, reemplace con la dirección IP del destino del proxy inverso
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
                        # Almacenar en caché solo contenido estático
                if ($uri ~* "\.(jpg|jpeg|png|webp|gif|mp4|css|js|ico|woff2)$") {
                    set $do_not_cache 0;
                }

                proxy_no_cache          $do_not_cache;
                proxy_cache_bypass      $do_not_cache;

                proxy_cache             zone1;
                proxy_cache_key         $mobile$scheme$proxy_host$uri$is_args$args;
                proxy_cache_valid       200 201 6h;
                proxy_cache_valid       302 3h;
                proxy_cache_valid       301 1d;
                proxy_cache_valid       404 5m;
                proxy_cache_lock        on;
                proxy_buffering         on;
    }
}

    }

Estoy intentando acelerar las cosas colocando una caché en este VPS. Planeo parar si hay algún problema.
Lo que realmente me sorprendió fue aquí:
client_max_body_size 500M;
Me tomó un tiempo darme cuenta de que el tamaño de archivo de carga predeterminado de nginx es de 1 MB, por lo que incluso si la configuración del servidor doméstico permitía cargas más grandes, nginx no funcionaría correctamente si no estaba configurado también.

Además, obtuve un error cuando usé la misma configuración de zona, así que creé carpetas con mkdir y separé las carpetas de caché para cada una.

Y también configuraré conexiones SSH entre nginx y el servidor doméstico.

Configuración del lado del servidor doméstico (Apache2)

/etc/wireguard/wg0.conf

[Interface]
PrivateKey = #Introducir la generada por wg genkey en el servidor doméstico
ListenPort = 51820
Address = 192.168.10.101/24 #IP privada para esta máquina en Wireguard
DNS = 8.8.8.8

[Peer]
PublicKey = #Introducir la generada por wg genkey en el VPS
PreSharedKey = #Introducir la PreSharedKey generada por wg genkey en el servidor doméstico
Endpoint =  #Dirección IP global del VPS :51820
AllowedIPs = 192.168.10.0/24 
PersistentKeepalive = 25

Una vez me quedé atascado con esta configuración de Wireguard porque no se conectaba sin la configuración de DNS.
Estoy usando temporalmente el DNS de Google, pero probablemente lo cambiaré una vez que vuelva a la normalidad.

Y notas varias

Con la configuración anterior, no funcionaba con múltiples dominios; incluso si registraba un segundo dominio, solo se mostraba el primer dominio. Cambiar el puerto tampoco ayudó, y me preguntaba por qué hasta que me di cuenta de que no había seleccionado el directorio para el nuevo dominio en apache2.conf.

<Directory */donde están los archivos del nuevo dominio/>
#	Options Indexes FollowSymLinks
#	AllowOverride None
#	Require all granted
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
</Directory>

¿Es correcto asumir que esto permitió la separación?

Además, al usar un proxy inverso con WordPress por defecto, se confundía con la autenticación SSL, mostrando correctamente con HTTP pero haciendo que el CSS dejara de funcionar con conexiones HTTPS. Me pregunté por qué, y parece que se puede resolver añadiendo lo siguiente a wp-config.

$_SERVER['HTTPS']='on';

Había otros métodos, pero este fue el que funcionó mejor, ya que otros a veces hacían que la pantalla de inicio de sesión cambiara repentinamente a comunicación HTTP.

Probablemente todavía esté en conflicto.
Debería cambiar el puerto, pero estoy cansado, así que lo haré más tarde.

No está organizado en absoluto, pero lo dejaré como un recordatorio antes de que lo olvide.

Related Posts