Обратный прокси-сервер 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
сеть на вашем персональном компьютере.
Затем добавьте этоreverseproxy
service в конфигурацию 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 из первой части этого ответа.