问题场景
C 是一台有公网 IP 的跳板机,A 和 B 是异地局域网的机器,并且 A、B、C 通过 WireGuard 组成了 VPN 局域网。
S 和 A 在同一个局域网内,并且 S 上运行了一个 Web 服务器,现在需要从 B 的位置访问到 S 的服务。
解决方案
在 A 上面使用 Nginx 进行端口转发,访问 A 的端口就相当于访问到 S 的服务端口,这样 B 只需要访问 A 开放的端口就可以了, 也不需要对外暴露 S 的 IP 地址。
配置 Nginx
假设 S 的内网地址和 Web 服务端口是 192.168.0.99:443
,A 机器上使用端口 8443
进行数据转发:
在 A 机器上的 Nginx 配置端口转发:
stream {
proxy_buffer_size 16k;
server {
listen 8443;
proxy_connect_timeout 5s;
proxy_timeout 15s;
proxy_pass 192.168.0.99:443;
}
}
当然 UDP 端口也可以转发,只需要在 listen
的端口后面加上 udp
就表示是转发 UDP
协议:
stream {
proxy_buffer_size 16k;
server {
listen 53 udp reuseport;
proxy_connect_timeout 5s;
proxy_timeout 15s;
proxy_pass 192.168.0.99:53;
}
}
以上配置就可以把 DNS 解析通过端口转发到 192.168.0.99
上进行解析,对于异地网络访问很有用。
参考资料
https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html