我有一台旧电脑,我把它拆下来并装上了 Ubuntu,因为我想让它作为测试服务器,让我可以在上面运行一些个人项目的概念。启动并运行时,我可以执行hostname -I
并返回192.168.1.1
,但我相信这是一个私有 IP 地址,引用路由器级别以下 LAN 上的机器。访问网站,例如https://whatismyipaddress.com/将产生70.108.1.98
,并且我希望能够打开浏览器并能够导航到https://70.108.1.98:4321
,例如,应用程序在该端口上运行,期待流量。
目前,如果我想连接到另一台设备上运行的服务器,我可以在一台机器上打开浏览器,访问该机器的私有 IP,然后4321
连接即可,不会出现问题。这是有道理的,因为它是一个 LAN,子网掩码允许这些 IP 在路由器下相互找到。
我最初的估计是我需要做以下一些事情:
- 配置路由器以允许防火墙上的流量
4321
- 将所有流量转发
4321
到指定192.168.xxx.xxx
IP,该 IP 表示网络上的特定机器 - 配置机器上运行的 Web 服务器以接受流量
4321
我想我唯一的另一个问题是,给定链接提供的 IP(代表我的公共 IP)是代表路由器本身还是我用来访问该站点的机器?换句话说,如果我用连接到 WiFi 的手机访问该网站,IP 是否相同,从而表明路由器上的所有设备都具有该公共 IP,而路由器会将流量路由到设备的私有 IP?
任何指点都将不胜感激!
答案1
听起来好像有两个场景/问题需要您寻找答案(如果我错了,请纠正我)。
您希望在端口 4321 上托管一项服务,并使其可从公共互联网(使用您的公共 IP)和您的私有网络(使用您的公共 IP 或您的私有 IP)访问。为此,您需要对路由器进行端口转发,以便将路由器上的端口 4321 重定向到 Ubuntu 计算机上的端口 4321。第一步是确定您的 Ubuntu 服务器私有 IP 地址(可以使用命令找到
ip a
)。第二步是按照相关步骤对路由器进行端口转发(此站点收集了大量路由器型号的端口转发指南:https://portforward.com/router.htm)。完成这些步骤后,您的 Ubuntu 服务器端口 4321 上将运行一个服务,您将能够使用您的公共 IP 访问它。对于第二个问题,您似乎走在正确的轨道上。您的路由器将创建一个网络地址转换 (NAT) 网络来处理公共网络和您的专用网络之间的路由。这就是您的 Ubuntu 服务器所说的 IP 地址与外部站点所说的 IP 地址之间的差异。通过路由器连接到互联网的任何设备都将成为专用 NAT 网络的一部分,并且所有这些设备的公共 IP 地址都将相同(因此,您的 Wi-Fi 上的设备将具有与您的 Ubuntu 服务器相同的公共 IP 地址)。
答案2
我想我唯一的另一个问题是,给定链接提供的 IP(代表我的公共 IP)是代表路由器本身还是我用来访问该站点的机器?换句话说,如果我用连接到 WiFi 的手机访问该网站,IP 是否相同,从而表明路由器上的所有设备都具有该公共 IP,而路由器会将流量路由到设备的私有 IP?
在这种情况下,IP 地址通常属于路由器本身。它实际上永远不会共享具有私有地址的机器之间;他们大多数都不知道这一点。
您的设备从其私有 IP 地址作为源发起连接,路由器通过 SNAT 将其透明地转换为其自己的公共地址。
在从互联网接收到数据包后,路由器首先检查它们是否与已知的转换相匹配;如果匹配,则将其目的地转换回主机的私有 IP 地址;如果不匹配,则路由器本身接受数据包作为目标主机。
这不仅仅是“路由”,转换(NAT)是一个附加功能在之上路由。路径上的所有 ISP 路由器都只转发数据包而不执行任何额外的转换。(如果您的网络为所有主机都提供了公共 IP 地址,您的路由器也可以这样做,大多数支持 IPv6 的网络都是如此。)
类似地,当您在路由器上设置“将所有流量转发到 <IP>”规则时,实际上是在设置 NAT(转换)规则。机器永远不会知道它是使用公共 IP 地址访问的;它收到的所有数据包都只有私有地址。