我正在尝试在 Debian 计算机上设置 Nginx 反向代理和 OpenVPN 客户端。流量应从 OpenVPN 客户端路由到反向代理。OpenVPN 客户端的目的是提供公共 IP 地址。对公共 OpenVPN IP(我们称之为 xxxx)或关联域(sentry.mycompany.com)的请求应路由到我的反向代理,然后反向代理应将流量路由到 http://localhost:9000。

我让 OpenVPN 客户端和 Nginx 服务器分别运行。问题是流量无法在两者之间路由。

这是我的 Nginx 配置:

server {
        listen 80;
        listen [::]:80;

        proxy_buffering on;
        proxy_buffer_size    128k;
        proxy_buffers        4 256k;

        location / {
            proxy_pass       http://localhost:9000;
            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-Proto $scheme;
        }

}

对我的本地 IP(10.10.1.70)的请求工作正常,并且流量成功重定向到 http://localhost:9000。

这是我的 OpenVPN 配置:

client
route-nopull
dev tun
proto tcp-client
data-ciphers AES-256-CBC:AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
tun-mtu 1400
mssfix 1360
tls-timeout 60
remote super-secret-server-url.net
port 1194
nobind
persist-key
persist-tun
tls-client
remote-cert-tls server
verb 5
mute 10
tls-cert-profile insecure
cipher AES-256-CBC
auth SHA512
auth-user-pass /.secrets/vpn/credentials.txt
<ca>
-----BEGIN CERTIFICATE-----



-----END CERTIFICATE-----
</ca>

此配置有效,并且成功连接到服务器。我已配置,route-nopull因为我不想让 OpenVPN 干扰我的路由。如果不配置route-nopull,我的服务器将无法从本地网络 (10.10.1.70) 访问,也无法从 OpenVPN 公共 IP 访问服务器。我希望能够从本地网络访问该机器。

连接到 OpenVPN 服务器会设置一个新的网络接口:

11: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1400 qdisc fq_codel state UNKNOWN group default qlen 500
    link/none
    inet 192.168.90.174/24 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fe80::8bd:d4a6:8d40:8b46/64 scope link stable-privacy
       valid_lft forever preferred_lft forever

分配的 IP 是正确的。我的 VPN 提供商会将外部 IP xxxx 的 NAT 端口转发到“本地”OpenVPN IP (192.168.90.174)。

总而言之,我想按如下方式配置它:

  1. 请求至 xxxx 或 sentry.mycompany.com
  2. 我的 VPN 服务提供商将流量转发到 192.168.90.174
  3. 我的机器正在 tun0 上获取流量
  4. 来自 tun0 的流量应该路由到我的 Nginx 反向代理
  5. Nginx 代理应将端口 80 上的流量转发到 http://localhost:9000
  6. 通过我的本地网络(10.10.1.70)进行请求也应该是可能的(SSH 等)。

我怎样才能做到这一点?


最佳答案
1

您需要通过 OpenVPN 隧道传输所有面向互联网的流量,然后 OpenVPN 服务器需要伪装流量,以便源 IP 地址是 OpenVPN 服务器的 IP 地址。

如果您想避免通过 OpenVPN 隧道发送所有流量,这是可能的。它需要设置 IPTables 规则以使用数据包标记来标记来自 nginx 的流量,然后添加用于该流量标记的辅助路由表。我只知道一般原理,我无法给出如何操作的详细说明。

为了解释原因,我们首先假设:

OpenVPN服务器的IP地址192.0.2.1
是 您的本地网络外网IP地址是
198.51.100.1
您的OpenVPN客户端IP地址是
192.168.90.174

然后,让我们考虑一下进入您服务器的请求。

客户端从203.0.113.1向 OpenVPN 服务器发送请求192.0.2.1。OpenVPN 服务器将目标 IP 地址更改为192.168.90.174

现在,您的 Web 服务器接收来自 IP 的请求203.0.113.1,并将响应发送回其。

如果响应数据包未通过 OpenVPN 隧道转发,它将被您的家庭路由器伪装。因此,的响应数据包203.0.113.1将来自198.51.100.1

因此,当客户端收到响应数据包时,它会将其丢弃,因为它不是来自预期的位置。