我有一个小型networking与路由器,它保持连接到Internet,服务器和本地networking中的一些工作站。

服务器意味着从Internet访问,并且在路由器iptables中设置了几个DNAT条目,如下所示:
-A PREROUTING -i ppp0 -p tcp -m multiport --dports 22,25,80,443 -j DNAT --to-destination 192.168.2.10
外部数据包通过ppp0接口到达路由器,内部路由器从br-lan去,实际上包括交换机和WLAN适配器。 问题是,虽然外部访问工作正常,但试图通过DNSparsing的外部IP(分配给ppp0 )从LAN内部访问服务器失败。
我能够发明的唯一解决scheme是向路由器的/etc/hosts指向内部IP的静态条目,但由于没有通配符(我至less有三个分配给该系统的顶级域名,的子域),这是相当脆弱和容易失败。 你能提出更好的build议吗?
我只find这个问题 ,这不是很有帮助。
如果这是相关的,路由器用dnsmasq运行OpenWRT 10.03 Kamikaze。
我删除了原来的答案,因为我不完全相信这是正确的。 我已经有一段时间来build立虚拟机虚拟networking来模拟有问题的networking。 以下是适用于我的一组防火墙规则(仅在iptables-save格式中,仅适用于nat表):
-A PREROUTING -d 89.179.245.232/32 -p tcp -m multiport --dports 22,25,80,443 -j DNAT --to-destination 192.168.2.10 -A POSTROUTING -s 192.168.2.0/24 -o ppp0 -j MASQUERADE -A POSTROUTING -s 192.168.2.0/24 -d 192.168.2.10/32 -p tcp -m multiport --dports 22,25,80,443 -j MASQUERADE
第一个POSTROUTING规则是与LAN共享Internet连接的简单方法。 我把它留在那里是为了完整。
PREROUTING规则和第二个POSTROUTING规则共同build立适当的NAT,这样就可以通过外部IP地址连接到服务器,而不pipe连接来自外部还是来自LAN内部。 当局域网上的客户端通过外部IP地址连接到服务器时,服务器将连接视为来自路由器的内部IP地址(192.168.2.1)。
有趣的是,事实certificate第二个POSTROUTING规则也有一些变化。 如果目标更改为-j SNAT --to-source 192.168.2.1 ,则效果(与MASQUERADE相同)(不奇怪):服务器将本地LAN客户端的连接视为源自路由器的内部 IP地址。 另一方面,如果目标被更改为-j SNAT --to-source 89.179.245.232 ,那么NAT仍然工作,但是这次服务器看到来自本地LAN客户端的连接源自路由器的外部 IP地址(89.179 .245.232)。
最后,请注意,使用-i ppp0原始PREROUTING / DNAT规则不起作用,因为该规则永远不会匹配来自LAN客户端的数据包(因为这些数据包不通过ppp0接口进入路由器)。 通过为内部LAN客户端添加第二个PREROUTING规则,可以使其工作,但是这将是不雅观的(IMO),并且仍然需要明确地引用外部IP地址。
现在,即使在详细阐述了“发夹NAT”(或“NAT环回”,或“NATreflection”或任何人喜欢称之为)解决scheme之后,我仍然相信一种水平分割的DNS解决scheme – – 外部客户解决外部IP和内部客户解决内部IP —将是更可取的路线。 为什么? 因为越来越多的人了解DNS如何工作,而不是理解NAT是如何工作的,构build好系统的很大一部分是select使用可维护的部分。 DNS设置比一个神秘的NAT设置(当然是IMO)更可能被理解,因此被正确地维护。
一个常见的解决scheme是将内部主机指向本地DNS服务器,该服务器为这些主机名返回正确的“内部”地址。
另一种解决scheme – 我们正在使用思科防火墙的工作 – 就是在防火墙上重写与这些地址相对应的DNS响应。 我不认为现在有用于Linux的工具。
你应该能够在你的网关上configuration路由来做正确的事情。 您可能需要configuration服务器以了解其外部映射IP地址(例如,通过将其分配给虚拟接口)。 通过这种configuration,从一个内部系统到另一个内部系统的通信 – 使用它的“外部”地址 – 将通过路由器。
你所要做的就是所谓的NAT Loopback ,它要求你添加一个SNAT规则,以便从你的局域网到你的服务器的数据包将通过路由器返回:
-A POSTROUTING -p tcp -s 192.168.2.0/24 -d 192.168.2.10 -m multiport --dports 22,25,80,443 -j SNAT --to-source 89.179.245.232
有关主持内部版本的命名空间\域的评论通常是我过去处理这个问题的方式。 当然,你需要一个内部的DNS服务器才能做到这一点。
您希望使用dnsmasq覆盖服务器的真实DNS条目以使用INTERNAL IP地址。
如果您的服务器是www.example.com,并且它的IP地址是1.2.3.4,则从外部应如下所示:
Name: www.example.com Address: 1.2.3.4
但是在你的networking的内部,你需要www.example.com指向192.168.2.10,这样你可以使用和外部相同的名称访问,所以nslookup应该在你的局域网上返回这个名称:
Name: www.example.com Address: 192.168.2.10
为什么这些数据包“离开”你的局域网只是马上回来? 我从来没有取得太多的成功。 但同时,我也没有理由这样做。 我已经看到,在许多其他configuration(如使用Endian防火墙,或隐藏在思科ASA设备后面的更大型更复杂的networking以及各种不同的DNS服务器)上完成了相同的操作。
只要互联网知道如何到达您的服务器,而您的内部主机知道如何到达您的服务器(通过覆盖您本地DNS服务器上的DNS条目),这是非常重要的。