对于这个问题,假设所有涉及的计算机都运行最新的 Ubuntu LTS 版本(或类似版本,例如 Ubuntu Server)。
我的 LAN 上有一台计算机。我们将其称为“本地服务器”,并假设它的 IP 为192.168.1.2
。我还有一个云 VPS,称为“公共服务器”。我们还假设我们有一个 DNS A 记录,该记录表明server.example.com
指向我的 VPS 的公共 IP 地址。为简单起见,我们假设它上面没有防火墙,尽管实际上会有。
我要将 Web 服务器放到本地服务器上:
$ sudo apt update && sudo apt install nginx
...
$ sudo systemctl start nginx
...
在另一台计算机上192.168.1.0/24
,我将执行以下操作curl 192.168.1.2:80
以确保其正常工作:
$ curl 'http://192.168.1.2:80'
[The HTML for the welcome to NGINX page]
效果很好。但是,我想让公共服务器(又称 VPS)上的端口 8080“映射”到本地服务器上的端口 80。也就是说,我希望第三台名为“客户端计算机”的计算机能够curl http://server.example.com:8080
,然后 VPS 接收该请求,将其传递回本地服务器,从本地服务器获取响应,并将响应提供给“客户端计算机”。但是,我希望客户端计算机看起来就像公共服务器刚刚直接处理了该请求一样。
不过,还有几点需要注意:
- 尽管我用它作为示例,但该服务实际上并不是一个 Web 服务器。因此它实际上需要处理流量 - HTTP 反向代理不起作用
- 本地服务器根本无法进行端口转发
- 云VPS上的其他端口能例如,本地服务器可能连接到一个用于本地服务器和 VPS 之间通信的
- 直接在 VPS 上运行我的应用程序不是一个选择
- 我在乎首先关于响应延迟 - 我正在运行一个游戏服务器,因此延迟比原始吞吐量更重要
以下是我发现的一些选项:
- 鼠洞
- SSH 端口转发(,也需要在)
ssh [email protected] -R 0.0.0.0:8080:localhost:80
GatewayPorts
yes
sshd_config
实现此目的的最佳方法是什么,以尽可能减少延迟?
答案1
通常回答您的一般性问题,即“我有哪些选择?”...如果您愿意,您可以稍后选择并询问有关一种特定方法的新问题,以获得具体的详细答案。
无需防火墙/NAT(按延迟最小排序)
域名屏蔽(又称为“DNS 框架转发”或“URL 框架”):
这会将访问者重定向到您选择的备用 URL,同时将您的域名保留在标题/地址字段中...这取决于您的域名服务提供商...但是,大多数服务提供商都有它...例如:
SSH(或其他选择)隧道:
这将在源计算机和目标计算机之间创建一个隧道,以便从源计算机向目标计算机发送/转发请求,并在后台接收答复...例如安全 Shell 隧道。
通过本地服务进行远程获取:
此方法要求您配置服务(还可以依赖 Web 服务器上的脚本文件等常见服务)在某个端口/URL 上处理传入的请求,从远程机器/URL 获取响应,并在处理后显示给访问者。
需要防火墙/NAT
DNAT(目标 NAT):
这会将发送到一台机器的某个端口的请求在后台转发到另一台机器,而访问者不会注意到或知道...显然,如果另一台机器也在防火墙/NAT后面,那么它也需要使用popper普通端口转发...例如使用 netfilter 进行目标 NAT(DNAT)。