Обратный прокси-сервер Nginx через туннель Wireguard

Я установил туннель Wireguard между экземпляром AWS (действующим в качестве сервера) и персональным компьютером, выступающим в качестве клиента. Wireguard установлен на обоих в Docker-контейнере (с использованием образа linuxserver). На локальном компьютере у меня есть веб-сайт, к которому я хотел бы получить доступ с сервера через прокси-сервер с Nginx. По сути, я хочу подключиться к IP-адресу экземпляра AWS и быть перенаправленным через туннель Wireguard на веб-сайт на моем локальном компьютере. Я могу свернуть свой веб-сайт из Docker-контейнера Nginx на экземпляре AWS, но прокси-сервер не работает. Как я могу решить эту проблему?

Экземпляр AWS (сервер Wireguard и прокси-сервер Nginx)

      version: "3"
services:
  reverseproxy:
    container_name: reverseproxy
    build: .
    restart: unless-stopped
    network_mode: service:wireguard

  wireguard:
    image: lscr.io/linuxserver/wireguard:latest
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Rome
      - SERVERURL=107.22.140.0 #optional
      - SERVERPORT=51820 #optional
      - PEERS=1 #optional
      - PEERDNS=auto #optional
      - INTERNAL_SUBNET=10.0.0.0 #optional
      - ALLOWEDIPS=0.0.0.0/0 #optional
      - LOG_CONFS=true #optional
    volumes:
      - /home/ubuntu/wireguard/config:/config
      - /lib/modules:/lib/modules
    ports:
      - 51820:51820/udp
      - 80:80
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    restart: unless-stopped

Конфигурация Nginx прокси:

      worker_processes 1;

events { worker_connections 1024; }

http {

    sendfile on;

    upstream docker-proxy {
        server 10.0.1.2:80;
    }

    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-Host $server_name;

    server {
        listen 80;
        resolver 127.0.0.11 ipv6=off;
        location / {
            proxy_pass         http://docker-proxy/;
            proxy_redirect     off;
        }
    }
}

Локальный компьютер с Wireguard и локальным веб-сайтом:

      version: '3'

services:
    nginx:
        container_name: nginx
        #depends_on:
            #- reverseproxy
        image: nginx:alpine
        restart: unless-stopped
        ports:
            - 80:80
        networks:
            vpn:
                ipv4_address: 10.0.1.2
    wireguard:
        image: lscr.io/linuxserver/wireguard:latest
        container_name: wireguard
        cap_add:
            - NET_ADMIN
            - SYS_MODULE
        environment:
            - PUID=1000
            - PGID=1000
            - TZ=Europe/Rome
            - SERVERURL=wireguard.domain.com #optional
            - SERVERPORT=51820 #optional
            - PEERS= #optional
            - PEERDNS=auto #optional
            - INTERNAL_SUBNET=10.0.0.0 #optional
            - ALLOWEDIPS=0.0.0.0/0 #optional
            - LOG_CONFS=true #optional
        volumes:
            - /home/user/dev/nginx-proxy/config:/config
            - /lib/modules:/lib/modules
        ports:
            - 51820:51820/udp
        sysctls:
            - net.ipv4.conf.all.src_valid_mark=1
        restart: unless-stopped
        networks:
            vpn:
                ipv4_address: 10.0.1.5
    
networks:
    vpn:
        ipam:
            config:
                - subnet: 10.0.1.0/8 

1 ответ

Если все, что вам нужно, это переадресация портов с вашего сервера AWS, вам не нужен nginx, вы можете просто использовать правило iptables в своем контейнере WireGuard для переадресации порта 80.

На вашем сервере AWS сохраните этот файл конфигурации WireGuard в каком-нибудь каталоге, напримерserver/wireguard/wg0.conf:

      # server/wireguard/wg0.conf

# local settings for AWS server
[Interface]
PrivateKey = <server private key>
Address = 10.0.0.1/32
ListenPort = 51820

# port forwarding to Docker `nginx` service on `vpn` network on personal computer
PreUp = iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.0.1.2
# masquerading for Internet traffic to Docker `vpn` network on personal computer
PreUp = iptables -t nat -A POSTROUTING -d 10.0.1.0/24 -j MASQUERADE

# remote settings for personal computer
[Peer]
PublicKey = <client public key>
AllowedIPs = 10.0.0.2/32, 10.0.1.0/24

