Alojamiento de sitio web que solo permite la red privada de WireGuard

8 min

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

Hola, soy Muno.
No es muy bueno que la página de administración esté expuesta públicamente, pero en mi caso, actualmente solo permito IPs privadas de WireGuard para la página de administración. Así es como se configura.

Configuración del lado de WireGuard

En otras palabras, estoy usando múltiples clientes.

Lado del cliente

En este caso, para wg0, como AllowedIPs = 0.0.0.0/0, ::/0, todo el tráfico pasa a través de la red WireGuard.
Sin embargo, en este caso, es necesario especificar una regla en el lado del servidor para que 10.1.0.22 pase por el NAT del servidor. Esto se debe a que, de lo contrario, esta IP no podría salir de la red privada de WireGuard.
En resumen, es así:

  • wg0
    • Pasa por todas las redes
    • Consulta al DNS interno
    • No puede salir sin una regla NAT en el lado del servidor WireGuard
  • wg1
    • Enruta solo las IPs privadas de WireGuard
      • Solo permite el rango de valores CIDR de 10.1.0.0/24
    • Consulta al DNS interno

wg0.conf :

[Interface]
PrivateKey = Client Private Key
Address = 10.1.0.22/24
DNS = 10.1.0.1

[Peer]
PublicKey = Server PubKey
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = WireGuard Server Endpoint:51820
PreSharedKey = PreSharedKey

wg1.conf :

[Interface]
PrivateKey = Client Private Key
Address = 10.1.0.21/24
DNS = 10.1.0.1

[Peer]
PublicKey = Server PubKey
AllowedIPs = 10.1.0.0/24
Endpoint = WireGuard Server Endpoint:51820
PreSharedKey = PreSharedKey

Lado del servidor

[Interface]
ListenPort = 51820
Address = 10.1.0.1/24
PrivateKey = Server PrivKey

~~~

[Peer]
PublicKey = Client PubKey
PreSharedKey = PreSharedKey
AllowedIPs = 10.1.0.21/32
PersistentKeepalive = 25

[Peer]
PublicKey = Client PubKey
PreSharedKey = PreSharedKey
AllowedIPs = 10.1.0.22/32
PersistentKeepalive = 25

Así es como queda.

Reglas NAT del lado del servidor WireGuard

Esto es un privilegio de los sistemas basados en BSD, pero las reglas NAT se especifican con pf.

# Definición de variables
wireguard_clients="{ 10.1.0.4, 10.1.0.22 }"
wanint="vtnet0"
wg_ports="{51820}"

# Reescribe el tráfico saliente de $wireguard_clients a la IP de la interfaz WAN ($wanint) para salir a Internet
# Configuración NAPT
nat on $wanint inet from $wireguard_clients to any -> $wanint

# Permite las conexiones WireGuard (UDP 51820) entrantes desde el exterior a la WAN
pass in on $wanint proto udp from any to $wanint port $wg_ports

De esta manera, las propias IPs privadas de WireGuard podrán pasar por el NAT del lado del servidor WireGuard.

Configuración de Nginx

a.soulminingrig.com es la configuración de la página de administración de LumeCMS para este sitio.
Con allow 10.1.0.0/16;, solo se permite la red WireGuard, y todo lo demás se deny all;.

server {
    listen 80;
    server_name a.soulminingrig.com;
    return 301 https://$host$request_uri;
}

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

    location / {
        allow 10.1.0.0/16;
	    deny all;

        proxy_pass http://10.1.0.20:3001/;
        include proxy_headers.conf;
        proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504 http_403 http_404;
        proxy_connect_timeout 3s;
        proxy_read_timeout 15s;
    }
    include common_error_pages.conf;
    include ssl_common.conf;

    ssl_certificate /usr/local/etc/letsencrypt/live/a.soulminingrig.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /usr/local/etc/letsencrypt/live/a.soulminingrig.com/privkey.pem; # managed by Certbot
}

¿Por qué se puede aplicar una restricción de IP sin ser reconocido como la IP pública del servidor WireGuard, a pesar de tener reglas NAT?

Puede que haya una pregunta como esta.
(Pregunta que me inventé)

Las reglas NAT están escritas así:

nat on $wanint inet from $wireguard_clients to any -> $wanint

Es decir, on $wanint significa que el NAT se aplica solo a los paquetes que pasan por la interfaz WAN.
Es un poco complicado, pero para que sea más fácil de entender, hagamos un ifconfig.

vtnet0: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
        options=4c079b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWTSO,LINKSTATE,TXCSUM_IPV6>
        ether aa
        inet aa netmask 0xfffffe00 broadcast aa
        inet6 aa prefixlen 64 scopeid 0x1
        inet6 aa prefixlen 64
        media: Ethernet autoselect (10Gbase-T <full-duplex>)
        status: active
        nd6 options=21<PERFORMNUD,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>
pflog0: flags=0 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.1.0.1 netmask 0xffffff00
        groups: wg
        nd6 options=109<PERFORMNUD,IFDISABLED,NO_DAD>

Sí, WireGuard es una NIC virtual, por lo que la interfaz en el caso de WireGuard es wg0.
En este caso, como pasa por wg0, si proxy_pass es 10.1.0.20:3001, los paquetes pasarán a través de esta NIC virtual.

10.1.0.22 -> coincide con la regla allow 10.1.0.0/16 (10.1.0.0 ~ 10.1.255.255) -> el proxy_pass de Nginx es 10.1.0.20, por lo que se completa dentro de la red privada
Durante este proceso, toda la comunicación se completa dentro de la NIC virtual en wg0, lo que permite esta comunicación privada.

Para terminar

Así es, ¿qué les parece?
En realidad, personalmente no me gusta escribir reglas en GNU/Linux, así que pf de los sistemas BSD es increíblemente fácil en este sentido...
Hasta la próxima. Gracias.

Related Posts