我已经在我的 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.22
到10.0.0.100
(而不是在 EC2 上执行此操作以免暴露内部 IP)
但是我该怎么做呢?我尝试了几次从我的电脑到它自己的 proxy_pass(从10.8.0.22
到10.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;
}
}