使用 WireGuard 隧道时,如何解决 IP 地址不匹配的问题?

使用 WireGuard 隧道时,如何解决 IP 地址不匹配的问题?

我已经在我的 EC2 实例和家用电脑之间建立了 WireGuard 隧道。

我正在使用 nginx 通过 IP 在 PC 上的虚拟机上提供 PHP 应用程序10.0.0.100

WireGuard 隧道 IP10.8.0.11适用于 EC2 实例和10.8.0.22我的本地 PC

我在 EC2 实例上安装了 nginx,并使用以下配置将流量路由到我的 PHP 应用程序:

server {
    location / {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header Host-Real-IP  $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://10.8.0.22:80;
    }
}

本示例中的我的 EC2 IP 是34.34.34.34

当我在浏览器中输入这个 IP 时,它就能正常工作,而且我确实能看到该网站。

但是我的应用程序使用了一些读取服务器 IP 的功能,在我的例子中,当我单击使用这些功能的某些路由时,它会重定向到http://10.8.0.22/some_route而不是http://34.34.34.34/some_route(这反过来会代理传递到实际的 PC)

我正在考虑编辑本地 PC VM 上的 nginx 配置以将流量从重定向10.8.0.2210.0.0.100(而不是在 EC2 上执行此操作以免暴露内部 IP)

但是我该怎么做呢?我尝试了几次从我的电脑到它自己的 proxy_pass(从10.8.0.2210.0.0.100),但我的语法失败了。可能是因为我已经在配置中拥有以下内容并且它发生了冲突:

server {
    listen 80;
    server_name myapp;
    root /var/www/myapp/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

编辑:这是ip route我的电脑上的虚拟机上的输出:

default via 10.0.0.138 dev enp0s3 proto dhcp src 10.0.0.100 metric 100
10.0.0.0/24 dev enp0s3 proto kernel scope link src 10.0.0.100 metric 100
10.0.0.138 dev enp0s3 proto dhcp scope link src 10.0.0.100 metric 100
10.8.0.0/24 dev wg0 proto kernel scope link src 10.8.0.22

route print以及Windows 主机上的输出:(注意,我最近更换了路由器,我认为它显示的是旧192.168.x.x路由,但目前新路由器使用10.0.x.x

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0       10.0.0.138         10.0.0.1     25
         10.0.0.0    255.255.255.0         On-link          10.0.0.1    281
         10.0.0.1  255.255.255.255         On-link          10.0.0.1    281
       10.0.0.255  255.255.255.255         On-link          10.0.0.1    281
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    331
        127.0.0.1  255.255.255.255         On-link         127.0.0.1    331
  127.255.255.255  255.255.255.255         On-link         127.0.0.1    331
     192.168.56.0    255.255.255.0         On-link      192.168.56.1    281
     192.168.56.1  255.255.255.255         On-link      192.168.56.1    281
   192.168.56.255  255.255.255.255         On-link      192.168.56.1    281
    192.168.182.0    255.255.255.0         On-link     192.168.182.1    291
    192.168.182.1  255.255.255.255         On-link     192.168.182.1    291
  192.168.182.255  255.255.255.255         On-link     192.168.182.1    291
    192.168.206.0    255.255.255.0         On-link     192.168.206.1    291
    192.168.206.1  255.255.255.255         On-link     192.168.206.1    291
  192.168.206.255  255.255.255.255         On-link     192.168.206.1    291
        224.0.0.0        240.0.0.0         On-link         127.0.0.1    331
        224.0.0.0        240.0.0.0         On-link      192.168.56.1    281
        224.0.0.0        240.0.0.0         On-link     192.168.182.1    291
        224.0.0.0        240.0.0.0         On-link     192.168.206.1    291
        224.0.0.0        240.0.0.0         On-link          10.0.0.1    281
  255.255.255.255  255.255.255.255         On-link         127.0.0.1    331
  255.255.255.255  255.255.255.255         On-link      192.168.56.1    281
  255.255.255.255  255.255.255.255         On-link     192.168.182.1    291
  255.255.255.255  255.255.255.255         On-link     192.168.206.1    291
  255.255.255.255  255.255.255.255         On-link          10.0.0.1    281
===========================================================================

ip route这是EC2 机器上的输出:

default via 168.25.75.1 dev eth0 proto dhcp src 168.25.80.15 metric 100
10.8.0.0/24 dev wg0 proto kernel scope link src 10.8.0.11
168.25.0.2 via 168.25.75.1 dev eth0 proto dhcp src 168.25.80.15 metric 100
168.25.75.0/20 dev eth0 proto kernel scope link src 168.25.80.15 metric 100
168.25.75.1 dev eth0 proto dhcp scope link src 168.25.80.15 metric 100

答案1

我找到了一个解决方案 - 在我的案例中,问题在于框架 (Laravel) 使用 HTTP Host 标头来构建 URL。当我指定标头时proxy_pass,nginx 默认重写 Host 标头以使用proxy_host,而不是原始主机。因此对 Web 服务器的 HTTP 请求包含Host: 10.8.0.22

为了获取外部 IP 作为主机,我必须使用以下方法重写标头:proxy_set_header Host $host;

通过在 EC2 实例上更新以下 nginx 配置,现在可以使用 EC2 公共 IP 正确生成 URL:

server {

    location / {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header Host-Real-IP  $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_pass http://10.8.0.22:80;
    }
}

相关内容