![本地网络上的 Web 服务器](https://linux22.com/image/1098007/%E6%9C%AC%E5%9C%B0%E7%BD%91%E7%BB%9C%E4%B8%8A%E7%9A%84%20Web%20%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我无法从本地网络访问(我的一个)Web 服务器。
我有一台 (Ubuntu) 计算机,用作路由器、Web 服务器等。它运行良好,我可以从外部和内部网络访问 Web 服务器。我还可以从外部通过 ssh 访问内部网络上的计算机(使用 iptables 重定向)。
现在我在内部网络上有另一台 Web 服务器。我使用 iptables 创建了一些路由路径。如果我在浏览器中输入,some.webadress.com:40080
它应该转到“内部”Web 服务器。
这有效:
- 从外部网络使用域名(+端口)访问内部Web服务器
- 从内网使用内网IP号(+端口)访问内网Web服务器
这不起作用:
- 从内网通过域名(+端口)访问内网Web服务器
我非常确定路由部分工作正常。问题是我是否必须有 DNS,还是我应该在文件中添加/更改它/etc/hosts
?
编辑:
需要澄清一下。我遇到问题的设备/网络服务器是网络交换机。网络交换机是一种可以通过网络/手机应用程序控制多个高压继电器(例如汽车加热器、外部灯等)的设备。使用智能手机时会出现问题。如果我使用 3G 网络,我会使用some.webadress.com:40080
(请注意,我使用端口转换),如果我使用家庭 wifi,我必须使用192.168.0.101:8080
。我想使用的是some.webadress.com:40080
无论我是在本地网络还是外部网络上。
(家里的另一半对技术性的东西不太感兴趣,所以快速找到地址实际上是一个问题:)
答案1
您网络中的其他计算机无需通过路由器即可访问 Web 服务器;它们位于同一个本地网络中。您应该能够使用其 IP 地址从内部网络直接访问 Web 服务器,例如http://192.168.0.101:8080
。我假设您不进行端口转换,并且您的 Web 服务器在计算机上的同一端口上运行,就像您配置路由器以从该端口转发它一样。
如果可行,那么您只需告诉您的机器192.168.0.101
在解析名称时与之通信some.webadress.com
。您应该能够在本地 DNS 服务器(可能在路由器上运行)上配置此功能。您还应该确保本地网络中的机器始终使用此本地 DNS 服务器。
例如,如果你使用 在 Ubuntu 中设置 DNS 服务器dnsmasq
,它将/etc/hosts
默认加载此计算机上的文件,因此输入一行
192.168.0.101 some.webadress.com
就足够了。
或者,编辑/etc/hosts
文件全部机器否决 DNS 的答案。这很难维护,尤其是当涉及大量机器时。
答案2
hosts
文件就可以很好地工作了,而且我认为没有必要仅为此而构建 DNS 服务器。
您可以考虑的另一种方法是使用内部名称(主机名、hostname.local 或 hostname.internal.domain,具体取决于您的 LAN 配置方式)为 Web 服务器虚拟主机创建别名,该别名可以在本地解析,而无需 DNS 服务器。这样,本地计算机将能够直接访问它,而无需使用外部 IP/路由器路径。
原始问题澄清后的评论:
如果您想在两个网络(3G 和 wifi)上使用相同的 URL,则使用不同于外部名称的内部名称是被排除的,因为它将是不同的 URL。
您可能能够做的是hosts
根据您使用的连接更改文件:一个hosts
文件用于 wifi(将 URL 转换为服务器的内部 IP),另一个文件用于 3G(转换为外部 IP)。您可以使用计算机上的自动脚本执行此操作(至少运行 Linux),但我不知道在智能手机上如何操作。
当您使用some.webadress.com:40080
wifi 连接时,路由器不会使用外部地址路由内部流量。这是 LAN 的目的之一,即与公共网络隔离。
我假设您在 iptables 中使用输入接口而不是目标 IP 进行转发,因为它可能是动态的,但如果您有一个固定的公共 IP,如果您使用目标 IP + 端口(您的公共 IP)而不是输入接口 + 端口作为规则,我认为它应该会按您想要的方式工作。无论如何,您可以使用测试时拥有的 IP 暂时尝试一下。
如果您的 IP 是动态的,您必须使用接口作为 iptables 转发规则的输入,这样当它出现在内部接口上时,您可能会尝试转发到 Web 服务器的内部 IP,而不仅仅是外部 IP。
您可以尝试的另一个选项是使用端口和源
0.0.0.0/0.0.0.0
通过 iptables 进行转发。
答案3
看起来您想要实现的是 NAT 环回。找到了这个指南:
http://for-invent.com/nat-loopback-using-iptables/
类似于以下内容:
iptables -t nat -A PREROUTING -s 192.168.0.0/24 -d some.webaddress.com -p tcp --dport 40080 -j DNAT --to-destination 192.168.0.101:8080
iptables -t nat -A POSTROUTING -d 192.168.0.101 -s 192.168.0.0/24 -p tcp --dport 8080 -j SNAT --to-source some.webaddress.com
虽然对 POSTROUTING 规则中的 --dport 值不是 100% 确定,但如果上述方法不起作用,请尝试使用 40080。
祝你好运。