这有点复杂,所以请耐心听我说。我确实对 IP 有相当多的实用知识,但我正在寻求帮助,以找到实现这一目标的最佳方法。
我的 ISP 为我提供了一组静态 IP 以及一个 IP。为了保护隐私,以下是我在示例中将使用的网络布局:
- 192.168.1.0/24 - 局域网
- 172.16.0.1/30 - 单个静态 IP,默认网关 172.16.0.2
- 172.16.1.1-5/28 - 静态 IP 范围,默认网关 172.16.1.6
在这些示例中,172.16.0.1 和 172.16.1.1-5 实际上是全球可路由的 Internet IP。出于隐私考虑,我使用了私有 IP 块。因此,假设 172.16.0.1 是您想要想象的任何公共 IP,172.16.1.1 块也是如此。
我的服务通过单电缆调制解调器接口具有单个以太网端口。换句话说,所有交换、路由等工作都应在客户端完成。
我目前有一台带有两个以太网接口的 Linux 服务器。它被分配了静态地址 172.16.0.1,并使用 NAT 为 LAN 接口提供互联网,运行良好。多年来,我一直使用这种设置,它为我提供了一个 NAT 路由器,与现成的路由器相比,我对它的控制要深得多。
现在,我想开始利用我拥有的其他静态 IP。问题如下:
我仍然希望能够至少在某种程度上控制对这些盒子的访问。因此,在主 Linux 盒子上,我希望能够说“172.16.1.1 无法接收除通过端口 80 之外的任何传入连接”或“172.16.1.2 无法连接到除端口 22 之外的任何出站连接”。仅举几个例子。换句话说,我仍然希望防火墙控制这些盒子。类似于我目前用来
iptables
阻止 192.168.1.5 去往除我想要的地方之外的任何地方的方式,并且在这种情况下,还计算入站连接。理想情况下,这意味着我可以通过 iptables 路由发往五个公共静态之一的所有数据包,并拥有与我对 LAN 数据包相同的控制级别。LAN (192.168.1.0/24) 上的计算机可能也需要访问这些面向公众的机器。此外,公共 IPS 上的计算机可能需要访问 LAN 计算机。因此,172.16.1.2 可能需要访问 192.168.1.5,反之亦然。
具有静态全球可路由 IP 的计算机应尽可能地了解其面向公众的 IP。我看到的一个建议是将公共计算机放在 LAN 上并为其提供 LAN 地址,然后在 Linux 机器上使用多宿主并将所有端口从所需的静态 IP 转发到所需的 LAN IP。这当然可以工作,但它会造成一些混乱的情况 - Linux 机器现在需要知道每一个静态 IP因此,这不会很好地扩展。因此,例如“eth1”(WAN 接口)不仅需要拥有它已经使用的 IP,还需要拥有所有五个其他 IP。对于五个 IP 来说,这可能没问题,但是当将来有 2000 个 IP 时,可扩展性如何呢......
我想到的一个想法是向 Linux 路由器添加第三个接口,并设置一个仅包含面向公众的机器的小型网络。那么唯一的问题就是这些机器和互联网之间的路由。除此之外,我能想到的唯一简单方法是在 eth2 上为 Linux 机器提供第二个 IP 地址,这将占用这五个宝贵的静态地址之一。
我不想使用任何商业解决方案来实现这一点。我觉得 Linux 应该能够处理这种情况。
这是我希望能够起作用的布局,但我只需要弄清楚如何在 Linux 上进行路由本身。
答案1
如果您像上面那样添加第三个接口来构建 DMZ,那么路由就非常简单。实际上,您需要做的就是启用 IP 转发,它将在连接的接口之间转发数据包。
任何一个
sysctl -w net.ipv4.ip_forward=1
或者
echo 1 > /proc/sys/net/ipv4/ip_forward
即时启用它
或设置
net.ipv4.ip_forward=1
在/etc/sysctl.conf
然后,您只需要防火墙规则来控制从 DMZ 到 Lan 计算机的访问,您仍将使用从 Wan 接口到 LAN 接口的 NAT,您将依靠路由 + 访问规则来控制从 WAN 到 DMZ 和从 DMZ 到 LAN。事实上,DMZ 和 LAN 的默认 GW 是同一个盒子,您不必在 DMZ 或 LAN 计算机上中继静态路由即可相互访问。另一种选择是在每个 DMZ 主机中放置 2 个以太网卡,并将它们也连接到 LAN,但这不如使用中间的路由器和访问列表 (iptables) 来指示什么可以与什么通信那么干净。
答案2
我终于明白了这一点,为了大家的利益,值得在这里写下来。
我将购买一个带有三个以太网接口的盒子。以下是它们的接线方式:
- eth0 -> 至电缆调制解调器
- eth1 -> 连接到具有公共 WAN 地址的计算机所在的交换机
- eth2 -> 连接至 LAN(NATted)计算机的交换机
我们使用 bridge-utils (brctl),br0 设置了一个 Linux 桥,用于桥接 eth0 和 eth1。
然后,我们可以为 br0 接口指定一个面向公众的 IP 地址。这最终将成为来自 LAN 计算机的数据包的来源地址。为了获得最佳安全性,我将使用 iptables 阻止到此 IP 的所有非 NAT 流量:
iptables -A INPUT d 172.16.0.1 -j DROP
这是可行的,因为 NAT 流量将在 FORWARD 链上传递,而未经请求的 Internet 流量将出现在 INPUT 上。
现在,在 WAN 交换机上,我可以放置其他主机。我将把我的主服务器(Web 服务器等)移到该交换机上,并静态地为其分配一个全球可路由的公共 IP。
我之前没有意识到这一点的真正原因是我不认为我可以对桥接接口设置防火墙 - 我没有意识到桥接的数据包确实会通过 iptables。事实证明我不仅可以这样做,而且我甚至可以使用 ulogd 等技巧和类似工具来监控带宽等。关键是一个名为 的 iptables 模块physdev
,它允许您根据数据包进入或离开的物理接口设置防火墙,而不管接口是否为桥接接口。
因此我可以将防火墙规则添加到 FORWARD 表,例如:
iptables -A FORWARD -d 172.16.1.2 -p tcp --dport 80 -m physdev --physdev-in eth0 -j ACCEPT
iptables -A FORWARD -d 172.16.1.2 -m physdev --physdev-in eth0 -j DROP
最终,即使该机器具有公共 IP,也只允许从 Internet 通过端口 80 访问 172.16.1.2。(请记住,在我的示例中,172.16.xx 是公共的,尽管我们都知道实际上它们不是。)
由于我使用的是physdev
,这意味着 LAN 端的机器仍然可以完全访问该主机。因此从 LAN 端,我仍然可以通过 SSH 连接到 172.16.0.1。从 LAN 机器的角度来看,172.16.0.1 根本没有防火墙。从另一台 DMZ 机器的角度来看,情况也是如此。但是,从 Internet 的角度来看,172.16.0.1 已被锁定。
找到解决方案了!事实证明这是一个非常有趣的项目。
F
答案3
我想,您要找的功能是“网络别名”。那么您需要做的就是为这些网络别名配置“多个 NAT”。
我不知道你的路由器 Linux 机器上实际运行的是什么,但如果我可以建议一个解决方案,只需安装具有很多功能的“pfSense”(http://www.pfsense.org/index.php@option=com_content&task=view&id=40&Itemid=43.html)或 IPCop(http://www.ipcop.org/),那么由于它是一个图形解决方案,因此管理起来就容易得多。
这与您的用例完全对应:
- http://www.youtube.com/watch?v=zrBr0N0WrTY
- http://www.ipcop.org/2.0.0/en/install/html/preparation-network-interfaces.html
此外,它可以在非常旧的硬件上运行。
扬