![所有端口的反向代理](https://linux22.com/image/1581589/%E6%89%80%E6%9C%89%E7%AB%AF%E5%8F%A3%E7%9A%84%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86.png)
我正在开发一个系统,其中每个客户端都分配有单独的 Raspberry Pi,他们可以在上面运行任何他们想要的东西(例如,游戏服务器或具有自定义端口的 Web 服务器)。我该如何反向代理每个客户端?根据这个问题,我可以使用 NAT。那是什么?我该如何设置它?此外,我可以用它来阻止特定端口(例如端口 25)并获取日志等吗?
答案1
我该如何反向代理每一个?
一般来说,你不会。
从你的问题来看,你似乎想在多个客户端设备之间共享一个公共 IP 地址。NAT 和反向代理都是实现这一点的机制,尽管它们的工作层次不同。
(但是,如果你能为每台设备提供专用的公共 IP 地址,那么问题不存在首先,这两种机制实际上都是无关紧要的。
DNAT(通常称为“端口转发”)通常在传输级别工作 - 它通过为每个设备分配一系列 TCP 或 UDP 端口来允许多个设备“共享”一个 IP 地址。
例如,如果您拥有 IP 地址
x.y.z.t
,则可以将 TCP 端口 80(x.y.z.t:80
)转发到设备 A,将端口 81 转发到设备 B,依此类推。反向代理通常在应用程序级别工作 - 它允许多个设备或服务通过根据协议中发现的某些标识符分离请求来“共享”单个 IP:端口组合。
例如,如果您在 上运行 HTTP 反向代理
x.y.z.t:80
,您可以让它根据请求的域名将 HTTP 请求转发到不同的设备。
反向代理的优点是代理允许您在多个域之间共享相同的 IP:端口,但它有一些要求:
- 代理软件需要理解相关协议;它需要专门为该协议构建。这意味着您不能随意代理“所有端口”,并让它适用于您的客户端运行的任何杂项服务。
- 协议实际上需要有某种“主机”或“域”标识符作为其消息的一部分。并非所有协议都带有此类标识符;事实上大多数协议都没有。
- 代理会重写低层地址;您的客户端将看到所有连接都来自代理本身,除非服务也有处理该问题的方法(例如 X-Forwarded-For 或所谓的“PROXY 协议”)。
因此,多台设备的代理实际上仅限于 HTTP 和 HTTPS(具有“Host”标头);加上基于 TLS 的服务(具有 SNI 和 ALPN);再加上可能的 DNS 和 SMTP(基于收件人地址);以及可能是不安全的 POP3/IMAP/FTP(基于登录名)。
对于游戏服务器来说,这不是一个选项——你几乎必须在每个设备上为每项服务使用一个(或多个)专用端口。这通常称为“端口转发”或“DNAT”;它与家用路由器中的端口转发功能完全相同;并且它有自己的一系列问题:
它不了解 DNS 域,而是直接在 IP 地址级别工作。如果您的所有域都解析为同一个 IP 地址,则它们都具有完全相同的端口转发规则。
这意味着给定 IP 地址上的每个 TCP 或 UDP 端口只能转发到一个设备。例如,如果客户端 1 获取标准 SSH 端口,即
pi1.example.com:22
,则意味着pi2.example.com:22
或pi3.example.com:22
将还转到客户端 1 的设备 – 现在其他客户端不能完全不使用此端口进行入站连接。(根据执行 NAT 的软件,它们可能也无法将其用于出站连接。)每个 IP 地址只有约 65k 个 TCP 端口和约 65k 个 UDP 端口,并且两个入站连接都需要它们(每个服务一个,有时更多)和对于出站连接(作为源端口;通常每个连接一个)。因此实际上您不能拥有超过... 比如说 ~32k 条端口转发规则。
有些服务需要具体的端口。例如,用于入站邮件传递的 SMTP 始终使用 TCP 端口 25;IKE 使用 UDP 端口 500 和 4500;游戏服务器通常需要特定范围的端口。如果您的一个客户端保留了该特定范围,则其他客户端无法运行相同的服务。
至于如何设置它 - 我建议从 DNAT 开始,因为无论如何你很可能都需要它来进行反向代理。
那是什么?我该如何设置它?
如上所述,传入连接的 NAT(DNAT)通常称为“端口转发”,直接在您的路由器(“拥有”您的公共 IP 地址的设备)上配置,并且肯定会在设备手册中说明。
(如果路由器只运行常规 Linux 或 FreeBSD,则 DNAT 规则是通过iptables或者普法,与防火墙规则相同。)
另外,我可以用它来阻止特定端口(例如端口 25)并获取日志等吗?
是也不是。这些都是防火墙的功能。任何像样的防火墙都会有这些功能(我的意思是,这就是防火墙做),但他们会在那里旁边NAT,但是不属于NAT。