我的 ISP 路由 /29 网络(8 个 IP 地址)。第一个和最后一个当然是网络和广播地址,第二个是由 ISP 分配给调制解调器的。调制解调器有一个带有 /29 网络的以太网 LAN 端口,我可以使用它。不幸的是,我无法访问或更换调制解调器,只有 ISP 可以访问它。在此讨论中,它需要被视为黑匣子。我的端点是提供 /29 网络的调制解调器的 LAN 连接。
当然,我可以将剩下的 5 个 IP 地址分配给不同的机器,并通过以太网端口将它们连接到调制解调器。这就是我现在正在做的事情。
但是,我想在两者之间有一个数据包过滤器(防火墙)。通常防火墙需要两个接口和两个子网。从技术上讲,我可以将 /29 分成两个 /30 网络,并将防火墙放在它们之间。
另一种选择是将所有五个静态 IP 分配给防火墙并进行 NAT 和端口转发。
第三种选择是让所有 L2 流量通过我的防火墙,将其配置为网桥并使用基本的 L2 过滤。
这些选项中没有一个对我有吸引力。
有没有一种无需NAT 或 L2 过滤即可在我的 IP 网络前面放置防火墙的好方法?
理想情况下,整个 /29 将位于防火墙的“内部”接口上,防火墙本身将使用完全独立的 /31(或 /30)连接,并且 ISP 将通过您的防火墙路由主 /29。 . 值得尝试致电您的 ISP 并询问他们是否可以进行那种“点对点”配置。
如果这不可能,请在防火墙上使用代理 ARP来伪造它。只要它回答路由器的 ARP 查询,它就会接收这些 IP 地址的流量,即使它们实际上并未在防火墙上配置。
这适用于基于 Linux 的防火墙(一般的想法应该适用于例如 OpenBSD),但不能保证设备:
像往常一样使用 /29 中的地址配置防火墙的“内部”接口。
使用相同的地址配置防火墙的“外部”接口,但将其设为 /32。
在 Linux 上,您可以使用“点对点”寻址方式,将调制解调器的地址指定为“对等点”。
如果这不可能,请使用常规 /32 并单独为调制解调器地址添加“本地”路由。
像往常一样添加默认路由。
在“外部”接口上启用代理 ARP。在 Linux 上,您可以使用内核实现(通过 启用
sysctl
)或用户空间守护程序(“parpd”)。因为内核内的实现让我无所适从,所以使用起来
parpd
更简单(也因为在我的情况下,我需要配置整个子网代理的异常,parpd 可以做到,但内核不能),所以这里有一个 /etc/ parpd.conf:您还可以为“内部”接口启用 ARP 代理,以便静态配置的 LAN 主机可以简单地继续将 ISP 路由器的地址作为其“默认网关”,而无需立即在任何地方更改它:
Linux 上的内核内代理 ARP 实现可以在
sysctl net.ipv4.conf.ext0.proxy_arp[_pvlan]
以及ip neigh add .. proxy
. (经过几次尝试,我仍然不完全知道后者是否需要启用 sysctl 或者它们是否是正交的。)请注意,在这种情况下,“代理”并不意味着中继请求(尽管这也是可能的);相反,防火墙本身将代表代理地址进行回答。
就是这样,现在只需将防火墙视为标准路由器并编写您的 iptables 规则。
这种机制的优势(与例如 NAT 或 ebtables brouting 1相比)是,除了看起来有点奇怪的“外部”接口之外,您的防火墙继续作为一个完全标准的第 3 层路由器工作 - 代理 ARP 不会改变任何方式的 IP 数据包,几乎可以达到与 ISP 简单地通过防火墙路由 /29 相同的结果。
(同样的方法也适用于使用代理 NDP 的 IPv6,但希望您不需要它,并且可以让 ISP 正确路由它,例如通过 DHCPv6-PD?)
请注意,即使在您将 /29 拆分为两个 /30 的初始计划中,仍需要代理 ARP,因为 ISP 的路由器将完全不知道拆分 - 它会继续为整个 /29 发出 ARP 查询。
如果答案是您可以致电 ISP 并要求他们调整路由,以便可以使用两个 /30... 那么您也可以要求他们首先将整个 /29 路由到您的防火墙(在这种情况下,他们将为调制解调器-防火墙链接分配一个专用的点对点 /30)。
1 Linux 软件网桥支持一项功能,其中某些数据包可以提升到 L3 处理(路由/iptables),而其他数据包继续由 L2 网桥转发。这由一些防火墙设备使用,例如 Untangle。这太可怕了,我希望我再也不会看到它在网络上使用了。
防火墙也会根据需要进行 NAT,这意味着只有“外部”子网是您的 /29,而“内部”子网是私有地址范围,可以任意大(例如
10.0.0.0/8
)。这可以是“静态”NAT,因此您可以拥有 5 个内部 IP 并将它们一对一映射到您的 5 个外部 IP。或者任何你喜欢的东西。
因此,在您的情况下使用 NAT 确实没有缺点。NAT 不限于“将整个内部子网映射到单个 IP 地址”,这是在家庭路由器上默认完成的。
我的意思是,你要么留在 L2,然后需要 L2 过滤,要么转到 L3,然后你需要路由,因此需要 NAT。所以这将是一个或另一个。
为内部防火墙机器浪费外部 IP 地址并不是对 IP 地址等昂贵资源的良好利用,只是因为您“不喜欢 NAT”(或者无论您的原因是什么)。