Заменять<server private key>с помощью закрытого ключа WireGuard, который вы сгенерировали для своего сервера, и<client public key>с открытым ключом WireGuard, который вы создали для своего клиента.

Затем сохраните этот файл Docker Compose в каталоге над ним, например:server/docker-compose.yml:

      # server/docker-compose.yml

version: '3'
services:
  wireguard:
    image: procustodibus/wireguard
    cap_add:
    - NET_ADMIN
    ports:
    - 80:80
    - 51820:51820/udp
    volumes:
    - ./wireguard:/etc/wireguard

И запустите из того же каталога, что и файл Docker Compose.

Затем на своем персональном компьютере сохраните этот файл конфигурации WireGuard в каком-нибудь каталоге, напримерclient/wireguard/wg0.conf:

      # client/wireguard/wg0.conf

# local settings for personal computer
[Interface]
PrivateKey = <client private key>
Address = 10.0.0.2/32
ListenPort = 51820

# masquerading for WireGuard traffic to Docker `vpn` network on personal computer
PreUp = iptables -t nat -A POSTROUTING -d 10.0.1.0/24 -j MASQUERADE

# remote settings for AWS server
[Peer]
PublicKey = <server public key>
AllowedIPs = 10.0.0.1/32
Endpoint = <server ip address or domain name>:51820
PersistentKeepalive = 25

Заменять<client private key>с помощью закрытого ключа WireGuard, который вы сгенерировали для своего клиента, и<server public key>с открытым ключом WireGuard, который вы сгенерировали для своего сервера. Заменять<server ip address or domain name>с общедоступным IP-адресом или доменным именем вашего сервера AWS.

Затем сохраните этот файл Docker Compose в каталоге над ним, например:client/docker-compose.yml:

      # client/docker-compose.yml

version: '3'

services:
  nginx:
    image: nginx
    networks:
      vpn:
        ipv4_address: 10.0.1.2

  wireguard:
    image: procustodibus/wireguard
    cap_add:
    - NET_ADMIN
    networks:
      vpn:
        ipv4_address: 10.0.1.5
    ports:
    - 51820:51820/udp
    volumes:
    - ./wireguard:/etc/wireguard

networks:
  vpn:
    ipam:
      config:
      - subnet: 10.0.1.0/24

и бежатьdocker-compose upиз того же каталога, что и файл Docker Compose.


Однако, если вам нужен nginx на вашем сервере AWS (например, для сохранения реального IP-адреса HTTP-клиентов или для прекращения TLS и т. д.), пропустите правило iptables переадресации портов в конфигурации WireGuard вашего сервера AWS:

      # server/wireguard/wg0.conf

# local settings for AWS server
[Interface]
PrivateKey = <server private key>
Address = 10.0.0.1/32
ListenPort = 51820

# masquerading for Internet traffic to Docker `vpn` network on personal computer
PreUp = iptables -t nat -A POSTROUTING -d 10.0.1.0/24 -j MASQUERADE

# remote settings for personal computer
[Peer]
PublicKey = <client public key>
AllowedIPs = 10.0.0.2/32, 10.0.1.0/24

Добавьте файл конфигурации обратного прокси-сервера nginx на сервере AWS в каталог, который является родственным по отношению к вашей конфигурации WireGuard, напримерserver/reverseproxy/nginx.conf:

      # server/reverseproxy/nginx.conf

events {}
http {
    server {
        listen 80;
        location / {
            proxy_pass http://10.0.1.2:80;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

Используйте любые директивы прокси-сервера (или другую конфигурацию nginx), которые вы хотите в этом файле конфигурации (исходная конфигурация обратного прокси-сервера из вашего вопроса должна работать нормально) - просто убедитесь, что адрес и порт вышестоящего сервера совпадают с адресом и портом, используемыми Docker.nginxслужба в г.vpnсеть на вашем персональном компьютере.

Затем добавьте этоreverseproxyservice в конфигурацию Docker Compose на вашем сервере AWS:

      # server/docker-compose.yml

version: '3'

services:
  reverseproxy:
    image: nginx
    network_mode: service:wireguard
    volumes:
    - ./reverseproxy:/etc/nginx

  wireguard:
    image: procustodibus/wireguard
    cap_add:
    - NET_ADMIN
    ports:
    - 80:80
    - 51820:51820/udp
    volumes:
    - ./wireguard:/etc/wireguard

На своем персональном компьютере используйте ту же «клиентскую» конфигурацию WireGuard и Docker Compose из первой части этого ответа.

Другие вопросы по тегам