![通过互联网进行端口转发](https://linux22.com/image/505731/%E9%80%9A%E8%BF%87%E4%BA%92%E8%81%94%E7%BD%91%E8%BF%9B%E8%A1%8C%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91.png)
我希望我在正确的网站上,因为这是我在这里的第一个问题!!
我的情况是这样的,我在家里有一台小型服务器,它位于一条 DSL 线路后面,我有一个静态 IP。现在我想在同一个端口上运行两个不同的服务。我无法应用任何类型的源 IP 过滤,因为它们都应该可以从任何地方访问。所以基本上我认为没有办法做到这一点,唯一的解决方案是在 2 个不同的 IP 地址上运行服务。
为了做到这一点,我考虑使用另一条 DSL 线路,显然我有第二个公共 IP。有没有办法将发往特定端口的流量重定向到另一台机器,但在互联网上,而不是在 LAN 内?
当然,我希望只使用调制解调器/路由器来实现这一点,而不需要任何额外的硬件(否则就太简单了,只需要某种 netcat 管道就可以了!!)。对于那些感兴趣的人,路由器是 Zyxel P-2602R-D1A(链接文本)
欢迎任何想法和建议!!!
谢谢
答案1
理论上,这是可行的。您必须设置从额外公共 IP 到原始 IP 的端口转发。对于您来说,就是从 extraIP:80 到 originalIP:81。
我有这样一个带有 iptables 的设置。它旨在简化不同公共 IP 范围之间的 IP 迁移。基本上,“旧”公共 IP 将被 NAT 为“新”公共 IP。NAT 可以毫无问题地通过互联网。
我怀疑它是否能与你的调制解调器/路由器兼容。它很可能只能将端口转发到其 LAN 上的 IP。找出答案的唯一方法是尝试对任何随机公共 IP 进行 NAT,然后你就会知道它是否有效。
我尝试使用 pfense 来做这件事,但失败了。只有 IPTables 可以正常工作。
答案2
您必须在路由器 B 上添加 DNAT 规则。这意味着路由器 B 必须支持 DNAT,并且足够灵活,能够在同一接口上执行 DNAT。如果不行,请尝试安装替代固件,例如 OpenWrt。
答案3
这是可能的,但很棘手,我怀疑普通家用路由器是否具有实现此目的所需的灵活性。
在这篇文章的其余部分,我将假设您的路由器是通用的 Linux 设备。这些原则可能适用于其他平台,但我不知道具体情况。
在 iptables 中,“DNAT”规则用于更改连接的目的地。Iptables 会很乐意将目的地更改为您想要的任何内容。
当 DNAT 规则的目标位于实施 DNAT 的路由器后面的 LAN 上时,这种方法非常有效。DNAT 会更改连接的初始数据包上的目的地,设置连接跟踪条目并将数据包传递到目的地。回复通过同一路由器返回,匹配连接跟踪条目,进行反向转换并发送回源。源接受数据包并继续通信。
如果您的 DNAT 规则的目标位于互联网上的不同网络上,那么它的效果就不太好。DNAT 会更改初始数据包上的目的地,并将数据包传回您的 ISP。
如果您的 ISP 遵循最佳实践,那么他们的入口过滤会在此时将数据包丢弃在地板上,但我们假装他们没有这样做。
数据包被传送到服务器,服务器回复数据包并将回复发送给客户端。不幸的是,回复数据包从未到达实施 DNAT 的路由器,也从未进行反向转换。因此,客户端会收到一个带有意外源地址的数据包,并立即将其丢弃。
那么我们该如何解决这个问题呢?
一种选择是,除了让数据包通过 DNAT 规则外,我们还让其通过 SNAT/MASQUERADE 规则。这将避免 ISP 入口过滤的问题,并将回复带回 NAT 盒,以便可以应用反向转换。不幸的是,它还会向服务器隐藏客户端的 IP,使滥用控制几乎不可能。
另一种选择是将 VPN 与策略路由相结合。我们不是将数据包从 NAT 盒通过开放互联网发送到服务器,而是通过 VPN 发送它们。然后在服务器上使用策略路由,这样当数据包通过 VPN 进入时,对该数据包的回复也会通过 VPN 发送。
答案4
现在我想在同一个端口上运行两个不同的服务
你不能那样做。每个服务器程序都必须监听自己的端口(如果有两个程序尝试打开同一个端口,你将遇到“无法绑定”或“端口正在使用”错误)。
如果您要托管两个不同的网站,则可以通过基于名称的虚拟托管来实现。即,一个服务器监听端口 80,但对站点 1 和站点 2 的请求会发送到不同的地方。
除此之外,您还需要两个公共 IP 地址,或者需要使用不同的端口。
我确信您的 ISP 会很乐意向您出售另一个 IP 地址。您可能需要购买不同的 DSL 路由器(我不知道您的路由器是否知道如何处理多个公共 IP),但您不需要另一条 DSL 线路。